|
如題你們要的匯編版本
幾年沒碰過匯編了,有些生疏。寫了三種形式的,程序有不足的地方請見諒,話也不多說
直接 ~giao 啊!!!不對 直接上程序、仿真
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
單片機源程序如下:
- /**************************第一種**************************************************
- RED_A EQU P0.0
- YELLO_A EQU P0.1
- GREE_A EQU P0.2
- RED_B EQU P0.3
- YELLO_B EQU P0.4
- GREE_B EQU P0.5
- ORG 0000H
- AJMP START
- ORG 0030H
- AJMP MAIN
- START:MOV P0,#0FFH
- CLR RED_A //東西 南北方向紅燈亮
- CLR RED_B
- LCALL DELAY2S
- MOV P0,#0F7H //消影
- MAIN:MOV R3,#3 //閃爍次數設置為3
-
- LOOP1:CLR GREE_A //東西方向綠燈亮
- CLR RED_B //南北方向紅燈亮
- LCALL DELAY10S
- MOV P0,#0F5H
- TOP1:CLR YELLO_A //東西方向黃燈亮
- LCALL DELAY100MS //調用100ms延時
- SETB YELLO_A //東西方向黃燈滅
- LCALL DELAY100MS
- DJNZ R3,TOP1
- MOV P0,#0DEH //南北綠燈亮 東西紅燈亮
- LOOP2:CLR GREE_B //南北方向綠燈亮
- CLR RED_A //東西方向紅燈亮
- LCALL DELAY10S
- MOV R3,#3 //賦值南北方向黃燈閃爍次數
- MOV P0,#0FEH
- TOP2:CLR YELLO_B //南北方向黃燈亮
- LCALL DELAY100MS //調用延時
- SETB YELLO_B //南北方向黃燈滅
- LCALL DELAY100MS //
- DJNZ R3,TOP2 //R3減1若不等于0跳轉至TOP2處執行,執行3次從而達到閃爍
- //R3減1等于0則順序執行
- MOV P0,#0F7H //東西方向綠燈 南北方向紅燈
- LJMP MAIN //跳轉至MAIN處循環執行
- DELAY100MS:MOV R5,#4 //定時100ms @11.0592MHz
- MOV R6,#93
- MOV R7,#152
- NEXT:DJNZ R7,NEXT
- DJNZ R6,NEXT
- DJNZ R5,NEXT
- RET
- DELAY2S:MOV R7,#20 //延時2S子程序
- MOV R6,#200
- MOV R5,#248
- B1:DJNZ R5,B1
- DJNZ R6,B1
- DJNZ R7,B1
- RET
- DELAY10S:MOV R5,#81 //延時10S
- MOV R6,#47
- MOV R7,#121
- D1:DJNZ R7,D1
- DJNZ R6,D1
- DJNZ R5,D1
- RET
- END
- ****************************************************************************************/
-
- /*****************************第二種********************/
- ORG 0100H //預留空間
- START:MOV A, #0F6H //初始化
- MOV P0, A //東西南北全紅(P0口地址)
- LCALL DELAY //鑒于空間的大小,這里選用LCALL作為調用函數
- LOOP:MOV P0,#0F3H //東西綠燈亮 南北紅的亮
- ACALL DTIME //進入定時器中斷
- MOV R0,#3 //閃爍次數 3
- LOOP1:MOV P0,#0F5H //東西黃燈閃爍,南北紅燈
- ACALL DTIME1 // ||
- MOV P0,#0F7H // ||
- ACALL DTIME1 //
- DJNZ R0,LOOP1 //判斷是否閃爍了3次,滿足則執行下一條指令,反之回到LOOP1處繼續執行
- MOV P0,#0DEH //南北綠燈,東西紅燈
- ACALL DTIME
-
- MOV R0,#3
- LOOP2:MOV P0,#0EEH //南北黃燈閃,東西紅燈
- ACALL DTIME1
- MOV P0,#0FEH
- ACALL DTIME1
- DJNZ R0,LOOP2
- JMP LOOP
-
- DTIME1:MOV TMOD,#01H //定時器T0工作在方式1 @11.0592MHz
- MOV TH0,#3CH //定時器高四位
- MOV TL0,#0B0H //定時器低四位
- MOV R6,#10 //定時0.5S R6賦值20表示1S 10*50ms=500ms=0.5s
- SETB TR0 //啟動定時0 20*50ms=1000ms=1s
- WM:JBC TF0,NEXT1 //判斷中斷溢出位為1則清零,并跳轉到NEXT1
- AJMP WM
- NEXT1:DJNZ R6,NEXT2 //定時0.5S,時間到則返回進入前位置繼續執行
- RET
- NEXT2:MOV TH0,#3CH //重裝定時器初值
- MOV TL0,#0B0H
- AJMP WM
- RET
- DTIME:MOV TMOD,#01H //定時器T0工作在方式1
- MOV TH0,#3CH //定時初值
- MOV TL0,#0B0H //定時時間 50ms
- MOV R6,#20 //1s時間到
- MOV R7,#2 //為了方便調試 綠燈亮2S 35s定時則為MOV R7,#35
- SETB TR0 //20*500ms*2=2s
- LM:JBC TF0,NEXT //判斷中斷溢出位為1則清零,并跳轉到NEXT
- AJMP LM //檢測50ms是否到
- NEXT: DJNZ R6,NEXT4
- DJNZ R7,NEXT3
- AJMP JS
- NEXT3:MOV R6,#20 //重裝定時器初值
- NEXT4:MOV TH0,#3CH
- MOV TL0,#0B0H
- AJMP LM //檢測50ms是否到
- JS:RET
- DELAY: MOV R7,#50 //延時5S子程序
- DL1:MOV R6,#200
- DL2:MOV R5,#248
- DJNZ R5,$
- DJNZ R6,DL2
- DJNZ R7,DL1
- RET
- END
- /**************************第二種*****************************************************
- ORG 0000H
- LJMP START
- ORG 0030H
- START:
- MOV A, #0F6H
- MOV P0, A ;東西南北全紅(P0口地址)
- LCALL DELAY ;鑒于空間的大小,這里選用LCALL作為調用函數
- MAIN:
- MOV A,#11110011B ;東西車道綠燈亮,通行;南北車道紅燈亮,禁止通行
- MOV P0, A ;CPU中斷
- LCALL DELAY2 ;調用延時子程序
- MOV R1,#3
- LOOP1:
- MOV A,#11110101B ;東西車道黃燈閃爍,南北車道紅燈亮,禁止通行
- MOV P0, A
- LCALL DELAY1 ;CPU中斷,調用函數
- MOV A,#11110111B
- MOV P0, A
- LCALL DELAY1
- DJNZ R1,LOOP1
- MOV A,#11011110B ;東西車道紅燈亮,禁止通行,南北車道綠燈亮,通行
- MOV P0, A
- LCALL DELAY2
- MOV R2,#3
- LOOP2:
- MOV A,#11101110B ;東西車道紅燈亮,禁止通行,南北車道黃燈閃爍
- MOV P0, A
- LCALL DELAY1
- MOV A,#11111110B
- MOV P0, A
- LCALL DELAY1
- DJNZ R2,LOOP2
- LJMP MAIN ;跳轉程序
- DELAY: MOV R7,#20 ;延時2S子程序
- DL1:MOV R6,#200
- DL2:MOV R5,#248
- DJNZ R5,$
- DJNZ R6,DL2
- DJNZ R7,DL1
- RET
- DELAY1: MOV R5, #3 ;黃燈閃爍3次程序
- Y1: MOV R6, #200
- Y2: MOV R7, #248
- X1: DJNZ R7, X1
- DJNZ R6, Y2
- DJNZ R5, Y1
- RET
- DELAY2: MOV R5, #50 ;綠燈通行延時程序
- D1: MOV R6, #200
- D2: MOV R7, #248
- D3:
- DJNZ R7, D3
- DJNZ R6, D2
- DJNZ R5, D1
- RET
- END
- */
復制代碼
所有資料51hei提供下載:
交通燈.7z
(132.36 KB, 下載次數: 46)
2020-6-28 04:24 上傳
點擊文件名下載附件
|
評分
-
查看全部評分
|