单片机交通灯课设报告.docx
《单片机交通灯课设报告.docx》由会员分享,可在线阅读,更多相关《单片机交通灯课设报告.docx(27页珍藏版)》请在冰豆网上搜索。
![单片机交通灯课设报告.docx](https://file1.bdocx.com/fileroot1/2022-12/14/eff5a8e5-4a43-4094-a1e7-ff3fa2c1f796/eff5a8e5-4a43-4094-a1e7-ff3fa2c1f7961.gif)
单片机交通灯课设报告
摘要
随着社会经济的发展,城市问题越来越引起人们的关注。
人、车、路三者关系的协调,已成为交通管理部门需要解决的重要问题之一。
城市交通控制系统是用于城市交通数据检测、交通信号灯控制与交通疏通的计算机综合管理系统,它是现代城市交通监控指挥系统中最重要的组成部分。
十字路口车辆穿梭,行人熙攘,车行车道,人行人道,有条不紊。
那么靠什么来实现这井然秩序呢?
靠的就是交通信号灯的自动指挥系统。
交通灯的控制方式很多,本系统采用可编程并行I/O接口芯片STC90C516RD为中心器件来设计交通灯控制器,实现本系统的各种功能。
同时,本系统实用性强,操作简单。
本设计系统由LED数码显示系统、点阵显示系统两大部分组成。
系统除基本的交通灯功能外,还具有倒计时等功能,较好的模拟实现了十字路口可能出现的状况。
软件上采用C51编程,主要编写了主程序,点阵显示程序,LED数码管显示程序,内部定时器T0中断定时程序,外部中断INT0和INT1的中断程序等。
经过整机调试,实现了对十字路口交通灯的模拟。
关键字:
STC90C51交通灯LED数码管倒计时
一、引言
1.1设计背景
当今,红绿灯安装在各个道口上,已经成为疏导交通车辆最常见和最有效的手段。
但这一技术在19世纪就已出现了。
1858年,在英国伦敦主要街头安装了以燃煤气为光源的红,蓝两色的机械扳手式信号灯,用以指挥马车通行。
这是世界上最早的交通信号灯。
1868年,英国机械工程师纳伊特在伦敦威斯敏斯特区的议会大厦前的广场上,安装了世界上最早的煤气红绿灯。
它由红绿两以旋转式方形玻璃提灯组成,红色表示“停止”,绿色表示“注意”。
1869年1月2日,煤气灯爆炸,使警察受伤,遂被取消。
电气启动的红绿灯出现在美国,这种红绿灯由红绿黄三色圆形的投光器组成,1914年始安装于纽约市5号大街的一座高塔上。
红灯亮表示“停止”,绿灯亮表示“通行”。
1918年,又出现了带控制的红绿灯和红外线红绿灯。
带控制的红绿灯,一种是把压力探测器安在地下,车辆一接近红灯便变为绿灯;另一种是用扩音器来启动红绿灯,司机遇红灯时按一下嗽叭,就使红灯变为绿灯。
红外线红绿灯当行人踏上对压力敏感的路面时,它就能察觉到有人要过马路。
红外光束能把信号灯的红灯延长一段时间,推迟汽车放行,以免发生交通事故。
信号灯的出现,使交通得以有效管制,对于疏导交通流量、提高道路通行能力,减少交通事故有明显效果。
1968年,联合国《道路交通和道路标志信号协定》对各种信号灯的含义作了规定。
绿灯是通行信号,面对绿灯的车辆可以直行,左转弯和右转弯,除非另一种标志禁止某一种转向。
左右转弯车辆都必须让合法地正在路口内行驶的车辆和过人行横道的行人优先通行。
红灯是禁行信号,面对红灯的车辆必须在交叉路口的停车线后停车。
黄灯是警告信号,面对黄灯的车辆不能越过停车线,但车辆已十分接近停车线而不能安全停车时可以进入交叉路口。
1.2系统设计的意义与目的
(1)加强对单片机和C51语言的认识,充分掌握和理解设计各部分的工作原理、设计过程、选择芯片器件、模块化编程等多项知识。
(2)用单片机模拟实现具体应用,使个人设计能够真正使用。
(3)把理论知识与实践相结合,充分发挥个人能力,并在实践中锻炼。
(4)提高利用已学知识分析和解决问题的能力。
(5)提高实践动手能力。
1.3系统设计的基本要求和内容
任务:
设计一个交通信号灯的模拟控制系统
设计内容与要求:
(1)用8个发光二极管模拟一个十字交叉路口的红、绿灯,并设置两个紧急放行按键。
(2)正常行驶时,东西或南北方向的灯按绿灯亮10秒,绿灯闪烁3秒,红灯亮12秒控制。
(3)当东西或南北方向的紧急放行按键按下时,如果禁行方向为红灯,则红灯继续维持12秒;如果禁行方向为绿灯,则立即变为绿灯闪烁3秒;如果禁行方向为绿灯闪烁,则闪烁继续维持。
(备注:
本系统采用8*8点阵来模拟十字路口,点阵只有红黄两种颜色,红点亮表示红灯亮,黄点亮表示绿灯亮,红点闪烁表示绿灯闪烁,这里我们看成黄灯闪烁)
二、工作原理
2.1系统框图
2.1.1LED数码管显示模块(模拟图)
2.1.2点阵模拟十字路口红绿灯显示模块(模拟图)
2.2程序原理
1、首先了解实际交通灯的变化情况和规律。
假设一个十字路口如上图所示,为东南西北走向。
初始状态1:
为东西绿灯亮,南北红灯亮;然后转状态2:
东西黄灯闪烁,南北红灯亮;过后转状态3:
东西红灯亮,南北绿灯亮;再转状态4:
东西红灯亮,南北黄灯闪烁。
一段时间后,又循环至状态0。
中间可通过中断按钮产生中断,跳入中断程序执行中断,实现南北紧急通行或实现东西紧急通行。
2、对于交通信号灯来说,应该有东西南北共四组灯,同一道上的两组的信号灯的显示情况是相同的,采用单片机的点阵模块即可来控制共12个信号灯。
3、通过编写程序,实现对发光点阵的控制,来模拟交通信号灯的管理。
每延时一段时间,发光点阵的显示情况都会按交通灯的显示规律进行状态转换。
4、通过延时时间送显,可以在原有的交通信号灯系统的基础上,用LED数码管增添其倒计时间的显示功能,实现其功能的扩展。
5、通过脉冲中断编写中断程序,可实现中断。
2.3选题方案论证
2.3.1供电方式
连接单片机控制芯片板和笔记本设备的USB接口,使用笔记本的电源,打开芯片板总开关正常通电。
本方案的优点是系统简明扼要,节约成本;缺点是输出功率不高,笔记本要保持在通电的状态。
2.3.2显示方案
采用LED数码管与有色发光点阵相结合的方法因为程序设计既要求倒计时数字显示输出,又要求有状态灯的亮灭等,为方便观看并考虑到现实情况,用LED数码管与有色发光点阵分别显示时间与交通灯的亮灭情况。
三、硬件设计
3.1单片机
3.1.1单片机的概述
单片微型计算机简称单片机,是典型的嵌入式微控制器(MicrocontrollerUnit),常用英文字母的缩写MCU表示单片机,单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。
单片机由运算器、控制器、存储器、输入输出设备构成,相当于一个微型的计算机(最小系统),和计算机相比,单片机缺少了外围设备等。
概括的讲:
一块芯片就成了一台计算机。
它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。
同时,学习使用单片机是了解计算机原理与结构的最佳选择。
3.1.2单片机的特点
1.特点:
(1)体积小巧,携带方便
USB接口通讯及供电,USB供电系统,直接插接到电脑USB口即可提供电源,不需另接直流电源,通讯速度快,无须外接电源
(2)有电源和烧写状态指示灯,可直观了解编程器当前状态
(3)只需要USB供电,无需使用外部电源。
周密的自保护方式,有效保证不损毁用户器件或编程器本身。
2.主要部件
(1)8位数码管
可做数码管的静态扫描以及动态扫描显示实验. 如:
0-999计数器实验,18B20温度检测实验,遥控解码实验等都可以用数码管显示。
(2)8位LED发光二极管
可做跑马灯实验。
(3)一路继电器控制
通过继电器可以控制其他电器设备的工作低压控制高压等实验,不过为了安全建议不要控制电压超过30V的设备。
(4)蜂鸣器
可做单片机发声实验 播放音乐实验 报警实验等声响实验。
(5)集成一体化红外接收头
方便学习红外遥控接收,解码实验。
(6)字符液晶1602LCD接口,采用接插件方式方便插拔
可显示两行,每行16个,共计32任意 ASCII码字符,它的功能应用比数码管丰富很多显示的信息量更大
(7)点阵,采用接插件方式方便插拔
可显示任意汉字和图形。
3.2芯片介绍
本设计选用了市面上较为常见的STC90C51单片机,STC90C51是一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。
使用高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。
片上Flash允许程序存储器在系统可编程,亦适于常规编程器。
在单芯片上,拥有灵巧的8位CPU和在线系统可编程Flash,使得STC90C51为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
3.2.1STC90C51芯片特性
主要性能:
(1)与MCS-51单片机产品兼容 、8K字节在系统可编程Flash存储器、 1000次擦写周期、全静态操作:
0Hz~33Hz 、三级加密程序存储器 、 32个可编程I/O口线、三个16位定时器/计数器、两个外部中断源、全双工UART串行通道、 低功耗空闲和掉电模式 、掉电后中断可唤醒 、看门狗定时器 、双数据指针、掉电标识符 。
(2) STC90C51是一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash 存储器。
使用高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。
片上Flash允许程序存储器在系统可编程,亦适于常规编程器。
在单芯片上,拥有灵巧的8 位CPU 。
3.2.2交通灯的状态显示
简单的十字路口交通灯基本拥有四个状态,依次循环显示这些状态,构成基本的交通灯控制系统。
(正常行驶时,东西或南北方向的灯按绿灯亮10秒,黄灯闪烁3秒,红灯亮13秒控制)。
交通灯基本状态表
状态1
状态2
状态3
状态4
南北向红灯时长10s
东西向绿灯时长10s
南北向红灯时长3s
东西向黄灯时长3s
南北向绿灯时长10s
东西向红灯时长10s
南北向黄灯时长3s
东西向红灯时长3s
四、软件设计
4.1程序设计语言
在本次设计中,采用了C语言作为程序编程的语言。
4.2程序设计软件
4.2.1编程软件
程序设计选择了KeilμVision3.0编程环境的软件。
这款软件支持众多不同公司的MCS51架构芯片,它集编辑、编译、仿真为一体,同时还支持PLM、汇编和C语言的程序设计,界面友好、简单易学,在调试程序。
软件仿真方面都有很强大的功能。
在初期的软件调试阶段,KeilμVision会提供非常便利的环境。
4.2.2烧录软件
程序设计还使用了单片机烧录软件STC_ISP_V483.exe软件。
由于STC90系列的单片机具有系统可编程特性(ISP),省去购买通用编程器。
把程序烧录进芯片,无须将单片机从已生产好的拆下,通过编程器将程序代码烧录单片机内部。
直接下载到单片机中显示程序结果,若现实结果与预期不一致,再返回Keil软件修改程序,再次进行调试显示结果。
有些程序尚未定型的产品可以一边生产,一边完善,加快了产品进入市场的速度,减小先产品由于软件缺陷带来的风险。
4.3程序设计
4.3.1主要函数
/*------------------------------------------------
主函数
------------------------------------------------*/
main()
{
用于循环显示交通灯四种状态
}
/*------------------------------------------------
定时器0中断函数
------------------------------------------------*/
voidtim(void)interrupt
{
用于每种交通灯状态计时
}
/*------------------------------------------------
外部中断0函数
------------------------------------------------*/
voidISR_Key(void)interrupt0
{
用于南北紧急放行
INT0:
通过中断接口P3.2连接的独立按键,使用电平触发
/*------------------------------------------------
外部中断1函数
------------------------------------------------*/
voidISR_INT1(void)interrupt1
{
用于东西紧急放行
INT1:
通过中断接口P3.3连接的独立按键,使用电平触发,启用按键去抖,适合实际按键
}
4.4程序流程图
不按紧急通行按钮时:
外部中断0程序(南北紧急放行):
外部中断1程序(东西紧急放行):
五、调试测试
5.1调试
1、接硬件图接线,为了确保东西南北红黄绿灯能够对应显示,实验时,P1口连接至LED用于显示红绿灯,P0口接数码管,数码管显示时间,P3.0接段码B,P3.1接位码A,P3.2接按键K1,P3.3接按键K2,P2接点阵接口J4和J5从J4对齐。
2、开始运行,观察8*8点阵上对应的点是否与交通显示情况对应,如果有偏差,则单步运行或断点运行,进行调试,直至满足设计要求。
3、调试完灯的显示后,观察数码管显示的是否正常,如果不正常,则运用单步运行或断点运行进行分析和调试,直至满足要求。
4、整体运行,观察灯显示和时间显示是否都符合要求,如果不符合,则再调试。
直至满足要求。
5.2测试过程
5.2.1通电测试
编写程序之前检测硬件电路板是否有短路或设备连接不稳固等隐患。
通电后打开电路板开关,LED数码管显示13的字样。
我的程序设计中仅用到了数码管和发光点阵,通过烧录软件将磁盘中的LED循环左移程序烧录芯片中运行,结果显示LED发光二极管电路连接良好,未发生短路状况。
5.2.2基本测试
编写好的程序通过KeilμVision3.0编译生成.hex文件,再用烧录软件将.hex文件烧录到芯片中,通电后程序运行:
初始状态1为南北红灯亮,东西绿灯亮,双位数码管显示倒计时为13。
状态2南北红灯亮,东西黄灯闪烁,数码管显示为3。
状态3南北绿灯亮,东西红灯亮,数码管显示10。
状态4南北黄灯闪烁,东西红灯亮,数码管显示为3。
程序依次循环显示这四个状态。
5.2.3复位测试
程序运行时,若在状态2、3、4显示的途中,按复位键,程序立刻回转初始状态运行。
反复测试成功。
六、结论
6.1特点
系统采用了STC90C51芯片的硬件设计,简便、实用性强、操作简单、程序设计简便;同时采用了C语言作为程序编程的语言,可读性和可移植性高于汇编语言。
该系统设计有一定的新颖性,采用STC90C51芯片点阵来显示东西南北向的红绿灯;两位LED数码管动态显示倒计时,显示南北向的倒计时。
普通交通灯模拟系统仅用一直排的LED灯来显示东西南北的红绿灯,不够直观和美观,
6.2存在的问题
程序设计过程中东西南北时间为固定值,若考虑到车流高峰时,固定设置的红绿灯时间可能会造成交通更加堵塞,易发生交通事故。
程序过于简单,只能适用于一些车流简单的小路段使用。
6.3需要改进的地方
在各个方向加上一个指示转弯的指示灯。
再通过程序实现对定时的改变,便可使此交通灯系统实现全方位的指示。
参考文献
[1]张友德 涂时亮 赵志英:
单片微型机原理、应用于实验上海:
复旦大学出版社,2012,3
附录
程序代码
/*-----------------------------------------------
P1口连接至LED用于显示红绿灯,P0口接数码管,数码管显示时间,
P3.0接B,P3.1接A,P3.2接k1,P3.3接K2,P2接J4,J5从J4对齐
INT0:
通过中断接口P3.2连接的独立按键,使用电平触发
INT1:
通过中断接口P3.3连接的独立按键,使用电平触发,启用按键去抖,适合实际按键
------------------------------------------------*/
#include//包含头文件,头文件包含特殊功能寄存器的定义
#include
/*------------------------------------------------
硬件端口定义
------------------------------------------------*/
sbitLATCH=P2^3;//数码管管脚定义
sbitSRCLK=P2^2;
sbitSER=P2^1;
sbitLATCH_B=P2^7;
sbitSRCLK_B=P2^6;
sbitSER_B=P2^5;
sbitLACTCH1=P3^0;//段锁存
sbitLACTCH2=P3^1;//位锁存
sbitnorth=P3^0;
sbiteast=P1^7;
/*------------------------------------------------
全局变量
------------------------------------------------*/
bitred,green,yellow,red2,green2,yellow2,turnred;//定义红绿黄灯标志位
unsignedcharsecond;//秒数
codeunsignedchartab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//共阴数码管0-9
unsignedcharsegout[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//8列
unsignedcharcodetab1[]={0x00,0x00,0x00,0x01,0x80,0x00,0x00,0x00,};//1南北红
unsignedcharcodetab2[]={0x00,0x00,0x01,0x00,0x00,0x80,0x00,0x00,};//2南北黄
unsignedcharcodetab3[]={0x00,0x01,0x00,0x00,0x00,0x00,0x80,0x00,};//3南北绿
unsignedcharcodetab4[]={0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x02,};//4东西绿
unsignedcharcodetab5[]={0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x04,};//5东西黄
unsignedcharcodetab6[]={0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x08,};//6东西红
unsignedcharcodetab10[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//10空
};
unsignedcharcodetab11[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//11黄灯闪
};
unsignedcharDis_Shiwei;//定义十位
unsignedcharDis_Gewei;//定义个位
/*------------------------------------------------
------------------------------------------------*/
voiddelay(unsignedintcnt)
{
while(--cnt);
}
/*/*------------------------------------------------
uS延时函数,含有输入参数unsignedchart,无返回值
unsignedchar是定义无符号字符变量,其值的范围是
0~255这里使用晶振12M,精确延时请使用汇编,大致延时
长度如下T=tx2+5uS
------------------------------------------------*/
voidDelayUs2x(unsignedchart)
{
while(--t);
}
/*------------------------------------------------
mS延时函数,含有输入参数unsignedchart,无返回值
unsignedchar是定义无符号字符变量,其值的范围是
0~255这里使用晶振12M,精确延时请使用汇编
------------------------------------------------*/
voidDelayMs(unsignedchart)
{
while(t--)
{
//大致延时1mS
DelayUs2x(245);
DelayUs2x(245);
}
}
/*------------------------------------------------
发送字节程序
带有方向参数,可以选择从高位节写入或者低位写入
------------------------------------------------*/
voidSendByte(unsignedchardat,bitdirection)
{
unsignedchari,temp;
if(direction==0)
temp=0x80;
else
temp=0x01;
for(i=0;i<8;i++)
{
SRCLK=0;
SER=dat&temp;
if(direction==0)
dat<<=1;
else
dat>>=1;
SRCLK=1;
}
}
/*------------------------------------------------
发送双字节程序
------------------------------------------------*/
voidSend2Byte(unsignedchardat1,unsignedchardat2,bitdirection)
{
SendByte(dat1,direction);
SendByte(dat2,direction);
}
/*------------------------------------------------
595锁存程序
------------------------------------------------*/
voidOut595(void)
{
LATCH=0;
_nop_();
LATCH=1;
}
/*------------------------------------------------
发送位码字节程序
使用另外一片单独595
------------------------------------------------*/
voidSendSeg(unsignedchardat