单片机课程设计
题 目:交通信号灯模拟控制
班 级:
姓 名:
学 号:
指导教师:
设计时间:
评语:
成绩
- 1 - 一. 问题分析及解决方案
1.题目设计要求
(1)该设计能控制东、西、南、北四个路口的红、黄、绿信号灯正常工作。
(2)当东西方向放行、南北方向禁行时,东西方向绿灯亮25秒,然后黄灯亮5秒;南北方向红灯亮30秒。
(3)当南北方向放行、东西方向禁行时,南北方向绿灯亮25秒,然后黄灯亮5秒;东西方向红灯亮30秒。
(4)当使两条路线交替地成为放行线和禁行线时,就可以实现定时交通控制,同时用2位数码管进行30秒递减显示。
2.设计方案
(1)芯片选择:为了实现上述设计要求,可以同AT89C51单片机芯片。用AT89C51芯片的P1口(P1.0-P1.5)分别接上六组信号灯。
(2)显示方案:P0口和P2口各接一个LED显示。
(3)延时的实现:延时的实现可以通过软件实现;也可以利用定时器/计数器的定时工作方式实现延时。本系统使用定时器/计数器的模式1实现100ms定时。系统时钟频率为6Hz。
AT89C51两位LED显示器6位LED指示灯
图1 原理方框图
- 2 - 二.系统控制流程图
系统初始化显示初始值设置25sA线放行,B线禁行延时、显示显示初始值设置5sA线警告,B线禁行延时、显示显示初始值设置25sA线禁行,B线放行延时、显示显示初始值设置5sA线禁行,B线警告延时、显示1s到减1秒十位显示码送P0秒个位显示码送P21s到否返回结束YYNN开始开始Flag=1?
图2 主程序流程图 图3 显示子程序流程图
- 3 - 三.硬件实现
1.信号灯的控制及控制编码:P1.0-P1.2控制东西方向的信号灯(用A线表示);P1.3-P1.5控制南北方向的信号灯(用B先表示)。6只发光二极管是以共阳极连接,所以相应口线输出高电平则“信号灯”灭;口线输出低电平则“信号灯”亮。为了实现上述控制要求,P1共输出四种控制码,如表1所示。
表1 “信号灯”控制码表
P1.7 P1.6 P1.5 P1.4 P1.3 P1.2 P1.1 P1.0
控制码 状态说明 空 空 B线
绿灯 B线
黄灯 B线
红灯 A线
绿灯 A线
黄灯 A线
红灯
0 0 1 1 0 0 1 1 33H A线放行
B线禁行
0 0 1 1 0 1 0 1 35H A线警告
B线禁行
0 0 0 1 1 1 1 0 1EH A线禁行
B线放行
0 0 1 0 1 1 1 0 2EH A线禁行
B线警告
2.时间显示:秒显示计数器设为Count单元,100ms计数器Tcount。设系统时钟频率为6MHz,定时器T0实现100ms定时,计数器的初值为:(TH0)=3CH,(TL0)=0B0H,模式控制器TMOD中的控制字为:(TMOD)=01H。
四.电路原理图
交通信号灯的控制电路中核心是AT89C51单片机,其内部带有4KB的ROM,无需扩展程序寄存器;交通信号灯的控制没有大量的运算和暂存数据,AT89C51芯片的128B RAM已能满足要求,所以不必外扩RAM。LED显示通过P0口和P2口连接。一个LED显示的段选端口与P0口连接,另一个LED与P2口连接。LED显示器以共阴极接法连接,电路原理图如图4所示,执行过程如图5、图6、图7、图8所示。
图4 交通信号灯控制的原理图
- 4 -
图5 南北禁止,东西放行
图6 南北禁止,东西警告
- 5 -
图7 东西禁止,南北放行
图8 东西禁止,南北警告
五.软件实现
//*******************************************
// 有时间显示的定时交通灯控制
//*******************************************
- 6 - #include
#inlcude
//-------------------------------------------
unsigned char code LEDcode[]= //定义''0--9''十个数据共阴极LED七段显示码
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f} ;
//''0'',''1'',''2'',''3'',''4'',''5'',''6'',''7'',''8'',''9''
//-------------------------------------------
#define uchar unsigned char
#define uint unsigned int
#define A_PASS_B_STOP 0x33 //A线放行,B线禁止
#define A_WARNING_B_STOP 0x35 //A线警告,B线禁止
#define A_STOP_B_PASS 0x1e //A线禁止,B线放行
#define A_STOP_B_WARNING 0x2e //A线禁止,B线警告
//============================================
uchar Count; //延时计数器
uchar tcount; //定义50ms计数变量
uchar flag
/******************主程序开始***********************/
void main(void)
{P1=0xff; //初始化,所有灯都不亮
TMOD=0x01; //定时/计数器0设为方式1
TH0=(65535-50000)/256; //定时100ms初值的高八位送入TH0
TL0=(65535-50000)%256; //定时100ms初值的低八位送入TL0
TR0=1; //启动定时器0
ETO=1; //开定/时计数0的中断
EA=1; //开CPU中断
tcount=0; //100ms计数变量清零
Count=0; //秒计数变量清零
Flag=1
P0=LEDcode[Count/10]; //秒的十位送十位显示
P2=LEDcode[Count%10]; //秒的个位送个位显示
if(Flag=1)
while(1)
{ P1= A_PASS_B_STOP ; //A线放行,B线禁止
Count=25; //延时25s
while(Count!=0); //不等于0等待
P1= A_WARNING_B_STOP; //A线警告,B线禁止
Count=5; //延时5s
while(Count!=0); //不等于0等待
P1= A_STOP_B_PASS; //A线禁行,B线放行
Count=25; //延时25s
while(Count!=0); //不等于0等待
P1= A_STOP_B_WARNING; //A线禁行,B线警告
Count=5; //延时25s
- 7 - while(Count!=0); //不等于0等待
}
else
exit(-1);
}
//===========================================
void t0(void) interrupt 1 using 1 //定时器0中断处理函数
{TH0=(65535-50000)/256; //重新将定时100ms初值的高八位送入TH0
TL0=(65535-50000)%256; //重新将定时100ms初值的低八位送入TL0
tcount++; //定时100ms时间到加1
if(tcount==10) //判断是否到1秒
{tcount=0; //到1秒,变量清0
if(Count!=0)
{Count--;} //秒计数变量减1
}
P0=LEDcode[Count/10]; //秒的十位送十位显示
P2=LEDcode[Count%10]; //秒的个位送个位显示
}
//=============================================
六.遇到的问题及解决方案
单片机原理及应用是我们上学期上过的一门专业必修课,这次课程设计对提高我们专业知识的应用能力和理解能力有很大的帮助。在做这次课程设计时,明显感觉到对知识的遗忘,需要重新看书,理解知识点,在我做的课程设计里面,又一次对AT89C51的内部结构,定时器/计数器的工作模式进行了学习,巩固了所学的知识。在这个系统中要求用到数码管显示,使我对数码管的原理和应用有了进一步的认识和掌握。在红绿灯显示时候,由于受到驱动能力的限制,在这个系统中,采用了NPN共发射极放大电路,增大了驱动能力,完成了对LED灯的驱动放大。同时本系统的不足之处在于现实中,由于两个东西方向和南北方向车流量的不同,两组灯得计时数也不一样,由于能力有限,在日后单片机学习中还需要进一步深入,不断提高对单片机在实际问题中的应用。
最后,要感谢侯涛老师的悉心指导,在设计过程中,能严格要求我们熟悉设计原理和方法,同时对调试工具和仿真工具有了熟练的掌握。
七.参考文献
[1] 李华,王思明,张金敏.单片机原理及应用[M].兰州:兰州大学出版社,2001.
[2] 皮大雄,南光群,刘金华.单片机课程设计指导书[M].北京:北京理工大学出版社,2010.