單片機紅綠燈的匯編語言程序設計 a> 程序源代碼
ORG 0000H ;主程序的入口地址 LJMP MAIN ;跳轉到主程序的開始處 ORG 0003H ;外部中斷0的中斷程序入口地址 ORG 000BH ;定時器0的中斷程序入口地址 LJMP T0_INT ;跳轉到中斷服務程序處 ORG 0013H ;外部中斷1的中斷程序入口地址 MAIN : MOV SP,#50H MOV IE,#8EH ;CPU開中斷,允許T0中斷,T1中斷和外部中斷1中斷 MOV TMOD,#51H ;設置T1為計數方式,T0為定時方式,且都工作于模式1 MOV TH1,#00H ;T1計數器清零 MOV TL1,#00H SETB TR1 ;啟動T1計時器 SETB EX1 ;允許INT1中斷 SETB IT1 ;選擇邊沿觸發方式 MOV DPTR ,#0003H MOV A, #80H ;給8255賦初值,8255工作于方式0 MOVX @DPTR, A AGAIN: JB P3.1,N0 ;判斷是否要設定東西方向紅綠燈時間的初值,若P3.1為1 則跳轉 MOV A,P1 JB P1.7,RED ;判斷P1.7是否為1,若為1則設定紅燈時間,否則設定綠燈時間 MOV R0,#00H ;R0清零 MOV R0,A ;存入東西方向綠燈初始時間 MOV R3,A LCALL DISP1 LCALL DELAY AJMP AGAIN RED: MOV A,P1 ANL A,#7FH 1.7置0 MOV R7,#00H ;R7清零 MOV R7,A ;存入東西方向紅燈初始時間 MOV R3,A LCALL DISP1 LCALL DELAY AJMP AGAIN ;------------------------------------------- N0: SETB TR0 ;啟動T0計時器 MOV 76H,R7 ;紅燈時間存入76H N00: MOV A,76H ;東西方向禁止,南北方向通行 MOV R3,A MOV DPTR,#0000H ;置8255A 口,東西方向紅燈亮,南北方向綠燈亮 MOV A,#0DDH MOVX @DPTR, A N01: JB P2.0,B0 N02: SETB P3.0 CJNE R3,#00H,N01 ;比較R3中的值是否為0,不為0轉到當前指令處執行 ;------黃燈閃爍5秒程序------ N1: SETB P3.0 MOV R3,#05H MOV DPTR,#0000H ;置8255A 口,東西,南北方向黃燈亮 MOV A,#0D4H MOVX @DPTR,A N11: MOV R4,#00H N12: CJNE R4,#7DH,$ ;黃燈持續亮0.5秒 N13: MOV DPTR,#0000H ; 置8255A 口,南北方向黃燈滅 MOV A,#0DDH MOVX @DPTR,A N14: MOV R4,#00H CJNE R4,#7DH,$ ;黃燈持續滅0.5秒 CJNE R3,#00H,N1 ;閃爍時間達5秒則退出 ;------------------------------------------------------------ N2: MOV R7,#00H MOV A,R0 ;東西通行,南北禁止 MOV R3,A MOV DPTR,#0000H ; 置8255A 口,東西方向綠燈亮,南北方向紅燈亮 MOV A,#0EBH MOVX @DPTR,A N21: JB P2.0,T03
N22: CJNE R3,#00H,N21 ;------黃燈閃爍5秒程序------ N3: MOV R3,#05H MOV DPTR,#0000H ;置8255A 口,東西,南北方向黃燈亮 MOV A,#0E2H MOVX @DPTR,A N31: MOV R4,#00H CJNE R4,#7DH,$ ;黃燈持續亮0.5秒 N32: MOV DPTR,#0000H ; 置8255A 口,南北方向黃燈滅 MOV A,#0EBH MOVX @DPTR,A N33: MOV R4,#00H CJNE R4,#7DH,$ ;黃燈持續滅0.5秒 CJNE R3,#00H,N3 ;閃爍時間達5秒則退出 SJMP N00 ;------闖紅燈報警程序------ B0: MOV R2,#03H ;報警持續時間3秒 B01: MOV A,R3 JZ N1 ;若倒計時完畢,不再報警 CLR P3.0 ;報警 CJNE R2,#00H,B01 ;判斷3秒是否結束 SJMP N02 ;------1秒延時子程序------- N7: RETI T0_INT:MOV TL0,#9AH ;給定時器T0送定時10ms 的初值 MOV TH0,#0F1H INC R4 INC R5 CJNE R5,#0FAH,T01 ;判斷延時是否夠一秒,不夠則調用顯示子程序 MOV R5,#00H ;R5清零 DEC R3 ;倒計時初值減一 DEC R2 ;報警初值減一 T01: ACALL DISP ;調用顯示子程序 RETI ;中斷返回 ;------顯示子程序------ DISP: JNB P2.4,T02 DISP1: MOV B,#0AH MOV A,R3 ;R3中值二轉十顯示轉換 DIV AB MOV 79H,A MOV 7AH,B DIS: MOV A,79H ;顯示十位 MOV DPTR,#TAB MOVC A,@A+DPTR MOV DPTR,#0002H MOVX @DPTR,A MOV DPTR,#0001H MOV A,#0F7H MOVX @DPTR,A LCALL DELAY DS2: MOV A,7AH ;顯示個位 MOV DPTR,#TAB MOVC A,@A+DPTR MOV DPTR,#0002H MOVX @DPTR,A MOV DPTR,#0001H MOV A,#0FBH MOVX @DPTR,A RET ;------東西方向車流量檢測程序------ T03: MOV A,R3 SUBB A,#00H ;若綠燈倒計時完畢,不再檢測車流量 JZ N3 JB P2.0,T03 INC R7 CJNE R7,#64H,E1 MOV R7,#00H ;中斷到100次則清零 E1: SJMP N22 ;------東西方向車流量顯示程序------ T02: MOV B,#0AH MOV A,R7 ;R7中值二轉十顯示轉換 DIV AB MOV 79H,A MOV 7AH,B DIS3: MOV A,79H ;顯示十位 MOV DPTR,#TAB MOVC A,@A+DPTR MOV DPTR,#0002H MOVX @DPTR,A MOV DPTR,#0001H MOV A,#0F7H MOVX @DPTR,A LCALL DELAY DS4: MOV A,7AH ;顯示個位 MOV DPTR,#TAB MOVC A,@A+DPTR MOV DPTR,#0002H MOVX @DPTR,A MOV DPTR,#0001H MOV A,#0FBH MOVX @DPTR,A LJMP N7 ;------延時4MS 子程序---------- DELAY: MOV R1,#0AH LOOP: MOV R6,#64H NOP LOOP1: DJNZ R6,LOOP1 DJNZ R1,LOOP RET ;------字符表------ TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH END ORG 0000H AJMP MAIN ORG 000BH LJMP INT ORG 0030H MAIN:MOV R2,#20H MOV TMOD,#01H MOV TL0,#0B0H MOV TH0,#80H SETB EA SETB ET0 SETB TR0 LOOP:MOV A,#01H MOV P1,A LCALL DEL MOV R0,#02H LCALL FP LOOP1:MOV A,#02H MOV P1,A LCALL DEL MOV R0,#02H LCALL FP LOOP2:MOV A, #04H MOV P1,A LCALL DEL MOV R0,#05H LCALL FP MOV P1,#00H LCALL DEL CJNE R0,#00H ,AA SJMP LOOP FP:MOV R1,#80H MOV A,R1 MOV DPTR,#3FFFH MOVX @DPTR,A RR A MOV R1,A MOV A,R0 ANL A,#0FH MOV DPTR,#TAB MOVC A,@A+DPTR MOV DPTR,#5FFFH MOVX @DPTR,A LCALL DEL MOV A,#0FFH MOV DPTR,#5FFFH MOVX @DPTR,A MOV A,R1 MOV DPTR,#3FFFH MOVX @DPTR,A MOV A,R0 ANL A,#0F0H SWAP A MOV DPTR,#TAB MOVC A,@A+DPTR MOV DPTR,#5FFFH MOVX @DPTR,A LCALL DEL MOV A,#0FFH MOV DPTR,#5FFFH MOVX @DPTR,A CJNE R0,#99H,FP RET DEL:MOV R5,#100H DEL0:MOV R6,#250H DEL1JNZ R6,DEL1 DJNZ R5,DEL0 RET INT: CLR ET0 DJNZ R2,GOON MOV A,R0 ADD A,#99H DA A MOV R0,A MOV R2,#20H GOON:MOV TMOD,#01H MOV TL0,#0B0H MOV TH0,#80H SETB EA SETB ET0 SETB TR0 RETI TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H END
|