单片机交通灯实验汇编语言程序
- 格式:docx
- 大小:10.74 KB
- 文档页数:2
设计报告一、设计方法:1、通过老师上课讲的内容及要求来设计。
2、开始时可跟着老师走从基础使用4094实现倒计时开始一步一步实现。
3、实现基础部分后我们就可按着自己的思路结合单片机的学习从而一步一步实现整个功能。
二、设计思路:1、首先在实现整个功能之前我并不清楚自己要设计的界面应是什么样子的,我从最基本的开始先学会使用4094实现一位倒计时,然后使用4094实现两位倒计时,实现了两位倒计时之后基本上就可以实现四个路口的倒计时显示。
2、完成基本型后就要想办法如何才能实现在线修改参数,且按照新的参数执行,而且参数用什么来设置等等,通过单片机的学习我想到了用中断方式的方法来实现,且在中断里来调用子程序来设置参数,并选用了键盘来设置参数。
因为单片机里已学过键盘子程序,现在再来使用这样的键盘,虽比单片机里学过的4*4键盘复杂点,但总不会太难了。
就这样一步一步按照自己的思路完成。
3、以上实现后,我们也可多加些按键来控制暂停、复位、行人按键等等,而这些在完成以上功能后再来实现它们就会很容易了。
流程图:三、选择的芯片:AT89C51、4094、KEYPAD-PHONE、LED-GREEN、LED-RED、LED-YELLOW、TSEG-COM-AN-GRN、3WATT100R、BUTTON 四、硬件设计:五、软件设计:1、部分代码:;30H、34H、35H主干道红、绿、黄灯,33H、31H、32H支干道红、绿、黄灯,修改用外部中断ORG 0000HLJMP MAINORG 0003H ;复位中断入口地址LJMP FWORG 0013H ;修改参数中断入口地址LJMP XGORG 0030HMAIN:MOV 30H,#50MOV 31H,#30MOV 32H,#20MOV 33H,#40MOV 34H,#32MOV 35H,#08LOOP: SETB IT0 ;设置外部中断0的触发方式SETB IT1 ;设置外部中断1的触发方式SETB EX0 ;开启外部中断0SETB EX1 ;开启外部中断1SETB PX0 ;设置优先级CLR PX1SETB EA ;开启总中断STAR1:MOV 40H,30HMOV 41H,31HMOV 42H,32HMOV 43H,33HMOV 44H,34HMOV 45H,35H;主干道的红与支干道的绿ZHUHO:CLR P2.7 ;关门,减震作用MOV 46H,#0F5H ;显示LED亮与灭MOV A,40H ;显示主干道的红灯参数LCALL XSLCALL LPMOV A,41H ;显示支干道的绿灯参数LCALL XSLCALL LOPSETB P2.7 ;开门,减震作用LCALL DELAYDEC 40H ;倒计时JNB P1.7,ZHIHODJNZ 41H,ZHUHOCLR P2.7MOV A,40H ;显示主干道的红灯参数LCALL XSLCALL LPMOV A,41H ;显示支干道的绿灯参数LCALL XSLCALL LOPSETB P2.7LCALL DELAY;主干道的红与支干道的黄ZIHU:CLR P2.7MOV 46H,#0F6H ;显示LED亮与灭MOV A,42H ;显示主干道的红灯参数LCALL XSLCALL LPMOV A,42H ;显示支干道的黄灯参数LCALL XSLCALL LOPSETB P2.7LCALL DELAYJNB P1.7,ZHIHO ;倒计时DJNZ 42H,ZIHUCLR P2.7MOV A,42H ;显示主干道的红灯参数LCALL XSLCALL LPMOV A,42H ;显示支干道的黄灯参数LCALL XSLCALL LOPSETB P2.7LCALL DELAY;支干道的红与主干道的绿ZHIHO:CLR P2.7MOV 46H,#0EBH ;显示LED亮与灭MOV A,43H ;显示支干道的红灯参数LCALL XSLCALL LOPMOV A,44H ;显示主干道的绿灯参数LCALL XSLCALL LPSETB P2.7LCALL DELAYDEC 43HDJNZ 44H,ZHIHOCLR P2.7MOV A,43H ;显示支干道的红灯参数LCALL XSLCALL LOPMOV A,44H ;显示主干道的绿灯参数LCALL XSLCALL LPSETB P2.7LCALL DELAY;支干道的红与主干道的黄ZUHU:CLR P2.7MOV 46H,#0DBH ;显示LED亮与灭MOV A,45H ;显示支干道的红灯参数LCALL XSLCALL LOPMOV A,45H ;显示主干道的黄灯参数LCALL XSLCALL LPSETB P2.7LCALL DELAYDJNZ 45H,ZUHUCLR P2.7MOV A,45H ;显示支干道的红灯参数LCALL XSLCALL LOPMOV A,45H ;显示主干道的黄灯参数LCALL XSLCALL LPSETB P2.7LCALL DELAYLJMP STAR1XG:JB P3.3,EXIT ;修改参数中断服务子程序MOV A,#00H ;使数码管都显示00MOV 46H,#0FFH ;使LED都灭LCALL XSLCALL LPLCALL LOPSJMP FCZFW:CLR EA ;复位中断服务子程序MOV A,#88MOV 46H,#0FFHLCALL XSLCALL LPLCALL LOP;产生中断后对参数重新赋初值FCZ:MOV P0,#0F9HMOV P2,#0BFHLCALL LKEY1 ;设置第一个参数MOV 30H,20HMOV P0,#0A4HMOV P2,#0BFHLCALL LKEY1 ;设置第二个参数MOV 31H,20HMOV P0,#0B0HMOV P2,#0BFHLCALL LKEY1 ;设置第三个参数MOV 33H,20HMOV P0,#99HMOV P2,#0BFHLCALL LKEY1 ;设置第四个参数MOV 34H,20HMOV A,30HSUBB A,31HMOV 32H,AMOV A,33HSUBB A,34HMOV 35H,AMOV 40H,30HMOV 41H,31HMOV 42H,32HMOV 43H,33HMOV 44H,34HMOV 45H,35HMOV P0,#0FFHMOV P2,#0FFHEXIT:RETI ;中断返回DELAY:MOV R3,#10 ;延时0.5s子程序MOV TMOD,#01HMOV TH0,#3CHMOV TL0,#0B0HSETB TR0LOOP1:JBC TF0,LOOP2SJMP LOOP1LOOP2:MOV TH0,#3CHMOV TL0,#0B0HDJNZ R3,LOOP1CLR TR0RETXS:MOV DPTR,#TAB ;显示子程序MOV B,#10DIV ABMOVC A,@A+DPTRMOV R5,AMOV A,BMOVC A,@A+DPTRMOV R6,ARETTAB: DB 0C0H,0F9H,0A4H,0B0HDB 99H,92H,82H,0F8HDB 80H,90H,88H,83HDB 0C6H,0A1H,86H,8EHLP:CLR C ;4094主干道显示两位倒计时子程序MOV R0,#08HMOV A,R6LP1:CLR P3.7RLC AMOV P3.6,CSETB P3.7DJNZ R0,LP1MOV A,R5MOV R0,#08HLP2:CLR P3.7RLC AMOV P3.6,CSETB P3.7DJNZ R0,LP2RETLOP:CLR C ;4094支干道显示两位数倒计时子程序MOV R0,#08HMOV A,R6LOP1:CLR P3.5RLC AMOV P3.4,CSETB P3.5DJNZ R0,LOP1MOV A,R5MOV R0,#08HLOP2:CLR P3.5RLC AMOV P3.4,CSETB P3.5DJNZ R0,LOP2XP2:MOV R0,#08H ;四个路口红绿灯LED显示器子程序MOV A,46HLP5:CLR P3.1RLC AMOV P3.0,CSETB P3.1DJNZ R0,LP5RET;键盘扫描子程序KEY16:LCALL KS ; 读键盘JZ KEY16 ; 判是否有键按下,A=0表示无键按下,再读LCALL T10MS ; 延时LCALL KS ; 有键按下的话,再读一次,消除抖动JZ KEY16 ; 判是否有键按下,A=0表示无键按下,再读MOV R2,#0EFH ; 列扫描初值,11101111MOV R4,#00H ; 列扫描计数单元置"0"; 下面进行列扫描(0~3)、读行值(01、04、07、0FF)LK1:MOV P1,R2 ; P1.4=0, 扫描第一列JB P1.0,ONE ; 判是否第0行健按下,否判下一行MOV A,#01H ; 是,行值"01"LJMP KPONE:JB P1.1,TWO ; 判是否第1行健按下,否判下一行MOV A,#04H ;是,行值"04"LJMP KPTWO:JB P1.2,THREE ; 判是否第2行健按下,否判下一行MOV A,#07H ; 是,行值"07"LJMP KPTHREE:JB P1.3,NEXT ; 判是否第3行健按下,否则扫描下一列MOV A,#0FFH ; 是,行值"0ff"LJMP KPNEXT:INC R4 ; 列计数加1MOV A,R2 ; 行扫描完,列移位,继续JNB ACC.6,KND ; 判是否列扫描结束RL A ; 左移,扫下一列MOV R2,AAJMP LK1 ; 转下一列读键KND:AJMP KEY16KP:ADD A,R4 ; 生成键值,A=行基值+列值(0~3)PUSH ACCLK:LCALL KSJNZ LKPOP ACCSETB P1.7RETT10MS:MOV R7,#10H ;T10ms延时子程序TS1:MOV R6,#0FFHTS2:NOPNOPDJNZ R6,TS2DJNZ R7,TS1RETKS:MOV P1,#0FH ; 判有无键按下子程序MOV A,P1CPL AANL A,#0FHRETLKEY1:MOV A,#0LCALL KEY16 ; 读第一个数CJNE A,#0AH,LKEY2 ; 键值>9则重读键SJMP LKEY1LKEY2:JNC LKEY1MOV R0,A ; 保存第一个数SWAP ALCALL XSP0P2 ; 显示第一个数LKEY3:MOV A,#0LCALL KEY16 ; 读第二个数CJNE A,#0AH,LKEY4 ; 键值>9(非数字键)则重读键SJMP LKEY3SJMP LKEY3LKEY4:JNC LKEY3MOV R1,A ; 第二个数存入B中MOV A,R0 ; 取第一个数SWAP A ; 换到高位ADD A,R1 ; 第二个数(低位)与第一个数(高位)合并MOV 20H,APUSH AMOV A,R0MOV B,#10MUL ABADD A,R1MOV 20H,APOP ALCALL XSP0P2 ; 显示两个数JB P1.3,$ ;判确定键有没按下RETXSP0P2:PUSH B ;显示子程序MOV DPTR,#XSTAB ; 取数据表首地址MOV B,A ; 保存原数据ANL A,#0FH ; 截取低4位数MOVC A,@A+DPTR ; 取显示字型码MOV P0,A ; 送P0显示MOV A,B ; 取原数据ANL A,#0F0H ; 截取高4位SWAP A ; 半字节交换MOVC A,@A+DPTR ; 取显示段码MOV P2,A ; 送P2显示MOV A,BPOP BRETXSTAB: DB 0C0H,0F9H,0A4H,0B0HDB 99H,92H,82H,0F8HDB 80H,90H,88H,83HDB 0C6H,0A1H,86H,8EHEND六、时间安排:1、要完成这个项目我们只有两个周的时间,第一个周我们完成了基本的用4094实现两位数的倒计时,并实现基本的十字路口,两路显示,能够实现最基本的运行。
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。
单片机交通灯控制器的设计一. 设计任务在一十字路口设置交通灯,并用单片机对其进行合理的控制。
时间方向控制要求白天东西绿灯黄灯红灯南北红灯绿灯黄灯夜晚东西黄灯南北黄灯二. 总体设计方案现在流行的一种设计为两主干线相交的十字路。
本设计采用一主干道(南北方向),一从干道(东西方向)的路口,即主干道的通行时间为从干道的2倍。
在正常情况下,两干道的交通灯按图1进行转换,并以倒计数的方式将剩余时间显示在每个干道对应的两位LED上;另发挥部分为当出现紧急情况时,路口的交通灯全为红灯,紧急情况解除时,恢复到原来的状态。
其具体状态如图1。
状态持续时间/S 南北方向东西方向控制码绿黄红绿黄红1 40 亮灭灭灭灭亮01111110B2 5 灭亮灭灭灭亮10111110B3 20 灭灭亮亮灭灭11001111B4 5 灭灭亮灭亮灭11011101B5 按紧急键灭灭亮灭灭亮11011110B6 按夜晚键灭亮灭灭亮灭01111100B7 按恢复键恢复恢复恢复恢复恢复恢复恢复原来其系统框图如图2。
三.硬件电路的设计1. 单片机系统单片机系统采用atmel公司的AT89C51芯片,晶振选用6MHZ,电源电压采用5V。
其总体系统电路图见图3。
2. 信号灯与按钮电路的设计信号灯采用发光二极管组成,分红黄绿三种颜色。
该系统用于控制信号灯的输出线路有六条,按钮输出线有三条,应用AT89C51的P2.7,P3口来实现上述连接。
3个按钮一端通过上拉电阻连接到电源,并输入单片机,另一端接地,这样未按下时,输入是高电平,反之,为低电平。
采用软件消抖。
3. LED显示电路用LED显示器共有4位,需8位输出口用于位选输出,分别选用AT89C51的P1,P2口,驱动电路采用芯片7407驱动器。
四.软件设计本系统的软件包括主程序,显示程序和定时器溢出中断程序三部分。
1. 主程序:设置堆栈,定时器初始化,中断系统初始化,显示缓冲区赋初值,设置状态标志,状态切换。
单片机应用技术实验报告BCD码加法一、实验内容编写一个程序实现多位BCD码加法。
假设单片机RAM中20H和30H中放着BCD码加数和被加数,结果放在20H开始的单元中。
要求考虑进位问题。
二、实验源程序ORG0630HMOV R0,#20HMOV R1,#30HMOV A,R7;R7中放着加数的个数MOV R6,A;R6中放置最后结果CLR CLOOP:MOV A,@R0;取加数ADDC A,@R1DA A;十进制加法调整MOV@R0,A;把结果送回20H开始的单元INC R0INC R1DJNZ R7,LOOPJC NEXT1;如果最后一次加法有进位,跳转到NEXT1SJMP NEXT2NEXT1:MOV@R0,#1;R0中放置进位INC R6NEXT2:NOPEND三、实验小结这个BCD码加法实验在编程是,遇到些语法小问题,后来在同组同学的探讨下纠正了过来。
当程序运行正确时我们有一种成就感,很高兴。
实验名称:P3.3输入、P0口输出一、实验内容(1)P3.3口做输入口,外接一脉冲,每输入一个脉冲,P1口按十六进制加一。
(2)P1口做输出口,编写程序,使P1口接的8个发光二极管L1—L8按16进制加一方式点亮发光二极管。
二、实验说明(1)P1口是准双向口,它作为输出口时与一般的双向口使用方法相同,由准双向口结构可知:当P1口作为输入口时,必须先对它置高电平,使内部MOS管截止,因内部上拉电阻是20KΩ—40KΩ,故不会对外部输入产生影响。
(2)延时子程序的延时计算问题。
对于延时程序DELAY:MOV R6,#00HDELAY1:MOV R7,#80HDJNZ R7,$DJNZ R6,DELAY1MOV、DJNZ指令均需用两个机器周期,而一个机器周期时间长度为12/6.0MHZ,所以该段指令执行时间为:((80+1)×256+1)×2×(12÷6000000)=132.1ms三、实验步骤(1)P3.3用插针连至K1,P1.0—P1.7用插针连至L1—L8。
题目:智能交通灯控制系统班级: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的端口高低电平的测试和跳转语句来实现功能三,并且功能一、二在主程序中实现,没有功能四的的实现程序。
单片机整套实验及程序(交通灯_跑马灯等)文档实验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;}}六、实验思考题●请用汇编指令完成本实验内容,深刻理解汇编语言程序设计结构。
题目:简易交通灯一、设计目的利用TDN微机原理试验箱及单元电路,实现对一道路交通灯的控制。
当通过车辆计数达到50时,绿灯灭,红灯亮,同时数码块倒计时若干秒(此次设计中设为9秒)。
此时,车辆停止,行人可以通过。
二、参加人员及分工李——试验报告霍——调试程序洪——编写程序三、技术要求1、设计完成交通灯的电路2、采用TDN试验箱上的8255、8259、8253完成3、程序设计中采用软件延时四、试验器材TDN-MD86/51实验箱一台,8253一片,8255一片,8259一片,数码管一组,发光二极管一组。
五、设计和调试环境TDN-MD86/51教学试验系统六、题目分析、工作原理、设计思想题目分析我们所做的交通灯是控制单路口处车辆和行人的通过及停止的简易交通灯。
因此需要两个灯和一块用于显示倒计时的数码块来控制车辆和行人的通行、停留问题。
其中两个灯分为红绿色,主要根据两只灯的亮灭情况来控制车辆,当红灯灭绿灯亮的时候车辆可以通过,而红灯亮绿灯灭时车辆就要停止通行。
数码块用于显示倒计时的时间以控制人,当倒计时开始时人通行,倒计时结束后行人就要等待。
根据题目分析得出以下设计思想及工作原理:设计思想在一开始启动交通灯时设置为红灯灭绿灯亮,让车辆先通行,行人等待,当通过50辆车后,红绿灯都同时灭然后红灯亮绿灯灭且数码快开始倒计时,此时为行人通行时间。
然后当数码块倒计时到0时行人通行的时间结束。
转而红灯灭绿灯亮又改为车辆通行时间。
红绿灯和数码块如此反复工作就构成的交通灯。
工作原理通过向8259写入程序来控制其他器件的工作。
在程序一开始写入中断向量和各芯片的控制方式字,以确保发生中断是正确的响应中断及芯片正确的工作状态。
接下来的程序就是控制8255和8253,8255选择工作方式1,A、B、C、口都做基本的输入输出。
通过8255A 口先让红灯灭绿灯亮。
8253选择工作方式2:计数停止中断,通过8253对车辆的计数达到50辆车是就发出中断请求。
ORG 0000HLJMP STARTORG 0003HLJMP IINT0ORG 0013HLJMP IINT1ORG 0030HSTART: MOV SP,#6FHMOV 61H,#35HMOV 60H,61HLIGHT: SETB EASETB EX0SETB EX1CLR IT1CLR IT0MOV 63H, #0F3HMOV P1,63H ;东西红,南北绿,计时时间为35sMOV 60H,61HA1: MOV R1,#50A2: ACALL BCDLCALL BIANANDJNZ R1,A2MOV A,60HMOV R0,60HADD A,#99HDA AMOV 60H,ACJNE R0,#05H,A1MOV 63H,#0F5HMOV P1,63H ; 东西红,南北黄灯闪烁5sMOV R2,#5A3: MOV R1,#25A4: ACALL BCDACALL DISPCLKDJNZ R1,A4CPL P1.1MOV R1,#25A41: ACALL BCDACALL DISPCLKDJNZ R1,A41CPL P1.1MOV A,60HADD A,#99HDA AMOV 60H,ADJNZ R2,A3MOV 63H,#1EHMOV P1,63H ;东西绿,南北红,计时时间35sMOV 60H,61HA5: MOV R1,#50A6: ACALL BCDLCALL BIANANDJNZ R1,A6MOV R0,60HMOV A,60HADD A,#99HDA AMOV 60H,ACJNE R0,#05H,A5MOV 63H,#0EEHMOV P1,#0EEH ;南北红,东西黄灯闪烁5sMOV R2,#5A7: MOV R1,#25A8: ACALL BCDACALL DISPCLKDJNZ R1,A8CPL P1.4MOV R1,#25A81: ACALL BCDACALL DISPCLKDJNZ R1,A81CPL P1.4MOV A,60HADD A,#99HDA AMOV 60H,ADJNZ R2,A7LJMP LIGHT ;连续运行返回部分BIANAN: ;显示部分MOV DPTR,#TABMOV A,50HMOVC A,@A+DPTRMOV P2,ACLR P1.7SETB P3.7LCALL DELAYCLR P3.7MOV A,51HMOVC A,@A+DPTRMOV P2,ACLR P1.6SETB P3.6LCALL DELAYCLR P3.6RETDISPCLK: ;显示部分D1: MOV DPTR,#TABMOV A,50HMOVC A,@A+DPTRMOV P0,AMOV P2,ASETB P1.7SETB P3.7LCALL DELAYCLR P1.7CLR P3.7D2: MOV A,51HMOVC A,@A+DPTRMOV P0,AMOV P2,ASETB P1.6SETB P3.6LCALL DELAYCLR P1.6CLR P3.6RETBCD: ;将十位数送到(51H),个位数送到(50H)MOV A,60HMOV B,#10HDIV ABMOV 51H,AMOV A,BMOV 50H,ARETIINT0: ;紧急情况处理CLR EAJB P3.2,$PUSH 60HPUSH P0PUSH P1PUSH P2PUSH P3B0: JNB P3.0,NHJNB P3.1,DHA9: MOV P1,#36H ;全红LCALL BIANANJNB P3.2,B0MOV P1,63HJMP JENH: MOV P1,#1EH ;只允许东西方向车辆通行SETB P2.6SETB P2.7ACALL DELAYJNB P3.2,B0JMP JEDH: MOV P1,#33H ;只允许南北方向车辆通行SETB P2.6SETB P2.7ACALL DELAYJNB P3.2,B0JMP JEJE:POP P3POP P2POP P1POP P0POP 60HSETB EARETIIINT1: ;通行时间加减程序CLR EAJB P3.3,$PUSH P1PUSH P2SINC1: ;加1 MOV R3,#20A11: ACALL BCDACALL DISPCLKDJNZ R3,A11B2: JB P3.3,JSJNB P3.0,SINC2LCALL LDELAYJNB P3.0,SINC2SDEC1: ;减1程序MOV R5,#20A13: ACALL BCDACALL DISPCLKDJNZ R5,A13B3: JB P3.3,JSJNB P3.1,SDEC2LCALL LDELAYJNB P3.1,SDEC2JMP SINC1SINC2:MOV A,60HADD A,#01HDA AMOV 60H,AJMP SINC1SDEC2:MOV A,60HADD A,#99HDA AMOV 60H,AJMP SDEC1JS: MOV 61H,60HPOP P2POP P1SETB EARETI;10MS延时DELAY: MOV R6,#25DEL1: MOV R7,#200DEL2: DJNZ R7,DEL2DJNZ R6,DEL1RET; MS延时LDELAY: MOV R6,#25DEL3: MOV R7,#200DEL4: DJNZ R7,DEL4DJNZ R6,DEL3RETTAB: 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。
实验四、中断实验报告一、实验内容参照实验电路,设计交通灯控制系统。
模拟交通信号灯控制:一般情况下正常显示,东西-南北交替放行,各方向通行时间为30秒。
有救护车或警车到达时,两个方向交通信号灯全为红色,以便让急救车或警车通过,设通行时间为10秒,之后交通恢复正常。
用单次脉冲模拟急救车或警车申请外部中断。
二、程序流程图3实验仿真电路4、实验程序ORG 0000HJMP MAINORG 0003H ;外部中断0的入口地址JMP X0_INTORG 000BH ;T0中断的入口地址JMP T0_INT;*************************************** MAIN:MOV TMOD, #01HMOV TH0, #3CHMOV TL0, #0B0HMOV R1, #20 ;定时1sSETB TR0SETB ET0SETB PT0SETB EX0SETB IT0SETB EAMOV SP, #60HM_LOOP:;***************************************N_B:MOV 30H, #11H ;南北MOV P1, 30HMOV R5, #30 ;CALL DISPLAYMOV R2, #27LOOP1:CALL WAIT_1SDJNZ R2, LOOP1 ;判断是否过了27s ;--------------------------MOV 30H, #21HMOV P1, 30HMOV R2, #3LOOP11:CALL WAIT_1SDJNZ R2, LOOP11 ;判断是否过了3秒;*************************************** D_X:MOV 30H, #0AH ;东西MOV P1, 30HMOV R5, #30CALL DISPLAYMOV R2, #27LOOP2:CALL WAIT_1SDJNZ R2, LOOP2 ;判断是否过了27s ;--------------------------MOV 30H, #0CHMOV P1, 30HMOV R2, #3LOOP22:CALL WAIT_1SDJNZ R2, LOOP22 ;判断是否过了3秒JMP M_LOOP;*************************************** WAIT_1S: ;等待新秒出现JNB 20H.0, $CLR 20H.0DEC R5CALL DISPLAYRET;-----------------------------DISPLAY:MOV A, R5MOV B, #10DIV ABMOV DPTR, #TAB1MOVC A, @A + DPTRMOV P2, AMOV A, BMOV DPTR, #TAB1MOVC A, @A + DPTRMOV P0, ARETTAB1:DB 3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07H, 7FH, 6FH ;***************************************X0_INT:MOV P1, #09H ;全部红灯PUSH ACCPUSH BPUSH PSWSETB RS0 ;换工作区MOV R5, #10 ;倒计时显示CALL DISPLAYMOV R1, #20 ;定时1s;----------------MOV R2, #10 ;倒计时LOOP3:CALL WAIT_1SDJNZ R2, LOOP3 ;判断是否到了10s ;----------------POP PSW ;恢复原区CALL DISPLAY ;显示原值MOV P1, 30H ;显示原灯POP BPOP ACCRETI;-----------------------------T0_INT: ;T0中断,高优先级 MOV TL0, #0B0HMOV TH0, #3CH ;50ms中断一次DJNZ R1, EXIT_T0MOV R1, #20 ;定时1sSETB 20H.0 ;每到一秒就置一EXIT_T0:RETI;*************************************** END。
单片机交通灯实验汇编语言程序
经过几天的整理,终于将网络上得到交通灯仿真文件,用汇编自己编写
了一个程序,实验结果完全符合本人的思路,实验成功。
程序比较长,估计还
会用更好的办法重新写。
编写心得是:单片机编程,不一定要背指令,用时可
以查,也不必去默写子程序,用时还是可以查,但是,很关键的就是,你的程
序,你自己要清楚整个的执行过程,也就是单片机的执行流程。
而在实际的应
用中,要注意驱动电路的设计,特别是单片机上电复位输出高电平可能造成的
影响。
程序如下:如果网页显示格式错乱可从51hei/f/jtda.rar 处下载. ORG 0000HSTART:MOV R2,#30SU0:MOV P0,#00HMOV P1,#00HMOV P2,#00HMOV P3,#00111111BMOV A,R2MOV R4,AMOV A,R4MOV R0,AMOV B,#5DIV ABMOV B,#3MUL ABMOV R1,ASETB P0.4SETB P0.7SETB P2.2SETB
P2.5AJMP KEYSU1A: DEC R0DEC R1SUL5: CJNE R1,#5,SUL6SETB P2.7SUL6: CJNE R1,#4,SUL7SETB P2.7SUL7: CJNE R1,#3,SUL1SETB P2.7SUL1: CJNE R1,#2,SUL2SETB P2.7SUL2: CJNE R1,#1,SUL3SETB P2.7SUL3: CJNE R1,#0,SUL4MOV A,R0MOV R1,ACLR P2.5CLR P0.7SETB P0.5SETB P2.4SUL4: CJNE R0,#0,KEYAJMP SU0BKEY: JB P3.5,KEY1 LCALL DELAY MOV
R2,#45KEY1:JB P3.2,KEY2 LCALL DELAY MOV R2,#60KEY2:JB P3.3,KEY3 LCALL DELAY MOV A,R2 ADD A,#5 MOV R2,A CJNE R2,#95,DD MOV
R2,#95KEY3:JB P3.4,DD LCALL DELAY MOV A,R2 SUBB A,#5 MOV R2,A CJNE R2,#0,DD MOV R2,#0DD:MOV R3,#50;数码1DD1: MOV P1,#00H MOV A,R0 MOV B,#10 DIV AB MOV DPTR,#TAB MOVC A,@A+DPTR MOV P1,A SETB P0.0 LCALL DELAY1 CLR P0.0 MOV A,B MOV DPTR,#TAB MOVC A,@A+DPTR MOV P1,A SETB P0.1 LCALL DELAY1 CLR P0.1;数码2 MOV。