您好,欢迎访问三七文档
当前位置:首页 > 建筑/环境 > 设计及方案 > 交通灯设计实验报告(硬件原理图+程序)
交通灯信号灯自动控制系统交通灯原理图一、系统的基本功能要求(1)以秒为计时单位,两位数码管以十进制递减计数形式作定时显示,在递减计数回零瞬间完成换灯操作。(2)通过键盘红黄绿三色信号灯所亮时间在0~99秒内任意设定。(3)十字路口的通行起始状态可人工设定,运行中可通过人工干预使十字路口通行状态固定于任何一种工作模式。二、设计思路及总体框图,方案比较硬件设计1.系统总体框图2.电路设计(1)显示模块倒计时与时钟STC89C52单片机锁存器(位选端)倒计时显示数码管键盘锁存器(段选端)时间显示数码管码管码管LED红绿灯复位电路时钟电路P2P1P1说明:⑴共阴极两位数码管用于倒计时;段选端由锁存器控制,位选端用P3_0与P3_1控制⑵两个四位共阴极数码组成八位数码管用于时钟显示段位选分别由两个锁存器控制(2)红绿灯模块说明:⑴图为两方向的红绿黄灯,分别接在P0口上,由P0口控制⑵51系列单片机的P0口内部没有集成上拉电阻,加上拉就是提高驱动能力,必须要通过上拉电阻接VCC。上拉电阻一般接1K的。(3)键盘模块说明⑴P2键控制功能说明:P2^6key0绿灯位选择P2^5key1黄灯位选择P2^4key2加1操作P2^3key3减1操作P2^2key4信号灯状态固定P2^1key5信号灯状态切换P2^0key6时钟时分秒设置键⑵键盘加上拉电阻为了提高驱动能力3.复位电路:4.时钟电路:说明:用12M晶振时电容要选择30p软件部分1、主程序流程图开始时钟初值设置子程序绿灯初值设置子程序黄灯初值设置子程序开时钟2开时钟1,倒计时状态固定状态选择2、时钟初值控制子程序3、绿灯,黄灯初值设置子程序Y是否有键盘按下Y是否按下时钟键时钟键盘扫描扫描加一,减一键盘各个位的加一,减一NNN4、时钟控制与倒计时控制时钟,倒计时初值通过键盘输入。倒计时使用52单片机内部定时器1实现计数,时钟控制部分是使用定时、计数器2实现计时,以秒为基本单位在数码管中显示。时钟部分:当秒的个位计时到了10,则秒个位清0,同时十位进一,以此类推;倒计时部分显示是则递减显示。此过程通过判断语句实现。5、.灯状态控制灯的状态通过键盘扫描控制。状态固定键按下时,关闭定时器1;再次按下此键时,打开定时器。状态选择键按下时,程序跳至下一个状态的程序控制部分,从而实现状态改变。NNYY扫描绿灯键盘控制键是否键盘按下扫描加一,减一键键盘是否按下相应位加一或减一三、实现功能说明基本功能:(1)AB干道分别有两组红黄绿灯,各自的亮灯时间与状态由键盘控制。(2)两位数码管用于倒计时,记录各个灯的亮灯时间,定时时间由键盘设定。(3)十字路口通行状态可由键盘切换。发挥部分功能:(1)由八位数码管显示,初试时间可由键盘设定,且在05:00~23:00黄灯闪烁显示。(2)绿灯倒计时最后三秒和黄灯显示时闪烁显示(频率1HZ)。(3)人行道的红绿灯配合车辆的红绿灯同时工作。四、所用器件与功能(1)共阴数码管10个:8个显示时间,2个显示倒计时时间(2)红黄绿发光二极管个4个:模拟十字路口信号灯。令各加1个人行道上的红灯和绿灯(3)74HC573锁存器2个:段码和位选锁存各一个(4)STC单片机一块按键8个12M晶振一个排线排针电阻电容若干五、故障及问题分析(1)问题:每次通电后都要在十八、十十九口触发一下才能正常工作。分析:晶振电路与单片机距离过远,输入噪声很大解决:把晶振电路改在紧挨单片机位置就可排除干扰。(2)共阳数码管需要接三极管放大驱动电流,为节约成本选用共阴数码管。(3)键盘扫描程序中加了按键前沿消抖延时,但按键不够灵敏加了后延消抖后使得按键足够灵敏。(4)在段锁存器给各个数码管送段码时相互之间有影响,在显示函数中加消影程序解决相互之间的影响。(5)在第一次焊接时一次性焊接完,调试时无法检查错误,而在第二次焊接时采用边调试边焊接的方法,加快速度,提高了准确度。(6)杜邦线数码管、锁存器等接线比较多,用单根导线焊接容易相互连接且不易检查错误,用杜邦线便于检查和模块化调试。六、心得体会本次设计,我们花了不少时间和精力,但收获很大:(1)这次设计时间很长,期间,我们自学了单片机教程,keil2、proteus、protel99se等软件,自学能力达到很大的提高(2)本次设计过程中,我们充分体会到了团体合作的重要性。通过我们三个人的合理分工,设计过程完成的比较成功(3)通过本次设计,我们学到了对复杂程序模块化的编程方法和对其进行检查与修改方法。(4)本次设计过程中,我们的动手能力得到很大的提高,例如说焊接技术、对电路板的总体规划,等等。七、参考资料单片机原理与应用及C51程序设计清华大学大学出版社附:软件C程序//********************实验板上完整程序#includereg52.h#defineuintunsignedint#defineucharunsignedcharucharaa,bb,cc,dd,ee,ff,a1,a3,con32,con31;uchartemp,ye,shi1,ge1,shi2,ge2,shi,ge,flag;intb,c=0,d=0,m=1,t;uintn1,n2;sbitp0_3=P0^3;//A干道黄灯sbitp0_2=P0^2;//A干道红灯sbitp0_4=P0^4;//A干道绿灯sbitp0_6=P0^6;//B干道黄灯sbitp0_7=P0^7;//B干道红灯sbitp0_5=P0^5;//B干道绿灯sbitwela=P3^0;sbitdula=P3^1;sbitp3_2=P3^2;sbitp3_3=P3^3;uchardatatimedate1[3]={0x00,0x00,0x00};//显示缓冲区两位数字uchardatatimedate2[3]={0x00,0x00,0x00};//显示缓冲区两位数字uchardatatimedate3[7]={0x00,0x00,0x00,0x00,0x00,0x00,0x00};//显示缓冲区两位数字charcodewei[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位扫描sbitkey0=P2^6;//绿灯控制键sbitkey1=P2^5;//黄灯控制键sbitkey2=P2^4;//加一键sbitkey3=P2^3;//减一键sbitkey4=P2^2;//保存状态sbitkey5=P2^1;//状态改变sbitkey6=P2^0;//时钟控制键uchardatacon3=0x00;uchardatacon=0x00;ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};voiddisplay(ucharshi,ucharge);voiddisplay3(ucharaa,ucharbb,ucharcc,uchardd,ucharee,ucharff);voiddelay(uintz);voidinit();keyscan1();keyscan2();keyscan3();voidmain(){init();//初始化子程序while(1){//*************************键盘扫描控制程序if(con==0&&ye==0)keyscan3();display3(aa,bb,cc,dd,ee,ff);if(con3==0&&ye==0)//调用键盘扫描程序{keyscan1();shi1=n1/10;ge1=n1%10;display(shi1,ge1);}if(con==0&&con3==0){keyscan2();shi2=n2/10;ge2=n2%10;display(shi2,ge2);}if((con=3&&ye==0)||(ye=3&&con==0))display(0,0);P0=0xff;delay(1);//***************************保存当前状态if(key4==0){delay(12);while(key4==0);delay(12);d++;if(d%2)TR0=0;//关闭计数器,下面elseif语句不执行,直接到delay()显示语句elseTR0=1;}//****************************状态改变,进入下一个状态if(key5==0){delay(12);while(key5==0);delay(12);m++;c++;if(c%2)temp=n2;elsetemp=n1;}//****************************状态选择if(t5||t=23){if(a1/10==0){p0_3=0;p0_6=0;}else{p0_3=1;p0_6=1;}delay(1);}else{if(m%4==1){p0_6=1;p0_2=1;if(temp3)p0_4=0;else{if(a1/10==0)p0_4=0;elsep0_4=1;}//A绿灯p0_7=0;//B红灯delay(1);}elseif(m%4==2){p0_4=1;if(a1/10==0)p0_3=0;elsep0_3=1;//A黄灯p0_7=0;//B红灯delay(1);}elseif(m%4==3){p0_3=1;p0_7=1;p0_2=0;//A红灯if(temp3)p0_5=0;else{if(a1/10==0)p0_5=0;elsep0_5=1;}//B绿灯delay(1);}elseif(m%4==0){p0_5=1;p0_2=0;//A红灯if(a1/10==0)p0_6=0;elsep0_6=1;//B黄灯delay(1);}}//*****************************************倒计时if(con=3&&ye=3){TR0=1;if(b!=0)temp=n1;//只有当扫描到有输入时temp才等于n,否则为自减后的值shi=temp/10;ge=temp%10;if(a1==20){a1=0;temp--;if(temp==-1){c++;//进入下一个状态,赋倒计时起始值m++;//进入下一个状态,赋灯的状态if(c%2)temp=n2;elsetemp=n1;}}display(shi,ge);}b=0;}}voiddelay(uintz){uintx,y;for(x=z;x0;x--)for(y=110;y0;y--);}voiddisplay(ucharshi,ucharge){P1=0x00;wela=0;p3_2=1;dula=1;P1=table[shi];dula=0;p3_3=0;delay(1);p3_3=1;dula=1;P1=table[ge];dula=0;p3_2=0;delay(1);p3_2=1;}voiddisplay3(ucharaa,ucharbb,ucharcc,uchardd,ucharee,ucharff){p3_2=1;p3_3=1;P1=0xff;wela=1;P1=wei[7];wela=0;P1=0x00;dula=1;P1=table[aa];dula=0;delay(1);dula=1;P1=table[bb];dula=0;P1=0xff;wela=1;P1=wei[6];wela=0;delay(1);dula=1;P1=table[10];dula=0;P1=0xff;wela=1;P1=wei[5];wela=0;delay(1);dula=1;P1=table[cc];dula=0;P1=0xff;wela=1;P1=wei[4];wela=0;delay(1);dula=1;P1=table[dd];dula=0;P1=0xff;wela=1;P1=wei[3];wela=0;delay(1);dula=1;P1=tabl
本文标题:交通灯设计实验报告(硬件原理图+程序)
链接地址:https://www.777doc.com/doc-6959970 .html