单片机交通灯控制课程设计报告书.docx
《单片机交通灯控制课程设计报告书.docx》由会员分享,可在线阅读,更多相关《单片机交通灯控制课程设计报告书.docx(19页珍藏版)》请在冰豆网上搜索。
单片机交通灯控制课程设计报告书
单片机交通灯控制课程设计
:
院系:
物理与电气工程学院
专业:
电气工程及其自动化
班级:
学号:
指导教师:
志富
2014年3月15日
基本要求
利用单片机的定时器产生秒信号,控制十字路口的红、绿、黄灯交替点亮和熄灭,并且用4只LED数码管显示十字路口两个方向的剩余时间。
要求能用按键设置两个方向的通行时间(绿、红等点亮的时间)和暂缓通行时间(黄灯点亮的时间)。
系统的工作应符合一般交通灯控制的要求。
设计简介
交通在人们的日常生活中占有重要的地位,随着人们社会活动的日益频繁,这点更是体现的淋漓尽致。
交通信号灯的出现,使交通得以有效管制,对于疏导交通流量、提高道路通行能力,减少交通事故有明显效果。
近年来随着科技的飞速发展,单片机的应用正在不断深入,同时带动传统控制检测技术日益更新。
在实时检测和自动控制的单片机应用系统中,单片机往往作为一个核心部件来使用,仅单片机方面知识是不够的,还应根据具体硬件结构软硬件结合,加以完善。
本设计系统由单片机I/O口系统、交通灯状态显示系统、复位电路等几大部分组成。
系统具有基本的交通灯功能,较好的模拟实现了十字路口可能出现的状况。
本设计系统利用单片机的工作原理设计一个十字路口交通信号灯,要求东、西、南、北四个方向各有红黄绿色三个灯,当东西方向亮绿灯时,南北方向红灯亮起;反之,如果南北方向亮绿灯,同时东西方向亮绿灯;绿灯亮时车辆行驶,红灯亮时车辆停止。
即在同一时间保证只有两个对应方向的车辆可以行驶。
本设计系统软件上采用KeiluVision3、Proteus。
使用C51编程,主要编写了主程序、中断子程序、延时子程序、数码管显示子程序、交通控制子程序、矩阵键盘子程序。
本设计系统经过整机调试,实现了对十字路口交通灯运作与设置的模拟。
系统简要分析
本设计系统单片机89C51为中心器件来设计交通灯控制器,系统实用性强、操作简单、扩展性强、成本较低。
本设计就是采用单片机模拟十字路口交通灯的各种状态显示。
利用单片机完成交通信号灯控制器的设计,该交通信号灯控制器由一条主干道和一条支干道汇合成3十字路口,在每个入口处设置红、绿、黄三色信号灯,数码管显示剩余时间。
红灯亮禁止通行,绿灯亮允许通行,黄灯亮则给行驶中的车辆有时间停在禁行线外。
用红、绿、黄发光二极管作信号灯,8管共阴极数码管显示剩余时间,矩阵键盘用来设置交通灯的显示时间和状态。
硬件原理图
源程序
#include
#defineucharunsignedchar
#defineuintunsignedint
ucharcodetable[]={//共阴极数码管码表
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,
0xC9,0xFF,0x40};//设置码,测试码,不计时码
voiddelay(uintx);//延时函数
voiddisplay(uchar,uchar,uchar,uchar);//数码管显示函数
voidmkeys();//键盘函数
voidtraffic();//交通灯函数
ucharnum,num1,num2,//1南北2东西
shi1,ge1,shi2,ge2,
value1,value2,//南北绿灯时间黄灯时间
value3,value4,//东西绿灯时间黄灯时间
count1,count2,flag1,flag2;//南北标记东西标记
voidmain()
{
TMOD=0x01;
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
EA=1;
ET0=1;
TR0=1;
/*初状态*/
value1=15;//南北黄绿灯默认值
value2=5;
value3=10;//东西黄绿灯默认值
value4=5;
num1=value1;//南北数码管先绿灯时间
num2=value2+value1;//东西红灯时间
shi1=num1/10;
ge1=num1%10;
shi2=num2/10;
ge2=num2%10;
P1=0x41;//初始状态:
东西红灯南北绿灯2015
while
(1){
if(num==20)//定时器1s
{
num=0;
num1--;
num2--;
traffic();
shi1=num1/10;
ge1=num1%10;
shi2=num2/10;
ge2=num2%10;
}
mkeys();
display(shi1,ge1,shi2,ge2);
}
}
voidtraffic()//红绿灯主控制程序
{
if(num1==0){
count1++;
if(count1==1){
P1=0x42;//东西红灯南北黄灯55
num1=value2;
}
if(count1==2){
num1=value3+value4;//东西绿灯南北红灯1015
P1=0x14;
}
if(count1==3){
P1=0x41;//东西黄灯南北红灯55
num1=value4;
count1=0;
}
}
if(num2==0){
count2++;
if(count2==1){
//P1=0x14;//东西绿灯南北红灯
num2=value3;
}
if(count2==2){
P1=0x24;//东西黄灯南北红灯
num2=value4;
}
if(count2==3){
num2=value1+value2;//东西红灯南北绿灯
num1=value1;
count2=0;
}
}
}
voiddisplay(ucharshi1,ucharge1,ucharshi2,ucharge2)//数码管显示子函数
{
uchartemp;
temp=P2;
P2=0xfe;
P0=table[shi1];
delay(5);
P2=0xfd;
P0=table[ge1];
delay(5);
P2=0xfb;
P0=table[shi2];
delay(5);
P2=0xf7;
P0=table[ge2];
delay(5);
voiddelay(uintx)//延时子函数
{
uinti,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
voidmkeys()//4*4矩阵键盘功能子函数
{
uchartemp,key;
P3=0xfe;//第一行线
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0)
{
delay(10);
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0){
temp=P3;
switch(temp)
{
case0xee:
key=0;
break;
case0xde:
key=1;
break;
case0xbe:
key=2;
break;
case0x7e:
key=3;
break;
}
while(temp!
=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
if(key==0){//按键1:
暂停
TR0=~TR0;//定时器取反
flag1=~flag1;//南北能够设置标志0有效
flag2=~flag2;//东西能够设置标志
}
if(key==1&&flag1==0){//按键2:
设置时间按钮
TR0=0;
P1=0x44;//禁止东南西北车辆全为红灯可以设置
shi1=ge1=shi2=ge2=16;
}
if(key==2&&flag2==0){//按键3:
设置完成重启
TR0=1;
num=0;//定时器初始化
P1=0x41;//重新开始初状态
num1=value1;//南北数码管先绿灯时间
num2=value2+value1;//东西红灯时间
shi1=num1/10;
ge1=num1%10;
shi2=num2/10;
ge2=num2%10;
}
if(key==3&&P1==0x44){//按键4:
测试交通灯各个设备的好坏
P1=0xff;
delay(1000);
P1=~P1;
shi1=ge1=shi2=ge2=17;
P1=0x44;
}
}
}
P3=0xfd;//第二行线
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0)
{
delay(10);
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0){
temp=P3;
switch(temp)
{
case0xed:
key=0;
break;
case0xdd:
key=1;
break;
case0xbd:
key=2;
break;
case0x7d:
key=3;
break;
}
while(temp!
=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
if(key==0&&P1==0x44){//按键5:
设置南北绿灯时间+
num1=value1;
if(num2!
=159){//保证交通合理,红灯最大值计时159s,绿灯不再增加
num1++;
value1=num1;
}
shi1=num1/10;
ge1=num1%10;
num2=value1+value2;//显示东西红灯时间
shi2=num2/10;
ge2=num2%10;
}
if(key==1&&P1==0x44){//按键6:
设置南北黄灯时间+
num1=value2;
if(num2!
=159){
num1++;
value2=num1;
}
shi1=num1/10;
ge1=num1%10;
num2=value1+value2;//显示东西红灯时间
shi2=num2/10;
ge2=num2%10;
}
if(key==2&&P1==0x44&&value1>3){//按键7:
设置南北绿灯时间-保证交通合理,绿灯最小值计时3s,绿灯不再减少
num1=value1;
num1--;
value1=num1;
shi1=num1/10;
ge1=num1%10;
num2=value1+value2;//显示东西红灯时间
shi2=num2/10;
ge2=num2%10;
}
if(key==3&&P1==0x44&&value2>3){//按键8:
设置南北黄灯时间-
num1=value2;
num1--;
value2=num1;
shi1=num1/10;
ge1=num1%10;
num2=value1+value2;//显示东西红灯时间
shi2=num2/10;
ge2=num2%10;
}
}
}
////||||||||||||||||||
P3=0xfb;//第三行线
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0)
{
delay(10);
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0){
temp=P3;
switch(temp)
{
case0xeb:
key=0;
break;
case0xdb:
key=1;
break;
case0xbb:
key=2;
break;
case0x7b:
key=3;
break;
}
while(temp!
=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
if(key==0&&P1==0x44){//按键9:
设置东西绿灯时间+
num2=value3;
if(num1!
=159){
num2++;
value3=num2;
}
shi2=num2/10;
ge2=num2%10;
num1=value3+value4;//显示南北红灯时间
shi1=num1/10;
ge1=num1%10;
}
if(key==1&&P1==0x44){//按键10:
设置东西黄灯时间+
num2=value4;
if(num1!
=159){
num2++;
value4=num2;
}
shi2=num2/10;
ge2=num2%10;
num1=value3+value4;//显示南北红灯时间
shi1=num1/10;
ge1=num1%10;
}
if(key==2&&P1==0x44&&value3>3){//按键11:
设置东西绿灯时间-
num2=value3;
num2--;
value3=num2;
shi2=num2/10;
ge2=num2%10;
num1=value3+value4;//显示南北红灯时间
shi1=num1/10;
ge1=num1%10;
}
if(key==3&&P1==0x44&&value4>3){//按键12:
设置东西黄灯时间-
num2=value4;
num2--;
value4=num2;
shi2=num2/10;
ge2=num2%10;
num1=value3+value4;//显示南北红灯时间
shi1=num1/10;
ge1=num1%10;
}
}
}
P3=0xf7;//第四行线2未用
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0)
{
delay(10);
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0){
temp=P3;
switch(temp)
{
case0xe7:
key=0;
break;
case0xd7:
key=1;
break;
case0xb7:
key=2;
break;
case0x77:
key=3;
break;
}
while(temp!
=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
if(key==0&&P1==0x44){//按键13:
南北紧急情况:
南北绿灯常亮东西红灯常亮
P1=0x41;
shi1=ge1=shi2=ge2=18;
}
if(key==1&&P1==0x44){//按键14:
东西紧急情况:
东西绿灯常亮南北红灯常亮
P1=0x14;
shi1=ge1=shi2=ge2=18;
}
if(key==2&&P1==0x44){//按键15:
}
if(key==3&&P1==0x44){//按键16:
}
}
}
}
voidT0_time()interrupt1//定时器T0中断子程序
{
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
num++;
}
设计总结
通过这次课程设计,使我掌握了交通灯控制的基本思想与原理,学习到了一些有用的专业知识、专业技能分析和解决问题全面系统的锻炼。
使我在单片机的基本原理、单片机应用系统开发过程,电路图的绘制以及在常用编程设计思路技巧的掌握方面都向前迈了一大步。
而且本次课程设计是分五人小组设计模式,增强了我的团队意识,以及团队之间共同商量问题,解决问题的能力。
本次课程设计的过程是艰辛的,不过收获却是很大的。
在设计过程中,会出现了一些问题,但都是常见的小问题,如:
在代码中中英文符号转换问题,输入字母出错,程序语法错误,代码维护困难等;在调试过程中出现异常,显示效果不是理想的效果。
不过经过调试修改,代码模块化,小组成员的共同商量与检查这些问题都一一解决,程序顺利完成,并实现了预期的功能。
综合课程设计让我们把课堂上学习到的知识得到巩固和进一步的提高认识,对已有知识有了更进一步的理解和认识。
在此,由于自身能力有限,在课程设计中碰到了很多的问题,我们通过查阅相关书籍、资料以及小组成员之间的交流、已经老师的耐性指导把困难统统克服。
由于使用的是单片机作为核心的控制元件,使得电路的可靠性比较高,功能也比较强大,而且可以随时的更新系统,进行不同状态的组合。
但是在我们设计和调试的过程中,也发现了一些问题,不过设计也有很多不足之处,譬如红灯和绿灯的切换还不够迅速,红绿灯规则不效率还不是很高,键盘效率不太高等等,这需要在实践中进一步完善,希望在今后的学习中学习更多新知识然后得以完善。
当然,通过这次课程设计,我也发现了自身的很多不足之处,在以后的学习中,我会不断的完善自我,在今后的学习和工作中设计出更好的作品!
同时感谢老师和同学的耐心指点,使我能够顺利的完成本次任务。
参考文献
【1】全利主编《单片机原理及接口技术》第二版
【2】郭天祥主编《新概念C51单片机C语言教程》
【3】XX文献《交通灯控制原理图》