单片机实现交通灯控制汇编代码
- 格式:doc
- 大小:65.50 KB
- 文档页数:11
用单片机控制交通灯传统的交通灯控制电路一般由数字电路构成,电路复杂、体积大、成本高。
采用单片机控制交通灯不但可以解决上述问题,而且还具有时间显示功能,非常方便。
下面介绍一种用单片机控制交通灯的方法。
一、硬件硬件电路如附图。
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.因为本实验是交通灯控制实验,所以要先了解实际交通灯的变化规律。
ORG 0000HA_BIT EQU 20H ;用于存放南北十位数B_BIT EQU 21H ;用于存放南北十位数C_BIT EQU 22H ;用于存放东西十位数D_BIT EQU 23H ; 用于存放东西位数TEMP1 EQU 24H ;用于存放第一二南北状态要显示的时间TEMP2 EQU 25H ;用于存放第一二东西状态要显示的时间TEMP3 EQU 26H ;用于存放第三第四南北状态要显示的时间TEMP4 EQU 27H;用于存放第三第四南北状态要显示的时间LJMP MAINORG 0003H ;外部中断0入口LJMP INT0 ;跳转到外部0中断ORG 0013H ;外部中断1入口LJMP INT1 ;跳转到外部1中断INT0: MOV A,P1 ;外部0中断PUSH ACCMOV A,P2 ;中断保护PUSH ACCMOV P1,#0FFH ;清除先前状态MOV P2,#0FFHCLR P1.0CLR P1.4 ;南北通行,东西禁止通行CLR P1.6CLR P2.3JNB P3.2 ,$ ;判断是否还在中断状态POP ACCMOV P2,A ;返回中断前状态POP ACCMOV P1,ACCRETI ;中断返回INT1:MOV A,P1 ;外部1中断PUSH ACC ;中断保护MOV A,P2PUSH ACCMOV P1,#0FFH ;清除先前状态MOV P2,#0FFHCLR P1.2CLR P2.1CLR P1.3 ;东西通行,南北禁止通行CLR P1.5JNB P3.3 ,$ ;判断是否还在中断状态POP ACCMOV P2,A ;返回中断前状态POP ACCMOV P1,ARETI ;中断返回MAIN:ORG 0100H ;初始情况MOV P1,#0FFHMOV P2,#0FFH ;灭所有灯MOV TMOD,#55H ;计数方式方式1MOV IE,#85H ;开中断MOV TEMP1,#20 ;MOV TEMP2,#25MOV TEMP3,#25MOV TEMP4,#20STAR:MOV P1,#0FFHMOV P2,#0FFH ;灭所有灯MOV A,24H ;将显示时间送ACJNE A,#20,T40T ;判断时间,选初始值T20T: ;南北通行要显示的时间为20的计数器初始值CLR TF0 ;清TF0CLR TF1 ;清TF1MOV TH1 ,#0FFH ;送20秒时的初始值MOV TL1 ,#0FCH ;在些设计20秒6辆为多车MOV TH0 ,#0FFHMOV TL0 ,#0FCHLJMP TEMP20 ;跳到20秒T40T: ;南北通行要显示的时间为40的计数器初始值CLR TF0 ;清TF0CLR TF1 ;清TF1MOV TH1,#0FFH ;送40秒时的初始值MOV TL1 ,#0F8H ;在些设计40秒8辆为多车MOV TH0 ,#0FFHMOV TL0 ,#0F8HLJMP TEMP40 ;跳到40秒TEMP20: ;TEMP1=20情况SETB TR0 ;开始计数SETB TR1CLR P1.2CLR P2.1 ;南北通行,东西禁止通行CLR P1.3CLR P1.5MOV TEMP1,#20 ;南北要显示的时间,MOV TEMP2,#25 ;东西要显示的时间STLOP:ACALL DISPLAY1 ;调用显示DEC TEMP1 ;时间够一秒显示时间减1DEC TEMP2MOV A,TEMP1CJNE A,#0,NEXT ;若显示时间不为0保持现在状态LJMP STAR2 ;若显示时间为 0跳到第二状态NEXT: LJMP STLOPSTAR2: ;状态1SETB P1.2CLR P1.1 ;南北黄灯,东西禁止通行SETB P1.3CLR P1.4MOV TEMP1,#05 ;南北要显示的时间,MOV TEMP2,#05 ;东西要显示的时间,STLOP2:ACALL DISPLAY1 ;调用显示DEC TEMP1 ;时间够一秒显示时间减1DEC TEMP2MOV A,TEMP1CJNE A,#0,NEXT2 ;若显示时间不为0保持现在状态JB TF1 ,T40 ;判断南北是否多车JB TF0 ,T40 ;判断北南是否多车MOV TEMP1,#20 ;少车下次显示时间为20秒LJMP STAR3 ;跳到状态3T40:MOV TEMP1,#40 ; 多车下次显示时间为40秒LJMP STAR3 ;若显示时间为 0跳到第三状态NEXT2:LJMP STLOP2TEMP40:;TEM=40 程序SETB TR0 ; 开始计数SETB TR1CLR P1.2CLR P2.1 ;南北通行,东西禁止通行CLR P1.3CLR P1.5MOV TEMP1,#40 ;南北要显示的时间,MOV TEMP2,#45 ;东西要显示的时间STLOP11:ACALL DISPLAY1 ;调用显示DEC TEMP1 ;时间够一秒显示时间减1DEC TEMP2MOV A,TEMP1CJNE A,#0,NEXT11 ;若显示时间不为0保持现在状态LJMP STAR22 ;若显示时间为 0跳到第二状态NEXT11: LJMP STLOP11STAR22: ;状态1SETB P1.2CLR P1.1 ;南北黄灯,东西禁止通行SETB P1.3CLR P1.4MOV TEMP1,#05 ;南北要显示的时间,MOV TEMP2,#05 ;东西要显示的时间,STLOP22:ACALL DISPLAY1 ;调用显示DEC TEMP1 ;时间够一秒显示时间减1DEC TEMP2MOV A,TEMP1CJNE A,#0,NEXT22 ;若显示时间不为0保持现在状态JB TF1 ,T401 ; 判断是否多车JB TF0 ,T401MOV TEMP1,#20 ;少车下次显示时间为20秒LJMP STAR3T401:MOV TEMP1,#40 ;多车下次显示时间为40秒LJMP STAR3 ;若显示时间为 0跳到第三状态NEXT22:LJMP STLOP22STAR3:MOV A,26HCJNE A,#25,T40T1 ;判断时间,选初始值T20T1: ;南北通行要显示的时间为20的计数器初始值CLR TF0 ; 清溢出位CLR TF1MOV TH1 ,#0FFH ; 给初值MOV TL1 ,#0FCHMOV TH0 ,#0FFHMOV TL0 ,#0FCHLJMP TEMP320T40T1: ;南北通行要显示的时间为40的计数器初始值CLR TF0 ;CLR TF1MOV TH1,#0FFH ;给初值MOV TL1 ,#0F8HMOV TH0 ,#0FFHMOV TL0 ,#0F8HLJMP TEMP340TEMP320:;状态三SETB TR1 ;南北停止计数SETB TR0 ;东西开始计数SETB P1.1 ;东西通行,南北禁止通行CLR P1.0CLR P1.0SETB P1.5CLR P1.6SETB P2.1CLR P2.3MOV TEMP3,#25 ;南北要显示的时间,MOV TEMP4,#20 ;东西要显示的时间,STLOP33:ACALL DISPLAY ;调用显示DEC TEMP3 ;时间够一秒显示时间减1DEC TEMP4MOV A,TEMP4CJNE A,#0,NEXT33 ;若显示时间不为0保持现在状态LJMP STAR34 ;若显示时间为 0跳到第四状态NEXT33:LJMP STLOP33STAR34: ;状态四SETB P2.3CLR P2.2SETB P1.6 ;东西黄灯,南北禁止通行CLR P1.5MOV TEMP3,#05 ;南北要显示的时间,MOV TEMP4,#05 ;东西要显示的时间,STLOP34:ACALL DISPLAY ;调用显示DEC TEMP3 ;时间够一秒显示时间减1DEC TEMP4MOV A,TEMP4CJNE A,#0,NEXT34 ;若显示时间不为0保持现在状态JB TF1 ,T402JB TF0 ,T402MOV TEMP3,#25LJMP START402:MOV TEMP3,#45LJMP STARNEXT34: LJMP STLOP34TEMP340 :SETB TR1 ;南北停止计数SETB TR0 ;东西开始计数SETB P1.1 ;东西通行,南北禁止通行CLR P1.0SETB P1.1CLR P1.0CLR P1.6SETB P2.1CLR P2.3MOV TEMP3,#45 ;南北要显示的时间,MOV TEMP4,#40 ;东西要显示的时间,STLOP43:ACALL DISPLAY ;调用显示DEC TEMP3 ;时间够一秒显示时间减1DEC TEMP4MOV A,TEMP4CJNE A,#0,NEXT43 ;若显示时间不为0保持现在状态LJMP STAR44 ;若显示时间为 0跳到第四状态NEXT43:LJMP STLOP43STAR44: ;状态四SETB P2.3CLR P2.2SETB P1.6 ;东西黄灯,南北禁止通行CLR P1.5MOV TEMP3,#05 ;南北要显示的时间,MOV TEMP4,#05 ;东西要显示的时间,STLOP44:ACALL DISPLAY ;调用显示DEC TEMP3 ;时间够一秒显示时间减1DEC TEMP4MOV A,TEMP3CJNE A,#0,NEXT44 ;若显示时间不为0保持现在状态JB TF1 ,T403JB TF0 ,T403MOV TEMP3,#25LJMP START403:MOV TEMP3,#45LJMP STARNEXT44: LJMP STLOP44;显示DISPLAY1:MOV A,TEMP1 ;将南北要显示的数存放到AMOV B,#10 ;B=10DIV AB ;A除以B商存A,余数BMOV B_BIT,A ; 将A放到20HMOV A_BIT,B ;将B放到21HMOV A,TEMP2 ;将东西要显示的数存放到AMOV B,#10 ;B=10DIV AB ;A除以B商存A,余数B MOV C_BIT,A ;将A放到22HMOV D_BIT,B ;将B放到23HMOV DPTR ,#NUMT ;MOV R0,#2 ;R0=2DPL11: MOV R1,#250 ;R1=250DPLOP1:MOV A,A_BIT ;将南北要显示的10位数送A MOVC A,@A+DPTR ;查表MOV P0,A ;显示南北10位数CLR P2.7ACALL D1MS;延时1MSSETB P2.7 ;灭南北10位数MOV A,B_BIT ;将南北要显示的个位数送A MOVC A,@A+DPTR ;查表MOV P0,A ;显示南北个位数CLR P2.6ACALL D1MS ;延时1MSSETB P2.6 ;灭南北个位数MOV A,C_BIT ;将东西要显示的10位数送A MOVC A,@A+DPTR ;查表MOV P0,A ;显示东西10位数CLR P2.5ACALL D1MS ;延时1MSSETB P2.5 ;灭东西10位数MOV A,D_BIT ;将东西要显示的个位数送A MOVC A,@A+DPTR ;查表MOV P0,A ;显示东西东西位数CLR P2.4ACALL D1MS ;延时1MSSETB P2.4 ;灭东西个位数DJNZ R1,DPLOP ;循环扫描DJNZ R0,DPL1RET ;等待1秒返回;显示DISPLAY:MOV A,TEMP3 ;将南北要显示的数存放到A MOV B,#10 ;B=10DIV AB ;A除以B商存A,余数BMOV B_BIT,A ; 将A放到20HMOV A_BIT,B ;将B放到21HMOV A,TEMP4 ;将东西要显示的数存放到A MOV B,#10 ;B=10DIV AB ;A除以B商存A,余数BMOV C_BIT,A ;将A放到22HMOV D_BIT,B ;将B放到23HMOV DPTR ,#NUMT ;MOV R0,#2 ;R0=2DPL1: MOV R1,#250 ;R1=250DPLOP:MOV A,A_BIT ;将南北要显示的10位数送A MOVC A,@A+DPTR ;查表MOV P0,A ;显示南北10位数CLR P2.7ACALL D1MS;延时1MSSETB P2.7 ;灭南北10位数MOV A,B_BIT ;将南北要显示的个位数送A MOVC A,@A+DPTR ;查表MOV P0,A ;显示南北个位数CLR P2.6ACALL D1MS ;延时1MSSETB P2.6 ;灭南北个位数MOV A,C_BIT ;将东西要显示的10位数送A MOVC A,@A+DPTR ;查表MOV P0,A ;显示东西10位数CLR P2.5ACALL D1MS ;延时1MSSETB P2.5 ;灭东西10位数MOV A,D_BIT ;将东西要显示的个位数送A MOVC A,@A+DPTR ;查表MOV P0,A ;显示东西东西位数CLR P2.4ACALL D1MS ;延时1MSSETB P2.4 ;灭东西个位数DJNZ R1,DPLOP ;循环扫描DJNZ R0,DPL1RET ;等待1秒返回D1MS: MOV R7,#250 ;1MS延时程序DJNZ R7,$RET;1到10对应电路图数码管表NUMT: DB 7EH,48H,67H,6BH,59HDB 3BH,3FH,68H,7FH,7BH。
题目:智能交通灯控制系统班级:p09电气四班姓名:刘强0903110429一、任务:设计并制作一个城市交道口交通灯控制糸统二、要求:根据下图交道口模型,装上交通灯。
交道口模型如图所示。
交通灯控制规则如下:1)每个街口有左拐、右拐、直行及行人四种指示灯。
每个灯有红、绿两种颜色。
自行车与汽车共用左拐、右拐和直行灯。
2)共有四种通行方式:①车辆南北直行、各路右拐,南北向行人通行。
南北向通行时间为1分钟,各路右拐比直行滞后10秒钟开放。
②南北向左拐、各路右拐,行人禁行。
通行时间为1分钟。
③东西向直行、各路右拐,东西向行人通行。
东西向通行时间为1分钟,各路右拐比直行滞后10秒钟开放。
④东西向左拐、各路右拐。
行人禁行。
通行时间为1分钟。
3)在通行结束前10秒钟,绿灯闪烁直至结束。
1, 基本部分:按照上述控制要求,用发光二极管代替交通灯,用PROTEUS绘制电路图,并仿真调试实现之。
2, 发挥部分:1.有倒计时时间显示。
2若交道口出现紧急情况,交警可将糸统设置成手动:全路口车辆禁行、行人通行。
紧急情况结束后再转成自动状态。
3当有119、120等特种车辆通过时,糸统自动转为特种车放行,其它车辆禁止状态。
特种车辆通过15秒钟后,糸统自动恢复,用模型车演示。
4其它自选措施。
智能交通灯控制系统1.系统功能的确定功能一:可以实现红绿灯的转换以及控制路口的基本功能。
功能二:有倒计时功能和最后十秒绿灯闪烁的功能。
功能三:出现紧急情况时,警察可以手动控制特殊状态,并维持交通。
功能四:119或120等特种车经过时,可转换成为特种车道行驶状态,并在情况消除后15秒,恢复原状。
2.方案论证2.1方案一:如下图所示,为proteus仿真图。
其中,P1,P0端口的8位分别来控制东西,南北方向的红绿灯。
且运用了4个74LS164的8位移位寄存器(串行输入,并行输出)来控制4个LED的数码显示,通过AT89C51单片机的P3.0,P3.1两个扩展端口来接4个并行连接的74LS164的DIN和CLK两个端口来显示倒计时的功能,这会产生乱码使得显示杂乱,而主程序以顺序执行为主,其中穿插着对P3.7的端口高低电平的测试和跳转语句来实现功能三,并且功能一、二在主程序中实现,没有功能四的的实现程序。
#include<reg52.h>#define uchar unsigned char#define uint unsigned intuchar code table[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x0};uchar code table1[7]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf};uint table2[5]={5,15,20,0,15};sbit dula=P1^0;sbit wela=P1^1;sbit beer=P3^7;sbit k1=P1^5;sbit k2=P1^2;sbit k3=P1^4;sbit k4=P1^6;sbit A1=P2^0;sbit A2=P2^1;sbit A3=P2^2;sbit A4=P2^3;uintcount,count1,count2,j,tz=79,kn2,t10=15,tc=15,tf=15,tb,te,t4,t5,n=4,k=1,kn,tt,ti=20,t11=20,t12=35 ,t13=40,t14=55,t15=60,t16=75;void init(){TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;}void delayms(uint x){uint y,z;for(y=x;y>0;y--)for(z=110;z>0;z--);}void display(uint td,uchar ta){uint num;P0=0xff;wela=1;wela=0;if(td==0)P0=table[ta];elseP0=ta ;dula=1;dula=0;if(num==7)num=0;P0=table1[num];num++;wela=1;wela=0;}void ts(){uchar shi,ge;ET0=0;shi=ti/10;ge=ti%10;if(k2==0){delayms(5);if(k2==0){kn2++;if(kn2==2) kn2=0;}while(!k2);}if(kn2==1){if(j==1) wela=1;else{display(0,shi);display(0,ge);display(0,shi);display(0,ge);display(1,0xff);display(1,0x0);display(1,0x0);}if(k3==0||k4==0){delayms(5);if(k3==0){table2[1]++;table2[4]++;table2[2]++;ti++;t10++;t11++;t12=t12+2;t13=t13+2;t14=t14+3;t15=t 15+3;t16=t16+4;tz=tz+4,tc++,tf++;}if(k4==0){table2[1]--;table2[2]--;table2[4]--;ti--;t10--;t11--;t12=t12-2;t13=t13-2;t14=t14-3;t15=t15-3;t1 6=t16-4;tz=tz-4;}while(!k3);while(!k4);tb=0;te=0;tt=0;n=4;k=1;}}ET0=1;}void incident(){ET0=0;if(k1==0){delayms(5);if(k1==0){kn++;if(kn==2){beer=1;kn=0;}}while(!k1);}if(kn==1){beer=0;if(j==1) wela=1;else{display(0,10);display(0,10);display(0,10);display(0,10);display(1,0xff);display(1,0x0);display(1,0x0);}}ET0=1;}void main(){uchar shia,gea,shib,geb;uint i;init();while(1){ts();incident();if(count1==10){count1=0;j++;if(j==2) j=0;}if(count2==5){count2=0;i++;if(i==4) i=0;}if(i==0) A1=0;else A1=1;if(i==1) A2=0;else A2=1;if(i==2) A3=0;else A3=1;if(i==3) A4=0;else A4=1;if(count==20){count=0;tt++; tb++; te++;if(tt>tz) tt=0;if(n==3||n==5) n=0;if(t4==tb) tb=0;t4=table2[n];tc=t4-tb ;if(tc==1) n++;if(k==3) k=0;if(t5==te) te=0;t5=table2[k];tf=t5-te ;if(tf==1) k++;}if(kn2==0&&kn==0){shia=tc/10;display (0,shia);gea=tc%10;display (0,gea);shib=tf/10;display (0,shib);geb=tf%10;display (0,geb);if (tt<t10)/*a方向-1绿*/{if(tt>=(t10-5)&&tt<=t10&&j==0)display(1,0x9);/*红*/else display(1,0x39);/*红*/display(1,0x0);/*黄*/display(1,0x6);/*绿*/}else if (tt>=t10&&tt<t11)/*黄*/{display(1,0x9);if(j==0) display(1,0x6);else display(1,0x0);display(1,0x30);}else if (tt>=t11&&tt<t12)/*b方向-1绿*/{if (tt>=(t12-5)&&tt<t12&&j==0) display(1,0xe);else display(1,0xf);display(1,0x0);display(1,0x30);}else if (tt>=t12&&tt<t13)/*黄*/{display(1,0xe);if(j==0) display(1,0x30);else display(1,0x0);display(1,0x1);}else if (tt>=t13&&tt<t14)/*a方向-2绿*/{if(tt>=(t14-5)&&tt<t14&&j==0) display(1,0x36);else display(1,0x3e);display(1,0x0);display(1,0x1);}else if (tt>=t14&&tt<t15)/*黄*/{display(1,0x36);if(j==0) display(1,0x1);else display(1,0x0);display(1,0x8);}else if (tt>=t15&&tt<t16)/*b方向-2绿*/{if(tt>=(t16-5)&&tt<t16&&j==0) display(1,0x31);else display(1,0x37);display(1,0x0);display(1,0x8);}else /*黄*/{display(1,0x31);if(j==0) display(1,0x8);else display(1,0x0);display(1,0x6);}}}}void time0() interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;count++;count1++;count2++;}。
DATAS SEGMENT;此处输入数据段代码CONADD EQU 21BH ;控制寄存器端口地址BADD EQU 219H ;B口地址CADD EQU 21AH ;C口地址DATAS ENDSSTACKS SEGMENT;此处输入堆栈段代码STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKSSTART:MOV AX,DATASMOV DS,AX;此处输入代码段代码;ORG 2000H ;定义起始地址XOR CH,CHXOR AH,AHMOV AL,80H ;1 00 0 0 0 0 0B方式0,输出MOV DX,CONADD ;写控制字OUT DX,ALMOV AL,01101111B ;东西方向全红(接高四位)MOV DX,BADD ;DX保存Bd口地址OUT DX,ALMOV AL,11011011B ;南北方向全红MOV DX,CADDOUT DX,ALCALL DELAY1 ;延时S: MOV AL,1101111BMOV DX,BADD ;东西方向绿灯亮,起始状态OUT DX,ALMOV AL,10011011B ;南北方向红灯亮MOV DX,CADDOUT DX,ALCALL DELAY2 ;长延时MOV CX,0005H ;黄灯闪5次Y1: MOV AL,10111111BMOV DX,BADDOUT DX,ALMOV AL,01011011BMOV DX,CADDOUT DX,AL ;黄灯亮CALL DELAY3MOV AL,11111111BMOV DX,BADDOUT DX,ALMOV AL,11011011BMOV DX,CADDOUT DX,AL ;黄灯灭CALL DELAY3LOOP Y1MOV AL,01101111BMOV DX,BADDOUT DX,ALMOV AL,11110110BMOV DX,CADD ;东西红灯,南北绿灯OUT DX,ALCALL DELAY2 ;长延时MOV CX,0005H ;黄灯闪5次Y2: MOV AL,01101111BMOV DX,BADDOUT DX,ALMOV AL,11101101BMOV DX,CADDOUT DX,ALCALL DELAY2MOV AL,01101111BMOV DX,BADDOUT DX,ALMOV AL,11111111BMOV DX,CADDOUT DX,ALCALL DELAY2LOOP Y2MOV AH,1;待定,有键按下退出INT 16HJZ SMOV AH,4CHINT 21H;回到起始状态,不断循环DELAY1 PROC NEAR ;短延时子过程PUSH CX ;CX入栈保护(保护外循环次数)MOV CX,08000H ;置LOOP次数T:LOOP T ;跳转至本身,延时作用POP CX ;CX出栈RET ;返回DELAY1 ENDPDELAY2 PROC NEAR ;长延时子过程PUSH AX ;AX(AL)入栈保护PUSH CX ;CX入栈保护MOV CX,0010H ;置LOOP次数K:CALL DELAY1 ;调用短延时LOOP K ;循环一次,CX减1POP CX ;数据出栈,先进后出POP AXRET ;返回DELAY2 ENDPDELAY3 PROC NEAR ;长延时子过程PUSH AX ;AX(AL)入栈保护PUSH CX ;CX入栈保护MOV CX,0010H ;置LOOP次数Q:CALL DELAY1 ;调用短延时LOOP Q ;循环一次,CX减1POP CX ;数据出栈,先进后出POP AXRET ;返回DELAY3 ENDPCODES ENDSEND START。
交通灯控制一、课程设计的内容在实验平台上选择两组指示灯,每组分为红,黄,绿代表交通灯。
要求: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。
程序源代码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为定时方式,且都工作于模式1MOV TH1,#00H ;T1计数器清零MOV TL1,#00HSETB TR1 ;启动T1计时器SETB EX1 ;允许INT1中断SETB IT1 ;选择边沿触发方式MOV DPTR ,#0003HMOV A, #80H ;给8255赋初值,8255工作于方式0MOVX @DPTR, AAGAIN: 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 AGAINRED: 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 ;红灯时间存入76HN00: MOV A,76H ;东西方向禁止,南北方向通行MOV R3,AMOV DPTR,#0000H ;置8255A口,东西方向红灯亮,南北方向绿灯亮MOV A,#0DDHMOVX @DPTR, AN01: JB P2.0,B0N02: SETB P3.0CJNE R3,#00H,N01 ;比较R3中的值是否为0,不为0转到当前指令处执行;------黄灯闪烁5秒程序------N1: SETB P3.0MOV R3,#05HMOV DPTR,#0000H ;置8255A口,东西,南北方向黄灯亮MOV A,#0D4HMOVX @DPTR,AN11: MOV R4,#00HN12: CJNE R4,#7DH,$ ;黄灯持续亮0.5秒N13: MOV DPTR,#0000H ; 置8255A口,南北方向黄灯灭MOV A,#0DDHMOVX @DPTR,AN14: 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,AN21: JB P2.0,T03N22: CJNE R3,#00H,N21;------黄灯闪烁5秒程序------N3: MOV R3,#05HMOV DPTR,#0000H ;置8255A口,东西,南北方向黄灯亮第2 页共27 页毕业设计MOV A,#0E2HMOVX @DPTR,AN31: MOV R4,#00HCJNE R4,#7DH,$ ;黄灯持续亮0.5秒N32: MOV DPTR,#0000H ; 置8255A口,南北方向黄灯灭MOV A,#0EBHMOVX @DPTR,AN33: 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: RETIT0_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,T02DISP1: MOV B,#0AHMOV A,R3 ;R3中值二转十显示转换DIV ABMOV 79H,AMOV 7AH,BDIS: MOV A,79H ;显示十位第3 页共27页唐波:基于单片机的交通灯控制器的研究与设计MOV DPTR,#TABMOVC A,@A+DPTRMOV DPTR,#0002HMOVX @DPTR,AMOV DPTR,#0001HMOV A,#0F7HMOVX @DPTR,ALCALL DELAYDS2: 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 ;若绿灯倒计时完毕,不再检测车流量JZ N3JB P2.0,T03INC R7CJNE R7,#64H,E1MOV R7,#00H ;中断到100次则清零E1: SJMP N22;------东西方向车流量显示程序------T02: MOV B,#0AHMOV A,R7 ;R7中值二转十显示转换DIV ABMOV 79H,AMOV 7AH,BDIS3: MOV A,79H ;显示十位MOV DPTR,#TABMOVC A,@A+DPTRMOV DPTR,#0002HMOVX @DPTR,AMOV DPTR,#0001H第4 页共27 页毕业设计MOV A,#0F7HMOVX @DPTR,ALCALL DELAYDS4: MOV A,7AH ;显示个位MOV DPTR,#TABMOVC A,@A+DPTRMOV DPTR,#0002HMOVX @DPTR,AMOV DPTR,#0001HMOV A,#0FBHMOVX @DPTR,ALJMP N7;------延时4MS子程序----------DELAY: MOV R1,#0AHLOOP: MOV R6,#64HNOPLOOP1: DJNZ R6,LOOP1DJNZ R1,LOOPRET;------字符表------TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH END第5 页共27页。
单片机红绿灯的汇编语言程序设计a>程序源代码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为定时方式,且都工作于模式1MOV TH1,#00H ;T1计数器清零MOV TL1,#00HSETB TR1 ;启动T1计时器SETB EX1 ;允许INT1中断SETB IT1 ;选择边沿触发方式MOV DPTR ,#0003HMOV A, #80H ;给8255赋初值,8255工作于方式0MOVX @DPTR, AAGAIN: 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 AGAINRED: MOV A,P1ANL A,#7FH 1.7置0MOV R7,#00H ;R7清零MOV R7,A ;存入东西方向红灯初始时间MOV R3,ALCALL DISP1LCALL DELAYAJMP AGAIN;-------------------------------------------N0: SETB TR0 ;启动T0计时器MOV 76H,R7 ;红灯时间存入76HN00: MOV A,76H ;东西方向禁止,南北方向通行MOV R3,AMOV DPTR,#0000H ;置8255A口,东西方向红灯亮,南北方向绿灯亮MOV A,#0DDHMOVX @DPTR, AN01: JB P2.0,B0N02: SETB P3.0CJNE R3,#00H,N01 ;比较R3中的值是否为0,不为0转到当前指令处执行;------黄灯闪烁5秒程序------N1: SETB P3.0MOV R3,#05HMOV DPTR,#0000H ;置8255A口,东西,南北方向黄灯亮MOV A,#0D4HMOVX @DPTR,AN11: MOV R4,#00HN12: CJNE R4,#7DH,$ ;黄灯持续亮0.5秒N13: MOV DPTR,#0000H ; 置8255A口,南北方向黄灯灭MOV A,#0DDHMOVX @DPTR,AN14: 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,AN21: JB P2.0,T03N22: CJNE R3,#00H,N21;------黄灯闪烁5秒程序------N3: MOV R3,#05HMOV DPTR,#0000H ;置8255A口,东西,南北方向黄灯亮MOV A,#0E2HMOVX @DPTR,AN31: MOV R4,#00HCJNE R4,#7DH,$ ;黄灯持续亮0.5秒N32: MOV DPTR,#0000H ; 置8255A口,南北方向黄灯灭MOV A,#0EBHMOVX @DPTR,AN33: 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: RETIT0_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,T02DISP1: MOV B,#0AHMOV A,R3 ;R3中值二转十显示转换DIV ABMOV 79H,AMOV 7AH,BDIS: MOV A,79H ;显示十位MOV DPTR,#TABMOVC A,@A+DPTRMOV DPTR,#0002HMOVX @DPTR,AMOV DPTR,#0001HMOV A,#0F7HMOVX @DPTR,ALCALL DELAYDS2: 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 ;若绿灯倒计时完毕,不再检测车流量JZ N3JB P2.0,T03INC R7CJNE R7,#64H,E1MOV R7,#00H ;中断到100次则清零E1: SJMP N22;------东西方向车流量显示程序------T02: MOV B,#0AHMOV A,R7 ;R7中值二转十显示转换DIV ABMOV 79H,AMOV 7AH,BDIS3: MOV A,79H ;显示十位MOV DPTR,#TABMOVC A,@A+DPTRMOV DPTR,#0002HMOVX @DPTR,AMOV DPTR,#0001HMOV A,#0F7HMOVX @DPTR,ALCALL DELAYDS4: MOV A,7AH ;显示个位MOV DPTR,#TABMOVC A,@A+DPTRMOV DPTR,#0002HMOVX @DPTR,AMOV DPTR,#0001HMOV A,#0FBHMOVX @DPTR,ALJMP N7;------延时4MS子程序----------DELAY: MOV R1,#0AHLOOP: MOV R6,#64HNOPLOOP1: DJNZ R6,LOOP1DJNZ R1,LOOPRET;------字符表------TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH ENDORG 0000HAJMP MAINORG 000BHLJMP INTORG 0030HMAIN:MOV R2,#20H MOV TMOD,#01H MOV TL0,#0B0H MOV TH0,#80H SETB EASETB ET0SETB TR0LOOP:MOV A,#01H MOV P1,ALCALL DELMOV R0,#02H LCALL FPLOOP1:MOV A,#02H MOV P1,ALCALL DELMOV R0,#02H LCALL FPLOOP2:MOV A, #04H MOV P1,ALCALL DELMOV R0,#05H LCALL FPMOV P1,#00H LCALL DELCJNE R0,#00H ,AASJMP LOOPFP:MOV R1,#80H MOV A,R1MOV DPTR,#3FFFH MOVX @DPTR,A RR AMOV A,R0ANL A,#0FHMOV DPTR,#TAB MOVC A,@A+DPTR MOV DPTR,#5FFFH MOVX @DPTR,A LCALL DELMOV A,#0FFHMOV DPTR,#5FFFH MOVX @DPTR,AMOV A,R1MOV DPTR,#3FFFH MOVX @DPTR,AMOV A,R0ANL A,#0F0HSWAP AMOV DPTR,#TAB MOVC A,@A+DPTR MOV DPTR,#5FFFH MOVX @DPTR,A LCALL DELMOV A,#0FFHMOV DPTR,#5FFFH MOVX @DPTR,ACJNE R0,#99H,FPRETDEL:MOV R5,#100H DEL0:MOV R6,#250H DEL1JNZ R6,DEL1 DJNZ R5,DEL0RETINT: CLR ET0DJNZ R2,GOONMOV A,R0ADD A,#99HDA AMOV R0,AMOV R2,#20HGOON:MOV TMOD,#01H MOV TL0,#0B0HMOV TH0,#80HSETB EASETB ET0RETITAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H END。
/****************************************************************************** ** 描述: ** A T89S52液晶演示数据p0,控制p2** 功能:** 万年历、频率计、密码锁、点阵屏** 作者:** 哥不在江湖~~** 技术支持:** 湖南工学院************************************************************************************************ */;****************************************************************************** *****************;;系统起始程序区ORG 0000HSTART: LJMP MAINORG 000BHLJMP TIMEORG 001BHLJMP TIME2;****************************************************************************** *****************;;系统监控程序区ORG 0030HMAIN: MOV SP, #80H ;确立堆栈区MOV PSW, #00H ;MOV TMOD, #01H ;定时器初始化,定时器0以工作方式1工作CLR F0 ;判断表格首地址标志位CLR EAMOV R0, #20H ;RAM区首地址MOV R7, #96 ;RAM区单元个数ML: MOV @R0, #00HINC R0DJNZ R7, MLTSF: MOV DPTR, #DISBH ;系统初始化后提示符“P.”字符代码表首地址MOV R5, #08HMOV R0, #78HDISPTSF:CLR AMOVC A, @A+DPTRMOV @R0, AINC R0INC DPTRDJNZ R5, DISPTSFFUN: ACALL DISP ;调显示子程序显示提示符“P.”ACALL KEY ;调用键扫描程序JB 20H.0, JT ;S2键按下,则执行交通灯的程序JB 20H.1, SZAJ2 ;S3键按下,则执行数字按键的程序LJMP FUNSZAJ2: LJMP SZAJ;****************************************************************************** *****************;;交通灯程序入口JT: MOV IE, #82H ;定时器0初始化MOV TMOD, #01H ;(1秒钟定时)MOV TH0, #3CHMOV TL0, #0B0HMOV R4, #20CLR 21H.0CLR TR1CLR TR0;****************************************************************************** *****************;ONE: MOV R3, #15 ;第一个状态,主绿次红MOV P3, #0DEH ;灯亮,R3为秒计数;****************************************************************************** *****************;TSF1: MOV DPTR, #DISBHMOV R5, #08HMOV R0, #78HDISPTSF1:CLR A ;数码管显示缓存区扫描MOVC A, @A+DPTRMOV @R0, AINC R0INC DPTRDJNZ R5, DISPTSF1MOV 78H, #05H ;数码管显示缓存区付初值MOV 79H, #01H ;主绿次红,初值15SETB TR0 ;开定时;****************************************************************************** *****************;HA1: ACALL DISPJNB 21H.0, HUI1CLR 21H.0 ;15秒倒计时程序DJNZ 78H, HUIQU1MOV R6, 79HCJNE R6, #00H, TENLJMP HUIQU1TEN: ACALL DISPJNB 21H.0, TENMOV 78H, #09HMOV 79H, #00HDEC R3CLR 21H.0LJMP HUIQU1HUI1: LJMP HA1HUIQU1: DJNZ R3, HA1;***********************************************************************************************;CLR TR0 ;第二个状态,主黄次红;****************************************************************************** *****************;TWOTWO: MOV IE, #88H ;定时器1初始化MOV TMOD, #10H ;(0.5秒定时器)MOV TH1, #3CHMOV TL1, #0B0HMOV R4, #10;****************************************************************************** *****************;TWO: MOV R3, #5 ;R3还是秒计数MOV P3, #0DDH ;灯亮;****************************************************************************** *****************;TSF2: MOV DPTR, #DISBHMOV R5, #08HMOV R0, #78H ;数码管显示缓存区扫描DISPTSF2:CLR AMOVC A, @A+DPTRMOV @R0, AINC R0INC DPTRDJNZ R5, DISPTSF2 ;数码管显示缓存区付初值MOV 78H, #05H ;主黄次红,初值05MOV 79H, #00H;***************************************************************************** ******************;CLR 22H.0SETB TR1 ;开定时器1MOV R7, #00HHA2: ACALL DISPJNB 22H.0, HA2 ;执行两次0.5秒定时,则计1秒INC R7CLR 22H.0CJNE R7, #02H, HA2DEC 78HMOV R7, #00H;****************************************************************************** *****************;CJNE R3, #4, HUIQU2 ;当倒计时剩下3秒时,执行主行道黄灯闪烁的程序;****************************************************************************** *****************;SHAN21: CLR 22H.0LIANG2: JB 22H.0, SHAN22MOV P3, #0DFH ;主行道闪烁程序ACALL DISPLJMP LIANG2SHAN22: CLR 22H.0MIE2: JB 22H.0, SHAN2MOV P3, #0DDHACALL DISPLJMP MIE2SHAN2: DEC 78HDEC R3CJNE R3, #1, SHAN21LJMP TIAO2HUIQU2: DJNZ R3, HA2HUI2: LJMP HA2TIAO2: NOP;****************************************************************************** *****************;CLR TR1 ;第三个状态,主红次绿CLR TR0 ;定时器的选择SANSAN: MOV IE, #82HMOV TMOD, #01HMOV TH0, #3CHMOV TL0, #0B0HMOV R4, #20;****************************************************************************** *****************;SAN: MOV R3, #5MOV P3, #0F3H;****************************************************************************** *****************;TSF3: MOV DPTR, #DISBHMOV R5, #08HMOV R0, #78HDISPTSF3:CLR AMOVC A, @A+DPTRMOV @R0, AINC DPTRDJNZ R5, DISPTSF3MOV 78H, #05HMOV 79H, #00H;****************************************************************************** *****************;SETB TR0 ;开定时HA3: ACALL DISPJNB 21H.0, HA3 ;5秒倒计时程序CLR 21H.0DEC 78HDJNZ R3, HA3;****************************************************************************** *****************;CLR TR0 ;选择定时器1,即0.5秒定时器SISI: MOV IE, #88HMOV TMOD, #10HMOV TH1, #3CHMOV TL1, #0B0HMOV R4, #10;****************************************************************************** *****************;SI: MOV R3, #5MOV P3, #0EBHTSF4: MOV DPTR, #DISBHMOV R5, #08HMOV R0, #78HDISPTSF4:CLR AMOVC A, @A+DPTRMOV @R0, AINC R0INC DPTRDJNZ R5, DISPTSF4MOV 78H, #05HMOV 79H, #00HCLR 22H.0SETB TR1HA4: ACALL DISPJNB 22H.0, HA4INC R7CLR 22H.0CJNE R7, #02H, HA4MOV R7, #00H;***************************************************************************** ******************;CJNE R3, #4, HUIQU4;***************************************************************************** ******************;SHAN41: CLR 22H.0LIANG4: JB 22H.0, SHAN42MOV P3, #0FBHACALL DISPLJMP LIANG4SHAN42: CLR 22H.0MIE4: JB 22H.0, SHAN4MOV P3, #0EBHACALL DISPLJMP MIE4SHAN4: DEC 78HDEC R3CJNE R3, #1, SHAN41LJMP TIAO4HUIQU4: DJNZ R3, HA4HUI4: LJMP HA4TIAO4: NOPLJMP JT;****************************************************************************** *****************;SZAJ: MOV P3, #0FFH ;数据初始化MOV 78H, #10HMOV 79H, #10HMOV 7AH, #10HMOV 7BH, #10HMOV 7CH, #10HMOV 7DH, #10HMOV 7EH, #10HMOV 7FH, #10HXS: ACALL DISPACALL KEYJB 20H.0, KEY00 ;是S2键,转KEY00执行JB 20H.1, KEY11 ;是S3键,转KEY11执行JB 20H.2, KEY22 ;是S4键,转KEY22执行JB 20H.3, KEY33 ;是S5键,转KEY33执行JB 20H.4, KEY44 ;是S6键,转KEY44执行JB 20H.5, KEY55 ;是S7键,转KEY55执行JB 20H.6, KEY66 ;是S8键,转KEY66执行JB 20H.7, KEY77 ;是S9键,转KEY77执行LJMP OUTKEY00: LCALL JIAOHUANMOV 7FH, #00HLCALL DISPLJMP OUTKEY11: LCALL JIAOHUANMOV 7FH, #01HLCALL DISPLJMP OUTKEY22: LCALL JIAOHUANMOV 7FH, #02HLCALL DISPLJMP OUTKEY33: LCALL JIAOHUANMOV 7FH, #03HLCALL DISPLJMP OUTKEY44: LCALL JIAOHUANMOV 7FH, #04HLCALL DISPLJMP OUTKEY55: LCALL JIAOHUANMOV 7FH, #05HLCALL DISPLJMP OUTKEY66: LCALL JIAOHUANMOV 7FH, #06HLCALL DISPLJMP OUTKEY77: LCALL JIAOHUANMOV 7FH, #07HLCALL DISPOUT: LJMP XSTIME: MOV TH0, #3CHMOV TL0, #0B0HDEC R4CJNE R4, #0, ZHUANSETB 21H.0MOV R4, #20ZHUAN: RETITIME2: MOV TH1, #3CHMOV TL1, #0B0HDEC R4CJNE R4, #0, ZHUAN2SETB 22H.0MOV R4, #10ZHUAN2: RETIDISBH: DB 11H,10H,10H,10H,10H,10H,10H,10H,10H ;提示符“P.”字符序号;显示字符段选码表(共阳极代码)TAB: DB 0C0H, 0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H ;0-8DB 90H, 88H,83H,0C6H,0A1H,86H,8EH,0FFH,0CH ;9,A,B,C,D,E,F,灭,p.;****************************************************************************** ********;;键扫描子程序KEY: LCALL KEYCHULI ;调P1口数据处理子程序JZ EXIT ;没有键按下,转返回LCALL DISP ;调显示子程序去抖动LCALL DISPLCALL KEYCHULI ;调P1口数据处理子程序JZ EXIT ;没有键按下,转返回MOV B, 20H ;保存取反后的键值KEYSF: LCALL KEYCHULI ;调P1口数据处理子程序JZ KEY1 ;键释放,则将键值转移并保存LCALL DISP ;调显示子程序延时LJMP KEYSF ;等待释放KEY1: MOV 20H, B ;键值送20H保存EXIT: RET ;子程序返回;P1口按键数据处理子程序KEYCHULI: PUSH PSW ;保护现场CLR RS1 ;改变当前寄存器组为组1SETB RS0MOV P1, #0FFH ;先向P1口写1MOV A, P1 ;读P1口数据CPL A ;P1口数据取反MOV 20H, A;保存取反后的键值CLR RS1 ;恢复当前寄存器组为组0CLR RS0POP PSW ;恢复现场RET ;子程序返回;数码管显示子程序DISP;入口:7FH,7EH,7DH,7CH,7BH,7AH,79H,78H (LED7,LED6,LED5,LED4,LED3,LED2,LED1,LED0)DISP: PUSH DPHPUSH DPLPUSH ACCPUSH PSWCLR RS1 ;改变当前寄存器组为组1SETB RS0MOV R1, #78H ;显示缓冲存储单元首地址MOV R2, #0FEH ;从右至左显示MOV R5, #08H ;循环次数,即驱动数码管的位数DISP1: MOV A, @R1MOV DPTR, #TABMOVC A, @A+DPTRMOV P0, A ;送段控MOV P2, R2 ;送位控LCALL DLMOV A, R2 ;延时1毫秒RL A ;获得新的位控码MOV R2, A ;保存新的位控码INC R1 ;获得新的显示缓冲单元地址DJNZ R5, DISP1 ;循环没有结束则继续DISP2: POP PSW ;恢复当前寄存器组的组号POP ACCPOP DPLPOP DPHRET;延时1ms子程序(晶振频率12MHz)DLDL: MOV R7, #02HDL1: MOV R6, #0FFHDL2: DJNZ R6, DL2DJNZ R7, DL1RET;将78至7EH单元的内容交换子程序JIAOHUAN:MOV 78H, 79HMOV 79H, 7AHMOV 7AH, 7BH MOV 7BH, 7CH MOV 7CH, 7DH MOV 7DH, 7EH MOV 7EH, 7FH RETEND。
交通灯控制
一、课程设计的内容
在实验平台上选择两组指示灯,每组分为红,黄,绿代表交通灯。
要求:
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.3
JNB P3.3
开始
JB P3.4
P3.4 jnb
之前状态
JBP3.5 JB P3.2
东西绿灯亮 南北红灯亮
南北绿灯亮东西红灯亮
救护车 东西南北红灯亮并警报
显示子程序流程图:DISPL Y子程序流程图:
ORG 4000H
START: MOV DPTR,#0F100H
MOV A,#11011110B ;东西南北红灯亮
MOVX @DPTR,A
LCALL DL1S ; 显示时间,并查询按键状态 LCALL XIANSHI
LOP1: MOV DPTR,#0F100H
MOV A,#11011011B ;南北绿灯亮,东西红灯亮
MOVX @DPTR,A
LCALL DL1S ;显示时间,并查询按键状态
LCALL XIANSHI
MOV R0,#2
LOP2: MOV DPTR,#0F100H
MOV A, #11011001B ; 南北黄灯闪烁2次
MOVX @DPTR,A
LCALL DL1S ;显示时间,并查询按键状态 LCALL XIANSHI
LOPD: MOV DPTR,#0F100H
MOV A,#11011011B
MOVX @DPTR,A
LCALL DL1S
LCALL XIANSHI
DJNZ R0,LOP2
LOP3: MOV DPTR,#0F100H
MOV A,#01111110B ;东西绿灯亮,南北红灯亮
MOVX @DPTR,A
LCALL DL1S ;显示时间,并查询按键状态
LCALL XIANSHI
MOV R0,#2
LOP4: MOV DPTR,#0F100H
MOV A,#00111110B ; 东西黄灯闪烁2次
MOVX @DPTR,A
LCALL DL1S
LCALL XIANSHI
LOPE: MOV DPTR,#0F100H
MOV A,#01111110B ;显示时间,并查询按键态 MOVX @DPTR,A
LCALL DL1S
LCALL XIANSHI
DJNZ R0,LOP4 ;R0不为0,转L0P4
AJMP START
PK:
MOV DPTR,#0F100H ;手动状态两个黄灯亮作为标志
MOV A,#10111101B
MOVX @DPTR,A
JNB 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 ;不显示时间,显示0
AJMP PK
ZHUL:
MOV DPTR,#0F100H
MOV A,#11011011B ;南北绿灯亮,东西红灯亮
MOVX @DPTR,A
LCALL XIANSHI1 ;显示0
AJMP PK
ZILU: MOV DPTR,#0F100H
MOV A,#01111110B ;东西绿灯亮,南北红灯亮
MOVX @DPTR,A
LCALL XIANSHI1 ;显示0
AJMP PK
JHC: MOV TMOD,#01H
MOV TH0,#0FCH ;蜂鸣器响起
MOV TL0,#05BH
SETB TR0
SETB EA
CPL P1.7
MOV DPTR,#0F100H
MOV A, #11011110B ;东西,南北,红灯亮 MOVX @DPTR,A
LCALL XIANSHI1 ;显示0
;子程序
DL1S: JB P3.3,PK ;查询按键状态
JB P3.4,JHC
RET
;显示子程序
XIANSHI:MOV A,#0 ;显示0
MOV DPTR,#TB ;查表
ANL A,0FH
MOVC A,@A+DPTR
MOV R1,A
MOV P1,#11111111B
CALL DISPLY
LCALL DL1S1 ;调用延时 MOV A,#1 ;显示1 MOV DPTR,#TB
ANL A,0FH
MOVC A,@A+DPTR
MOV R1,A
MOV P1,#11111111B
CALL DISPLY
LCALL DL1S1
MOV A,#2 ;显示2
MOV DPTR,#TB
ANL A,0FH
MOVC A,@A+DPTR
MOV R1,A
MOV P1,#11111111B
CALL DISPLY
LCALL DL1S1
MOV A,#3 ;显示3 MOV DPTR,#TB
ANL A,0FH
MOVC A,@A+DPTR
MOV R1,A
MOV P1,#11111111B
CALL DISPLY
LCALL DL1S1
RET
XIANSHI1: MOV A,#0
MOV DPTR,#TB
ANL A,0FH ;显示0的子程序 MOVC A,@A+DPTR
MOV R1,A
MOV P1,#11111111B
CALL DISPLY
LCALL DL1S1
DISPLY:MOV R7,#8 ;
MOV A,R1
;MOV A,#8EH
T: RLC A ;串形输入
SETB P1.1 ;时钟置高
MOV P1.0,C ;数据送sda
CLR P1.1 ;时钟置低位
DJNZ R7,T
MOV P1,#10110111B ;1
RET
DL1S1: MOV R6,#4
DELAYY: MOV R5,#250
DELAYE: MOV R3,#250 ;延时子程序
DELAYF: DJNZ R3,DELAYF
DJNZ R5,DELAYE
DJNZ R6,DELAYY
RET
TB:DB
0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6 H,0A1H,86H,8EH
END
1 / 1。