交通信号灯单片机课设报告.docx
- 文档编号:8543667
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:24
- 大小:470.63KB
交通信号灯单片机课设报告.docx
《交通信号灯单片机课设报告.docx》由会员分享,可在线阅读,更多相关《交通信号灯单片机课设报告.docx(24页珍藏版)》请在冰豆网上搜索。
交通信号灯单片机课设报告
信息与电气工程学院
课程设计说明书
(2013/2014学年第二学期)
课程名称:
单片机应用课程设计
题目:
交通灯控制器
专业班级:
电气工程及其自动
学生姓名:
学号:
指导教师:
刘增环、岑毅南、高敬格等
设计周数:
2周
设计成绩:
2014年6月26日
1、课程设计目的
目的1:
通过本次课程设计加深对单片机课程的全面认识和掌握,对单片机课程的应用进一步了解。
目的2:
掌握串口进行数据传输的应用,并学会使用MAX232等外部芯片辅助项目设计。
目的3:
通过此次课程设计将单片机软硬件结合起来对程序进行编辑,校验,锻炼实践能力和理论联系实际的能力。
目的4:
锻炼团队分工合作与协调能力,通过自学和探讨的方式解决实际问题的能力。
2、设计任务与要求
用STC89C52单片机控制一个交通信号灯系统,晶振采用6MHZ。
设A车道(南北车道)与B车道(东西车道)交叉组成十字路口,A是主道,B是支道。
设计要求如下:
用发光二极管模拟交通信号灯,用按键开关模拟车辆检测信号。
正常情况下,A、B两车道轮流放行,A车道放行35s,其中5s用于警告;B车道放行25s,其中5s用于警告。
交通繁忙时,交通信号灯控制系统应有手控开关,可人为地改变信号灯的状态,以缓解交通拥挤状况。
在B车道放行期间,若A车道有车而B车道无车,按下开关K2使A车道放行10s;在A车道放行期间,若B车道有车而A车道无车,按下开关K1使B车道放行10s。
有紧急车辆通过时,按下K1开关使A、B车道均为红灯,禁行15s。
3、硬件设计
3.1方案设计与论证
方案一:
交通控制系统主要控制A、B两车道的交通,以STC89C52单片机为核心芯片,通过控制三色LED的亮灭来控制各车道的通行;另外通过2个按键来模拟各车道有无车辆的情况和有紧急车辆的情况。
根据设计要求,制定总体设计思想如下:
1、正常情况下运行主程序,采用100ms定时子程序的反复调用来实现各种定时时间。
2、一道有车而另一道无车时,采用外部中断1执行中断服务程序,并设置中断为低优先级中断。
3、有紧急车辆通过时,采用外部中断0执行中断服务程序,并设置中断为高优先级中断,实现二级中断嵌套。
该电路具有电路简单,设计方便,显示亮度高,耗电较少,也非常的可靠等点。
总体设计框图如图1所示:
图1系统整体设计方框图
方案二:
采用标准STC89C52单片机作为控制器;通行倒计时显示采用3位数码管;主、次通道及行人指示灯采用双色高亮发光二极管;LED显示采用动态扫描,以节省端口。
紧急车辆通行采用实时中断完成,识别方法采用手动按钮。
按以上系统构架设计,单片机端口资源刚好满足要求。
该系统具有电路简单,设计方便,显示亮度高耗电少,可靠性高,但是占用单片机资源太多了。
整个电路组成框图如图2所示。
图2
方案三:
采用AT89C2051单片机作为控制器,通行倒计时、主、次车道及行人通行指示采用单块LCD液晶点阵显示器。
这种方案设计占用单片机的端口最少,硬件也最少,耗电也最少;虽然显示图案也很精美,但由于亮度太暗,晚上还得必须开背光灯,所以较少采用。
通过以上综合分析可以看出,方案一具有综合设计优点,因此交通灯控制系统模型采用方案一设计。
3.2硬件单元电路设计
3.2.1时钟电路模块
时钟电路由一个晶体振荡器6MHZ和两个30pF的瓷片电容组成。
时钟电路用于产生单片机工作所需要的时钟信号,而时序所研究的是指令执行中各信号之间的相互关系。
单片机本身就如一个复杂的同步时序电路,为了保证同步工作方式的实现,电路应在唯一的时钟信
号控制下严格地工作。
其电路如图3所示:
图3时钟电路模块
3.2.2复位电路模块
复位电路是使单片机的CPU或系统中的其他部件处于某一确定的初始状态,并从这状态开始工作,除了进入系统的正常初始化之外,当由于程序运行出错或操作错误使系统处于死锁状态时,为摆脱困境,也需按复位电路以重新启动。
本设计采用的是按键复位电路。
其电路如图4所示:
图4复位电路
3.2.3主控制系统模块
主控制器采用STC89C52,是ATMEL公司生产的一款性能稳定的8位单片机。
STC89C52具有1个8KB的FLASH程序存储器,1个512字节的RAM,4个8位的双向可位寻址I/O端口,3个16位定时/计数器及1个串行口和6个向量二级中断结构。
单片机的P1口分别用于控制南北及东西的通行灯,P2口和P0口用于数码管的控制,紧急车辆通行时使用外中断0(P3^2)和外中断1(P3^3),进行手动按键,即可转换。
其主控电路如图5所示:
图5主控制系统模块
3.2.4交通灯输出控制模块
道口交通灯指示采用高亮度红、黄、绿发光二极管进行提示。
其图如图6所示
图6LED显示模块
当R=220欧时,按公式A=(5-1.8)/R计算,电路中的电流大小应为A=14.545mA.由于每个路口的通行双向指示处理相同,因此每个端口应具有3A的吸收电流能力。
3.2.5按键电路模块
按键电路是使单片机CPU的I/O口感应低电平,从而通过判断识别出有按键按下。
设置五个按键K1、K2、K3、K4、K5分别为紧急按键、调节按键、加一按键、减一按键、开始按键。
其电路如图7所示:
图7按键电路
3.2.6蜂鸣器电路模块
采用单片机P2^3口控制蜂鸣器工作,当有按键按下时蜂鸣器响。
其电路如图8所示:
图8蜂鸣器电路模块
3.2.7数码管显示时间电路模块
道口通行剩余时间采用高亮红色7段LED发光数码管显示,采用共阴数码管,设计中也用了中功率三极管9014.其显示电路如图7所示:
图9数码管显示模块
3.2.8CD4511译码驱动数码管电路模块
为了节省单片机I/O引脚,采用CD4511芯片对数码管显示进行译码,可以只用4个I/O引脚输入到CD4511芯片控制七段数码管显示,通过CD4511芯片输出与数码管连接,中间接7个300欧姆的电阻来降低电流,以免烧坏数码管。
其连接电路如图8所示:
图10CD4511控制电路
3.3系统电路调试
电路调试是利用开发系统、基本测试仪器(万用表、示波器等),检查系统硬件中存在的故障。
其调试可分为静态调试与动态调试两步进行。
3.3.1静态调试
静态调试是在系统未工作时的一种硬件检测。
第一步:
目测。
检查外部的各种元件或者是电路是否有断点。
第二步:
用万用表测试。
先用万用表复核目测中有疑问的连接点,再检测各种电源与地线之间是否有短路现象。
第三步:
加电检测。
给板加电,检测所有的插座或是器件的电源端是否符合要求的值。
第四步:
是联机检查。
因为只有用单片机开发系统才能完成对用户系统的调试。
3.3.2动态调试
动态调试是在系统工作的情况下发现和排除系统硬件中存在的器件内部故障、器件连接逻辑错误等的一种硬件检查。
动态调试的一般方法是由近及远、由分到合。
由分到合是指首先按逻辑功能将系统硬件电路分为若干块,当调试电路时,与该元件无关的器件全部从系统中去掉,这样可以将故障范围限定在某个局部的电路上。
当各块电路无故障后,将各电路逐块加入系统中,在对各块电路功能及各电路间可能存在的相互联系进行调试。
由分到合调试既告完成。
由近及远是将信号流经的各器件按照距离单片机的逻辑距离进行由近及的分层,然后分层调试。
调试时,仍采用去掉无关元件的方法,逐层调试下去,就会定位故障元件了。
在系统调试时遇到很多问题,比如在焊接数码管时焊接引脚时特别不好上手,因为用的万用板的原因,接线接错,一些芯片因为质量问题影响系统正常工作等等问题,调试过程图片如图9、10所示:
图9单片机最小系统电路板
图10系统整体电路板及调试
4、软件设计与流程图
4.1系统软件设计的分析
主程序采用查询方式定时,调用0.5S延时子程序的次数,从而获取交通灯的各种时间。
子程序采用定时器1方式1查询式定时,定时器定时100ms,确定100ms循环10次,从而获得1S的延时时间。
有车车道的放行的中断服务程序首先要保护现场,因而需用到延时子程序,子程序采用定时器0方式1查询式定时,定时器定时100ms,确定100ms循环10次,从而获得1S的延时时间,保护现场时还需关中断,以防止高优先级中断(紧急车辆通过所产生的中断)出现导致程序混乱。
开中断,由软件查询外中断1,判别哪一道有车,再根据查询情况执行相应的服务。
待交通灯信号出现后,保持10S的延时,然后,关中断,恢复现场,再开中断返回主程序。
紧急车辆出现时的中断服务程序也需要保护现场,但无须关中断(因其为高优先级中断),然后执行相应的服务,待交通灯信号出现后延时15S,确保紧急车辆通过交叉路口,然后,恢复现场,返回主程序。
4.2软件设计流程图
有车车道放行时的中断服务程序(外中断1)
紧急情况时的中断服务程序(外中断0)
4.3软件调试
软件调试是通过对拥护程序的C编程、连接、执行发现程序中存在的语法错误与逻辑错误并加以排除纠正的过程。
运行程序后,编辑,查看程序是否有逻辑的错误。
4.4程序清单
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitRED_NB=P1^0;//南北红灯
sbitYELLOW_NB=P1^1;//南北黄灯
sbitGREEN_NB=P1^2;//南北绿灯
sbitRED_DX=P1^3;//东西红灯
sbitYELLOW_DX=P1^4;//东西黄灯
sbitGREEN_DX=P1^5;//东西绿灯
sbitA0=P0^0;//CD4511
sbitA1=P0^1;
sbitA2=P0^2;
sbitA3=P0^3;
sbitbell=P2^3;//蜂鸣器
sbitP24=P2^4;
sbitP25=P2^5;//南北方向数码管位选
sbitP26=P2^6;
sbitP27=P2^7;//东西方向数码管位选
sbitK1=P3^2;//紧急按键
sbitK2=P3^3;//调节按键
sbitK3=P2^1;//加一按键
sbitK4=P2^2;//减一按键
sbitK5=P2^0;//开始按键
voiddisplay1(uchar,uchar);
voiddisplay2(uchar,uchar);
voiddelayms(uintk);
ucharbuf1,buf2,buf3,buf0,buf4,buf5,buf6,buf7,buf8;
ucharNB1=35,DX1=35,NB3=60,DX3=60;
ucharjs100ms1,js100ms2,t0;
ucharflag1=0,flag2=0,flag3=0,flag4=0,kaishi_flag=0,led_data_buf,led_data_buf1;
voidgetkey(void)
{
if(K3==0)
{
delayms(8);
if(K3==0)
{
while(!
K3)bell=0;
bell=1;
t0+=1;
if(NB1!
=0)
{NB1+=1;DX1+=1;}
else
{NB3+=1;DX3+=1;}
}
}
if(K4==0)
{
delayms(8);
if(K4==0)
{
while(!
K4)bell=0;
bell=1;
t0-=1;
if(NB1!
=0)
{NB1-=1;DX1-=1;}
else
{NB3+=1;DX3+=1;}
}
}
}
voidInitial(void)
{
TMOD=0x11;//定时器0,1工作在方式1
TH1=(65536-50000)/256;//100ms定时
TL1=(65536-50000)%256;
TR1=1;//开定时器1中断
ET1=1;//允许定时器1中断
ET0=1;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EX0=1;//允许外部中断0
IE0=1;//启动外部中断0
PX0=1;
EX1=1;
IE1=1;
EA=1;//开总中断
}
voidint0(void)interrupt0//外中断0
{
flag1=1;flag3++;
led_data_buf=P1;buf0=t0;
buf1=NB1,buf2=DX1,buf3=NB3,buf4=DX3;
t0=15;
if(!
K1)
{
delayms(10);
if(!
K1)
{
while(!
K1)bell=0;
bell=1;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR1=0;
TR0=1;
EX0=0;
EX1=0;
js100ms2=0;
}
}
}
voidint1(void)interrupt2//外部中断1
{
t0=10;flag3++;
flag2=1;
led_data_buf=P1;led_data_buf1=P1;
buf1=NB1,buf2=DX1,buf3=NB3,buf4=DX3;
if(!
K2)
{
delayms(10);
if(!
K2)
{
while(!
K2)bell=0;
bell=1;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR1=0;
TR0=1;
EX1=0;
js100ms2=0;
}
}
}
voidISRT0(void)interrupt1//定时器0中断服务子程序
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;//重装初值
getkey();
if(flag1)
{
flag1=0;
P1=0xf6;
}
if(flag2)
{
flag2=0;
if(((RED_NB==0)&&(GREEN_DX==0))||((RED_NB==0)&&(YELLOW_DX==0)))
{P1=0xff;
RED_DX=0;
GREEN_NB=0;
}
else
{P1=0xff;
RED_NB=0;
GREEN_DX=0;
}
}
js100ms2++;
if(js100ms2>9)
{
t0--;
js100ms2=0;
}
if(t0==0)
{if(flag3==1)
{
if(flag4==1)
{flag4=0;P1=led_data_buf1;}
elseP1=led_data_buf;
NB1=buf1,DX1=buf2,NB3=buf3,DX3=buf4;
TR0=0;//禁止定时器0中断
TR1=1;//开定时器1中断
EX1=1;
EX0=1;
js100ms2=0;
flag3=0;
return;}
if(flag3==2)
{P1=led_data_buf;
t0=buf0;
js100ms2=0;
flag3=1;flag4=1;}
}
}
voidISRT1(void)interrupt3//定时器1中断服务子程序
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;//重装初值
js100ms1++;
getkey();
if(js100ms1>9)
{
NB1--;
DX1--;
NB3--;
DX3--;
js100ms1=0;
}
}
/*=================延时=======================*/
voidDelay10uS(ucharsecond)
{
uinti;
while((second--)!
=0)
{
for(i=0;i<3;i++)
{}
}
}
voiddelayms(uintk)
{
uinti,j;
for(i=0;i for(j=0;j<60;j++); } /*==================数码管控制========================*/ ucharcodediscode[]= {0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9}; //CD4511驱动共阴数码管0-9代码 voiddisplay1(ucharnum1,ucharnum2)//控制南数码管显示 { P0=discode[num1];P24=1;Delay10uS(10);P24=0;//高位 P0=discode[num2];P25=1;Delay10uS(10);P25=0;//低位 } voiddisplay2(ucharnum3,ucharnum4)//控制东西数码管显示 { P0=discode[num3];P26=1;Delay10uS(10);P26=0;//高位 P0=discode[num4];P27=1;Delay10uS(10);P27=0;//低位 } /*===================主函数=================================*/ main() { /*=============初始状态: 东西南北都红灯==================*/ RED_NB=0; RED_DX=0; delayms(1800); RED_NB=1; RED_DX=1; for(;;) { if(! K5) { delayms(10); if(! K5) { while(! K5)bell=0; kaishi_flag=1; Initial(); bell=1; break; } } } while(kaishi_flag) { /*=============状态1: 东西绿灯(25s)南北红灯(25s)==================*/ /*=============状态2: 东西黄灯(5s)南北红灯(5s)=================*/ RED_NB=0; GREEN_DX=0; while(NB1! =0) { if(TR0==1) { display2(t0/10,t0%10);//当t0=15时东西、南北红灯(15s) display1(t0/10,t0%10);//当t0=10时东西、南北红、绿灯交换点亮 } else { if(NB1==5) { if(TR0==1) { display2(t0/10,t0%10); display1(t0/10,t0%10); } else { display1(NB1/10,NB1%10);//东西黄灯(5s) display2(DX1/10,DX1%10);//南北红灯(5s) GREEN_DX=1; RED_NB=0; YELLOW_DX=0; } } else { display1(NB1/10,NB1%10);//东西绿灯(25s)东西黄灯(5s) display2(DX1/10,DX1%10);//南北红灯(30s) } } } RED_NB=1; YELLOW_DX=1; P24=0;P25=0;P26=0;P27=0;//数码管全关掉 Delay10uS(10); /*=============状态3: 东西红灯(15s)南北绿灯(15s)================*/ /*=============状态4: 东西红灯(5s)南北黄灯(5s)==================*/ RED_DX=0; GREEN_NB=0; while(NB3! =0) { if(TR0==1) { display2(t0/10,t0%10);//当t0=15时东西、南北红灯(15s) display1(t0/10,t0%10);//当t0=10时东西、南北红、绿灯交换点亮 } else { if(NB3==5) { if(TR0==1) { display2(t0/10,t0%10); display1(t0/10,t0%10); } else { display1(NB3/10,NB3%10);//东西黄灯(5s) display2(DX3/10,DX3%10);//南北红灯(5s) GREEN_NB=1; RED_DX=0; YELLOW_NB=0; } } else { display1(NB3/10,NB3%1
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 交通 信号灯 单片机 报告