单片机十字路口交通信号灯模拟控制
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单片机课程设计题目:交通信号灯模拟控制
班级:
姓名:
学号:
指导教师:
设计时间:
一.问题分析及解决方案
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。
图1 原理方框图
二.系统控制流程图
图2 主程序流程图图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
1
1
1
1
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 交通信号灯控制的原理图
图5 南北禁止,东西放行
图6 南北禁止,东西警告
图7 东西禁止,南北放行
图8 东西禁止,南北警告五.软件实现
//*******************************************
// 有时间显示的定时交通灯控制
//*******************************************
#include <REG52.H> //插入52特殊功能寄存器头文件
#inlcude <stdlib.h>
//-------------------------------------------
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_W ARNING_B_STOP 0x35 //A线警告,B线禁止
#define A_STOP_B_PASS 0x1e //A线禁止,B线放行
#define A_STOP_B_W ARNING 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_W ARNING_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_W ARNING; //A线禁行,B线警告
Count=5; //延时25s
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]; //秒的个位送个位显示
}
//=============================================
六.遇到的问题及解决方案
单片机原理及应用是我们上学期上过的一门专业必修课,这次课程设计对提高我们专业知识的应用能力和理解能力有很大的帮助。
在做这次课程设计时,明显感觉到对知识的遗忘,需要重新看书,理解知识点,在我做的课程设计里面,又一次对A T89C51的内部结构,定时器/计数器的工作模式进行了学习,巩固了所学的知识。
在这个系统中要求用到数码管显示,使我对数码管的原理和应用有了进一步的认识和掌握。
在红绿灯显示时候,由于受到驱动能力的限制,在这个系统中,采用了NPN共发射极放大电路,增大了驱动能力,完成了对LED灯的驱动放大。
同时本系统的不足之处在于现实中,由于两个东西方向和南北方向车流量的不同,两组灯得计时数也不一样,由于能力有限,在日后单片机学习中还需要进一步深入,不断提高对单片机在实际问题中的应用。
最后,要感谢侯涛老师的悉心指导,在设计过程中,能严格要求我们熟悉设计原理和方法,同时对调试工具和仿真工具有了熟练的掌握。
七.参考文献
[1] 李华,王思明,张金敏.单片机原理及应用[M].兰州:兰州大学出版社,2001.
[2] 皮大雄,南光群,刘金华.单片机课程设计指导书[M].北京:北京理工大学出版社,
2010.。