基于单片机的车辆闯红灯报警装置李鑫Word文件下载.docx
《基于单片机的车辆闯红灯报警装置李鑫Word文件下载.docx》由会员分享,可在线阅读,更多相关《基于单片机的车辆闯红灯报警装置李鑫Word文件下载.docx(17页珍藏版)》请在冰豆网上搜索。
![基于单片机的车辆闯红灯报警装置李鑫Word文件下载.docx](https://file1.bdocx.com/fileroot1/2023-2/3/10bd5752-7f0b-4af1-bc71-947fa09094b5/10bd5752-7f0b-4af1-bc71-947fa09094b51.gif)
2设计方案及原理
按照系统设计要求,该系统分为两大模块:
一个交通灯模块,用来产生红灯信号,并将红灯信号发送给另一个模块;
一个车辆闯红灯信号采集模块。
其中最重要的是闯红灯信号采集模块,该模块的作用如下:
当接收到红灯信号时判断信号的方向,即是东西红灯信号还是南北红灯信号,再接着判断交通灯处于红灯时有无车辆从相应的方向通过,若有车辆通过就发出声音报警,实现闯红灯报警的功能。
系统组成框图如图2-1所示。
图2-1车辆闯红灯报警系统组成框图
3硬件设计
3.1主控模块AT89C51
单片机AT89C51在复位电路、晶振电路以及电源电路的共同作用下才能正常工作。
具体硬件连接图如图3-1所示。
(完整硬件连接图见附录1)
图3-1复位电路、晶振电路与单片机之间的连线图
3.2LED显示模块
LED数码管的段控和位选的引脚分别与AT89C51的相连,将各灯光的亮灯时间显示出来。
为提高显示亮度,在此用上拉电阻(排阻)作为段控输出驱动。
具体的硬件连接图如图3-2所示。
(完整硬件连接图见附录1)
图3-2LED显示模块
3.3灯光显示模块
利用单片机内部的定时器控制亮灯时长,当P2口的相应位置为高电平时,发光二极管就点亮,并利用不同颜色的发光二极管表示实际交通灯中的灯色。
具体硬件连接图如图3-3所示。
图3-3灯光显示模块
3.4灯光采集及报警模块
AT89C51通过外部中断接收到红灯信号后调用中断函数,判断此时有无车辆驶过,若有车辆闯红灯,系统就会启动报警装置,同时还会向交通灯模块发出中断请求,封闭交通以方便交警处理违章事故。
具体硬件连接图如图3-4所示。
图3-4灯光采集及报警模块
3.5闯红灯信号采集模块
在十字路口的中央放置两排电感线圈,同时用交通灯模块的端口P2.0和P2.7控制电感线圈工作。
由于车辆为金属材质,当电感线圈通电且有车辆通过时就会发生电磁感应现象,产生电动势,经过处理之后将电信号传送给闯红灯处理模块。
原理图如图3-5-1所示。
由于在Proteus中无法仿真该模块,于是改用两个开关KDX和KNB来模拟车辆通过电感线圈。
图3-5-1闯红灯信号采集模块原理图
3.6电源设计
该系统所有的电源均采用5V直流电。
实物图如图3-6-1所示。
图3-6-1直流稳压电源实物图
4软件设计
4.1交通灯模块软件设计
该程序主要负责控制交通灯,程序流程图如图4-1所示。
(具体程序见附录2)
图4-1交通灯模块流程图
4.2闯红灯报警模块软件设计
该块程序主要负责接收红灯信号并在红灯信号来临时判断电磁线圈有无信号传来,若有信号则启动报警并给交通灯模块一个外部中断使交通灯模块阻断交通。
程序流程图如图4-2所示。
(具体程序见附录3)
图4-2闯红灯报警模块流程图
5系统仿真及调试
软件调试:
先编写程序并进行硬件的正确性检验,然后分别进行主程序和LED显示器程序编译和调试;
硬件调试:
仔细检查电路有没有漏接或是错接的地方,如果不理想,继续调整程序,直到得到正确结果。
仿真结果见附录1所示。
6市场调研
本系统所用元件清单及软件、人力市场价格如表6-1所示。
名称
规格型号
价格(元)
数量
总价格(元)
单片机
AT89C51
3.0
2
6.0
总线收发器
74LS245
1.5
1
LED显示
7SEG
1.0
4
4.0
开关
发光二极管
LED
0.05
14
蜂鸣器
BUZZER
7.0
排阻
RESPACK-8
直流电源
50.0
电磁系统
100.0
软件
25
人工费
320
总计
423.5
表6-1市场调研
综合以上的各条件我对自己的这套系统做出的估价是423.5元,我觉得这个报价较为合理,买卖双方应都能接受。
7总结
所设计的系统能完成预计的功能即:
能检测并采集红灯信号,并且在车辆违规闯红灯时予以报警提示、封锁交通。
通过这次的课程设计我很好的将课堂上所学的知识用到了实践当中锻炼了自己,虽然设计的并不十分完善,但通过这一周的努力所取得的结果我还是很满意的。
附录1
硬件连接及仿真图
附录2
#include<
reg52.h>
#defineucharunsignedchar
#defineuintunsignedint
uchardatabuf[4];
//缓冲区
uchardatasec_dx=20;
//东西数默认
uchardatasec_nb=30;
//南北默认值
uchardataset_timedx=20;
uchardataset_timenb=30;
intn;
uchardatab=0;
//定时器中断次数
sbitYellow_nb=P2^5;
//南北黄灯标志
sbitYellow_dx=P2^2;
//东西黄灯标志
sbitGreen_nb=P2^4;
sbitGreen_dx=P2^1;
sbitRed_nb=P2^7;
sbitRed_dx=P2^0;
sbitkdx=P3^6;
//东西红灯信号
sbitknb=P3^7;
//南北红灯信号
bittime=0;
//灯状态循环标志
ucharcodetable[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
voiddelay(intms);
//延时子程序
voiddisplay();
//显示子程序
voidChushihua();
//开机
voidkey();
//红灯信号采集
voidmain()
{
TMOD=0X01;
//定时器0,工作方式1
TH0=0XD8;
TL0=0XF0;
EA=1;
//开中断
EX0=1;
//外部中断0开中断
ET0=1;
//内部定时器T0开中断
TR0=1;
Chushihua();
//开机
P2=0Xc2;
//开始默认状态,东西绿灯,南北红灯
sec_nb=sec_dx+5;
while
(1)
key();
display();
//调用显示程序
}
voiddisplay()//显示子程序
buf[1]=sec_dx/10;
//第1位东西秒十位
buf[2]=sec_dx%10;
//第2位东西秒个位
buf[3]=sec_nb/10;
//第3位南北秒十位
buf[0]=sec_nb%10;
//第4位南北秒个位
P1=0xff;
//初始灯为灭的
P0=0x00;
P1=0xfe;
//片选LCD1
P0=table[buf[1]];
delay
(1);
P1=0xfd;
//片选LCD2
P0=table[buf[2]];
P1=0xfb;
//片选LCD3
P0=table[buf[3]];
P1=0xff;
P1=0Xf7;
//片选LCD4
P0=table[buf[0]];
voidtime0(void)interrupt1//定时中断子程序
b++;
if(b==19)//定时器中断次数
{
b=0;
sec_dx--;
sec_nb--;
if(sec_nb<
=5&
&
time==0)//东西黄灯闪
{
Green_dx=0;
Yellow_dx=!
Yellow_dx;
}
if(sec_dx<
time==1)//南北黄灯闪
Green_nb=0;
Yellow_nb=!
Yellow_nb;
if(sec_dx==0&
sec_nb==5)
sec_dx=5;
if(sec_nb==0&
sec_dx==5)
sec_nb=5;
if(time==0&
sec_nb==0)
P2=0x19;
time=!
time;
sec_nb=set_timenb;
sec_dx=set_timenb+5;
if(time==1&
sec_dx==0)
P2=0xc2;
sec_dx=set_timedx;
sec_nb=set_timedx+5;
voidint0(void)interrupt0
TR0=0;
P2=0x48;
sec_dx=00;
sec_nb=00;
P0=0x40;
while
(1)
{
Chushihua();
}
voidChushihua()//"
----"
for(n=0;
n<
50;
n++)
P0=0x40;
P1=0xfe;
delay
(1);
P1=0xfd;
P1=0Xfb;
P1=0Xf7;
voiddelay(intms)
uintj,k;
for(j=0;
j<
ms;
j++)
for(k=0;
k<
124;
k++);
voidkey()
if(Red_nb==1)
knb=!
knb;
knb=1;
if(Red_dx==1)
kdx=!
kdx;
delay
(1);
kdx=1;
附录3
#include<
sbitKdx=P2^0;
sbitKnb=P2^1;
P1=0xFF;
P2=0xFF;
IE=0x85;
TCON=0x05;
while
(1);
voidscan1()interrupt0
if(Kdx==0)
delay(10);
P1=0xFC;
voidscan2()interrupt2
if(Knb==0)
delay(10);
if(Knb==0)
intj,k;
for(j=0;
for(k=0;
参考文献
[1]杨居义,杨尧,杨晓琴等.2009.单片机课程设计指导.北京:
清华大学出版社
[2]王思明,苟军年,张鑫等.2012.单片机原理及应用系统设计.北京:
科学出版社
[3]孙惠芹.2009.单片机项目设计教程.北京:
电子工业出版社
[4]高卫东,辛友顺,韩彦征.2008.51单片机原理与实践.北京:
北京航空航天大学出版社
[5]蔡文明,冯先成.2007.单片机课程设计.武汉:
华中科技大学出版社