基于51单片机的交通信号灯系统Word文档下载推荐.docx
- 文档编号:20312365
- 上传时间:2023-01-21
- 格式:DOCX
- 页数:23
- 大小:268.25KB
基于51单片机的交通信号灯系统Word文档下载推荐.docx
《基于51单片机的交通信号灯系统Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《基于51单片机的交通信号灯系统Word文档下载推荐.docx(23页珍藏版)》请在冰豆网上搜索。
SCL引脚串行时钟
WP写保护
VCC电源1.8~6V
VSS地
4.系统理论分析
4.1交通灯显示时序的理论分析
依次循环共分4种状态:
南北方向直行通行、南北方向左拐通行、东西方向直行通行,东西方向左拐通行。
南北方向直行:
南北段直行通行(绿灯)、东西段禁止(红灯),,此时,南北段人行道通行(绿灯),东西段人行道禁止(红灯),同时南北段和东西段方向的数码管分别从20s和30s(加上南北段左拐时间)开始倒计时,至最后5s时南北段绿灯变成黄灯闪烁;
此后南北段左拐(左拐绿灯亮)通行、东西段禁止(红灯)10s,南北段、东西段人行道都禁止(红灯),同时南北段和东西段方向的数码管都从10s开始倒计时,至最后5s时南北段左拐灯变成黄灯闪烁;
再后东西段直行通行(绿灯)、南北段禁止(红灯),东西段人行道通行(绿灯),南北段人行道禁止(红灯),同时东西段和南北段方向的数码管分别从20s和30s开始倒计时,至最后5s时东西段绿灯变成黄灯闪烁;
最后东西段左拐(左拐灯亮)通行、南北段禁止(红灯)10s,东西段、南北段人行道都禁止(红灯),同时东西段和南北段方向的数码管都从10s开始倒计时,至最后5s时东西段左拐灯变成黄灯闪烁,即完成一次循环。
4.2状态切换
系统中共设置了四种模式,分别为开始模式、延长通行时间模式、减少左拐时间模式、急停模式,这几种模式分别通过相应的按键进行切换。
开始模式:
直行20s,左拐10s;
延长通行时间模式:
直行40s,左拐20s;
减少左拐时间模式:
直行40s,左拐10s
急停模式:
当有紧急事故发生时,所有指示灯全变成红灯,禁止通行,数码管显示00.
4.3倒计时显示的具体实现
利用定时器中断,设置TH0=TH1=(65536-50000)/256,即每0.05秒中断一次。
每到第20次中断即过了20*0.05秒=1秒时,使时间的计数值减1,便实现了倒计时的功能。
4.4状态灯显示的实现方法
黄灯闪烁利用定时器中断。
每到第10次中断即过了10*0.05秒=0.5秒时,使黄灯标志位反置,即可让黄灯1秒闪烁一次。
4.5状态切换的实现方法
状态切换在定时器中实现,定时器每0.05秒中断一次,完全可以检测按键的发生。
考虑到实际的交通系统不可能立即切换状态,程序一个周期内检测两次状态,若在南北左拐前按键修改状态,则南北左拐结束后切换状态,若在南北左拐后修改状态,则在东西左拐后切换状态。
三.软件编程
1.程序流程图
图3.1主程序流程图
图3.2定时0中断流程图
2.程序
#include<
reg52.h>
#include"
24C02.h"
/*************端口定义*************/
sbitEW_ShuMa2=P2^3;
//EW方向低位数码管控制位
sbitEW_ShuMa1=P2^2;
//EW方向高位数码管控制位
sbitSN_ShuMa2=P2^1;
//SN方向低位数码管控制位
sbitSN_ShuMa1=P2^0;
//SN方向高位数码管控制位
sbitSN_Yellow=P1^1;
//SN黄灯
sbitEW_Yellow=P1^5;
//EW黄灯
sbitEW_ManGreen=P2^7;
//EW人行道绿灯
sbitSN_ManGreen=P2^4;
//SN人行道绿灯
sbitEW_ManRed=P2^6;
//EW人行道红灯
sbitSN_ManRed=P2^5;
//SN人行道红灯
sbitEW_Red=P1^6;
//EW直行道红灯
sbitSN_Red=P1^2;
//SN直行道红灯
sbitshezhi1=P3^0;
//模式设置键
sbitshezhi2=P3^1;
sbitstop1=P3^7;
//紧急情况键
bitFlag_SN_Yellow;
//SN黄灯标志位
bitFlag_EW_Yellow;
//EW黄灯标志位
charTime_EW;
//东西方向倒计时单元
charTime_SN;
//南北方向倒计时单元
ucharEW=30,SN=20,EWL=9,SNL=9;
//程序初始化赋值,正常模式
ucharEW1=30,SN1=20,EWL1=9,SNL1=9;
ucharcodetable[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
//0-9段选码
ucharcodeState[8]={0xBE,0xBD,0xB7,0xBD,0xEB,0xDB,0x7B,0xDB};
/*************函数声明***************/
voidDelay_ms(uintz);
voidShuMa_Display();
voidtimer0_init();
voidstate1();
voidstate2();
voidstate3();
voidstate4();
/**************主函数************/
voidmain()
{
timer0_init();
//定时器初始化
EW1=read(10);
//24c02读操作
SN1=read(11);
EWL1=read(12);
SNL1=read(13);
EW=EW1;
SN=SN1;
EWL=EWL1;
SNL=SNL1;
//Int_init();
while
(1)
{
state1();
state2();
state3();
state4();
}
}
/*************延时函数*************/
/*voidDelay_ms(uintz)
{uintx,y;
for(x=120;
x>
0;
x--)
for(y=z;
y>
y--);
}*/
/**************数码管显示函数*****************/
voidShuMa_Display()
ucharH,L;
H=Time_EW/10;
L=Time_EW%10;
P0=table[L];
EW_ShuMa2=0;
//点亮EW_LED2
Delay_ms
(1);
EW_ShuMa2=1;
//熄灭EW_LED2
P0=table[H];
EW_ShuMa1=0;
//点亮EW_LED1
EW_ShuMa1=1;
H=Time_SN/10;
L=Time_SN%10;
P0=table[L];
SN_ShuMa2=0;
//点亮SN_LED2
SN_ShuMa2=1;
SN_ShuMa1=0;
//点亮SN_LED1
SN_ShuMa1=1;
/***************模式函数****************/
voidstate1()
/*********SN通行SW禁止*********/
SN_ManRed=1;
SN_ManGreen=0;
//SN人行道通行
EW_ManRed=0;
//EW人行道禁止
EW_ManGreen=1;
Flag_SN_Yellow=0;
//SN关黄灯显示信号
Flag_EW_Yellow=0;
//EW关黄灯显示信号
Time_EW=EW;
Time_SN=SN;
while(Time_SN>
=5)
{
P1=State[0];
//SN绿灯,EW红灯
ShuMa_Display();
}
P1=0xff;
//关闭P1口所有灯
=0)
{
Flag_SN_Yellow=1;
//SN开黄灯信号位
EW_Red=0;
//P1=P1|0XB0;
//保持EW红灯
ShuMa_Display();
}
voidstate2()
/************SN方向左拐状态**********/
SN_ManRed=0;
//SN人行道禁止
SN_ManGreen=1;
Time_SN=SNL;
Time_EW=EWL;
P1=State[2];
//SN左拐绿灯亮,EW红灯
P1=0xFF;
Flag_EW_Yellow=1;
}
voidstate3()
/***********赋值*********/
EW=EW1;
SN=SN1;
EWL=EWL1;
SNL=SNL1;
/*******SN禁止,EW通行状态**********/
EW_ManRed=1;
EW_ManGreen=0;
//EW人行道通行
//EW关黄灯显示信号
Time_EW=SN;
Time_SN=EW;
while(Time_EW>
P1=State[4];
//EW通行,SN红灯
P1=0Xff;
Flag_EW_Yellow=1;
//EW开黄灯信号位
SN_Red=0;
//P1=P1|0x0B;
//保持SN红灯
voidstate4()
/***********EW方向左拐状态**************/
P1=State[6];
//EW左拐绿灯亮,SN红灯
//EN开黄灯信号位
/***********赋值*********/
}
/****************定时器0初始化函数***************/
voidtimer0_init()
TMOD=0x01;
//定时器0工作方式1
TH0=(65536-10000)/256;
//装初值
TL0=(65536-10000)%256;
EA=1;
//开总中断
ET0=1;
//开定时器0中断
TR0=1;
//启动定时器
/*******************定时器0服务中断函数***********/
voidtimer()interrupt1
{
uchart;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
t++;
if(shezhi1==0)
EW1=60;
SN1=40;
EWL1=19;
SNL1=19;
write(10,60);
//24C02写操作
write(11,40);
write(12,19);
write(13,19);
if(shezhi2==0)
EW1=50;
EWL1=9;
SNL1=9;
//write(10,60);
//write(11,50);
//write(12,9);
//write(13,9);
if(stop1==0)
P0=table[0];
EW_ShuMa2=0;
EW_ShuMa1=0;
SN_ShuMa2=0;
SN_ShuMa1=0;
P1=0XBB;
EW_ManGreen=1;
SN_ManGreen=1;
EW_ManRed=0;
SN_ManRed=0;
while
(1);
if(t==10)
{
if(Flag_SN_Yellow==1)//测试南北黄灯标志位
{SN_Yellow=~SN_Yellow;
if(Flag_EW_Yellow==1)//测试东西黄灯标志位
{EW_Yellow=~EW_Yellow;
}
if(t==20)
Time_EW--;
Time_SN--;
SN_Yellow=~SN_Yellow;
}
EW_Yellow=~EW_Yellow;
t=0;
24c02的.h程序
#defineucharunsignedchar
#defineuintunsignedint
sbitSCL=P3^5;
sbitSDA=P3^6;
/*************函数声明************/
voiddelay();
voidinit(void);
voidstart();
voidstop();
voidack();
voidnoack();
voidwrite_byte(uchardat);
ucharread_byte(void);
voidwrite(ucharadd,uchardat);
ucharread(ucharadd);
voiddelay()//短延时,大约5us
;
;
voidDelay_ms(uintz)
y--)
for(x=120;
x--);
voidinit(void)
SDA=1;
SCL=1;
voidstart()//启动信号
delay();
//下降沿到来
SDA=0;
voidstop()//停止信号
//上升沿到来
voidack()//应答信号
uchari;
while((SDA==1)&
&
(i<
250))//等待应答,用与语句防止一直不应答
i++;
SCL=0;
//若不应答,也将时钟拉低
voidnoack()
voidwrite_byte(uchardat)//写字节
for(i=0;
i<
8;
i++)
if(dat&
0x80)
SDA=1;
else
SDA=0;
dat=dat<
<
1;
delay();
SCL=1;
SCL=0;
//为下一次写数据做准备
SDA=1;
//释放总线
ucharread_byte(void)//读一个字节
uchari,dat;
//释放一次总线
if(SDA)
dat++;
returndat;
voidwrite(ucharadd,uchardat)//在一个地址写一个字节
init();
start();
write_byte(0xa0);
//写器件地址
ack();
write_byte(add);
//单片机芯片地址
write_byte(dat);
stop();
Delay_ms(30);
ucharread(ucharadd)//在一个地址读一个字节
uchara;
write_byte(0xa1);
a=read_byte();
noack();
returna;
四.总结
通过本次实训,对已有知识有了更进一步的理解和认识,在实训过程中,虽然碰到了很多的问题,但通过查阅相关书籍、资料以及和周围同学交流后都得以一一解决。
此外,我还明白了学习的重要性,了解到理论知识与实践相结合的重要意义,学会了坚持、耐心和努力,这将为自己今后的学习和工作做出了最好的榜样。
作为一名电气工程及其自动化专业的学生,基于单片机的实训是很有意义的。
更重要的是如何把自己平时所学的东西应用到实际中去。
本次实训反映的是一个从理论到实际应用的过程,但是更远一点可以联系到毕业之后从学校转到踏上社会的一个过程。
同学之间的配合﹑相处,以及自身的动脑和努力,都是以后工作中需要的。
当然,通过这次课程设计,我也发现了自身的很多不足之处,在以后的学习中,我会不断的完善自我,不断进取,能使自己在单片机编程这方面有一个大的发展。
五.附录
附录1
1.整体电路原理图
图5.1整体电路原理图
2.系统整体实物图
图5.2系统整体实物图
3.2位数码管实物图
图5.32位数码管实物图
附录2实验结果
1.首先,时南北段绿灯亮、东西段红灯亮,南北段人行道绿灯亮,东西段人行道红灯亮,同时南北段和东西段方向的数码管分别从20s和30s开始倒计时。
2.15秒后,南北方向的黄灯闪烁5秒钟,此时东西方向仍维持红灯亮,人行道灯不变。
3.5秒闪烁后,南北方向左拐灯亮,东西方向红灯亮,东西和南北人行道全部红灯亮,同时南北段和东西段方向的数码管分别从10秒开始倒计时。
4.10秒后,南北方向的黄灯闪烁5秒,此
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 51 单片机 交通 信号灯 系统