?? pwm2.asm
字號:
ORG 0000H
LJMP MAIN
ORG 0003H ;外部中斷0
LJMP interrupt_Ex1
ORG 000BH ;定時器0中斷
LJMP interrupt_T0
ORG 0013H ;外部中斷1
LJMP interrupt_Ex2
ORG 001BH ;定時器1中斷
LJMP interrupt_T1
;主函數開始
ORG 0030H
MAIN:
LCALL initial
WHILE: ;主循環,判斷按鍵
JB P3.4,KEYGREEN
KEYRED: ;紅燈按鍵判斷
JNB P3.4,KEYRED
CLR TR1
CLR TR0
CLR ET1
CLR ET0
CLR P1.7
SETB P1.6
SETB P1.5
SJMP WHILE
KEYGREEN: ;綠燈按鍵判斷
JB P3.5,KEYBLUE
JNB P3.5,KEYGREEN
CLR TR1
CLR TR0
CLR ET1
CLR ET0
CLR 0x90.6
SETB 0x90.7
SETB 0x90.5
SJMP WHILE
KEYBLUE: ;藍燈按鍵判斷
JB 0xB0.7,WHILE
JNB 0xB0.7,KEYBLUE
CLR TR1
CLR TR0
CLR ET1
CLR ET0
CLR 0x90.5
SETB 0x90.6
SETB 0x90.7
SJMP WHILE
;初始化系統
initial:
MOV TMOD,#11H
MOV TH0,#0FCH ;給兩個定時器賦初值
MOV TL0,#0x67
MOV TH1,#0xFF
MOV TL1,#0xA4
SETB IT0
SETB IT1
SETB ET0 ;開中斷
SETB ET1
SETB EX0
SETB EX1
SETB EA
RET
;外部中斷0服務程序--漸變開
interrupt_Ex1:
CLR EA
SETB TR1 ;開定時器
SETB TR0
SETB ET1
SETB ET0
SETB EA
RETI
;外部中斷1服務程序--調節漸變速度
interrupt_Ex2:
PUSH ACC ;保護現場
PUSH PSW
CLR EA
MOV A,#0x0A
ADD A,0x0B
MOV 0x0B,A
;if(Speed2>100)
SETB C
SUBB A,#0x64
JC ENDIF2
MOV 0x0B,#00H
ENDIF2:
SETB EA
POP PSW
POP ACC
RETI
;定時器0中斷服務程序--產生PWM,并控制燈的閃爍頻率
interrupt_T0:
PUSH ACC
PUSH PSW
CLR EA
CLR TR0
;if(++CountT==Speed2){ //改變此計數值可以改變漸變速度
INC 0x08 ;CountT
MOV A,0x08
CJNE A,0x0B,XXX1 ;Speed2(0x0B)
MOV 0x08,#0x00
MOV 0x09,#0x00
; if(++Speed>75)
INC 0x0A
MOV A,0x0A
SETB C
SUBB A,4BH
JC XXX1
MOV 0x0A,#0x00
XXX1:
MOV TH0,#0xFC
MOV TL0,#0x67
SETB TR0
SETB EA
POP PSW
POP ACC
RETI
;定時器1中斷服務程序--控制燈的漸變順序
interrupt_T1:
PUSH ACC
PUSH PSW
MOV PSW,#0x00
PUSH 0x07
CLR EA
CLR TR1
INC 0x09 ;Count
; if(Speed<=25){ // 紅降綠升
MOV A,0x0A ;Speed
SETB C
SUBB A,#19H
JNC ELSE1
;if(Count<=(25-Speed)){
CLR C
MOV A,#0x19
SUBB A,0x0A
MOV R7,A
MOV A,0x09
SETB C
SUBB A,R7
JNC Count25
CLR 0x90.7
SETB 0x90.6
SJMP ELSEEND
;else if(Count>(25-Speed)){
Count25:
MOV A,0x09
SETB C
SUBB A,R7
JC ELSEEND
SETB 0x90.7
CLR 0x90.6
;if(Count==26)
MOV A,0x09
XRL A,#0x1A
JNZ ELSEEND
;Count=0;
MOV 0x09,A
SJMP ELSEEND
;else if(Speed<=50){ // 綠降藍升
ELSE1:
MOV A,0x0A
SETB C
SUBB A,#0x32
JNC ELSE2
;if(Count<=(50-Speed)){
CLR C
MOV A,#0x32
SUBB A,0x0A
MOV R7,A
MOV A,0x09
SETB C
SUBB A,R7
JNC ELSE3
CLR 0x90.6
SETB 0x90.5
SJMP ELSEEND
;else if(Count>(50-Speed)){
ELSE3:
MOV A,0x09
SETB C
SUBB A,R7
JC ELSEEND
SETB 0x90.6
CLR 0x90.5
;if(Count==26)
MOV A,0x09
XRL A,#0x1A
JNZ ELSEEND
MOV 0x09,A
SJMP ELSEEND
;else if(Speed<=75){ // 紅升藍降
ELSE2:
MOV A,0x0A
SETB C
SUBB A,#0x4B
JNC ELSEEND
;if(Count<=(75-Speed)){
CLR C
MOV A,#0x4B
SUBB A,0x0A
MOV R7,A
MOV A,0x09
SETB C
SUBB A,R7
JNC ELSE4
CLR 0x90.5
SETB 0x90.7
SJMP ELSEEND
;else if(Count>(75-Speed)){
ELSE4:
MOV A,0x09
SETB C
SUBB A,R7
JC ELSEEND
SETB 0x90.5
CLR 0x90.7
; if(Count==26)
MOV A,0x09
CJNE A,#0x1A,ELSEEND
MOV 0x09,#0x00
ELSEEND:
MOV TH1,#0xFF
MOV TL1,#0xA4
SETB TR1
SETB EA
POP 0x07
POP PSW
POP ACC
RETI
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -