用单片机控制交通灯源程序代码及流程图

合集下载

C51代码交通灯Proteus原理图

C51代码交通灯Proteus原理图

吉首大学单片机交通灯设计原理图局部放大程序代码#include<reg51.H>#define uchar unsigned char #define uint unsigned intuchar code table[]={ //共阴极数码管码表0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0xC9,0xFF,0x40};//设置码,测试码,不计时码void delay(uint x);//延时函数void display(uchar,uchar,uchar,uchar); //数码管显示函数void mkeys(); //键盘函数void traffic(); //交通灯函数uchar num,num1,num2, //1南北 2东西shi1,ge1,shi2,ge2,value1,value2,//南北绿灯时间黄灯时间value3,value4,//东西绿灯时间黄灯时间count1,count2,flag1,flag2; //南北标记东西标记void main(){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;//初始状态:东西红灯南北绿灯 20 15while(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);}}void traffic() //红绿灯主控制程序{if(num1==0){count1++;if(count1==1){P1=0x42;//东西红灯南北黄灯 5 5num1=value2;}if(count1==2){num1=value3+value4;//东西绿灯南北红灯10 15 P1=0x14;}if(count1==3){P1=0x41;// 东西黄灯南北红灯 5 5num1=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;}}}void display(uchar shi1,uchar ge1,uchar shi2,uchar ge2) //数码管显示子函数{uchar temp;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);}void delay(uint x)//延时子函数{uinti,j;for(i=x;i>0;i--)for(j=110;j>0;j--);}void mkeys() //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){case 0xee:key=0;break;case 0xde:key=1;break;case 0xbe:key=2;break;case 0x7e: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){case 0xed:key=0;break;case 0xdd:key=1;break;case 0xbd:key=2;break;case 0x7d: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){case 0xeb:key=0;break;case 0xdb:key=1;break;case 0xbb:key=2;break;case 0x7b: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){case 0xe7:key=0;break;case 0xd7:key=1;break;case 0xb7:key=2;break;case 0x77: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:}}}}void T0_time() interrupt 1 //定时器T0 中断子程序{TH0=(65536-45872)/256;TL0=(65536-45872)%256; num++;}。

用单片机控制交通灯源程序代码及流程图

用单片机控制交通灯源程序代码及流程图

用单片机控制交通灯传统的交通灯控制电路一般由数字电路构成,电路复杂、体积大、成本高。

采用单片机控制交通灯不但可以解决上述问题,而且还具有时间显示功能,非常方便。

下面介绍一种用单片机控制交通灯的方法。

一、硬件硬件电路如附图。

AT89C2051的P1.7~P1.5和P1.3~P1.1直接驱动红、黄、绿灯,利用单片机的串口和二片74LS164串/并转换移位寄存器实现时间显示,七段数码管为共阴管,硬件电路极为简单。

二、软件交通灯有红、黄、绿三种。

红灯亮,停止通行;绿灯亮,允许通行;黄灯亮,作过渡。

红灯亮60秒,绿灯亮55秒,黄灯亮5秒。

每组灯的亮暗状态以2分钟为周期循环,故程序采用主、子程序方式,循环结构。

另外,为了简化电路,红、黄、绿灯采用低电平点亮。

源程序清单如下:ORG0000HSTART:MOVDRTR,#TABMOVSCON,#00HMOVP1,#6CH;点亮红、绿灯MOVR0,#0;R0清零LEFT:INCR0CJNER0,#55,LP0;R0<55,转LP0MOVP1,#6AH;R0=55,点亮红、黄灯LJMPLP1LP0:CJNER0,#60,LP1;R0<60,转LP1MOVP1,#0C6H;R0=60,点亮绿、红灯LJMPRIGHTLP1:LCALLDBDBLCALLDISPLJMPLEFT;20H为1,转LEFTRIGHT:DECR0CJNER0,#5,LP2;R0>0,转LP2MOVP1,#0A6H;R0=5,点亮黄、红灯LJMPLP3LP2:CJNER0,#0,LP3MOVP1,#6CH;R0=0,点亮红、绿灯LJMPLEFTLP3:LCALLDBDBLCALLDISPLJMPRIGHTDBDB:MOVA,R0MOVB,#10DIVABMOVR1,AMOVR2,BRETDISP:MOVA,R2MOVCA,@A+DPTRMOVSBUF,AJNBTI,$;查TI位CLRTIMOVA,R1MOVCA,@A+DPTRMOVSBUF,AJNBT1,$CLRTILCALLDEALYRETDELAY:MOVR3,#09HK1:MOVR4,#100K2:MOVR5,#250K3:DJNZR5,K3DJNZR4,K2KJNZR3,K1RETTAB:DB3FH,06H,5BHDB4FH,66HDB6DH,7DH,07HDB7FH,6FH三.实验电路及连线四.实验说明1.因为本实验是交通灯控制实验,所以要先了解实际交通灯的变化规律。

Proteus实现单片机交通灯_图+程序(调试可用)

Proteus实现单片机交通灯_图+程序(调试可用)

这是我初学单片机,并用Proreus软件自己绘制自己编写程序实现的一个交通红绿灯的系统。

这是硬件连接图和程序,以便今后复习。

左上右下中控制部分,上面一个开关按下时,南北方向绿灯,东西方向红灯黄灯闪烁3秒绿灯设置15秒,红灯设置18秒。

绿灯走完15秒后黄灯闪烁3秒变为红灯,红灯走完18秒后变成绿灯,以此循环。

源程序:COUNT EQU30H;T0中断计数SNLEDDATA EQU31H;存储南北数码管显示的数据SNCOLORFLAG EQU32H;=1时南北绿灯亮,=2时南北黄灯亮,=3时南北红灯亮SNLEDDATAINIT EQU33H;存储南北各颜色灯的初始时间EWLEDDATA EQU34H;存储东西数码管显示的数据EWCOLORFLAG EQU35H;=1时东西红灯亮,=2时东西绿灯亮,=3时东西黄灯亮EWLEDDATAINIT EQU36H;存储东西各颜色灯的初始时间org0000hlJMP MAINorg0003hljmp exint0ORG000BHlJMP INTT0org0013hljmp exint1org0100h;主函数**************************************MAIN:CALL INITSTART:MOV A,COUNTCJNE A,#200,NOT1S;没到1秒跳转MOV COUNT,#00;1秒时间到DEC SNLEDDATAMOV A,SNLEDDATAJNZ checkewleddataMOV SNLEDDATA,SNLEDDATAINITINC SNCOLORFLAGMOV A,SNCOLORFLAGCJNE A,#04,checkewleddataMOV SNCOLORFLAG,#01checkewleddata:DEC EWLEDDATAMOV A,EWLEDDATAJNZ timenotoverMOV EWLEDDATA,EWLEDDATAINITINC EWCOLORFLAGMOV A,EWCOLORFLAGCJNE A,#04,timenotoverMOV EWCOLORFLAG,#01TIMENOTOVER:NOT1S:call ewcolorcheckCALL snCOLORCHECKCALL DISPLAYJMP START;*********************************************;初始化函数***********************************INIT:MOV SP,#60HMOV TMOD,#01HMOV TH0,#0eCHMOV TL0,#078HMOV COUNT,#00HMOV SNLEDDATAINIT,#15MOV EWLEDDATAINIT,#18MOV SNLEDDATA,SNLEDDATAINITMOV EWLEDDATA,EWLEDDATAINITSETB TR0;开定时器0SETB ET0;允许定时器0中断setb ex0;允许外部0中断setb ex1;允许外部1中断setb it0;外部中断0下降沿触发setb it1;外部中断1下降沿触发SETB EA;开总中断MOV P2,#0feHMOV SNCOLORFLAG,#01RET;*****************************************;外部中断0*********************************** exint0:push accpush pswmov a,p0push accmov a,p1push accmov a,p2push accclr ex1clr p2.0clr p2.1clr p2.2clr p2.3setb p1.4clr p1.1clr p1.2setb p1.5clr p1.3clr p1.4jnb p3.2,$setb ex1pop accmov p2,apop accmov p1,apop accmov p0,apop pswpop acc;外部中断1*********************************** exint1:push accpush pswmov a,p0push accmov a,p1push accmov a,p2push accclr ex0clr p2.0clr p2.1clr p2.2clr p2.3setb p1.4setb p1.2clr p1.1clr p1.0setb p1.3clr p1.5clr p1.4jnb p3.3,$setb ex0pop accmov p2,apop accmov p1,apop accmov p0,apop pswpop acc;T0中断函数*******************************INTT0:PUSH ACCPUSH PSWMOV TH0,#0ecH;#0echMOV TL0,#078H;#078hMOV A,P2RL ACJNE A,#11101111B,NOT5MOV A,#0feH;p2.0=0,南北数码管十位亮,p2.1=0,南北数码管个位亮NOT5:MOV P2,A;p2.2=0,东西数码管十位亮,p2.3=0,东西数码管个位亮INC COUNTPOP PSWPOP ACCRETI;****************************************;南北红绿黄灯控制**************************snCOLORCHECK:PUSH ACCPUSH BPUSH PSWsngreen:MOV A,SNCOLORFLAGCJNE A,#01,snYELLOWMOV SNLEDDATAINIT,#03;设置南北黄灯闪烁时间CLR P1.2CLR P1.1SETB P1.0;南北绿灯亮JMP snCOLORCHECKOUTsnYELLOW:;MOV A,SNCOLORFLAGCJNE A,#02,snredMOV SNLEDDATAINIT,#18;设置南北红灯亮时间MOV A,COUNTDIV ABMOV A,BCJNE A,#00H,snNOTFLASHCPL P1.1;南北黄灯闪烁CLR P1.0CLR P1.2snNOTFLASH:JMP snCOLORCHECKOUTsnred:MOV SNLEDDATAINIT,#15;设置南北绿灯亮时间CLR P1.0CLR P1.1SETB P1.2;南北红灯亮snCOLORCHECKOUT:POP PSWPOP BPOP ACCRET;******************************************************;东西红绿黄灯控制**************************************ewCOLORCHECK:PUSH ACCPUSH BPUSH PSWewred:MOV A,ewCOLORFLAGCJNE A,#01,ewyellowMOV ewLEDDATAINIT,#15;设置东西绿灯亮时间CLR P1.3CLR P1.4SETB P1.5;东西红灯亮JMP ewCOLORCHECKOUT;MOV A,ewCOLORFLAGCJNE A,#03,ewgreenMOV ewLEDDATAINIT,#18;设置东西红灯亮时间MOV A,COUNTMOV B,#100DIV ABMOV A,BCJNE A,#00H,ewNOTFLASHCPL P1.4;东西黄灯闪烁CLR P1.3CLR P1.5ewNOTFLASH:JMP ewCOLORCHECKOUTewgreen:MOV ewLEDDATAINIT,#03;设置东西黄灯闪烁时间CLR P1.4CLR P1.5SETB P1.3;东西绿灯亮ewCOLORCHECKOUT:POP PSWPOP BPOP ACCRET;************************************************************;数码管显示**************************************************DISPLAY:PUSH ACCPUSH PSWPUSH BMOV A,SNLEDDATAMOV B,#10DIV ABMOV A,EWLEDDATAMOV B,#10DIV ABMOV R2,BMOV R3,AMOV DPTR,#TABLEMOV A,P2 DISPSNH:CJNE A,#0feH,DISPSNLMOV A,R1MOVC A,@A+DPTRMOV P0,AJMP DISPOUT DISPSNL:CJNE A,#0fdH,DISPEWHMOV A,R0MOVC A,@A+DPTRMOV P0,AJMP DISPOUT DISPEWH:CJNE A,#0fbH,DISPEWLMOV A,R3MOVC A,@A+DPTRMOV P0,AJMP DISPOUT DISPEWL:CJNE A,#0f7H,DISPOUTMOV A,R2MOVC A,@A+DPTRMOV P0,A DISPOUT:POP BRET;************************************************** TABLE:DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH;0123456789END。

51单片机用C语言实现交通灯_红绿灯_源程序

51单片机用C语言实现交通灯_红绿灯_源程序

c o d eu n s i g n e dc h a rt a b [ ] = { 0 x 3 f , 0 x 0 6 , 0 x 5 b , 0 x 4 f , 0 x 6 6 , 0 x 6 d , 0 x 7 d , 0 x 0 7 , 0 x 7 f , 0 x 6 f } ; / / 共阴数码管 0 9 u n s i g n e dc h a rD i s _ S h i w e i ; / / 定义十位 u n s i g n e dc h a rD i s _ G e w e i ;/ / 定 g n e di n tc n t ) { w h i l e ( c n t ) ; } m a i n ( ) { T M O D| = 0 x 0 1 ; / / 定时器设置 1 0 m si n1 2 Mc r y s t a l 定时器 0 ,工作方式 1 ,1 6 位定时器 T H 0 = 0 x d 8 ; / / 6 5 5 3 5 1 0 0 0 0 = 5 5 5 3 5 = D 8 F 0 (十六进制) T L 0 = 0 x f 0 ; I E =0 x 8 2 ;/ / 中断控制,E A = 1 开总中断,E T 0 = 1 :定时器 0 中断允许 T R 0 = 1 ; / / 开定时器 0 中断 P 1 = 0 x f c ; / / 红灯亮,根据红黄绿接灯的顺序。 r e d= 1 ; w h i l e ( 1 ) { P 0 = D i s _ S h i w e i ; / / 显示十位,这里实现用 8 位数码管,即左 1 位 P 2 = 0 ; d e l a y ( 3 0 0 ) ; / / 短暂延时 P 0 = D i s _ G e w e i ;/ / 显示个位,左数,2 位 P 2 = 1 ;

单片机整套实验及程序(交通灯_跑马灯等)文档

单片机整套实验及程序(交通灯_跑马灯等)文档

单片机整套实验及程序(交通灯_跑马灯等)文档实验1 跑马灯实验一、实验目的●初步学会Proteus ISIS和uVision2单片机集成开发环境的使用;●初步掌握采用汇编语言与C语言开发单片机系统的程序结构;●掌握80C51单片机通用I/O口的使用;●掌握单片机内部定时/计数器的使用及编程方法以及中断处理程序的编写方法。

二、实验设备及器件●硬件:PC机,HNIST-1型单片机实验系统●软件:Proteus ISIS单片机仿真环境,uVision2单片机集成开发环境三、实验内容●编写一段程序,采用P1口作为控制端口,使与P1口相接的四个发光二极管(D1、D2、D3、D4)按照一定的方式点亮。

如点亮方式为:先点亮D1,延时一段时间,再顺序点亮D2……D4,然后又是D4……D1,同时只能有一个灯亮;然后每隔一段时间一次使相邻两个灯亮,三个灯亮,四个灯亮,最后闪烁三次,接着循环变化。

●基于Proteus ISIS仿真环境完成上述功能的仿真。

●基于uVision2单片机集成开发环境与硬件平台完成程序的脱机运行。

四、实验原理图图3.1 跑马灯实验电路原理图电路原理图如上图3.1所示,AT89S52的P1.0~P1.3控制4个发光二极管,发光二极管按照一定次序发光,相邻发光二极管的发光时间间隔可以通过定时器控制,还可以通过软件延时实现。

五、软件流程图与参考程序● 主程序流程图如下:● 参考程序#include#include#define uchar unsigned char#define uint unsigned intuchar aa ,num ,speed ,flag;uchar code table[]={0x0e ,0x0d ,0x0b ,0x07};uchar code table1[]={0x0a ,0x05,0x09,0x06};uchar codetable2[]={0x0c ,0x09,0x03,0x08,0x01,0x0e ,0x0c ,0x08,0x00}; void delay(uint z)//延时函数uint x;uchar y;for(x=z;x>0;x--)for(y=200;y>0;y--);}void init()//条件初始化函数{ flag=0;speed=10;//控制跑马灯流水速度TMOD=0x01;//中断方式开始初始化(定时器、中断、标志位设置) Flag=1? 流水灯操作结束 Y NTH0=(65535-50000)/256;TL0=(65536-50000)%256;//初值EA=1;//打开总中断ET0=1;//打开外中断0TR0=1;}void main(){init();//调用初始化函数while(1){if(flag){delay(2000);//调用延时函数for(num=0;num<4;num++)//从左至右间隔一个依次闪烁{P1=table[num];delay(2000);for(num=3;num>0;num--)//从左至右间隔一个依次闪烁{P1=table[num];delay(2000);}for(num=0;num<4;num++)//从左至右间隔两个依次闪烁{P1=table1[num];delay(2000);}for(num=3;num>0;num--)//从左至右间隔两个依次闪烁{P1=table1[num];delay(2000);}for(num=0;num<6;num++)//两个,三个,四个跑马灯依次闪烁{P1=table2[num];delay(2000);}for(num=0;num<5;num++)//闪烁5次{P1=0xff;//全暗delay(2000);P1=0X00;//全亮delay(2000);}speed=speed-3;//变速if(speed==4){speed=10;}}}}void timer0() interrupt 1//中断函数{TH0=(65535-50000)/256;TL0=(65536-50000)%256;aa++;if(aa==speed){aa=0;flag=1;}}六、实验思考题●请用汇编指令完成本实验内容,深刻理解汇编语言程序设计结构。

单片机实现交通灯控制汇编代码

单片机实现交通灯控制汇编代码

交通灯控制一、课程设计的内容在实验平台上选择两组指示灯,每组分为红,黄,绿代表交通灯。

要求:1. 模拟十字交通路口的实际情况,设计十字路口交通灯自动变换系统。

2. 设计十字路口交通灯手动变换系统,并这两套系统可切换使用。

3. 在实现以上内容的基础上增加允许急救车优先通过的要求。

有急救车到达时,两方向交通信号为全红,以便让急救车通过。

二.设计思路及电路图在单片机实验箱上P0口和P2口不能做I/O接口。

但是为了实现交通灯的状态变化,我要用到I/O接口来对按键进行查询和显示发光二极管的状态,P1口控制四段数码管的显示。

所以我扩展I/O接口,用74LS377的输入端接P0口,其输出线1Q~8Q接8个发光二极管,WR作为锁存控制接74LS377的时钟端,扩展片选信号CS1接在74LS377的使能端G。

我用查询方式来查询按键来转换手动,自动,救护车到来的状态的变化,则把四个按键K4~K7与P3.2~P3.5相接,当按键置高电平时,程序就会转换到相应状态执行相应的模块状态。

在自动状态时,开始4个路口的红灯全亮(东西方向为之路,南北方向为主路)之后,南北路口的绿灯亮,东西口的红灯亮,延时显示并查询开关状态是否发生变化,当两个数码管(一个代表东西方向,一个代表南北方向)从0~3显示,当显示3后交通灯显示下一个状态,一直循环重复过程,直到查询到有按键发生变化。

当P3.3高电平时,自动转换为手动,(同理P3.3低电平时手动转换为自动。

)此时拨动按键使P3.2或P3.5置于高点位,就会转到主路或支路相应状态的交通灯显示,数码管显示0。

P3.4控制救护车来时的状态,当其高电位两个红灯全亮并蜂鸣器响起。

实验电路图:显示电路:三、程序:主程序流程图:输出口初始化化送灯的状态到锁存器,灯自动循环亮调用延时显示 并查询按键状态手动状态JB P3.3JNB P3.3开始JB P3.4P3.4 jnb之前状态JBP3.5 JB P3.2东西绿灯亮 南北红灯亮南北绿灯亮东西红灯亮救护车 东西南北红灯亮并警报显示子程序流程图:DISPL Y子程序流程图:ORG 4000HSTART: MOV DPTR,#0F100HMOV A,#11011110B ;东西南北红灯亮MOVX @DPTR,ALCALL DL1S ; 显示时间,并查询按键状态 LCALL XIANSHILOP1: MOV DPTR,#0F100HMOV A,#11011011B ;南北绿灯亮,东西红灯亮MOVX @DPTR,ALCALL DL1S ;显示时间,并查询按键状态LCALL XIANSHIMOV R0,#2LOP2: MOV DPTR,#0F100HMOV A, #11011001B ; 南北黄灯闪烁2次MOVX @DPTR,ALCALL DL1S ;显示时间,并查询按键状态 LCALL XIANSHILOPD: MOV DPTR,#0F100HMOV A,#11011011BMOVX @DPTR,ALCALL DL1SLCALL XIANSHIDJNZ R0,LOP2LOP3: MOV DPTR,#0F100HMOV A,#01111110B ;东西绿灯亮,南北红灯亮MOVX @DPTR,ALCALL DL1S ;显示时间,并查询按键状态LCALL XIANSHIMOV R0,#2LOP4: MOV DPTR,#0F100HMOV A,#00111110B ; 东西黄灯闪烁2次MOVX @DPTR,ALCALL DL1SLCALL XIANSHILOPE: MOV DPTR,#0F100HMOV A,#01111110B ;显示时间,并查询按键态 MOVX @DPTR,ALCALL DL1SLCALL XIANSHIDJNZ R0,LOP4 ;R0不为0,转L0P4AJMP STARTPK:MOV DPTR,#0F100H ;手动状态两个黄灯亮作为标志MOV A,#10111101BMOVX @DPTR,AJNB P3.3,START ;P3.3低电平转自动JB P3.2,ZHUL ;P3.2高电平转主路状态JB P3.5,ZILU ;P3.2高电平转之路状态JB P3.4,JHC ;P3.4高电平转救护车状态 CLR EA ;关救护车的蜂鸣器LCALL XIANSHI1 ;不显示时间,显示0AJMP PKZHUL:MOV DPTR,#0F100HMOV A,#11011011B ;南北绿灯亮,东西红灯亮MOVX @DPTR,ALCALL XIANSHI1 ;显示0AJMP PKZILU: MOV DPTR,#0F100HMOV A,#01111110B ;东西绿灯亮,南北红灯亮MOVX @DPTR,ALCALL XIANSHI1 ;显示0AJMP PKJHC: MOV TMOD,#01HMOV TH0,#0FCH ;蜂鸣器响起MOV TL0,#05BHSETB TR0SETB EACPL P1.7MOV DPTR,#0F100HMOV A, #11011110B ;东西,南北,红灯亮 MOVX @DPTR,ALCALL XIANSHI1 ;显示0;子程序DL1S: JB P3.3,PK ;查询按键状态JB P3.4,JHCRET;显示子程序XIANSHI:MOV A,#0 ;显示0MOV DPTR,#TB ;查表ANL A,0FHMOVC A,@A+DPTRMOV R1,AMOV P1,#11111111BCALL DISPLYLCALL DL1S1 ;调用延时 MOV A,#1 ;显示1 MOV DPTR,#TBANL A,0FHMOVC A,@A+DPTRMOV R1,AMOV P1,#11111111BCALL DISPLYLCALL DL1S1MOV A,#2 ;显示2MOV DPTR,#TBANL A,0FHMOVC A,@A+DPTRMOV R1,AMOV P1,#11111111BCALL DISPLYLCALL DL1S1MOV A,#3 ;显示3 MOV DPTR,#TBANL A,0FHMOVC A,@A+DPTRMOV R1,AMOV P1,#11111111BCALL DISPLYLCALL DL1S1RETXIANSHI1: MOV A,#0MOV DPTR,#TBANL A,0FH ;显示0的子程序 MOVC A,@A+DPTRMOV R1,AMOV P1,#11111111BCALL DISPLYLCALL DL1S1DISPLY:MOV R7,#8 ;MOV A,R1;MOV A,#8EHT: RLC A ;串形输入SETB P1.1 ;时钟置高MOV P1.0,C ;数据送sdaCLR P1.1 ;时钟置低位DJNZ R7,TMOV P1,#10110111B ;1RETDL1S1: MOV R6,#4DELAYY: MOV R5,#250DELAYE: MOV R3,#250 ;延时子程序DELAYF: DJNZ R3,DELAYFDJNZ R5,DELAYEDJNZ R6,DELAYYRETTB:DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6 H,0A1H,86H,8EHEND1 / 1。

单片机控制的交通灯C语言编程

单片机控制的交通灯C语言编程

单片机控制的交通灯红灯停,绿灯行,黄灯闪烁提示行人红绿灯即将切换。

四个方向各有一个红、黄、绿显示和两个数码管。

东西道为人行道(20秒),南北道为车行道(60秒),黄灯延时最后三秒时,闪烁并切换。

三、硬件电路设计此电中路设计采用AT89C51单片机,74LS47(数码管驱动)74LS373(数码管驱动输出锁存),8个数码管显示其延时值,四个红、黄、绿指示灯。

硬件设计关键在于,延时显示时,要考虑到当个位数字显示时,要确保十位数字显示输出的不变。

因此,可加输出锁存器。

在延时最后三秒时,要让黄灯进行闪烁,并同时显示数字(这一步在软件设计上很关键)。

四、软件程序(C语言)以下是整个设计的软件程序,直接可以编译成*。

Hex代码。

通过以上电路,下载到单片机,可直接运行。

//*****************************////程序名:十字路口交通灯控制//编写人:黄庭剑//初写时间:2009年1月2日//程序功能:南北为车行道,延时60秒;东西方向为人行道,延时20秒,且在最后3秒黄灯显示2秒钟再实现切换.//CPU说明:AT89C51型单片机; 24MHZ晶体振荡器//完成时间:2009年1月6日//*****************************//#include<stdio.h>#include<reg51.h>#include<intrins.h>sfr p0 = 0x80;sfr p1 = 0x90;sfr p2 = 0xA0;sfr p3 = 0xb0; //这部分内容其实在“#include<reg51.h>”里已经有,但里面定义的必须区分大小写,在这里,因为我程序采用的是小写,reg51.h里对各个端口与寄存器的定义都是大写,所以在编译连接时,会报错,所以,在本设计程序里,我只用到了端口,在这里也就只定义了四个,而没有去改reg51.h里面的内容。

单片机控制交通灯(内含程序和实物图)

单片机控制交通灯(内含程序和实物图)

摘要随着经济发展,汽车数量急剧增加,城市道路日渐拥挤,交通拥塞已成为一个国际性的问题。

因此,设计可靠、安全、便捷的多功能交通灯控制系统有极大的现实必要性。

根据交通灯在实际控制中的特点,结合单片机的控制功能,提出了一种用单片机自动控制交通灯的简易方法。

设计中包括硬件电路的设计和程序设计两大步骤,对单片机学习中的几个重要内容都有涉足。

单片机的应用正在不断深入,单片机可以用来仿真各个系统。

在自动控制的单片机应用系统中,单片机往往作为一个核心部件来使用,仅单片机方面知识是不够的,还应根据具体硬件结构软硬件结合,加以完善。

十字路口车辆穿梭,行人熙攘,车行车道,人行人道,有条不紊。

那么靠什么来实现这井然秩序呢?靠的就是交通信号灯的自动指挥系统。

交通信号灯控制方式很多。

本系统采用单片机STC89C52为中心器件来设计交通灯控制器,实现了通过P1口设置红、绿灯燃亮时间的功能;红绿灯循环点亮,倒计时剩5秒时黄灯闪烁警示(交通灯信号通过P1口输出,显示时间通过P0口输出至双位数码管)。

本系统设计周期短、可靠性高、实用性强、操作简单、维护方便、扩展功能强。

关键词:单片机交通灯数码管Microcontroller to control traffic lights Abstract: With economic development, a sharp increase in the number of cars, increasingly crowded city roads, traffic congestion has become an international problem. Therefore, the design of reliable, safe, convenient and versatile traffic light control system of great practical necessity.According to the characteristics of the traffic lights in the actual control, combined with the microcontroller control functions, and easy with Auto Control traffic lights. The design includes two steps of the hardware circuit design and programming have to get involved in several important single-chip learning.The application of microcontroller is the deepening of the Microcontroller can be used to simulate systems. In the automatic control of microcomputer application system, the Microcontroller is often used as a core component to use only Microcontroller knowledge is not enough, but also according to the specific hardware architecture hardware and software, to be improved.Crossroads shuttle vehicles, pedestrians bustling Dealers lane, walkways, and orderly. Rely on to achieve this orderly order? Rely on automatic command system of traffic lights. Traffic signal control. The system uses the Microcontroller STC89C52-centric devices to design the traffic signal controller to achieve a set of red, green light to kindle through the P1 port function of time; traffic light cycle lights, countdown 5 seconds left flashing yellow warning (traffic light signals through the P1 the output port, and displays the time through the P0 port output to double-digit LED). The system design cycle, high reliability, practical, simple operation, easy maintenance, strong extensions.Key words:microcontroller traffic light digital tub目录第1章前言 (1)1.1交通灯发展概述 (1)1.2 课题背景及意义 (2)1.3课题任务及主要实现内容 (3)1.4 原理分析 (4)1.4.1交通灯显示时序的理论分析 (4)1.4.2 交通灯显示的理论分析 (5)第2章设计方案分析 (6)2.1 单片机与外围接口部件 (6)2.2 倒计时显示界面 (7)2.3 交通灯 (7)第3章硬件系统设计 (8)3.1 单片机的选择 (8)3.2 硬件电路实现 (11)3.2.1 最小系统设计 (11)3.2.2 显示设计 (13)3.2.3 发光二极管模拟红绿灯 (15)3.2.4 按键模块 (16)第4章软件电路设计 (17)4.1 软件编译环境测试 (17)4.1.1 C语言介绍 (17)4.1.2 Keil uVision4介绍 (17)4.2软件总体设计 (17)第5章电路检测 (21)结论 (24)致谢 (25)参考文献 (26)附录: (27)源程序: (29)第1章前言单片机微型计算机是微型计算机的一个重要分支,也是颇具生命力的机种。

单片机8255交通灯程序

单片机8255交通灯程序

交通灯程序/*********************************************************** 十字路口交通灯控制 C 程序***********************************************************/#include <reg51.h>#define uchar unsigned char#define uint unsigned int/*****定义控制位*******************************************/sbit Time_Show_LED2=P2^5; //Time_Show_LED2(直行时间显示)控制位sbit Time_Show_LED1=P2^4; //Time_Show_LED1(直行时间显示)控制位sbit EW_LED2=P2^3; //EW_LED2控制位sbit EW_LED1=P2^2; //EW_LED1控制位sbit SN_LED2=P2^1; //SN_LED2控制位sbit SN_LED1=P2^0; //SN_LED1控制位sbit SN_Yellow=P1^6; //SN黄灯sbit EW_Yellow=P1^2; //EW黄灯sbit EW_ManGreen=P3^0; //EW人行道绿灯sbit SN_ManGreen=P3^1; //SN人行道绿灯sbit Special_LED=P2^6; //交通特殊指示灯sbit Busy_LED=P2^7; //交通繁忙指示灯sbit Nomor_Button=P3^5; //交通正常按键sbit Busy_Btton=P3^6; //交通繁忙按键sbit Special_Btton=P3^7; //交通特殊按键sbit EW_ManRed=P3^3; //EW人行道红灯sbit SN_ManRed=P3^4; //SN人行道红灯bit Flag_SN_Yellow; //SN黄灯标志位bit Flag_EW_Yellow; //EW黄灯标志位char Time_EW; //东西方向倒计时单元char Time_SN; //南北方向倒计时单元uchar EW=60,SN=40,EWL=19,SNL=19; //程序初始化赋值,正常模式uchar EW1=60,SN1=40,EWL1=19,SNL1=19; //用于存放修改值的变量uchar codetable[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //0-9段选码uchar code S[8]={0x28,0x48,0x18,0x48,0x82,0x84,0x81,0x84};//交通信号灯控制代码/**********************延时子程序**************************/void Delay(uchar a){uchar i;i=a;while(i--){;}}/*****************显示子函数******************************/ void Display(void){uchar h,l;h=Time_EW/10;l=Time_EW%10;P0=table[l];EW_LED2=1; //点亮EW_LED2Delay(2);EW_LED2=0; //熄灭EW_LED2P0=table[h];EW_LED1=1; //点亮EW_LED1Delay(2);EW_LED1=0;h=Time_SN/10;l=Time_SN%10;P0=table[l];SN_LED2=1; //点亮SN_LED2Delay(2);SN_LED2=0;P0=table[h];SN_LED1=1; //点亮SN_LED1Delay(2);SN_LED1=0;h= EW1/10;l= EW1%10;P0=table[l];Time_Show_LED1=1; //点亮Time_Show_LED1Delay(2);Time_Show_LED1=0;P0=table[h];Time_Show_LED2=1; //点亮Time_Show_LED2Delay(2);Time_Show_LED2=0;}/**********************外部0中断服务程序******************/void INT0_srv(void)interrupt 0 using 1{EX0=0; //关中断if(Nomor_Button==0) //测试按键是否按下,按下为正常状态 {EW1=60;SN1=40;EWL1=19;SNL1=19;Busy_LED=0; //关繁忙信号灯Special_LED =0; //关特殊信号灯}if(Busy_Btton==0) //测试按键是否按下,按下为繁忙状态 {EW1=45;SN1=30;EWL1=14;SNL1=14;Special_LED=0; //关特殊信号灯Busy_LED=1; //开繁忙信号灯}if(Special_Btton==0)//测试按键是否按下,按下为特殊状态 {EW1=75;SN1=55;EWL1=19;SNL1=19;Busy_LED=0; //关繁忙信号灯Special_LED =1;//开特殊信号灯}EX0=1; //开中断}/**********************T0中断服务程序*******************/ void timer0(void)interrupt 1 using 1{static uchar count;TH0=(65536-50000)/256;TL0=(65536-50000)%256;count++;if(count==10){if(Flag_SN_Yellow==1) //测试南北黄灯标志位{SN_Yellow=~SN_Yellow;}if(Flag_EW_Yellow==1) //测试东西黄灯标志位{EW_Yellow=~EW_Yellow;}}if(count==20){Time_EW--;Time_SN--;if(Flag_SN_Yellow==1) //测试南北黄灯标志位{SN_Yellow=~SN_Yellow;}if(Flag_EW_Yellow==1) //测试东西黄灯标志位{EW_Yellow=~EW_Yellow;}count=0;}}/*********************主程序开始***********************/ void main(void){Busy_LED=0;Special_LED=0;IT0=1; //INT0负跳变触发TMOD=0x01; //定时器工作于方式1TH0=(65536-50000)/256; //定时器赋初值TL0=(65536-50000)%256;EA=1; //CPU开中断总允许ET0=1; //开定时中断EX0=1; //开外部INTO中断TR0=1; //启动定时while(1){/*******S0状态**********/SN_ManRed=0;SN_ManGreen=1; //SN人行道通行EW_ManRed=1; //EW人行道禁止EW_ManGreen=0;Flag_EW_Yellow=0; //EW关黄灯显示信号Time_EW=EW;Time_SN=SN;while(Time_SN>=5){P1=S[0]; //SN绿灯,EW红灯Display();}/*******S1状态**********/P1=0x00;while(Time_SN>=0){Flag_SN_Yellow=1; //SN开黄灯信号位P1=P1|0x08; //保持EW红灯Display();}/*******S2状态**********/SN_ManRed=1; //SN人行道禁止SN_ManGreen=0;EW_ManRed=1; //EW人行道禁止EW_ManGreen=0;Flag_SN_Yellow=0; //SN关黄灯显示信号Time_SN=SNL;while(Time_SN>=5){P1=S[2]; //SN左拐绿灯亮,EW红灯Display();}/*******S3状态**********/P1=0x00;while(Time_SN>=0){Flag_SN_Yellow=1; //SN开黄灯信号位P1=P1|0x08; //保持EW红灯Display();}/***********赋值*********/EW=EW1;SN=SN1;EWL=EWL1;SNL=SNL1;/*******S4状态**********/SN_ManRed=1; //SN人行道禁止SN_ManGreen=0;EW_ManRed=0;EW_ManGreen=1; //EW人行道通行Flag_SN_Yellow=0; //SN关黄灯显示信号Time_EW=SN;Time_SN=EW;while(Time_EW>=5){P1=S[4]; //EW通行,SN红灯Display();}/*******S5状态**********/P1=0X00;while(Time_EW>=0){Flag_EW_Yellow=1;//EW开黄灯信号位P1=P1|0x80; //保持SN红灯Display();}/*******S6状态**********/SN_ManRed=1; //SN人行道禁止SN_ManGreen=0;EW_ManRed=1; //EW人行道禁止EW_ManGreen=0;Flag_EW_Yellow=0;//EW关黄灯显示信号Time_EW=EWL;while(Time_EW>=5){P1=S[6]; //EW左拐绿灯亮,SN红灯Display();}/*******S7状态**********/P1=0X00;while(Time_EW>=0){Flag_EW_Yellow=1; //EN开黄灯信号位P1=P1|0x80; //保持SN红灯Display();}/***********赋值********/EW=EW1;SN=SN1;EWL=EWL1;SNL=SNL1;}}。

51单片机控制交通灯原理图及C语言程序

51单片机控制交通灯原理图及C语言程序

Proteus仿真原理图:Keil C源程序:#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit RED_DONGXI = P1^0;//南北方向红灯亮sbit YELLOW_DONGXI = P1^1;//南北方向黄灯亮sbit RED_NANBEI = P1^3;//东西方向红灯亮sbit GREEN_DONGXI = P1^2;//南北方向绿灯亮sbit YELLOW_NANBEI = P1^4;//东西方向黄灯亮sbit GREEN_NANBEI = P1^5;//东西方向绿灯亮sbit DXweixuan1 = P1^6;//南北方向数码管位选1sbit DXweixuan2 = P1^7;//南北方向数码管位选2sbit NBweixuan1 = P3^0;//东西方向数码管位选1sbit NBweixuan2 = P3^1;//东西方向数码管位选2sbit L1=P3^5;sbit L2=P3^6;sbit L3=P3^7;uint aa, bai,shi,ge,bb;uint shi1,ge1,shi2,ge2;uint code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; uint code table1[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6};void delay(uint z);void init(uint a);void display(uint shi1,uint ge1,uint shi2,uint ge2);void xtimer0();void init1();void init2();void init3();void init4();void init5();void xint1();void xint0();void LED_ON();void LED_OFF();void main(){P0=0xFF;P1=0xFF;P2=0x00;P3=0xFF;EA=1;EX0=1;IT0=0;init1();while(1){init2();//第2个状态init3(); //第3个状态init4(); //第4个状态init5();//第5个状态}}void init1()//第一个状态:东西、南北方向均亮红灯5S {uint temp;temp=5;TMOD=0x01;TH0=(65535-50000)/256;TL0=(65535-50000)%256;EA=1;ET0=1;TR0=1;while(1){RED_DONGXI=0; //第一个状态东西、南北均亮红灯5SRED_NANBEI=0;GREEN_DONGXI=1;GREEN_NANBEI=1;YELLOW_DONGXI=1;YELLOW_NANBEI=1;if(aa==20)//定时20*50MS=1S{aa=0;temp--;}shi1=shi2=temp/10;ge1=ge2=temp%10;if(temp==0){temp=5;break;}display(ge1,shi1,ge2,shi2);}}void init2()//第二个状态:东西亮红灯30S~5S、南北亮绿灯25~0S;{uint temp;temp=26;TMOD=0x01;TH0=(65535-50000)/256;TL0=(65535-50000)%256;EA=1;ET0=1;TR0=1;while(1){RED_DONGXI=1;RED_NANBEI=0;GREEN_DONGXI=0;GREEN_NANBEI=1;YELLOW_DONGXI=1;//第二个状态:东西亮绿灯25S、南北亮红灯YELLOW_NANBEI=1;if(aa==20)//定时20*50MS=1S{aa=0;temp--;shi1=(temp+5)/10;ge1=(temp+5)%10;shi2=temp/10;ge2=temp%10;if(temp==0){temp=26;break;}}display(ge1,shi1,ge2,shi2);}}void init3() //第三个状态:东西绿灯变为黄灯闪5次、南北亮红灯5S {uint temp;temp=6;TMOD=0x01;TH0=(65535-50000)/256;TL0=(65535-50000)%256;EA=1;ET0=1;TR0=1;while(1){RED_NANBEI=0;GREEN_DONGXI=1;if(aa==20)//定时20*50MS=1S{aa=0;temp--;YELLOW_DONGXI=~YELLOW_DONGXI;shi1=temp/10;shi2=shi1;ge1=temp%10;ge2=ge1;}if(temp==0){temp=6;break;}display(ge1,shi1,ge2,shi2);}}void init4()//第四个状态:东西亮绿灯25~0S,南北方向亮红灯30~5S;{uint temp;temp=26;TMOD=0x01;TH0=(65535-50000)/256;TL0=(65535-50000)%256;EA=1;ET0=1;TR0=1;while(1){RED_DONGXI=0;RED_NANBEI=1;YELLOW_DONGXI=1;//第一个状态东西、南北均亮红灯5SGREEN_NANBEI=0;if(aa==20){aa=0;temp--;shi1=temp/10;shi2=(temp+5)/10;ge1=temp%10;ge2=(temp+5)%10;if(temp==0){temp=26;break;}}display(ge1,shi1,ge2,shi2);}}void init5()//第五个状态:东西亮红灯、南北绿灯闪5次转亮黄灯5S {uint temp;temp=6;TMOD=0x01;TH0=(65535-50000)/256;TL0=(65535-50000)%256;EA=1;ET0=1;TR0=1;while(1){RED_NANBEI=1;RED_DONGXI=0;GREEN_DONGXI=1;GREEN_NANBEI=1;if(aa==20){aa=0;temp--;YELLOW_NANBEI=~YELLOW_NANBEI;shi1=temp/10;shi2=shi2;ge1=temp%10;ge2=ge1;if(temp==0){temp=6;break;}}display(ge1,shi1,ge2,shi2);}}void display(uint shi1,uint ge1,uint shi2,uint ge2) {DXweixuan1=0;DXweixuan2=1;NBweixuan1=1;NBweixuan2=1;P0=table[ge1];delay(5);DXweixuan1=1;DXweixuan2=0;NBweixuan1=1;NBweixuan2=1;P0=table[shi1];delay(5);DXweixuan1=1;DXweixuan2=1;NBweixuan1=0;NBweixuan2=1;P0=table[ge2];delay(5);DXweixuan1=1;DXweixuan2=1;NBweixuan1=1;NBweixuan2=0;P0=table[shi2];delay(5);}void xint0() interrupt 0 {RED_NANBEI=0;RED_DONGXI=0;GREEN_NANBEI=1;GREEN_DONGXI=1;YELLOW_NANBEI=1;YELLOW_DONGXI=1;P0=0x00;NBweixuan1=0;NBweixuan2=0;DXweixuan1=0;DXweixuan2=0;delay(2);return ;}void xint1() interrupt 2 {RED_NANBEI=1;RED_DONGXI=1;GREEN_NANBEI=0;GREEN_DONGXI=0;YELLOW_NANBEI=1;YELLOW_DONGXI=1;P0=0x00;NBweixuan1=0;NBweixuan2=0;DXweixuan1=0;DXweixuan2=0;delay(2);return ;}void xtimer0() interrupt 1 {TH0=(65535-50000)/256;TL0=(65535-50000)%256;aa++;}void delay(uint z){uint x,y;for(x=0;x<z;x++)for(y=0;y<110;y++); }。

基于C51单片机的交通灯控制系统

基于C51单片机的交通灯控制系统

基于C51单片机的交通灯控制系统1、实验方案论证:进行十字路口的交通信号灯控制电路设计,画出电路原理图及实验电路图,进行软件编程、以及使用说明文档的建立等一整套工作任务。

进行十字路口的交通信号灯控制程序设计,提交一个符合上述功能要求的十字路口的交通信号灯控制系统设计。

2、控制流程分析:对设计要求进行分析后可得出以下交通工作状态表:3、硬件设计概要:根据设计要求,可用6个LED灯分别模拟东西、南北的交通灯。

具体接法如下:AT89C51的P1口接LED灯,P1.0、P1.1、P1.2分别接东西方向红、绿、黄交通灯,P1.3、P1.4、P1.5分别接南北方向的红、绿、黄交通灯。

P1口和LED灯之间要接限流保护电阻。

两位数码管段选接P2口,位选接P0口低两位,P0口低两位接上拉电阻使其可以输出高电平。

紧急情况按钮一端接地,另一端与外中断1引脚相连;恢复正常按钮一端接地,另一端与外中断0引脚相连。

三、原理图设计1、LED显示部分电路设计:把单片机AT89C51的P1口作为红黄绿灯显示部分,用6个LED灯分别模拟东西、南北的交通灯。

P1.0、P1.1、P1.2各通过一个300Ω的限流保护电阻接东西方向的红、绿、黄LED灯;P1.3、P1.4、P1.5各通过一个300Ω的限流保护电阻接南北方向的红、绿、黄LED灯。

LED 灯的一端接电源,另一端经电阻接P1口,因此当P1口引脚输出低电平时LED灯发光,即此方案采取低电平驱动方式。

具体电路如下:2、紧急情况处理电路设计:紧急情况按钮一端接地,另一端与外中断1引脚相连;恢复正常按钮一端接地,另一端与外中断0引脚相连。

在程序设计时,我会将其设置为下降沿触发方式。

具体电路如下:3、数字显示电路设计:选用共阴极两位数码管。

两位数码管A~G引脚各通过一个300Ω的限流保护电阻分别接P2.0~P2.6,位选1引脚和2引脚分别接P0.0口低两位,P0口低两位接5kΩ的上拉电阻使其可以输出高电平。

单片机交通灯实验代码

单片机交通灯实验代码

;======================P1口亮灯实验========================= ORG 0790H;----------------------------------------------------------SE18: MOV P1,#0FFH ;送P1口LO34: MOV A,#0FEH ;L1发光二极管点亮LO33: MOV P1,ALCALL SE19 ;延时RL A ;左移位SJMP LO33 ;循环;----------------------------------------------------------SE19: MOV R6,#0A0HLO36: MOV R7,#0FFHLO35: DJNZ R7,LO35DJNZ R6,LO36 ;延时RET;----------------------------------------------------------END;==================== 8255控制交通灯========================== ORG 0BB0HJOD0: MOV SP,#60HMOV DPTR,#0FFDBHMOV A,#88HMOVX @DPTR,A ;8255初始化MOV DPTR,#0FFD8HMOV A,#0B6HMOVX @DPTR,AINC DPTRMOV A,#0DHMOVX @DPTR,A ;点亮4个红灯MOV R2,#25H ;延时LCALL DEL YJOD3: MOV DPTR,#0FFD8HMOV A,#75HMOVX @DPTR,AINC DPTRMOV A,#0DHMOVX @DPTR,A ;东西绿灯亮,南北红灯亮MOV R2,#55HLCALL DEL Y ;延时MOV R7,#05H ;闪烁次数JOD1: MOV DPTR,#0FFD8HMOV A,#0F3HMOVX @DPTR,AINC DPTRMOV A,#0CHMOVX @DPTR,A ;东西黄灯亮,南北红灯亮MOV R2,#20HLCALL DEL Y ;延时MOV DPTR,#0FFD8HMOV A,#0F7HMOVX @DPTR,AINC DPTRMOV A,#0DHMOVX @DPTR,A ;南北红灯亮MOV R2,#20HLCALL DEL Y ;延时DJNZ R7,JOD1 ;闪烁次数未到继续MOV DPTR,#0FFD8HMOV A,#0AEHMOVX @DPTR,AINC DPTRMOV A,#0BHMOVX @DPTR,A ;东西红灯亮,南北绿灯亮MOV R2,#55HLCALL DEL Y ;延时MOV R7,#05H ;闪烁次数JOD2: MOV DPTR,#0FFD8HMOV A,#9EHMOVX @DPTR,AINC DPTRMOV A,#07HMOVX @DPTR,A ;东西红灯亮,南北黄灯亮MOV R2,#20HLCALL DEL Y ;延时MOV DPTR,#0FFD8HMOV A,#0BEHMOVX @DPTR,AINC DPTRMOV A,#0FHMOVX @DPTR,A ;东西红灯亮MOV R2,#20HLCALL DEL Y ;延时DJNZ R7,JOD2 ;闪烁次数未到继续LJMP JOD3 ;循环;---------------------------------------------DELY: PUSH 02HDEL2: PUSH 02HDEL3: PUSH 02H ;延时DEL4: DJNZ R2,DEL4POP 02HDJNZ R2,DEL3POP 02HDJNZ R2,DEL2POP 02HDJNZ R2,DEL YRET;---------------------------------------------END;===================== 工业顺序控制======================== ORG 0000HLJMP PO10ORG 0013HLJMP PO16;----------------------------ORG 0190HPO10: MOV P1,#7FHORL P3,#00HPO11: JNB P3.4,PO11 ;开工吗?ORL IE,#84HORL IP,#01HMOV PSW,#00H ;初始化MOV SP,#53HPO12: MOV P1,#7EH ;第一道工序ACALL PO1BMOV P1,#7DH ;第二道工序ACALL PO1BMOV P1,#7BH ;第三道工序ACALL PO1BMOV P1,#77H ;第四道工序ACALL PO1BMOV P1,#6FH ;第五道工序ACALL PO1BMOV P1,#5FH ;第六道工序ACALL PO1BMOV P1,#0FH ;第七道工序ACALL PO1BSJMP PO12;----------------------------PO16: MOV B,R2 ;保护现场PO17: MOV P1,#7FH ;关输出MOV 20H,#0A0H ;振荡次数PO18: SETB P1.7 ;振荡ACALL PO1A ;延时CLR P1.7 ;停振ACALL PO1A ;延时DJNZ 20H,PO18 ;不为0转CLR P1.7ACALL PO1A ;停振JNB P3.3,PO17 ;故障消除吗?MOV R2,B ;恢复现场RETIPO1A: MOV R2,#06HACALL DEL Y ;延时RETPO1B: MOV R2,#30HACALL DEL Y ;延时RET;----------------------------DELY: PUSH 02HDEL2: PUSH 02HDEL3: PUSH 02H ;延时DEL4: DJNZ R2,DEL4POP 02HDJNZ R2,DEL3POP 02HDJNZ R2,DEL2POP 02HDJNZ R2,DEL YRET;----------------------------END;=================== A/D转换实验======================== ORG 05A0HSE11: MOV SP,#53HMOV 7EH,#00HMOV 7DH,#08HMOV 7CH,#00HMOV 7BH,#09HMOV 7AH,#10HMOV 79H,#10H ;显示缓冲区初值LO18: CALL DIS ;显示MOV A,#00HMOV DPTR,#0FFE0HMOVX @DPTR,A ;0809的0通道采样CALL DIS ;SSEEMOVX A,@DPTR ;取出采样值mov dptr,#0ffe4h ;new add --> 138 Y1cpl a ;new addmovx @dptr,a ;new add --> 驱动发光二极管cpl a ;new addMOV R0,#79HCALL PTDS ;采样值送显示缓冲区SJMP LO18 ;循环;---------------------------PTDS: MOV R1,A ;拆送显示缓冲区ACALL PTDS1MOV A,R1SW AP APTDS1: ANL A,#0FHMOV @R0,AINC R0RET;---------------------------DIS: PUSH DPHPUSH DPLSETB RS1MOV R0,#7EHMOV R2,#20HMOV R3,#00HMOV DPTR,#LS0LS2: MOV A,@R0MOVC A,@A+DPTRMOV R1,#0DCHMOVX @R1,AMOV A,R2inc R1MOVX @R1,ALS1: DJNZ R3,LS1CLR CRRC AMOV R2,ADEC R0JNZ LS2movx @r0,adec r0cpl amovx @r0,aCLR RS1POP DPLPOP DPHRET;-------------------------------------LS0: DB 0C0H,0F9H,0A4H,0B0H,99H,92HDB 82H,0F8H,80H,90H,88H,83H,0C6HDB 0A1H,86H,8EH,0FFH,0CH,89H,7FH,0BFH;--------------------------------------END===================== D/A输出方波=========================;注意:进行本实验前,请先装载运行D/A 0V输出(调基准电压)程序Asm51\da_0v.asm ;使D/A输出端“AOUT”输出电压为0V,再进行本实验。

基于51单片机的十字路口交通灯控制系统设计(含源码及仿真图)

基于51单片机的十字路口交通灯控制系统设计(含源码及仿真图)

课程名称单片机原理及应用课程设计院部名称信息技术学院专业计算机科学与技术班级09计(嵌入式系统方向)姓名学号**********指导教师刘钰金陵科技学院教务处制摘要本文介绍了一个基于MCS-51及PROTEUS的十字路口交通灯控制系统的设计与仿真,通过对现实路况交通灯的分析研究,理解交通控制系统的实现方法。

十字路口交通灯控制系统通常要实现自动控制和在紧急情况下禁止普通车辆,而让紧急车辆优先通行。

本文还对MCS-51单片机的结构特点和重要引脚功能进行了介绍,同时对智能交通灯控制系统的设计进行了详细的分析。

最后介绍了PROTEUS嵌入式系统仿真与开发平台的使用方法,利用Proteus 软件对交通灯控制系统进行了仿真,仿真结果表明系统工作性能良好。

关键字:单片机,proteus仿真,中断,十字路口交通灯控制系统前言1,十字路口的交通控制系统指挥着人和各种车辆的安全运行,对交叉口实行科学的管理与控制是交通控制工程的重要研究课题,是保障交叉口的交通安全和充分发挥交叉口的通行能力的重要措施,是解决城市交通问题的有效途径。

交通灯信号灯的出现是人类历史上的一次重大改革,使人类的聚居生活,产生了深远的影响。

使交通得以有效管制,对于疏导交通流量,提高道路通行能力,减少交通事故有明显效果。

如何采用合适的控制方法,最大限度利用好耗费巨资修建的城市高速道路,缓解主干道与匝道、城区同周边地区的交通拥堵状况,越来越成为交通运输管理和城市规划部门亟待解决的主要问题。

随着电子技术的发展,利用单片机技术对交通灯进行智能化管理,已成为目前广泛采用的方法。

2,此十字路口交通灯控制系统,分东西道和南北道,设东西道为A道,南北道为B 道。

规定:A道放行时间为2分钟,B道放行1.5分钟;绿灯放行,红灯停止;绿灯转红灯时,黄灯亮2秒钟;若有紧急车辆要求通过时,此系统应能禁止普通车辆,而让紧急车辆通过。

3,应用单片机实现对交通灯的控制,在十字路口用红,黄,绿的指示灯,加上四个以倒计时显示的数码管来控制交通。

基于51单片机交通灯课设(内含程序和实物图)

基于51单片机交通灯课设(内含程序和实物图)

单片机控制交通灯摘要随着经济发展,汽车数量急剧增加,城市道路日渐拥挤,交通拥塞已成为一个国际性的问题。

因此,设计可靠、安全、便捷的多功能交通灯控制系统有极大的现实必要性。

根据交通灯在实际控制中的特点,结合单片机的控制功能,提出了一种用单片机自动控制交通灯的简易方法。

设计中包括硬件电路的设计和程序设计两大步骤,对单片机学习中的几个重要内容都有涉足。

单片机的应用正在不断深入,单片机可以用来仿真各个系统。

在自动控制的单片机应用系统中,单片机往往作为一个核心部件来使用,仅单片机方面知识是不够的,还应根据具体硬件结构软硬件结合,加以完善。

十字路口车辆穿梭,行人熙攘,车行车道,人行人道,有条不紊。

那么靠什么来实现这井然秩序呢?靠的就是交通信号灯的自动指挥系统。

交通信号灯控制方式很多。

本系统采用单片机STC89C52为中心器件来设计交通灯控制器,实现了通过P1口设置红、绿灯燃亮时间的功能;红绿灯循环点亮,倒计时剩5秒时黄灯闪烁警示(交通灯信号通过P1口输出,显示时间通过P0口输出至双位数码管)。

本系统设计周期短、可靠性高、实用性强、操作简单、维护方便、扩展功能强。

关键词:单片机交通灯数码管看门狗目录第1章前言 (1)1.1课题任务及主要实现内容 (1)1.2原理分析 (1)1.2.1交通灯显示时序的理论分析 (1)1.2.2 交通灯显示的理论分析 (2)第2章设计方案分析 (3)2.1 单片机与外围接口部件 (3)2.2 倒计时显示界面 (4)2.3 交通灯 (4)第3章硬件系统设计 (4)3.1 单片机的选择 (4)3.2 STC89c52的看门狗设置 (8)3.3 硬件电路实现 (9)3.2.1 最小系统设计 (9)3.3.2 显示设计 (11)3.2.3 发光二极管模拟红绿灯 (13)3.2.4 按键模块 (14)第4章软件电路设计 (15)4.1 软件编译环境测试 (15)4.1.1 C语言介绍 (15)4.1.2 Keil uVision4介绍 (15)4.2软件总体设计 (15)第5章电路检测 (17)结论 (20)参考文献 (21)附录:22原理图 (22)源程序: (22)第1章前言单片机微型计算机是微型计算机的一个重要分支,也是颇具生命力的机种。

单片机控制交通灯程序代码

单片机控制交通灯程序代码

单片机控制交通灯程序代码第一篇:单片机控制交通灯程序代码毕业设计程序源代码ORG 0000H;主程序的入口地址LJMP MAIN;跳转到主程序的开始处ORG 0003H;外部中断0的中断程序入口地址ORG 000BH;定时器0的中断程序入口地址LJMP T0_INT;跳转到中断服务程序处ORG 0013H;外部中断1的中断程序入口地址MAIN : MOV SP,#50HMOV IE,#8EH;CPU开中断,允许T0中断,T1中断和外部中断1中断MOV TMOD,#51H;设置T1为计数方式,T0为定时方式,且都工作于模式1 MOV TH1,#00H;T1计数器清零MOV TL1,#00HSETB TR1;启动T1计时器SETB EX1;允许INT1中断SETB IT1;选择边沿触发方式MOV DPTR ,#0003HMOV A, #80H;给8255赋初值,8255工作于方式0MOVX @DPTR, A AGAIN: JB P3.1,N0;判断是否要设定东西方向红绿灯时间的初值,若P3.1为1 则跳转MOV A,P1JB P1.7,RED;判断P1.7是否为1,若为1则设定红灯时间,否则设定绿灯时间MOV R0,#00H;R0清零MOV R0,A;存入东西方向绿灯初始时间MOV R3,ALCALL DISP1LCALL DELAYAJMP AGAIN RED:MOV A,P1ANL A,#7FH;P1.7置0MOV R7,#00H;R7清零MOV R7,A;存入东西方向红灯初始时间MOV R3,ALCALL DISP1LCALL DELAYAJMP AGAIN毕业设计;------------N0:SETB TR0;启动T0计时器MOV 76H,R7;红灯时间存入76H N00:MOV A,76H;东西方向禁止,南北方向通行MOV R3,AMOV DPTR,#0000H;置8255A口,东西方向红灯亮,南北方向绿灯亮MOV A,#0DDHMOVX @DPTR, A N01:JB P2.0,B0 N02:SETB P3.0CJNE R3,#00H,N01;比较R3中的值是否为0,不为0转到当前指令处执行;------黄灯闪烁5秒程序------N1:SETB P3.0MOV R3,#05HMOV DPTR,#0000H;置8255A口,东西,南北方向黄灯亮MOV A,#0D4HMOVX @DPTR,A N11:MOV R4,#00H N12:CJNE R4,#7DH,$;黄灯持续亮0.5秒N13:MOV DPTR,#0000H;置8255A口,南北方向黄灯灭MOV A,#0DDHMOVX @DPTR,A N14:MOV R4,#00HCJNE R4,#7DH,$;黄灯持续灭0.5秒CJNE R3,#00H,N1;闪烁时间达5秒则退出;-----------------------------N2:MOV R7,#00HMOV A,R0;东西通行,南北禁止MOV R3,AMOV DPTR,#0000H;置8255A口,东西方向绿灯亮,南北方向红灯亮MOV A,#0EBHMOVX @DPTR,A N21:JB P2.0,T03N22:CJNE R3,#00H,N21;------黄灯闪烁5秒程序------N3:MOV R3,#05HMOV DPTR,#0000H;置8255A口,东西,南北方向黄灯亮毕业设计MOV A,#0E2HMOVX @DPTR,A N31:MOV R4,#00HCJNE R4,#7DH,$;黄灯持续亮0.5秒N32:MOV DPTR,#0000H;置8255A口,南北方向黄灯灭MOV A,#0EBHMOVX @DPTR,A N33:MOV R4,#00HCJNE R4,#7DH,$;黄灯持续灭0.5秒CJNE R3,#00H,N3;闪烁时间达5秒则退出SJMP N00;------闯红灯报警程序------B0:MOV R2,#03H;报警持续时间3秒 B01:MOV A,R3JZ N1;若倒计时完毕,不再报警CLR P3.0;报警CJNE R2,#00H,B01;判断3秒是否结束SJMP N02;------1秒延时子程序-------N7:RETI T0_INT:MOV TL0,#9AH;给定时器T0送定时10ms的初值MOV TH0,#0F1HINC R4INC R5CJNE R5,#0FAH,T01;判断延时是否够一秒,不够则调用显示子程序MOV R5,#00H;R5清零DEC R3;倒计时初值减一DEC R2;报警初值减一 T01:ACALL DISP;调用显示子程序RETI;中断返回;------显示子程序------DISP: JNB P2.4,T02 DISP1:MOV B,#0AHMOV A,R3;R3中值二转十显示转换DIV ABMOV 79H,AMOV 7AH,B DIS:MOV A,79H;显示十位毕业设计MOV DPTR,#TABMOVC A,@A+DPTRMOV DPTR,#0002HMOVX @DPTR,AMOV DPTR,#0001HMOV A,#0F7HMOVX @DPTR,ALCALL DELAY DS2:MOV A,7AH;显示个位MOV DPTR,#TABMOVC A,@A+DPTRMOV DPTR,#0002HMOVX @DPTR,AMOV DPTR,#0001HMOV A,#0FBHMOVX @DPTR,ARET;------东西方向车流量检测程序------T03: MOV A,R3SUBB A,#00H;若绿灯倒计时完毕,不再检测车流量JZN3JB P2.0,T03INC R7CJNE R7,#64H,E1MOV R7,#00H;中断到100次则清零 E1:SJMP N22;------东西方向车流量显示程序------T02: MOV B,#0AH MOVA,R7;R7中值二转十显示转换DIV ABMOV 79H,AMOV 7AH,B DIS3: MOV A,79H;显示十位MOV DPTR,#TABMOVC A,@A+DPTRMOV DPTR,#0002HMOVX @DPTR,AMOV DPTR,#0001H毕业设计MOV A,#0F7HMOVX @DPTR,ALCALL DELAY DS4:MOV A,7AH;显示个位MOV DPTR,#TABMOVC A,@A+DPTRMOV DPTR,#0002HMOVX @DPTR,AMOV DPTR,#0001HMOV A,#0FBHMOVX @DPTR,ALJMP N7;------延时4MS子程序----------DELAY: MOV R1,#0AH LOOP: MOV R6,#64HNOP LOOP1: DJNZ R6,LOOP1DJNZ R1,LOOPRET;------字符表------TAB:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FHEND第二篇:单片机实现交通灯控制智能交通灯设计与实现基于单片机的智能交通灯控制系统的设计与实现,系统能够根据十字路口双车道车流量的情况控制交通讯号灯按特定的规律变化。

at89c51单片机_交通灯控制系统(包括源码and仿真图)

at89c51单片机_交通灯控制系统(包括源码and仿真图)

设计任务书设计要求和技术指标1、技术指标:设计一个十字路口的交通灯控制电路,每条道路上各配有一组红、黄、绿交通信号灯,其中红灯亮,表示该道路禁止通行;黄灯亮表示该道路上未过停车线的车辆禁止通行,已过停车线的车辆继续通行;绿灯表示该道路允许通行。

该电路自动控制十字路口两组红、黄、绿交通灯的状态转换,实现十字路口自动化。

2、设计要求(1)要求甲车道和乙车道上的车辆交替运行,每秒通行时间为25秒种;(2)要求黄灯先亮5秒种,才能变换车道;(3)黄灯亮时要求每秒闪亮一次;(4)要求绘出原理图,并用Protel画出印制板图;(5)根据设计要求和技术指标设计好电路,选好元件及参数;(6)拟定测试方案和设计步骤;(7)写出设计性报告。

录` 目一、项目名称................................................................................. 错误!未定义书签。

二、选题背景 (2)2.1 课题背景 (2)2.2 交通灯的历史 (2)三、单片机简介 (3)3.1 单片机的发展历程 (3)3.2 单片机的特点: (4)3.3 AT89C51单片机简介 (4)四、设计基本要求和步骤 (6)4.1 基本要求 (6)4.2 设计步骤 (7)五、硬件和软件设计 (7)5.1 硬件电路图 (7)5.2 程序流程图 (9)主程序 (9)运行过程 (10)LED显示程序 (11)T0中断 (12)INT0中断 (12)5.3 P0、P1口显示状态编码表 (13)5.4 程序源代码 (13)5.5 程序运行效果图 (18)六、心得体会 (20)七、参考文献 (21)摘要本系统由单片机系统、键盘、LED 显示、交通灯演示系统组成。

系统包括人行道、左转、右转、以及基本的交通灯的功能。

系统除基本交通灯功能外,还具有倒计时、时间设置、紧急情况处理、分时段调整信号灯的点亮时间、违规车辆检测以及根据具体情况手动控制等功能。

单片机实例--交通灯信号控制(DOC)

单片机实例--交通灯信号控制(DOC)

按住ctrl并鼠标单击这里学习更多优质的单片机视频课程实例A 交通灯信号控制本章在交通灯信号控制设计中,综合利用了单片机的定时器功能和多种中断功能。

A.1 采用定时器延时功能说明:利用单片机内的定时器功能进行延时,使接在P1.5引脚上的LED点亮后连续亮10s再熄灭,熄灭3s后再被点亮,不断循环。

A.1.1 硬件设计图A.1 实验电路║14 51单片机开发入门与典型实例(第2版)单片机实验电路的左侧部分为单片机最小系统电路:5V直流电源、单片机时钟电路和自动复位电路。

右侧P1端口中P1.5引脚接有LED用作程序功能显示。

A.1.2 程序设计1.工作原理(1)首先设置定时器工作模式。

TMOD = 0x01; /*设定T0为模式1 */(2)设置定时器初始值。

当定时器定时时间为50ms时,其初始值如下。

TH0 = -(50000/256); /*定时初始值为50000 */TL0 = -(50000%256);(3)启动定时器。

TR0 = 1;(4)检测定时器溢出标志TF0。

while(TF0! = 1); /* TF0为1则表示定时时间到了*/每次定时时间为50 ms,定时20次延时的时间为1s。

2.程序C51语言编写的使用定时器延时源程序JT 21-1.c代码如下:01 #include <AT89X51.H> /*头文件*/02 void delay50ms(unsigned int i); /*声明延时函数delay50ms() */03 /* ----------------- 主函数 -----------------*/04 main( ) /*主函数*/05 {06 TMOD = 0x01; /*设定T0为模式1 */07 for(; ;) /*无限循环*/08 {09 P1 = 0xdf; /*输出*/10 delay50ms(200); /*调用延时函数,延时10s */11 P1 = 0xff; /*输出*/12 delay50ms(60); /*调用延时函数,延时3s */13 }14 }15 /* ----------------- 延时函数 ----------------- */16 void delay50ms(unsigned int i) /*延时时间为50ms i */17 {18 TR0 = 1; /*启动定时器*/实例A 交通灯信号控制15║19 while(i! = 0) /*执行i次循环*/20 {21 TH0 = -(50000/256); /*定时器初始值50000 */22 TL0 = -(50000%256);23 while(TF0! = 1); /*等待计数终了*/24 TF0 = 0; /*清除TF0 */25 i--; /*循环数-1 */26 }27 TR0 = 0; /*关闭定时器*/28 }A.1.3 代码详解01:头文件。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

用单片机控制交通灯传统的交通灯控制电路一般由数字电路构成,电路复杂、体积大、成本高。

采用单片机控制交通灯不但可以解决上述问题,而且还具有时间显示功能,非常方便。

下面介绍一种用单片机控制交通灯的方法。

一、硬件硬件电路如附图。

AT89C2051的P1.7~P1.5和P1.3~P1.1直接驱动红、黄、绿灯,利用单片机的串口和二片74LS164串/并转换移位寄存器实现时间显示,七段数码管为共阴管,硬件电路极为简单。

二、软件交通灯有红、黄、绿三种。

红灯亮,停止通行;绿灯亮,允许通行;黄灯亮,作过渡。

红灯亮60秒,绿灯亮55秒,黄灯亮5秒。

每组灯的亮暗状态以2分钟为周期循环,故程序采用主、子程序方式,循环结构。

另外,为了简化电路,红、黄、绿灯采用低电平点亮。

源程序清单如下:ORG0000HSTART:MOVDRTR,#TABMOVSCON,#00HMOVP1,#6CH;点亮红、绿灯MOVR0,#0;R0清零LEFT:INCR0CJNER0,#55,LP0;R0<55,转LP0MOVP1,#6AH;R0=55,点亮红、黄灯LJMPLP1LP0:CJNER0,#60,LP1;R0<60,转LP1MOVP1,#0C6H;R0=60,点亮绿、红灯LJMPRIGHTLP1:LCALLDBDBLCALLDISPLJMPLEFT;20H为1,转LEFTRIGHT:DECR0CJNER0,#5,LP2;R0>0,转LP2MOVP1,#0A6H;R0=5,点亮黄、红灯LJMPLP3LP2:CJNER0,#0,LP3MOVP1,#6CH;R0=0,点亮红、绿灯LJMPLEFTLP3:LCALLDBDBLCALLDISPLJMPRIGHTDBDB:MOVA,R0MOVB,#10DIVABMOVR1,AMOVR2,BRETDISP:MOVA,R2MOVCA,@A+DPTRMOVSBUF,AJNBTI,$;查TI位CLRTIMOVA,R1MOVCA,@A+DPTRMOVSBUF,AJNBT1,$CLRTILCALLDEALYRETDELAY:MOVR3,#09HK1:MOVR4,#100K2:MOVR5,#250K3:DJNZR5,K3DJNZR4,K2KJNZR3,K1RETTAB:DB3FH,06H,5BHDB4FH,66HDB6DH,7DH,07HDB7FH,6FH三.实验电路及连线四.实验说明1.因为本实验是交通灯控制实验,所以要先了解实际交通灯的变化规律。

假设一个十字路口为东西南北走向。

初始状态0为东西红灯,南北红灯。

然后转状态1南北绿灯通车,东西红灯。

过一段时间转状态2,南北绿灯闪几次转亮黄灯,延时几秒,东西仍然红灯。

再转状态3,东西绿灯通车,南北红灯。

过一段时间转状态4,东西绿灯闪几次转亮黄灯,延时几秒,南北仍然红灯。

最后循环至状态1。

2.双色LED是由一个红色LED管芯和一个绿色LED管芯封装在一起,公用负端。

当红色正端加高电平,绿色正端加低电平时,红灯亮;红色正端加低电平,绿色正端加高电平时,绿灯亮;两端都加高电平时,黄灯亮。

五.实验程序框图程序框图:源代码:ORG 0000HLJMP STARTORG 0040HSTART:MOV SP,#60HLCALL STATUS0 ;初始状态(都是红灯) CIRCLE: LCALL STATUS1 ;南北绿灯,东西红灯LCALL STATUS2 ;南北绿灯闪转黄灯,东西红灯LCALL STATUS3 ;南北红灯,东西绿灯LCALL STATUS4 ;南北红灯,东西绿灯闪转黄灯LJMP CIRCLESTATUS0: ;南北红灯,东西红灯MOV DPTR,#8300HMOV A,#0FHMOVX @DPTR,AMOV R2,#10 ;延时1秒LCALL DELAYRETSTATUS1: ;南北绿灯,东西红灯MOV DPTR,#08300HMOV A,#5AH ;南北绿灯,东西红灯MOVX @DPTR,AMOV R2,#50 ;延时5秒LCALL DELAYRETSTATUS2: ;南北绿灯闪转黄灯,东西红灯MOV DPTR,#8300HMOV R3,#03H ;绿灯闪3次FLASH: MOV A,#5FHMOVX @DPTR,AMOV R2,#03HLCALL DELAYMOV A,#5AHMOVX @DPTR,AMOV R2,#03HLCALL DELAYDJNZ R3,FLASHMOV A,#0AH ;南北黄灯,东西红灯MOVX @DPTR,AMOV R2,#10 ;延时1秒LCALL DELAYRETSTATUS3: ;南北红灯,东西绿灯MOV DPTR,#8300HMOV A,#0A5HMOVX @DPTR,AMOV R2,#50 ;延时5秒LCALL DELAYRETSTATUS4: ;南北红灯,东西绿灯闪转黄灯MOV DPTR,#8300HMOV R3,#03H ;绿灯闪3次FLASH1: MOV A,#0AFHMOVX @DPTR,AMOV R2,#03HLCALL DELAYMOV A,#0A5HMOVX @DPTR,AMOV R2,#03HLCALL DELAYDJNZ R3,FLASH1MOV A,#05H ;南北红灯,东西黄灯MOVX @DPTR,AMOV R2,#10 ;延时1秒LCALL DELAYNOPRETDELAY: ;延时子程序 PUSH 2PUSH 1PUSH 0DELAY1: MOV 1,#00HDELAY2: MOV 0,#0B2HDJNZ 0,$DJNZ 1,DELAY2 ;延时 100 mSDJNZ 2,DELAY1POP 0POP 1POP 2RETEND交通灯的程序及流程图电路说明: 由六个LED(两组红、绿、黄)控制东西向和南北向车流,两位数码管显示本状态剩余时间(秒),具体灯亮的的方式如下:流程图程序如下:ORG 0000HAJMP MAINMAIN: MOV P2,#00HSETB P3.0CLR P2.7MOV P0,#0EEH ;LED显示红红LCALL DELCLR P3.0MOV 7EH,#04H ;把41S 3S送入显示缓冲区MOV 7DH,#01HMOV 7AH,#00HMOV 79H,#03HLCALL DISPMOV R6,#03HMOV R4,#29HAA1: MOV R5,#50HAA2: LCALL DISPMOV R0,#7AHLCALL DAAD1 ;南北数码显示各减1MOV R0,#7EHLCALL DAAD1DJNZ R6,AA1 ;3S时间是否到LCALL DELMOV P2,#00HSETB P3.0CLR P2.7MOV P0,#0BEH ;LED显示红绿CLR P3.0MOV 7EH,#03H ;把38S 30S 分别送入显示缓冲区MOV 7DH,#08HMOV 7AH,#03HMOV 79H,#00HLCALL DISPMOV R6,#1EHMOV R4,#26HBB1: MOV R5,#50HBB2: LCALL DISPDJNZ R5,BB2MOV R0,#7AH ;显示减1LCALL DAAD1MOV R0,#7EHLCALL DAAD1DJNZ R6,BB1 ;30S是否到MOV P2,#00HSETB P3.0CLR P2.7MOV P0,#0DEH ;LED显示红黄LCALL DELCLR P3.0MOV 7EH,#00H ;把8S 5S分别送入显示缓冲区MOV 7DH,#08HMOV 7AH,#00HMOV 79H,#05HLCALL DISPMOV R6,#05HMOV R4,#08HCC1: MOV R5,#50HCC2: LCALL DISPDJNZ R5,CC2MOV R0,#7AHMOV R0,#7EHLCALL DAAD1DJNZ R6,CC1 ;5S是否到MOV P2,#00HSETB P3.0CLR P2.7MOV P0,#0EEH ;LED显示红红LCALL DELCLR P3.0MOV 7EH,#00HMOV 7DH,#03HMOV 7AH,#04HMOV 79H,#01HLCALL DISPMOV R6,#29HMOV R4,#03HDD1: MOV R5,#50HDD2: LCALL DISPDJNZ R5,DD2MOV R0,#7AHLCALL DAAD1MOV R0,#7EHLCALL DAAD1DJNZ R4,DD1 ;3S是否到MOV P2,#00HSETB P3.0CLR P2.7MOV P0,#0EBH ;LED显示绿红LCALL DELCLR P3.0MOV 7EH,#03HMOV 7DH,#00HMOV 7AH,#03HMOV 79H,#08HLCALL DISPMOV R6,#26HMOV R4,#1EHEE1: MOV R5,#50HEE2: LCALL DISPDJNZ R5,EE2MOV R0,#7AHLCALL DAAD1MOV R0,#7EHDJNZ R4,EE1 ;30S是否到MOV P2,#00HSETB P3.0CLR P2.7MOV P0,#0EDH ;LED显示黄红LCALL DELCLR P3.0MOV 7EH,#00HMOV 7DH,#05HMOV 7AH,#00HMOV 79H,#08HLCALL DISPMOV R6,#08HMOV R4,#05HFF1: MOV R5,#50HFF2: LCALL DISPDJNZ R5,FF2MOV R0,#7AHLCALL DAAD1MOV R0,#7EHLCALL DAAD1DJNZ R4,FF1 ;5S是否到LJMP MAIN ;返回主程序显示红红;*************************************************;显示子程序显示缓冲区地址:79H,7AH,7BH,7CH,7DH,7EH;*************************************************DISP: PUSH DPHPUSH DPLPUSH ACCPUSH PSWSETB RS1 ;改变当前寄存器组为组2CLR RS0MOV R1, #79H ;显示缓冲存储单元首地址MOV R2, #01H ;从右至左显示DISP1: MOV A, @R1MOV DPTR, #TABMOVC A, @A+DPTRMOV P0, A ;送段控MOV P2, R2 ;送位控ACALL DL ;延时2毫秒MOV A, R2JB ACC.5, DISP2RL AINC R1MOV R2, AAJMP DISP1DISP2: POP PSW ;恢复当前寄存器组的组号POP ACCPOP DPLPOP DPHRET;**********************************;减1子程序;***********************************DAAD1: MOV A,@R0DEC R0SW AP AORL A,@R0ADD A,#99HDA AMOV R2,AANL A,#0FHMOV @R0, AMOV A,R2INC R0ANL A,#0F0HSW AP AMOV @R0,ARET;**************************************;延时1MS子程序(晶振为6MHZ);**************************************DEL: MOV R2,#01HTIME0: MOV R3,#0FFHTIME1: DJNZ R3,TIME1DJNZ R2,TIME0RET;延时2毫秒子程序DL: PUSH PSWSETB RS1SETB RS0MOV R7, #02HDL1: MOV R6, #0FFHDL2: DJNZ R6, DL2DJNZ R7, DL1POP PSWRET;***************************************************;显示字符段选码表(共阳极代码);*****************************************************TAB: DB 03H,9FH,25H,0DH,99H,49H,41H,1FH,01H ;0-8DB 09H,0FH,83H,0C6H,0A1H,86H,8EH,0FFH,030H ;9-F ,灭,p.。

相关文档
最新文档