带注释的c51汇编语言,51单片机汇编语言实现交通灯 代码有详细注释
ORG 0000H;程序起始地址
LJMP START;初始化標號
ORG 0003H;外部中斷地址--東西緊急按鈕觸發
LJMP DXJJ;東西緊急標號
ORG 0013H;外部中斷地址--南北緊急按鈕觸發
LJMP NBJJ;南北緊急標號
ORG 000BH;定時器T0中斷地址
LJMP OT? ?? ?? ?;定時器T0標號
ORG 0100H;程序起始位置
START:? ?? ???SETB EA? ?? ?? ?;中斷允許
SETB ET0 ;允許定時器T0中斷
CLR IT0 ;設置外部中斷為電平觸發
CLR IT1 ;同上
SETB EX0 ;允許外部中斷
SETB EX1 ;同上
SETB PX0 ;設置外部中斷優先級高于定時器中斷
SETB PX1 ;
CLR PT0? ?? ?? ?;
MOV TMOD,#01H;設置定時器模式1
MOV TH0,#3CH ;
MOV TL0,#0B0H;設置定時器初值--50ms
SETB TR0? ???;開啟定時器
MAIN:? ?? ???MOV R0,#20;設置R0 記錄20個50ms 產生1s
MOV R1,#56;設置主時間判斷時間軸 表示循環周期
MOV R2,#3 ;
MOV R3,#3 ;東西南北初始紅燈時間為3S
MOV R4,#0FCH;初始全紅 1111 1100
MOV 70H,#0;判斷是否按下了緊急按鈕的標志位 0 第一次按(進入緊急狀態) 1 第二次按(退出緊急狀態)
MOV R7,#00H ;判斷是要執行緊急程序還是正常交通燈顯示??00H正常交通燈 01H 東西緊急 02H南北緊急
XS:? ?? ???LCALL DISPLAY;調用顯示程序
LJMP XS? ???;循環進行顯示
SJMP [? ? ? ? DISCUZ_CODE_3? ? ? ? ]nbsp;? ???;死循環 保護程序執行? 可能沒用
OT:? ?? ???CJNE R7,#00H,PD ;R7不等于0跳轉判斷是哪個緊急,R7=0 說明未中斷正常跑程序
ZCP:? ?? ???DJNZ R0,OVER2;? ?? ???;R0 不為零說明沒有記夠20個50ms即沒有產生1s,跳出中斷等待下一次50ms產生中斷信號
MOV TH0,#3CH ;
MOV TL0,#0B0H;記完一次50ms 重新裝載定時器初值
DEC R1? ?? ???;進入此部分說明已經經過了1s 那么總時間-1
DEC R2? ?? ???;顯示時間-1
DEC R3? ?? ???;顯示時間-1
KK1:? ?? ???CJNE R1,#53,KK2? ?? ???;判斷是否經過了3s 到達了第一個狀態(初始狀態全紅為第狀態)
MOV R2,#20? ?? ???;
MOV R3,#23? ?? ???;賦值顯示
MOV R4,#0F9H;DX綠,NB紅 1111 1001
LJMP OVER2
KK2:? ?? ???CJNE R1,#33,KK3? ?? ???;判斷是否又經過了20s 到達了第二個狀態
MOV R2,#3? ?? ???;賦值顯示
MOV R4,#0EDH;DX黃,NB紅 1110 1101
LJMP OVER2
KK3:? ?? ???CJNE R1,#30,KK4? ?? ???;判斷是否又經過了3s 到達了第三個狀態
MOV R2,#33? ?? ???;
MOV R3,#30? ?? ???;賦值顯示
MOV R4,#0F6H;DX紅,NB綠 1111 0110
LJMP OVER2
KK4:? ?? ???CJNE R1,#0,OVER1 ;判斷是否又經過了30s 到達了第四個狀態? ?此時為了跳出中斷 還不能重新賦值記錄50ms的個數 采用了OVER1和OVER2
MOV R3,#3? ?? ???;賦值顯示
MOV R4,#0DEH;DX紅,NB黃 1101 1110
MOV R1,#56? ?? ???;重新賦值總時間
OVER1:? ?? ???MOV R0,#20? ?? ???;重新賦值20 以產生1s
OVER2:? ?? ???RETI? ?? ?? ?? ?? ???;跳出中斷 如果用ERT是跳出子程序調用 兩者有區別!
PD:? ?? ???CJNE R7,#01H,NB;判斷是哪種緊急 01H 是DX緊急??02H是NB緊急
DX:? ?? ???MOV R4,#0B9H;DXJJ將東西車和綠燈打開,將南北燈變紅 1011 1001
MOV P2,#0FFH;關掉數碼管選通 達到暫停數碼管效果
RETI
NB:? ?? ???MOV R4,#76H;NBJJ將南北車和南北綠燈打開,將東西燈變紅 0111 0110
MOV P2,#0FFH;關掉數碼管選通 達到暫停數碼管效果
RETI
DXJJ:? ?? ???JB 70H,OFF1;判斷是否第一次按下緊急按鈕
ON1:? ?? ???CPL 70H? ?? ?? ???;按下一次后就翻轉 下次就能檢測出是第二次
MOV R7,#01H;第一次按下說明開啟中斷 那么進入緊急狀態 緊急狀態標志變為#01H表示產生東西中斷
LJMP OUT1
OFF1:? ?? ???CPL 70H? ?? ?? ???;如果要關掉中斷那么也要對標志位取反 下次就能檢測出是要開啟
MOV R7,#00H;第二次按下說明是關閉中斷 緊急標志變為#00H進入正常交通燈顯示
OUT1:? ?? ???RETI
NBJJ:? ?? ???JB 70H,OFF2;道理同上
ON2:? ?? ???CPL 70H
MOV R7,#02H
LJMP OUT2
OFF2:? ?? ???CPL 70H
MOV R7,#00H
OUT2:? ?? ???RETI
DISPLAY:MOV DPTR,#TAB;東西的數碼管十位顯示
MOV A,R2;
MOV B,#10
DIV AB
MOVC A,@A+DPTR;
MOV P2,#11111101B;
MOV P0,A
LCALL YS
MOV DPTR,#TAB;東西的數碼管個位顯示
MOV A,B;
MOVC A,@A+DPTR;
MOV P2,#11111110B
MOV P0,A;
LCALL YS
MOV DPTR,#TAB;南北的數碼管十位顯示
MOV A,R3;
MOV B,#10
DIV AB
MOVC A,@A+DPTR;
MOV P2,#11110111B;
MOV P0,A
LCALL YS
MOV DPTR,#TAB;南北的數碼管個位顯示
MOV A,B;
MOVC A,@A+DPTR;
MOV P2,#11111011B
MOV P0,A;
LCALL YS
MOV P1,R4;紅綠燈的顯示
LCALL YS
RET
YS:? ?? ???MOV R5,#150 ;延時函數
JY:? ?? ???DJNZ R5,JY ;減一操作
RET
TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH;數碼管共陰極
END
總結
以上是生活随笔為你收集整理的带注释的c51汇编语言,51单片机汇编语言实现交通灯 代码有详细注释的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 王者荣耀内测皮肤怎么获得
- 下一篇: c语言无符号数除法,[求助]关于双字节无