单片机实训--交通灯.doc_第1页
单片机实训--交通灯.doc_第2页
单片机实训--交通灯.doc_第3页
单片机实训--交通灯.doc_第4页
单片机实训--交通灯.doc_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

桂林电子科技大学信息科技学院单片机交通灯实训报告学 号 0951100231 姓 名 贾小丹 指导教师:韩剑 易艺 李德明 2011 年 09 月 22 日交通灯控制系统一、 任务利用AT89S52单片机控制各个路口红绿灯及时间显示,设计一个交通灯控制系统。 二、 基本原理利用51单片机控制各个路口红绿灯及时间显示。模拟交通灯示意图:设计的重点:1、各个路口红绿灯亮灭的规则,暂不考虑左转方向;2、倒计时的实现,利用单片机的定时器进行计数得到秒信号;3、时间显示:东西南北四个方向的时间一致,当东西方向为60秒绿灯通行时间,同时南北方向为60秒红灯禁止时间,因此硬件连接时可考虑东西南北方向可采用同一接法;最后相当于2个数码管动态显示,具体见参考电路框图。4、按键设置(扩展要求):设置键按一次,设置主干道通信时间(即次干道禁止时间),按第二次,设置主干道禁止时间(即次干道通信时间),按第三次,可作为紧急通信键。设置时间需要确定,可通过确定键实现,也可通过延时确定,如10秒。当然也可根据需要增加相应的按键。 参考电路框图2位一体共阴数码管12只发光二极管 (红、黄、绿) 单片机按键(设置、+、-、确定)三、性能指标要求1、各方向的红、绿色信号灯能按照设定规则运行;2、绿灯亮之前,黄灯闪烁5次;3、红灯和绿灯倒计时间能够正确显示;4、两干道的车辆不会会车冲突。5、可以扩展其他功能(如按键设置时间,按键模拟警车。四 方案论证一、 方案比较论证方案一:纯数字电路方式 用数电器件设计:时钟分频模块,交通灯亮灭控制模块,交通灯显示模块,倒计时计数模块,倒计时显示模块,实现交通灯的控制和显示功能。优点是不需要软件编程控制,缺点是硬件规模庞大且不能实现延时可调。方案二:FPGA/CPLD方式FPGA/CPLD除了完成交通灯控制、存储和显示功能外,还可进行人机交互,实现定时器延时可调。这种方案系统结构紧凑,但调试过程繁琐。方案三:单片机方式利用单片机控制相应并口,模拟交通灯显示,利用其并口P2口实现数码管显示。利用外部中断功能,完成交通灯主干次道通行时间任意可调。此方案占用硬件资源少、功能齐全、调试过程简单。本设计采用方案三。二、 原理图,交通灯原理图为下图所示:部分原理图分析:东西、南北方向的数码管对角线放置,发光二极管连一个1K的电阻,防止灯烧。这里的按键是实现复位清零的功能。这里的按键P3.4按一下,进入倒计时时间设置,P3.5是实现显示时间减一功能,P3.6实现显示时间加一功能,P3.7实现确认功能。交通灯五、 交通灯C语言程序为:#include /*-/【贾小丹 (AdvancyYP)制作】/-*/* 名称 : 交通灯 单片机型号 :51系列单片机 晶振 : 12MHz*/*-/【贾小丹 (AdvancyYP)制作】/-*/*定义名称*/#define unint unsigned int#define unchar unsigned char /*定义管脚*/#define SMG_SEG P1 /定义数码管段选口为:P0#define SMG_BIT P2 /定义数码管位选口为:P2#define LIGHT P0 /定义红绿灯口为:P1#define KEY P3 /定义按键口为:P3sbit BEEP = P27; /定义蜂鸣器管脚为P3.7/*定义行为*/#define LIGHT_RED (LIGHT = 0xDE)/红灯亮起/#define LIGHT_YELLOW (LIGHT = 0xED)/黄灯亮起/#define LIGHT_GREEN (LIGHT = 0xF3)/绿灯亮起/#define LIGHT_OFF (LIGHT = 0xFF)/全部熄灭#define KEY1 0xEF/KEY1按下#define KEY2 0xDF/KEY2按下#define KEY3 0xBF/KEY3按下#define KEY4 0x7F/KEY4按下/*定义数码管编码*/数码管段码/(共阳)unchar code SMG_SEG_CODE=0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F;/数码管段码/数码管位码/(共阴)unchar code SMG_BIT_CODE=0xFD, 0xFE;/数码管位码/*定义时间变量*/unchar th, tl;/定时计数器初值变量unchar t_10ms, stop_time, run_time, set_stop_time, set_run_time;/时间变量/*定义模式、状态标识符*/unchar now_mode;/定义当前模式标识符/(注:0.系统运行模式 1.系统设置主干道通行时间 2.系统设置主干道禁止时间 3.系统设置主干道紧急通行)unchar stop_run;/定义:禁止通行标识符/(注:0.禁止 非0.通行)/*/ /函数声明/*/void _1ms();/1ms延时函数void _Nms(unsigned int N);/N*1ms延时函数void T0_INITIAL(void);/定时计数器T0初始化void SMG(unchar x_seg, unchar x_bit);/数码管函数void DISPLAY_TIME(unchar t);/显示时间函数void MODE(void);/模式函数/*/ /时间函数/*/void _1ms()/1ms延时函数unsigned char a,b,c;for(c=1;c0;c-)for(b=142;b0;b-)for(a=2;a0;a-);void _Nms(unsigned int N)/N*1ms延时函数while(N)_1ms();N-;/*/ /定时计数器T0初始化/*/void T0_INITIAL(void)EA=0;/总中断关闭ET0=0;/定时器0关闭TR0=0;/关闭TR0TMOD = 0x01;/设置定时器工作方式为16位定时器自动重装(方式1)th=(65536-10000)/256;/定时计数器初值计算(定时10ms)tl=(65536-10000)%256;/定时计数器初值计算(定时10ms)TH0=th;/定时器0附初始值(定时10ms)TL0=tl;/定时器0附初始值(定时10ms)stop_time = set_stop_time;/获取设定好的禁止时间run_time = set_run_time;/获取设定好的通行时间t_10ms=0;/初始化10ms定时计数变量TR0=1;/开启TR0ET0=1;/定时器0开启EA=1;/总中断开启/*/ /定时计数器T0中断/*/void T0_INTERRUPT(void) interrupt 1 using 1if(stop_run=0)/如果当前状态为:禁止t_10ms+;/10ms变量自增if(t_10ms=100)/如果定时计数到1st_10ms=0;/10ms定时计数变量清0stop_time-;/禁止时间自减if(stop_time=0)/禁止时间等于0时run_time = set_run_time;/获取设定好的通行时间stop_run = stop_run;/转换到通行状态if(stop_time0)/当禁止时间小于等于5秒并且大于0秒的时候if(t_10ms=50)/0.5秒外LIGHT_YELLOW;/黄灯亮elseLIGHT_RED;/红灯亮TH0=th;/定时器0附初始值(定时10ms)TL0=tl;/定时器0附初始值(定时10ms)elseif(stop_run!=0)/如果当前状态为:通行t_10ms+;/10ms变量自增if(t_10ms=100)/如果定时计数到1st_10ms=0;/10ms定时计数变量清0run_time-;/通行时间自减if(run_time=0)/通行时间等于0时stop_time = set_stop_time;/获取设定好的禁止时间stop_run = stop_run;/转换到禁止状态if(run_time0)/当通行时间小于等于5秒并且大于0秒的时候if(t_10ms=50)/0.5秒外LIGHT_YELLOW;/黄灯亮elseLIGHT_GREEN;/绿灯亮TH0=th;/定时器0附初始值(定时10ms)TL0=tl;/定时器0附初始值(定时10ms)/*/ /数码管函数/*/void SMG(unchar x_seg, unchar x_bit)SMG_SEG = SMG_SEG_CODEx_seg;/数码管段选SMG_BIT = SMG_BIT_CODEx_bit;/数码管位选/*/ /显示时间函数/*/void DISPLAY_TIME(unchar t)SMG(t/10), 1);/时间的十位_Nms(1);/1ms延时函数SMG(t%10), 0);/时间的个位_Nms(1);/1ms延时函数/*/ /模式函数/*/void MODE(void)if(now_mode=0)/0.系统运行模式while(now_mode=0)/0.系统运行模式if(stop_run=0)/当前状态:禁止DISPLAY_TIME(stop_time);/禁止时时间显示函数elseif(stop_run!=0)/当前状态:通行DISPLAY_TIME(run_time);/通行时时间显示函数if(KEY=KEY1)/如果按键1被按下_Nms(10);/10ms延时去抖if(KEY=KEY1)/如果按键1被按下now_mode+;/移动到下一模式if(now_mode=4)/如果增到模式4now_mode = 1;/回到模式1(注:只有模式 0、1、2、3 可选)while(KEY=KEY1);/等待按键1释放_Nms(10);/10ms延时去抖elseif(now_mode=1)/1.系统设置主干道通行时间ET0=0;/定时器0关闭LIGHT_GREEN;/绿灯亮起while(now_mode=1)/1.系统设置主干道通行时间DISPLAY_TIME(set_run_time);/显示设定的通行时间if(KEY!=0xFF)/有按键按下_Nms(10);/10ms延时函数if(KEY!=0xFF)/有按键按下switch(KEY)/获取键值case KEY1 : /如果按键1被按下now_mode+;/移动到下一模式if(now_mode=4)/如果增到模式4now_mode = 1;/回到模式1break;/退出case KEY2 : /如果按键2被按下if(set_run_time6)/如果通行时间大于6秒set_run_time-;/设置的通行时间减小break;/退出case KEY3 : /如果按键3被按下if(set_run_time6)/如果禁止时间大于6秒set_stop_time-;/设置的禁止时间减小break;/退出case KEY3 : /如果按键3被按下if(set_stop_time60)/如果禁止时间小于60秒set_stop_time+;/设置的通行时间增大break;/退出case KEY4 : /如果按键4被按下now_mode = 0;/确定键按下,回到模式 /0.系统运行模式T0_INITIAL();/定时计数器T0初始化break;/退出default : break;/其它while(KEY!=0xFF);/等待按键释放_Nms(10);/10ms延时函数elseif(now_mode=3)/3.系统设置主干道紧急通行ET0=0;/定时器0关闭LIGHT_GREEN;/绿灯亮起while(now_mode=3)/3.系统设置主干道紧急通行DISPLAY_TIME(0);/显示0if(KEY!=0xFF)/有按键按下_Nms(10);/10ms延时函数if(KEY!=0xFF)/有按键按下switch(KEY)/获取键值case KEY1 : /如果按键1被按下now_mode+;/移动到下一模式if(now_mode=4)/如果增到模式4now_mode = 1;/回到模式1break;/退出case KEY2 : /如果按键2被按下:主干道紧急通行LIGHT_GREEN;/绿灯亮起break;/退出case KEY3 : /如果按键3被按下:次干道紧急通行LIGHT_RED;/红灯亮起break;/退出case KEY4 : /如果按键4被按下now_mode = 0;/确定键按下,回到模式 /0.系统运行模式ET0=1;/定时器0开启break;/退出default : break;/其它while(KEY!=0xFF);/等待按键释放_Nms(10);/10ms延时函数/*/ /主函数/*/void main(void)set_stop_time = 60;/禁止时间:60sset_run_time = 60;/通行时间:60sstop_run = 0;/当前状态:禁止T0_INITIAL();/定时计数器T0初始化while(1)MODE();/模式函数六、 制作与调试过程1.状态灯显示测试由于在刚焊接好电路板的时候,没有下载程序,而且有虚焊的线路,所以,状态指示灯都没有亮。然后,我仔细的检查电路板,终于,接上电源以后,状态指示灯都可以亮。2数码管的测试测试数码管的时候,我将下好的程序下载到电路板上检测。由于,我焊的板子下载口有虚焊的地方。所以,导致下载不了。于是,我又重新检测板子,再次确认下载口焊接好了后,下载好程序,数码管显示正确。3整体电路测试在确认硬件和软件都正确的情况下,我把程序下载在板子里。检测题目的要求是否完成。首先,是红,黄,绿灯在主干道和次干道显示正确。然后,测试附加按键功能,都能够实现模块选择,主干道通行时间和次干道通行时间,紧急通行。所以,整体电路测试成功。七、实训心得体会 通过这几天的单片机实训,我觉得我的收获很大。说实话,我的单片机知识基础不好,因为,在之前的单片机理论课和实验课的学习中我没有认真学习,所以,没有打好基础。在实训的时候,我没有信心可以做好本次实训。但是,我依旧努力的去查资料,把单片机的实验认真复习,开始我的单片机实训。首先,是从原理图开始,我上网查了很多关于AT89S52单片机芯片的资料,包括管脚和功能。开始画原理图。基于对Protel 99软件的应用,所以,原理图很快就画好了,在拿给老师检查之后,我开始焊板。焊板是比较复杂的一个过程

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论