ImageVerifierCode 换一换
格式:DOCX , 页数:26 ,大小:277.56KB ,
资源ID:11363781      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/11363781.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(基于51单片机的交通信号灯系统设计说明.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

基于51单片机的交通信号灯系统设计说明.docx

1、基于51单片机的交通信号灯系统设计说明毕业设计基于单片机的交通信号的灯控制系统一综合实训的主要容 1.设计任务设计一单片机控制的交通信号灯系统,模拟城市十字路口交通信号灯功能。2.基本功能要求2.1 交通信号控制直行车道红黄绿灯控制、左行车道绿灯控制、人行横道红绿灯控制。2.2 通行时间显示数码管倒计时显示通行时间。2.3 时间参数设置存储按键实现通行时间的设置,并存储到EEPROM(24C02)芯片中。二硬件方案设计与论证1. 显示模块设计1.1倒计时时间显示设计思想:由于该系统要求完成倒计时显示通行时间的功能,且考虑到实际的交通系统中车辆与行人通行时间不会超过一分钟,基于以上原因,我们考虑

2、完全采用数码管显示,四个路口分别采用一个二位共阴极数码管进行显示。(其实物图见附录1图5.3)图2.1 数码管原理图原理图分析:为了显示数字或字符,必须对数字或字符进行编码。七段数码管(a,b,c,d,e,f,g)加上一个小数点(dp),共计8段,构成一个字节,通过对这八段给予高低平使二极管导通或截止,从而显示不同的数字或字符。系统中所使用的是2位共阴数码管(实物图见附录),其管脚从左上方起顺时针依次为1,a,b,e,d,2,g,f,dp,c。1.2 状态灯显示设计思想:由于该系统要求完成状态灯显示的功能,我们把各个路口的红灯和黄灯设成直行和左拐两个通行方式所共有,也就是说,一个路口只需四个状

3、态灯,一个直行通行的绿灯,一个左拐通行的绿灯,一个共有的红灯,一个共有的黄灯,人行横道采用红绿灯控制,综上所述,我们共使用16个LED绿灯,12个LED红灯,4个LED黄灯来完成状态灯显示功能。2.控制模块设计2.1 设计思想由于本系统结构简单,实现较容易,不需要大量的外围扩展,所以我们采用STC89C51单片机作为主控制器,STC89C51单片机具有体积小,功耗低,控制能力强,价格低、扩展灵活,使用方便等特点,其最小系统由振荡电路、复位电路构成。2.2 最小系统原理图图2.2 单片机最小系统原理图原理图分析:51单片机最小系统由复位电路,振荡电路组成。振荡电路使用11.0592Mz高精度晶振

4、,振荡电容选择30pF瓷片电容;复位电路采用RC电路。3.存储模块3.1 设计思想:系统掉电存储模块采用串行E2PROM,它是基于IIC总线的存储器件,遵循二线制协议,其具有接口方便,体积小,数据掉电不丢失等特点。3.2 24C02芯片原理图管脚描述 :A0A1A2引脚 器件地址选择SDA引脚 串行数据/地址SCL引脚串行时钟WP 写保护VCC电源 1.86V VSS 地4系统理论分析4.1交通灯显示时序的理论分析依次循环共分4种状态:南北方向直行通行、南北方向左拐通行、东西方向直行通行,东西方向左拐通行。南北方向直行:南北段直行通行(绿灯)、东西段禁止(红灯),,此时,南北段人行道通行(绿灯

5、),东西段人行道禁止(红灯),同时南北段和东西段方向的数码管分别从20s和30s(加上南北段左拐时间)开始倒计时,至最后5s时南北段绿灯变成黄灯闪烁;此后南北段左拐(左拐绿灯亮)通行、东西段禁止(红灯)10s,南北段、东西段人行道都禁止(红灯),同时南北段和东西段方向的数码管都从10s开始倒计时,至最后5s时南北段左拐灯变成黄灯闪烁;再后东西段直行通行(绿灯)、南北段禁止(红灯),东西段人行道通行(绿灯),南北段人行道禁止(红灯),同时东西段和南北段方向的数码管分别从20s和30s开始倒计时,至最后5s时东西段绿灯变成黄灯闪烁;最后东西段左拐(左拐灯亮)通行、南北段禁止(红灯)10s,东西段、

6、南北段人行道都禁止(红灯),同时东西段和南北段方向的数码管都从10s开始倒计时,至最后5s时东西段左拐灯变成黄灯闪烁,即完成一次循环。4.2 状态切换系统中共设置了四种模式,分别为开始模式、延长通行时间模式、减少左拐时间模式、急停模式,这几种模式分别通过相应的按键进行切换。开始模式:直行20s,左拐10s;延长通行时间模式:直行40s,左拐20s;减少左拐时间模式:直行40s,左拐10s急停模式:当有紧急事故发生时,所有指示灯全变成红灯,禁止通行,数码管显示00.4.3倒计时显示的具体实现利用定时器中断,设置 TH0=TH1(65536-50000)/256,即每0.05秒中断一次。每到第20

7、次中断即过了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#includ

8、e24C02.h/*端口定义*/sbit EW_ShuMa2=P23; /EW方向低位数码管控制位sbit EW_ShuMa1=P22; /EW方向高位数码管控制位sbit SN_ShuMa2=P21; /SN方向低位数码管控制位sbit SN_ShuMa1=P20; /SN方向高位数码管控制位sbit SN_Yellow=P11; /SN黄灯sbit EW_Yellow=P15; /EW黄灯sbit EW_ManGreen=P27; /EW人行道绿灯sbit SN_ManGreen=P24; /SN人行道绿灯sbit EW_ManRed=P26; /EW人行道红灯sbit SN_ManRed

9、=P25; /SN人行道红灯sbit EW_Red=P16; /EW直行道红灯sbit SN_Red=P12; /SN直行道红灯sbit shezhi1=P30; /模式设置键sbit shezhi2=P31; /模式设置键sbit stop1=P37; /紧急情况键bit Flag_SN_Yellow; /SN黄灯标志位bit Flag_EW_Yellow; /EW黄灯标志位char Time_EW; /东西方向倒计时单元char Time_SN; /南北方向倒计时单元uchar EW=30,SN=20,EWL=9,SNL=9; /程序初始化赋值,正常模式uchar EW1=30,SN1=2

10、0,EWL1=9,SNL1=9;uchar code table10=0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F; /0-9段选码uchar code State8=0xBE,0xBD,0xB7,0xBD,0xEB,0xDB,0x7B,0xDB;/*函数声明*/void Delay_ms(uint z);void ShuMa_Display();void timer0_init();void state1();void state2();void state3();void state4();/*主函数*/void main() time

11、r0_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(); /*延时函数*/*void Delay_ms(uint z) uint x,y; for(x=120;x0;x-) for(y=z;y0;y-);*/*数码管显示函数*/ void ShuMa_Display() uchar H,

12、L; H=Time_EW/10; L=Time_EW%10; P0=tableL; EW_ShuMa2=0; /点亮EW_LED2 Delay_ms(1); EW_ShuMa2=1; /熄灭EW_LED2 P0=tableH; EW_ShuMa1=0; /点亮EW_LED1 Delay_ms(1); EW_ShuMa1=1; H=Time_SN/10; L=Time_SN%10; P0=tableL; SN_ShuMa2=0; /点亮SN_LED2 Delay_ms(1); SN_ShuMa2=1; P0=tableH; SN_ShuMa1=0; /点亮SN_LED1 Delay_ms(1);

13、 SN_ShuMa1=1; /*模式函数*/void state1() /*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=State0; /SN绿灯,EW红灯 ShuMa_Display(); P1=0xff;/关闭P1口所有灯 while(Time_SN=0) Flag

14、_SN_Yellow=1; /SN开黄灯信号位 EW_Red=0; /P1=P1 |0XB0; /保持EW红灯 ShuMa_Display(); void state2() /*SN方向左拐状态*/ SN_ManRed=0; /SN人行道禁止 SN_ManGreen=1; EW_ManRed=0; /EW人行道禁止 EW_ManGreen=1; Flag_SN_Yellow=0; /SN关黄灯显示信号 Flag_EW_Yellow=0; /EW关黄灯显示信号 Time_SN=SNL; Time_EW=EWL; while(Time_SN=5) P1=State2; /SN左拐绿灯亮,EW红灯

15、ShuMa_Display(); P1=0xFF; while(Time_SN=0) Flag_SN_Yellow=1; /SN开黄灯信号位 Flag_EW_Yellow=1; ShuMa_Display(); void state3() /*赋值*/ EW=EW1; SN=SN1; EWL=EWL1; SNL=SNL1; /*SN禁止,EW通行状态*/ SN_ManRed=0; /SN人行道禁止 SN_ManGreen=1; EW_ManRed=1; EW_ManGreen=0; /EW人行道通行 Flag_SN_Yellow=0; /SN关黄灯显示信号 Flag_EW_Yellow=0;/

16、EW关黄灯显示信号 Time_EW=SN; Time_SN=EW; while(Time_EW=5) P1=State4;/EW通行,SN红灯 ShuMa_Display(); P1=0Xff; while(Time_EW=0) Flag_EW_Yellow=1;/EW开黄灯信号位 SN_Red=0; /P1=P1|0x0B; /保持SN红灯 ShuMa_Display(); void state4() /*EW方向左拐状态*/ SN_ManRed=0; /SN人行道禁止 SN_ManGreen=1; EW_ManRed=0; /EW人行道禁止 EW_ManGreen=1; Flag_SN_Y

17、ellow=0; /SN关黄灯显示信号 Flag_EW_Yellow=0;/EW关黄灯显示信号 Time_EW=EWL; while(Time_EW=5) P1=State6; /EW左拐绿灯亮,SN红灯 ShuMa_Display(); P1=0Xff; while(Time_EW=0) Flag_EW_Yellow=1; /EN开黄灯信号位 Flag_SN_Yellow=1; ShuMa_Display(); /*赋值*/ EW=EW1; SN=SN1; EWL=EWL1; SNL=SNL1; /*定时器0初始化函数*/ void timer0_init() TMOD=0x01; /定时器

18、0工作方式1 TH0=(65536-10000)/256; /装初值 TL0=(65536-10000)%256; EA=1; /开总中断 ET0=1;/开定时器0中断 TR0=1;/启动定时器/*定时器0服务中断函数*/void timer() interrupt 1 uchar t; 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

19、(13,19); if(shezhi2=0) EW1=50; SN1=40; EWL1=9; SNL1=9; /write(10,60); /write(11,50); /write(12,9); /write(13,9); if(stop1=0) P0=table0; 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) /测试南北黄灯

20、标志位 SN_Yellow=SN_Yellow; if(Flag_EW_Yellow=1) /测试东西黄灯标志位 EW_Yellow=EW_Yellow; if(t=20) Time_EW-; Time_SN-; if(Flag_SN_Yellow=1) /测试南北黄灯标志位 SN_Yellow=SN_Yellow; if(Flag_EW_Yellow=1) /测试东西黄灯标志位 EW_Yellow=EW_Yellow; t=0; 24c02的.h程序#define uchar unsigned char#define uint unsigned intsbit SCL=P35;sbit SD

21、A=P36;/*函数声明*/ void delay();void Delay_ms(uint z);void init(void);void start();void stop();void ack();void noack();void write_byte(uchar dat);uchar read_byte(void);void write(uchar add,uchar dat);uchar read(uchar add);void delay()/短延时,大约5us ; ;void Delay_ms(uint z) uint x,y; for(y=z;y0;y-) for(x=120

22、;x0;x-);void init(void) SDA=1; SCL=1; void start() /启动信号 SDA=1; delay(); SCL=1; delay();/下降沿到来 SDA=0; delay();void stop() /停止信号 SDA=0; delay(); SCL=1; delay(); SDA=1;/上升沿到来 delay();void ack() /应答信号 uchar i; SCL=1; delay(); while(SDA=1)&(i250) /等待应答,用与语句防止一直不应答 i+; SCL=0; /若不应答,也将时钟拉低 delay();void no

23、ack() SDA=1; delay(); SCL=1; delay(); SCL=0; delay();void write_byte(uchar dat)/写字节 uchar i; SCL=0; for(i=0;i8;i+) if(dat&0x80) SDA=1; else SDA=0; dat=dat1; delay(); SCL=1; delay(); SCL=0; /为下一次写数据做准备 delay(); SDA=1; /释放总线 delay(); uchar read_byte(void) /读一个字节 uchar i,dat; SCL=0; delay(); SDA=1;/释放一

24、次总线 delay(); for(i=0;i8;i+) SCL=1; delay(); dat=dat1; if(SDA) dat+; SCL=0; delay(); return dat;void write(uchar add,uchar dat) /在一个地址写一个字节 init(); start(); write_byte(0xa0);/写器件地址 ack(); write_byte(add);/单片机芯片地址 ack(); write_byte(dat); ack(); stop(); Delay_ms(30);uchar read(uchar add) /在一个地址读一个字节 uc

25、har a; start(); write_byte(0xa0);/写器件地址 ack(); write_byte(add); ack(); start(); write_byte(0xa1);/写器件地址 ack(); a=read_byte(); noack(); stop(); return a;四总结通过本次实训,对已有知识有了更进一步的理解和认识,在实训过程中,虽然碰到了很多的问题,但通过查阅相关书籍、资料以与和周围同学交流后都得以一一解决。此外,我还明白了学习的重要性,了解到理论知识与实践相结合的重要意义,学会了坚持、耐心和努力,这将为自己今后的学习和工作做出了最好的榜样。作为一名

26、电气工程与其自动化专业的学生,基于单片机的实训是很有意义的。更重要的是如何把自己平时所学的东西应用到实际中去。本次实训反映的是一个从理论到实际应用的过程,但是更远一点可以联系到毕业之后从学校转到踏上社会的一个过程。同学之间的配合相处,以与自身的动脑和努力,都是以后工作中需要的。当然,通过这次课程设计,我也发现了自身的很多不足之处,在以后的学习中,我会不断的完善自我,不断进取,能使自己在单片机编程这方面有一个大的发展。五附录附录11整体电路原理图图5.1 整体电路原理图2.系统整体实物图图5.2系统整体实物图3. 2位数码管实物图图5.3 2位数码管实物图附录2实验结果1首先,时南北段绿灯亮、东西段红灯亮,南北段人行道绿灯亮,东西段人行道红灯亮,同时南北段和东西段方向的数码管分别从20s和30s开始倒计时。215秒后,南北方向的黄灯闪烁5秒钟,此时东西方向仍维持红灯亮,人行道灯不变。35秒闪烁后,南北方向左拐灯亮,东西方向红灯亮,东西和南北人行道全部红灯亮,同时南北段和东西段方向的数码管分别从10秒开始倒计时。410秒后,南北方向的黄灯闪烁5秒,此时东西方向仍维持红灯亮,人行道灯不变。55秒闪烁后,东西段绿灯亮

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1