资源描述
- -
课程设计任务书
课 程 名 称 单片机原理及应用课程设计
院 部 名 称 信息技术学院
专 业 计算机科学与技术
班 级 09计〔嵌入式系统方向〕
姓 名
学 号 0905101072
指 导 教 师 钰
金陵科技学院教务处制
摘要
本文介绍了一个基于MCS-51及PROTEUS的十字路口交通灯控制系统的设计与仿真,通过对现实路况交通灯的分析研究,理解交通控制系统的实现方法。
十字路口交通灯控制系统通常要实现自动控制和在紧急情况下制止普通车辆,而让紧急车辆优先通行。本文还对MCS-51单片机的构造特点和重要引脚功能进展了介绍,同时对智能交通灯控制系统的设计进展了详细的分析。最后介绍了PROTEUS嵌入式系统仿真与开发平台的使用方法,利用Proteus软件对交通灯控制系统进展了仿真,仿真结果说明系统工作性能良好。
关键字:单片机,proteus仿真,中断,十字路口交通灯控制系统前言
1,十字路口的交通控制系统指挥着人和各种车辆的平安运行,对穿插口实行科学的管理与控制是交通控制工程的重要研究课题,是保障穿插口的交通平安和充分发挥穿插口的通行能力的重要措施,是解决城市交通问题的有效途径。交通灯信号灯的出现是人类历史上的一次重大改革,使人类的聚居生活,产生了深远的影响。使交通得以有效管制,对于疏导交通流量,提高道路通行能力,减少交通事故有明显效果。如何采用适宜的控制方法,最大限度利用好消耗巨资修建的城市高速道路,缓解主干道与匝道、城区同周边地区的交通拥堵状况,越来越成为交通运输管理和城市规划部门亟待解决的主要问题。随着电子技术的开展,利用单片机技术对交通灯进展智能化管理,已成为目前广泛采用的方法。
2,此十字路口交通灯控制系统,分东西道和南北道,设东西道为A道,南北道为B道。规定:A道放行时间为2分钟,B道放行1.5分钟;绿灯放行,红灯停顿;绿灯转红灯时,黄灯亮2秒钟;假设有紧急车辆要求通过时,此系统应能制止普通车辆,而让紧急车辆通过。
3,应用单片机实现对交通灯的控制,在十字路口用红,黄,绿的指示灯,加上四个以倒计时显示的数码管来控制交通。考虑到紧急车辆,设计紧急车辆开关。
一、 正文
4.1芯片介绍
AT89C51是一种带4K字节闪存可编程可擦除只读存储器〔FPEROM—FlashProgrammable and Erasable Read Only Memory〕的低电压、高性能CMOS 8位微处理器,俗称单片机。AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。单片机的可擦除只读存储器可以反复擦除1000次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器。AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
主要特性:
·与MCS-51 兼容
·4K字节可编程闪烁存储器
·寿命:1000写/擦循环
·数据保存时间:10年
·全静态工作:0Hz-24MHz
·三级程序存储器锁定
·128×8位部RAM
·32可编程I/O线
·两个16位定时器/计数器
·5个中断源
·可编程串行通道
·低功耗的闲置和掉电模式
·片振荡器和时钟电路
4.2 交通灯状态
北B
○○○
○○
A ○○A
○○
○○○
B
S1:东西通行,南北制止 S2:东拐南,西拐北通行
S3:南北通行,东西制止 S4:北拐东,南拐西通行
S1状态120秒,S2状态20秒,S3状态90秒,S4状态20秒,循环执行。
4.3设计步骤
1,利用proteus 7.5 sp3仿真软件绘制仿真实例
用traffic lights和一个绿色LED灯表示红、黄、绿,以及允许左拐的信号灯。
用P0口控制交通灯,用P1口控制数码管的段选,P2口控制数码管的位选。
P3.6和P3.7接收中断信号并返回给INT0接口处理。
2,利用Keil软件按要求编写程序实现相应功能。
五、硬件设计
5.1 通过proteus 7.5 sp3设计如下仿真图:
S1状态:
黄灯亮:
S2状态:
黄灯亮:
S3状态:
黄灯亮:
S4状态:
黄灯亮:
六、软件设计
6.1系统流程图
主程序
开场
设置中断工作方式、触发方式、初始化
是否有中断
运行过程
执行中断
Y
N
中断完毕,退出中断,返回
6.2定时器原理
定时器工作的根本原理其实就是给初值,让它不断加1直至减完为模值,这个初值是送到TH和TL中的。它是以加法记数的,并能从全1到全0时自动产生溢出中断请求。因此,我们可以把计数器记满为零所需的计数值,即所要求的计数值设定为C,把计数初值设定为TC 可得到如下计算通式:
TC=M-C
式中,M为计数器模值。计数值并不是目的,目的是时间值,设计1次的时间,即定时器计数脉冲的周期为T0,它是单片机系统主频周期的12倍,设要求的时间值为T,那么有C=T/T0。计算通式变为:
T=〔M-TC〕T0
模值和计数器工作方式有关。在方式0时M为8192;在方式1时M的值为65536;在方式2和3为256。就此可以算出各种方式的最大延时。如单片机的主脉冲频率为12MHZ,经过12分频后,假设采用方式0最大延时只有8.129毫秒,采用方式1最大延时也只有65.536毫秒。这就是为什么扫描周期为50ms的原因,
假设使用软件那么会耽误程序流程,显然不可行。相反,时间计时方面却不可能只用计数器,因为显然1秒钟已经超过了计数器的最大定时间,所以我们还必须采用定时器和软件相结合的方法才能解决这个问题。
6.3软件延时原理
MCS-51的工作频率为12MHZ,机器周期与主频有关,机器周期是主频的12倍,所以一个机器周期的时间为12*〔1/12MHZ〕=1us。我们可以知道具体每条指令的周期数,这样我们就可以通过指令的执行条数来确定1秒的时间,但同时由于单片机的运行速度很快其他的指令执行时间可以忽略不计。
6.4外部中断原理
本系统主要使用了外部中断,中断信号有引脚INT0和INT1输入,低电平有效,CPU每个时钟周期都会检测INT0和INT1上的信号,AT89C51允许外部中断以电平方式或负边沿方式两种中断方式输入中断请求信号,可由用户通过设置TCON中IT0和IT1位的状态来实现。以IT0为例,IT0=0,为电平触发方式,IT0=1,为负边沿触发方式,本设计采用电平方式,IE0为其中断标志位,有中断信号那么置位,中断效劳子程序响应后,IE0自动清零。IE中的EA为允许中断的总控制位,为1开启,EX0为外部中断允许控制位,为1开启。
在优先级的允许下,一旦有外部中断信号产生,单片机CPU首先保护断点,PC值进栈,然后执行相应的中断效劳子程序,执行完后,用RETI指令返回,此时CPU会从堆栈中取保存的断点地址,送回PC,程序再正常执行。
6.5程序模块设计
6.5.1数码管显示子程序
6.5.2 T0中断子程序
定时计数初值
50ms计数(count)加1
判断1S(count=20?)到否
count清0
Time_SN--;Time_EW--
恢复现场
中断返回
N
Y
6.5.3 INT0中断子程序
紧急状态按键连接到外部中断引脚P3.2,即INT0捕获到一个低电平,那么进入该中断进展相关处理。
七、系统软件调试
7.1.1 集成开发环境
KEIL IDE Vision2集成开发环境主要由以下局部组成:
◆ u Vision2 IDE。ision2 IDE包括:一个工程管理器,一个功能丰富并有交互式错误提示的编辑器选项设置生成工具,以及在线帮助。使用vision2创立源文件并组成应用工程加以管理。vision2可以自动完成编译汇编程序的操作;
◆ C51编译器和A51汇编器。Vision2 IDE创立的源文件可以被C51编译器或A51汇编器处理生成可重定位的object文件。KEIL C51编译器遵照ANSI C语言标准支持C语言的所有标准特性,另外还增加了几个可以直接支持at89C51构造的特性。KEIL A51宏汇编器支持at89C51及其派生系列的所有指令集;
◆ LIB51库管理器。B51库管理器可以从由汇编器和编译器创立的目标文件建立目标库,这些库是按规定格式排列的目标模块,可在以后被器所使用当器处理一个库时仅仅使用了库中程序使用了的目标模块而不是全部加以引用;
◆BL51器定位器。L51器使用从库中提取出来的目标模块和由编译器汇编器生成的目标模块创立一个绝对地址目标模块,绝对地址目标文件或模块包括不可重定位的代码和数据所有的代码和数据都被固定在具体的存储器单元中。
利用KEIL开发和调试系统软件流程大致如下:
◆启动Vision2,进入KEIL软件的集成开发环境;
◆利用KEIL置的文本编辑器进展程序源文件的编辑,因为KEIL集成的文本编辑器对中文支持不是很好,可以选择其他的编辑器(本文使用的文本编辑器是Ultraedit—32),Vision2能够自动识别外部改变了的源文件;
◆建立工程,指定针对哪种单片机进展开发,指定对源程序的编译、参数,指定调试方式(本文采用外部硬件仿真器仿真调试的方式,即使TKS仿真器仿真),然后对工程进展相关设置;
◆设置好工程后即可进展编译、。连接仿真器对软件进展调试。也可以生成下载到单片机存储器上的HEX文件。
7.1.2系统仿真调试
系统的仿真调试借助于PROTEUS仿真器,在进展系统仿真的连续调试之前要先进展软件的初调,就是要使各个子程序模块运行正确,程序的运行流程正确,生成hex文件。
参考文献:
[l]边海龙,永奎. 单片机开发与典型工程工程实例详解[J].电子工业,2021,(10):143-160.
[2]鑫,华臻,书谦. 单片机原理及应用[J].电子工业,2021(5).
[3]黄智伟.凌阳单片机课程设计指导[J].航空航天大学,2007.8
[4]余锡存 .单片机原理及接口技术[M].:电子科技大学,2000.7
[5]雷丽文 等.微机原理与接口技术[M].:电子工业,1997.2
- word.zl
- -
[6]柴钰.单片机原理和应用[M].电子科技大学.
[7]靖武.单片机系统的PROTUSE设计和仿真[M].电子工业.2007.
附:
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit Button_A=P3^6;
//sbit Button_B=P3^7;
uchar table[ ]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f}; //共阴段码表0--9
char Time_EW; //东西方向倒计时
char Time_SN; //南北方向倒计时
uchar EW=89,SN=89,EWJ=29,SNJ=29,EWL=19,SNL=19; //程序初始化赋值
uchar count=0;
/********************************************************/
void delay(unsigned char i) //延时i ms
{
unsigned char j;
while(i--)
{
for(j=0;j<115;j++);
}
}
/******************************************************/
void Display(void)
{
P2=0x08;
P1=table[Time_EW/10];
delay(2);
P2=0x04;
P1=table[Time_EW%10];
delay(2);
P2=0x02;
P1=table[Time_SN/10];
delay(2);
P2=0x01;
P1=table[Time_SN%10];
delay(2);
}
/******************T0中断*************************************/
void time_0() interrupt 1
{
TH0=0x3c;
TL0=0xb0;
count++;
if(count==20)
{
Time_SN--;
Time_EW--;
count=0;
}
}
void int0(void) interrupt 0
{
while(Button_A==0)
{
P0=0x09; //所有都是红灯
P1=0; //关数码管
}
}
/******************主程序*******************************/
void main()
{
TR0=1; //启动定时器0
TMOD=0x01; //定时器工作于方式1
TH0=(65536-50000)/256; //定时器赋初值
TL0=(65536-50000)%256;
EA=1; //CPU开中断总允许
ET0=1; //开定时中断
EX0=1; //开外部INTO中断
IT0=1; //INT0负跳变触发
while(1)
{
/*S1*****A道放行*******/ //S1状态
Time_EW=EW; //90s
Time_SN=SN; //90s
while(Time_EW>=0)
{
P0=0x0c;
Display();
}
/******A道+30s********/
Time_SN=SNJ; //SNJ=29
Time_EW=EWJ; //EWJ=29
while(Time_EW>=2)
{
P0=0x0c;
Display();
}
/******A道黄灯********/
while(Time_EW>=0)
{
P0=0x0a;
Display();
}
/*S2*****A道左拐******/ //S2状态
Time_SN=SNL; //20 s
Time_EW=EWL; //20 s
while(Time_EW>=2)
{
P0=0x80;
Display();
}
/******A道黄灯*******/
while(Time_EW>=0)
{
P0=0x0a;
Display();
}
/*S3*****B道放行*****/ //S3状态
Time_EW=EW; //90s
Time_SN=SN; //90s
while(Time_EW>=2)
{
P0=0x21;
Display();
}
/******B道黄灯*******/
while(Time_EW>=0)
{
P0=0x11;
Display();
}
/*S4*****B道左拐*****/ //S4状态
Time_SN=SNL; //20 s
Time_EW=EWL; //20 s
while(Time_EW>=2)
{
P0=0x40;
Display();
}
/******B道黄灯******/
while(Time_EW>=0)
{
P0=0x11;
Display();
}
}
}
- word.zl
展开阅读全文