当前位置:首页 > 2014年山东大学第十届“兴源通杯”科技创新大赛
基于单片机的交通灯控制系统
开始
AT89C51初始化 按键 南北左拐通行 按键 特殊模式全红灯 N 通行15秒 Y 南北黄灯闪烁 东西左拐通行
N N N 闪烁5秒 Y 南北直行通行 N 通行15秒 Y 东西黄灯闪烁 通行35秒 Y 南北黄灯闪烁 N 闪烁5秒 Y 东西直行通行 闪烁5秒 Y N 通行35秒 Y 东西黄灯闪烁 N 闪烁5秒 Y 4.2程序模块功能及代码 4.2.1 数码管动态显示模块
(1)动态显示实际是利用人眼的“视觉暂留”效应。方法是将所有数码管的 8 个笔画段a~h 的各同名端分别并接在一起,并把他们接在单片机
- 12 -
基于单片机的交通灯控制系统
的字段输出口上。为了防止各个数 码管同时显示相同的数字,各个数码管的公共端 COM 还要受到另一组信号的控制,即它们接 到位输出口上。这样,对于一组数码管显示器需要由两组信号来控制:一组是字段输出口输 出的字形代码,用来控制显示的字形,称为段码;另一组是位输出口输出的控制信号,用来 选择第几个显示器工作,称为位码。因此,所谓动态,就是利用循环扫描的方式,分时轮流 选通各个数码管的公共端,使各个数码管轮流导通,在导通的同时送上不同的段码。当扫描 速度达到一定程度时,人眼就分辨不出来了,认为各个数码管在同时显示。
(2)C程序代码:
uchar code table[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //0-9
段选码
void Display(void)
- 13 -
基于单片机的交通灯控制系统
{ }
uchar h,l;
h=Time_EW/10; l=Time_EW;
P0=table[l];
EW_LED2=1; //点亮EW_LED2 Delay(2);
EW_LED2=0; //熄灭EW_LED2 P0=table[h];
EW_LED1=1; //点亮EW_LED1 Delay(2); EW_LED1=0;
h=Time_SN/10; l=Time_SN; P0=table[l];
SN_LED2=1; //点亮SN_LED2 Delay(2); SN_LED2=0; P0=table[h]; SN_LED1=1; //点亮SN_LED1 Delay(2); SN_LED1=0;
4.2.2 外部中断服务模块
(1)MCS-51单片机有多个中断源,以8051为例,有5个中断源,两个外中断、两个定时中断和一个串行中断。
外中断是由外部原因引起的中断,有两个中断源。即外中断0(INT0)和外中断1(INT1),中断请求信号由引脚P3.2(INT0)和P3.3(INT1)输入。 外中断请求信号有两种方式,一是电平方式,二是脉冲方式。可通过有关控制位的定义进行规定。
电平方式为低电平有效,只需在单片机的(INT0)和(INT1)中断请求输入端采样到有效的低电平时,就会激活外部中断。
脉冲方式则在脉冲的后负跳沿有效,即在相邻两个机器周期对中断请求引入端进行采样中,如前一次为高,后一次为低即为有效中断请求。这就要求在这种中断方式,中断请求信号的脉冲宽度必须大于一个机器周期,以保证电平变化能被单片机采样到。
- 14 -
基于单片机的交通灯控制系统
定时器控制寄存器 (TCON)
外中断请求方式的控制位在定时控制寄存器TCON(地址为88H)中的位88(IT0)和位8A(IT1)两个位,当IT0(IT1)=0为电平方式,IT0(IT1)=1为脉冲方式。同时在此寄存器中的位89(IE0)和位8B(IE1)为外中断请求标志位,当CPU采样到INT0(INT1)端出现有效中断请求时,此位由硬件置1。在中断响应完成后转向中断服务时,再由硬件自动清0。
定时器控制寄存器 (TCON) 位地址 位符号
中断允许控制寄存器 (IE) 中断允许控制寄存器 (IE) 位地址 位符号 AF EA AE / AD / AC ES AB ET1 AA EX1 A9 ET0 A8 EX0 8F TF1 8E TR1 8D TF0 8C TR0 8B IE1 8A IT1 89 IE0 88 IT0 (2)C程序代码: <1>void INT0_srv(void)interrupt 0 using 1 {
EX0=0; //关中断
if(Nomor_Button==0) //测试按键是否按下,按下为正常状态 {
EW1=60; SN1=20; EWL1=39; SNL1=39; Busy_LED=0; //关繁忙信号灯 Kongxian_LED =0; //关特殊信号灯 }
if(Busy_Button==0) //测试按键是否按下,按下为繁忙状态 { EW1=45; SN1=15; EWL1=29; SNL1=29; Kongxian_LED=0; //关特殊信号灯 Busy_LED=1; //开繁忙信号灯 }
if(Kongxian_Button==0)//测试按键是否按下,按下为特殊状态
- 15 -
共分享92篇相关文档