收藏 分享(赏)

单片机实训--交通灯控制系统.doc

上传人:精品资料 文档编号:10814688 上传时间:2020-01-11 格式:DOC 页数:18 大小:253KB
下载 相关 举报
单片机实训--交通灯控制系统.doc_第1页
第1页 / 共18页
单片机实训--交通灯控制系统.doc_第2页
第2页 / 共18页
单片机实训--交通灯控制系统.doc_第3页
第3页 / 共18页
单片机实训--交通灯控制系统.doc_第4页
第4页 / 共18页
单片机实训--交通灯控制系统.doc_第5页
第5页 / 共18页
点击查看更多>>
资源描述

1、1桂林电子科技大学信息科技学院单片机交通灯实训报告学 号 0951100231 姓 名 贾小丹 指导教师:韩剑 易艺 李德明 2011 年 09 月 22 日2交通灯控制系统一、 任务利用 AT89S52 单片机控制各个路口红绿灯及时间显示,设计一个交通灯控制系统。 二、 基本原理利用 51 单片机控制各个路口红绿灯及时间显示。模拟交通灯示意图:东南西北次 干 道主干道设计的重点:1、各个路口红绿灯亮灭的规则,暂不考虑左转方向;2、倒计时的实现,利用单片机的定时器进行计数得到秒信号;3、时间显示:东西南北四个方向的时间一致,当东西方向为 60 秒绿灯通行时间,同时南北方向为 60 秒红灯禁止时

2、间,因此硬件连接时可考虑东西南北方向可采用同一接法;最后相当于 2 个数码管动态显示,具体见参考电路框图。4、按键设置(扩展要求):设置键按一次,设置主干道通信时间(即次干道禁止时间) ,按第二次,设置主干道禁止时间(即次干道通信时间) ,按第三次,可作为紧急通信键。设置时间需要确定,可通过确定键实现,也可通过延时确定,如 10 秒。当然也可根据需要增加相应的按键。参考电路框图单片机12 只发光二极管 (红、黄、绿)按键(设置、+、- 、确定)2 位一体共阴数码管3三、性能指标要求1、各方向的红、绿色信号灯能按照设定规则运行;2、绿灯亮之前,黄灯闪烁 5 次;3、红灯和绿灯倒计时间能够正确显示

3、;4、两干道的车辆不会会车冲突。5、可以扩展其他功能(如按键设置时间,按键模拟警车。四 方案论证一、 方案比较论证方案一:纯数字电路方式用数电器件设计:时钟分频模块,交通灯亮灭控制模块,交通灯显示模块,倒计时计数模块,倒计时显示模块,实现交通灯的控制和显示功能。优点是不需要软件编程控制,缺点是硬件规模庞大且不能实现延时可调。方案二:FPGA/CPLD 方式FPGA/CPLD 除了完成交通灯控制、存储和显示功能外,还可进行人机交互,实现定时器延时可调。这种方案系统结构紧凑,但调试过程繁琐。方案三:单片机方式利用单片机控制相应并口,模拟交通灯显示,利用其并口 P2 口实现数码管显示。利用外部中断功

4、能,完成交通灯主干次道通行时间任意可调。此方案占用硬件资源少、功能齐全、调试过程简单。本设计采用方案三。二、 原理图,交通灯原理图为下图所示:部分原理图分析:4东西、南北方向的数码管对角线放置,发光二极管连一个 1K 的电阻,防止灯烧。5这里的按键是实现复位清零的功能。这里的按键 P3.4 按一下,进入倒计时时间设置,P3.5 是实现显示时间减一功能,P3.6 实现显示时间加一功能,P3.7 实现确认功能。交通灯6五、 交通灯 C 语言程序为:#include /*-/【贾小丹 (AdvancyYP)制作】/-*/* 名称 : 交通灯单片机型号 :51系列单片机晶振 : 12MHz*/*-/【

5、贾小丹 (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.77/*定义行为*/#define LIGHT_RED (LIGHT = 0xDE)/红灯亮起/#define LIGHT_

6、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,

7、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

8、.通行)/*/函数声明/*/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);/模式函数/*/时间函数/8/*/void _1ms()/1ms延时函数unsigned char a,b,c;for(c=1;c0;c-)for(b=142;b0;b-)for(a=2;a0;a-);vo

9、id _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 =

10、set_stop_time;/获取设定好的禁止时间run_time = set_run_time;/获取设定好的通行时间t_10ms=0;/初始化10ms定时计数变量TR0=1;/开启TR0ET0=1;/定时器0开启EA=1;/总中断开启9/*/定时计数器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)/

11、禁止时间等于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)10elseif(stop_run!=0)/如果当前状态为:通行t_10ms+;/10ms变量自增if(t_10ms=100)/如果定时计数到1st_10ms=0;/10ms定时计数变

12、量清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)/*11*/数码管函数/*/void SMG(unchar x_seg, unchar x_bit)SMG_

13、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);/禁止时时

14、间显示函数elseif(stop_run!=0)/当前状态:通行DISPLAY_TIME(run_time);/通行时时间显示函数12if(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_GR

15、EEN;/绿灯亮起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;/回到模式113break;/退出case KEY2 : /如果按键2被按下if(set_run_time6)/如果通行时间大于6秒set_run_tim

16、e-;/设置的通行时间减小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;/其它wh

17、ile(KEY!=0xFF);/等待按键释放_Nms(10);/10ms延时函数elseif(now_mode=3)/3.系统设置主干道紧急通行15ET0=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

18、;/回到模式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延时函数16/*/主函数/*/void main(void)set_stop_tim

19、e = 60;/禁止时间:60sset_run_time = 60;/通行时间:60sstop_run = 0;/当前状态:禁止T0_INITIAL();/定时计数器T0初始化while(1)MODE();/模式函数六、 制作与调试过程1.状态灯显示测试由于在刚焊接好电路板的时候,没有下载程序,而且有虚焊的线路,所以,状态指示灯都没有亮。然后,我仔细的检查电路板,终于,接上电源以后,状态指示灯都可以亮。2数码管的测试测试数码管的时候,我将下好的程序下载到电路板上检测。由于,我焊的板子下载口有虚焊的地方。所以,导致下载不了。于是,我又重新检测板子,再次确认下载口焊接好了后,下载好程序,数码管显示

20、正确。3整体电路测试在确认硬件和软件都正确的情况下,我把程序下载在板子里。检测题目的要求是否完成。首先,是红,黄,绿灯在主干道和次干道显示正确。然后,测试附17加按键功能,都能够实现模块选择,主干道通行时间和次干道通行时间,紧急通行。所以,整体电路测试成功。七、实训心得体会通过这几天的单片机实训,我觉得我的收获很大。说实话,我的单片机知识基础不好,因为,在之前的单片机理论课和实验课的学习中我没有认真学习,所以,没有打好基础。在实训的时候,我没有信心可以做好本次实训。但是,我依旧努力的去查资料,把单片机的实验认真复习,开始我的单片机实训。首先,是从原理图开始,我上网查了很多关于 AT89S52单

21、片机芯片的资料,包括管脚和功能。开始画原理图。基于对 Protel 99软件的应用,所以,原理图很快就画好了,在拿给老师检查之后,我开始焊板。焊板是比较复杂的一个过程,因为,单片机实训的焊板不同于之前的做的实训,单片机实训没有 PCB 原理图,所以,必须用铁丝线搭建电路。所以,在焊电路板的时候要很仔细的检查每一根电路。由于我自己的不小心,我虚焊了很多,所以,在板子焊好之后,功能不能显示,于是,我仔细的检查了很多次,终于,板子成功。之后,就是写程序。我做的交通灯的程序可以用 C 语言和汇编语言编写。我用的是 C 语言。写程序是比较困难的,我上网找了很多的资料,在自己查资料,看书,各种收集资料,阅

22、读程序之后,反复修改,终于,写出了程序。所以,历经困难重重我的交通灯单片机实训终于完成。每一次的实训都能给我带来很大的成就感,让我明白很多知识。真正的让我认识到“时间是检验真理唯一的标准” 。通过本次实训,让我在理论的基础上更深刻的掌握了单片机的深层内容集实际生活中应用,实训锻炼了我自己动手能力和思维能力,还有在软件方面的编程能力,让我受益匪浅,同时也暴露出一些平时学习上的问题,让我深刻反思。通过实训软件上的应用,让我更熟悉掌握了 Keil uVision3, Protel 99 SE 这些应用程序的运用,让我懂得了如何编写一些简单的程序,学会了如何制作单片机应用程序,还有焊接和程序固化。所以,在以后的学习中,我希望自己能够更多的学习专业知识,能够把课本的知识运用到实际生活中。希望每一次的实训都能够锻炼自己的实践能力。参考文献1、 单片机原理与应用技术 李建民、喻晗 西安电子科技大学出版社 2、 MCS-51 系列单片机应用系统设计 何立民 北京航空航天大学出版社183、 单片机原理与应用 孙俊逸 张铮 清华大学出版社

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报