当前位置:文档之家› 交通灯设计实验报告(硬件原理图+程序)

交通灯设计实验报告(硬件原理图+程序)

交通灯信号灯自动控制系统交通灯原理图一、系统的基本功能要求(1)以秒为计时单位,两位数码管以十进制递减计数形式作定时显示,在递减计数回零瞬间完成换灯操作。

(2)通过键盘红黄绿三色信号灯所亮时间在0~99秒内任意设定。

(3)十字路口的通行起始状态可人工设定,运行中可通过人工干预使十字路口通行状态固定于任何一种工作模式。

硬件设计1.系统总体框图2.电路设计(1)显示模块倒计时与时钟说明:⑴共阴极两位数码管用于倒计时;段选端由锁存器控制,位选端用P3_0与P3_1控制⑵两个四位共阴极数码组成八位数码管用于时钟显示段位选分别由两个锁存器控制(2)红绿灯模块说明:⑴图为两方向的红绿黄灯,分别接在P0口上,由P0口控制⑵51系列单片机的P0口内部没有集成上拉电阻,加上拉就是提高驱动能力,必须要通过上拉电阻接VCC。

上拉电阻一般接1K的。

(3)键盘模块说明⑴P2键控制功能说明:P2^6 key0绿灯位选择P2^5 key1黄灯位选择P2^4 key2 加1操作P2^3 key3 减1操作P2^2 key4 信号灯状态固定P2^1 key5 信号灯状态切换P2^0 key6时钟时分秒设置键⑵键盘加上拉电阻为了提高驱动能力3.复位电路:4.时钟电路:说明:用12M晶振时电容要选择30p软件部分1、主程序流程图2、时钟初值控制子程序3、绿灯,黄灯初值设置子程序4、时钟控制与倒计时控制时钟,倒计时初值通过键盘输入。

倒计时使用52单片机内部定时器1实现计数,时钟控制部分是使用定时、计数器2实现计时,以秒为基本单位在数码管中显示。

时钟部分:当秒的个位计时到了10,则秒个位清0,同时十位进一,以此类推;倒计时部分显示是则递减显示。

此过程通过判断语句实现。

5、.灯状态控制灯的状态通过键盘扫描控制。

状态固定键按下时,关闭定时器1;再次按下此键时,打开定时器。

状态选择键按下时,程序跳至下一个状态的程序控制部分,从而实现状态改变。

基本功能:(1)A B干道分别有两组红黄绿灯,各自的亮灯时间与状态由键盘控制。

(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) 这次设计时间很长,期间,我们自学了单片机教程,keil 2、proteus、protel 99se等软件,自学能力达到很大的提高(2)本次设计过程中,我们充分体会到了团体合作的重要性。

通过我们三个人的合理分工,设计过程完成的比较成功(3)通过本次设计,我们学到了对复杂程序模块化的编程方法和对其进行检查与修改方法。

(4)本次设计过程中,我们的动手能力得到很大的提高,例如说焊接技术、对电路板的总体规划,等等。

<<单片机原理与应用及C51程序设计>>清华大学大学出版社附:软件C程序//********************实验板上完整程序#include"reg52.h"#define uint unsigned int#define uchar unsigned charuchar aa,bb,cc,dd,ee,ff,a1,a3,con32,con31; uchar temp,ye,shi1,ge1,shi2,ge2,shi,ge,flag; int b,c=0,d=0,m=1,t;uint n1,n2;sbit p0_3=P0^3; //A干道黄灯sbit p0_2=P0^2; //A干道红灯sbit p0_4=P0^4; //A干道绿灯sbit p0_6=P0^6; //B干道黄灯sbit p0_7=P0^7; //B干道红灯sbit p0_5=P0^5; //B干道绿灯sbit wela=P3^0;sbit dula=P3^1;sbit p3_2=P3^2;sbit p3_3=P3^3;uchar data timedate1[3]={0x00,0x00,0x00};//显示缓冲区两位数字uchar data timedate2[3]={0x00,0x00,0x00};//显示缓冲区两位数字uchar data timedate3[7]={0x00,0x00,0x00,0x00,0x00,0x00,0x00};//显示缓冲区两位数字char code wei[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位扫描sbit key0=P2^6; //绿灯控制键sbit key1=P2^5; //黄灯控制键sbit key2=P2^4; //加一键sbit key3=P2^3; //减一键sbit key4=P2^2; //保存状态sbit key5=P2^1; //状态改变sbit key6=P2^0; //时钟控制键uchar data con3=0x00;uchar data con=0x00;uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};void display(uchar shi,uchar ge);void display3(uchar aa,uchar bb,uchar cc,uchar dd,uchar ee,uchar ff);void delay(uint z);void init();keyscan1() ;keyscan2() ;keyscan3() ;void main(){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;//关闭计数器,下面else if语句不执行,直接到delay()显示语句else TR0=1;}//****************************状态改变,进入下一个状态if(key5==0){delay(12);while(key5==0) ;delay(12);m++;c++;if(c%2) temp=n2;else temp=n1;}//****************************状态选择if(t<5||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(temp>3)p0_4=0;else{if(a1/10==0)p0_4=0;else p0_4=1;} //A绿灯p0_7=0; //B红灯delay(1);}else if(m%4==2){p0_4=1;if(a1/10==0)p0_3=0; else p0_3=1;//A黄灯p0_7=0; //B红灯delay(1);}else if(m%4==3){p0_3=1;p0_7=1;p0_2=0; //A红灯if(temp>3)p0_5=0;else{if(a1/10==0)p0_5=0;else p0_5=1;} //B绿灯delay(1);}else if(m%4==0){p0_5=1;p0_2=0; //A红灯if(a1/10==0)p0_6=0; else p0_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;else temp=n1;}}display(shi,ge);}b=0;}}void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void display(uchar shi,uchar ge) { 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;}void display3(uchar aa,uchar bb,uchar cc,uchar dd,uchar ee,uchar ff){ 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;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);P1=table[dd]; dula=0;P1= 0xff;wela=1;P1=wei[3]; wela=0;delay(1);dula=1;P1=table[10]; dula=0;P1=0xff;wela=1;P1= wei[2]; wela=0;delay(1);dula=1;P1=table[ee];P1=0xff;wela=1;P1= wei[1];wela=0;delay(1);dula=1;P1=table[ff];dula=0;P1= 0xff;wela=1;P1=wei[0];wela=0;delay(1);}void init(){wela=0;dula=0;TH1=(65536-50000)/256;TL1=(65536-50000)%256;TMOD=0x11; EA=1;ET1=1;TR1=0;TH0=(65536-50000)/256;TL0=(65536-50000)%256;ET0=1;TR0=0;}//************************绿灯键盘扫描程序keyscan1(){if(key0==0){//b=0;delay(12);while(key0==0) ;delay(12);con++;//b++;}if(con!=0) //con=1||2时的加一运算if(key2==0){delay(12);while(key2==0) ;delay(12);timedate1[con]++;if(timedate1[con]>9)timedate1[con]=0;shi1=timedate1[1];ge1=timedate1[2];display(shi1,ge1);n1=10*shi1+ge1;}if(con!=0) //con=1||2时的减一运算if(key3==0){delay(12);while(key3==0) ;delay(12);timedate1[con]--;if(timedate1[con]==255)timedate1[con]=9;shi1=timedate1[1];ge1=timedate1[2];display(shi1,ge1);n1=10*shi1+ge1;}}//*********************黄灯控制键扫描keyscan2(){if(key1==0){b=0;delay(12);while(key1==0) ;delay(12);ye++;b++;}if(ye!=0) //con=1||2时的加一运算if(key2==0){delay(12);while(key2==0) ;delay(12);timedate2[ye]++;if(timedate2[ye]>9)timedate2[ye]=0;shi2=timedate2[1];ge2=timedate2[2];display(shi2,ge2) ;n2=10*shi2+ge2;}if(ye!=0) //con=1||2时的减一运算if(key3==0){delay(12);while(key3==0) ;delay(12);timedate2[ye]--;if(timedate2[ye]==255)timedate2[ye]=9;shi2=timedate2[1];ge2=timedate2[2];display(shi2,ge2);n2=10*shi2+ge2;}}void timer0() interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;a1++;}//******************时钟控制键扫描程序keyscan3(){if(key6==0){delay(12);while(key6==0) ;delay(12);con3++;TR1=0;if(con3==5){TR0=1;con3=0; }}if(con3!=0) //con=1||2时的加一运算if(key2==0){delay(12);while(key2==0) ;delay(12);timedate3[con3]++;if(con3==1)con31=2;else if(con3==2)con31=9;else if(con3==3)con31=5;else if(con3==4)con31=9;if(timedate3[con3]>con31)timedate3[con3]=0;if(timedate3[1]==2&&timedate3[2]==4){timedate3[2]=0;timedate3[1]=0;}}if(con3!=0)if(key3==0){delay(12);while(key3==0) ;delay(12);timedate3[con3]--;}if(con3==1) con32=2;else if(con3==2) con32=9;else if(con3==3) con32=5;else if(con3==4) con32=9;if(timedate3[con3]==255)timedate3[con3]=con32;if(timedate3[1]==2&&timedate3[2]==9)timedate3[2]=3;aa=timedate3[1]; //小时的十是位bb=timedate3[2];cc=timedate3[3];dd=timedate3[4];ee=timedate3[5];ff=timedate3[6];t=10*aa+bb;}void time_intt3(void) interrupt 3{TH0=(65536-50000)/256;TL0=(65536-50000)%256;a3++;if(a3==20){a3=0;timedate3[6]++;if(timedate3[6]==10){timedate3[6]=0;timedate3[5]++;} if(timedate3[5]==6){timedate3[5]=0;timedate3[4]++;} if(timedate3[4]==10){timedate3[4]=0;timedate3[3]++;} if(timedate3[3]==6){timedate3[3]=0;timedate3[2]++;} if(timedate3[2]==10){timedate3[2]=0;timedate3[1]++;} if(timedate3[1]==2&&timedate3[2]==4) {timedate3[1]=0;timedate3[2]=0;} aa=timedate3[1];bb=timedate3[2];cc=timedate3[3];dd=timedate3[4];ee=timedate3[5];ff=timedate3[6];t=10*aa+bb;}}。

相关主题