
此電路軟/硬件的功能是51單片機輸出PWM信號驅(qū)動三源色LED的,用紅外遙控或
或按鍵(電路圖按鍵未畫出)控制三源色LED的運行狀態(tài).但此電路在按遙控單片機解碼時LED有輕微閃爍,特別是在LED漸滅時,請各位針對此現(xiàn)象給予改良或講改軟件的思路!!!!多謝了!!!
;紅外接P1.3(INT1)/P1.4(T0); P1.5(T1)接按鍵
;P1.7(綠);P1.6(紅);P1.5(藍) P1.4/P1.3/P1.2接LED
RRR BIT P1.5;藍
BBB BIT P1.6;紅
GGG BIT P1.7;綠
;計數(shù)器
COUNTER EQU 23H
COUNTER1 EQU 24H
LDBS EQU 27H;亮燈標志寄存器
T28 EQU 28H
ORG 0000H
AJMP START
ORG 0BH
AJMP TOO
RETI
ORG 013H
AJMP INT0123
RETI
NOP
NOP
AJMP START
;初始化
CUSU:MOV P1,#00
MOV P3,#0FFH
MOV TMOD,#10B
MOV TH0,#20;236
SETB PT0
SETB EA
SETB EX1
SETB IT1
SETB ET0;調(diào)用初始化
MOV 38H,#1;37H與38H是設(shè)置輸出PWM可變周期及比例.
MOV 39H,#250
MOV 40H,#250;39H給最大時返回值.
RET
;主程序開始++++++++++++++++++++++++++++++++
START:ACALL CUSU
ACALL BBBH; 調(diào)用紅漸亮
SETB BBB ; 紅亮
ACALL DELAY2
ACALL GGGH ; 調(diào)用綠漸亮
SETB BBB; 紅亮
SETB GGG; 綠亮
ACALL DELAY2
START1:ACALL RRRHBBBGGGL; 調(diào)用藍漸亮/紅綠漸滅
SETB RRR; 藍亮
CLR BBB; 紅滅
CLR GGG; 綠滅
ACALL DELAY2
ACALL BBBGGGH; 調(diào)用紅綠漸亮
SETB BBB; 紅亮
SETB GGG; 綠亮
ACALL DELAY2
ACALL BBBRRRL; 調(diào)用紅藍漸滅
CLR BBB; 紅滅
CLR RRR; 藍滅
ACALL DELAY2
ACALL BBBHGGGL; 調(diào)用紅漸亮/綠漸滅 55555
SETB BBB; 紅亮
CLR GGG; 綠滅
ACALL DELAY2
ACALL GGGH; 調(diào)用綠漸亮
SETB GGG; 綠亮
ACALL DELAY2
ACALL RRRHBBBGGGL; 調(diào)用藍漸亮/紅綠漸滅
SETB RRR; 藍亮
CLR BBB; 紅滅
CLR GGG; 綠滅
ACALL DELAY2
ACALL BBBGGGH; 調(diào)用紅綠漸亮
SETB BBB; 紅亮
SETB GGG; 綠亮
ACALL DELAY2
ACALL BBBRRRL; 調(diào)用紅藍漸滅
CLR BBB; 紅滅
CLR RRR; 藍滅
ACALL DELAY2
ACALL BBBHGGGL; 調(diào)用紅漸亮/綠漸滅*
SETB BBB; 紅亮
CLR GGG; 綠滅
ACALL DELAY2
ACALL GGGH; 調(diào)用綠漸亮
SETB GGG; 綠亮
ACALL DELAY2
AJMP START1;轉(zhuǎn)移循環(huán)
;主程序到此結(jié)束+++++++++++++++++++++++++++++++++++++++
;以下被調(diào)用程序++++++++++++++++++++++++++++++++++++
; 紅漸亮
BBBH: MOV LDBS,#0;作標志,為了在按鍵或中斷解碼時繼續(xù)調(diào)用順序運行程序
MOV COUNTER,38H
MOV COUNTER1,39H
BBBH1: mov 10h,#1
j1: MOV 26H,#40
BBBH2:ACALL BBBH4
ACALL INTI;調(diào)用掃描按鍵*****************
JB 01H,BBBH2;查標志01h為0順序進行,為1則不變循環(huán)
DJNZ 26H,BBBH2
djnz 10h,j1
INC COUNTER
DEC COUNTER1
MOV A,COUNTER
CJNE A,40H,BBBH3
BBBH3:JC BBBH1
MOV LDBS,#7
RET
;綠漸亮
GGGH: MOV LDBS,#1;作標志,為了在按鍵或中斷解碼時繼續(xù)調(diào)用順序運行程序
MOV COUNTER,38H
MOV COUNTER1,39H
GGGH1:mov 10h,#1
j2: MOV 26H,#40
GGGH2:ACALL GGGH4
ACALL INTI;*****************
JB 01H,GGGH2
DJNZ 26H,GGGH2
djnz 10h,j2
INC COUNTER
DEC COUNTER1
MOV A,COUNTER
CJNE A,40H,GGGH3
GGGH3:JC GGGH1
MOV LDBS,#7
RET
; 藍漸亮/紅綠漸滅
RRRHBBBGGGL: MOV LDBS,#2;作標志,為了在按鍵或中斷解碼時繼續(xù)調(diào)用順序運行程序
MOV COUNTER,38H
MOV COUNTER1,39H
RRRHBBBGGGL1:mov 10h,#1
j3: MOV 26H,#40
RRRHBBBGGGL2: ACALL RRRHBBBGGGL4
ACALL INTI;*****************
JB 01H,RRRHBBBGGGL2
DJNZ 26H,RRRHBBBGGGL2
djnz 10h,j3
INC COUNTER
DEC COUNTER1
MOV A,COUNTER
CJNE A,40H,RRRHBBBGGGL3
RRRHBBBGGGL3:JC RRRHBBBGGGL1
MOV LDBS,#7
RET
;紅綠漸亮
BBBGGGH: MOV LDBS,#3;作標志,為了在按鍵或中斷解碼時繼續(xù)調(diào)用順序運行程序
MOV COUNTER,38H
MOV COUNTER1,39H
BBBGGGH1:mov 10h,#1
j4: MOV 26H,#40
BBBGGGH2: ACALL BBBGGGH4
ACALL INTI;*****************
JB 01H,BBBGGGH2
DJNZ 26H,BBBGGGH2
djnz 10h,j4
INC COUNTER
DEC COUNTER1
MOV A,COUNTER
CJNE A,40H,BBBGGGH3
BBBGGGH3: JC BBBGGGH1
MOV LDBS,#7
RET
; 紅藍漸滅
BBBRRRL: MOV LDBS,#4;作標志,為了在按鍵或中斷解碼時繼續(xù)調(diào)用順序運行程序
MOV COUNTER,38H
MOV COUNTER1,39H
BBBRRRL1:mov 10h,#1
j5: MOV 26H,#40
BBBRRRL2: ACALL BBBRRRL4
ACALL INTI;*****************
JB 01H,BBBRRRL2
DJNZ 26H,BBBRRRL2
djnz 10h,j5
INC COUNTER
DEC COUNTER1
MOV A,COUNTER
CJNE A,40H,BBBRRRL3
BBBRRRL3: JC BBBRRRL1
MOV LDBS,#7
RET
; 紅漸亮/藍漸滅
BBBHRRRL: MOV LDBS,#5;作標志,為了在按鍵或中斷解碼時繼續(xù)調(diào)用順序運行程序
MOV COUNTER,38H
MOV COUNTER1,39H
BBBHRRRL1:mov 10h,#1
j6: MOV 26H,#40
BBBHRRRL2: ACALL BBBHRRRL4
ACALL INTI;*****************
JB 01H,BBBRRRL2
DJNZ 26H,BBBHRRRL2
djnz 10h,j6
INC COUNTER
DEC COUNTER1
MOV A,COUNTER
CJNE A,40H,BBBHGGGL3
BBBHRRRL3: JC BBBHRRRL1
MOV LDBS,#7
RET
; 紅漸亮/綠漸滅
BBBHGGGL: MOV LDBS,#6;作標志,為了在按鍵或中斷解碼時繼續(xù)調(diào)用順序運行程序
MOV COUNTER,38H
MOV COUNTER1,39H
BBBHGGGL1: mov 10h,#1
j7: MOV 26H,#40
BBBHGGGL2: ACALL BBBHGGGL4
JB 01H,BBBHGGGL2
DJNZ 26H,BBBHGGGL2
djnz 10h,j7
INC COUNTER
DEC COUNTER1
MOV A,COUNTER
CJNE A,40H,BBBHGGGL3
BBBHGGGL3: JC BBBHGGGL1
MOV LDBS,#7
RET
;***************************************************************
BBBHGGGL4: SETB BBB ;紅漸亮/綠漸滅
CLR GGG
ACALL DELAY
CLR BBB
SETB GGG
ACALL DELAY1
RET
BBBHRRRL4:SETB BBB ;紅漸亮/藍漸滅
CLR RRR
ACALL DELAY
CLR BBB
SETB RRR
ACALL DELAY1
RET
BBBRRRL4:CLR BBB ;紅藍漸滅
CLR RRR
ACALL DELAY
SETB BBB
SETB RRR
ACALL DELAY1
RET
BBBGGGH4:SETB BBB ;紅綠漸亮
SETB GGG
ACALL DELAY
CLR BBB
CLR GGG
ACALL DELAY1
RET
RRRHBBBGGGL4: SETB RRR ;藍漸亮/紅綠漸滅
CLR BBB
CLR GGG
ACALL DELAY
CLR RRR
SETB BBB
SETB GGG
ACALL DELAY1
RET
GGGH4:SETB GGG ; 綠漸亮
ACALL DELAY
CLR GGG
ACALL DELAY1
RET
BBBH4:SETB BBB ; 紅漸亮
ACALL DELAY
CLR BBB
ACALL DELAY1
RET
;可動態(tài)延時
DELAY:MOV 25H,COUNTER
DJNZ 25H,$
RET
DELAY1:MOV 25H,COUNTER1
DJNZ 25H,$
RET
;LED切換變化時的延時++++++++++++++++++++++++++++++++++++++++++
DELAY2:MOV LDBS,#7;作標志,為了在按鍵或中斷解碼時繼續(xù)調(diào)用順序運行程序
MOV 36H,#10
DDD1: MOV R5,#255
DDD: ACALL DELAY3
DELAY5: ACALL INTI;調(diào)用按鍵檢測處理程序
JB 01H,DELAY5 ;01H為標志位,為1則暫停/0順序運行,
;此行是在暫停時不停檢測按鍵.
DJNZ R5,DDD
DJNZ 36H,DDD1
RET
DELAY3:NOP
NOP
NOP
ACALL DELAY
NOP
NOP
NOP
ACALL DELAY1
RET
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;被調(diào)用按鍵檢測處理程序++++++++++++++++++++++++++++++++++++++++++++++
INTI:JNB P3.5,INTII
KLL: RET
INTII:MOV 37H,P1;為了進入關(guān)閉后退出恢復(fù)原先狀態(tài).
ACALL DY
JB P3.5,KLL
MOV 35H,#255
INTIII: ACALL DY
ACALL DY
ACALL DY
DJNZ 35H,INTIII
JB P3.5,PPP
MOV P1,#00
INTIP:;長按按鍵關(guān)閉輸出++++
SETB P1.3
ACALL DELAY3
JNB P3.5,INTIP
ACALL DELAY3
JNB P3.5,INTIP
INTIP1:ACALL DELAY3
JB P3.5,INTIP1
ACALL DELAY3
JB P3.5,INTIP1
INTIP2:ACALL DELAY3
JNB P3.5,INTIP2
ACALL DELAY3
JNB P3.5,INTIP2
INTIP3:CLR P1.3
MOV P1,37H
RET
;+++++++++++++++++++++++++
PPP:CPL 01H
JNB 01H,JHJ
SETB P1.4
RET
JHJ:CLR P1.4
RET
;按鍵處理程序至此結(jié)束+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;為了讓PWM信號持續(xù)輸出保持LED同樣的亮度(不閃爍)給調(diào)用之用
DY: MOV A,LDBS;13us+524us=537us
RL A
MOV DPTR,#KEYFUNTB
JMP @A+DPTR
KEYFUNTB: AJMP ABBBH
AJMP AGGGH
AJMP ARRRHBBBGGGL
AJMP ABBBGGGH
AJMP ABBBRRRL
AJMP ABBBHRRRL
AJMP ABBBHGGGL
AJMP ADELAY3
ABBBH: ACALL BBBH4;每節(jié)524us
NOP
NOP
RET;++++++++++++++++++
AGGGH: ACALL GGGH4
NOP
NOP
RET
ARRRHBBBGGGL:ACALL RRRHBBBGGGL4
RET
ABBBGGGH: ACALL BBBGGGH4
NOP
RET
ABBBRRRL: ACALL BBBRRRL4
NOP
RET
ABBBHRRRL: ACALL BBBHRRRL4
NOP
RET
ABBBHGGGL: ACALL BBBHGGGL4
NOP
RET
ADELAY3: ACALL DELAY3
RET
;++++++++++++++++++++++++++++++++++++++++++++++++++++
;以下是中斷解碼程序
INT0123:PUSH ACC
CLR EX1
MOV T28,#16
INT0124:JB P3.3,INTRET
ACALL DY;調(diào)用LED請燈持續(xù)點亮總時間約525us
DJNZ T28,INT0124
JNB P3.3,$
;9ms判斷結(jié)束-------------------------------
MOV T28,#9
INT01235: ACALL DY
DJNZ T28,INT01235
MOV R1,#41H
MOV R2,#4
INT01238: MOV R3,#8
INT01236:
KL: JNB P3.3,$ ;4.5ms判斷結(jié)束-------------------------------
ACALL DY
ACALL DY
MOV C,P3.3
JNC INT01237
ACALL DY
JB P3.3,$
INT01237:MOV A,@R1
RRC A
MOV @R1,A
DJNZ R3,INT01236
INC R1
DJNZ R2,INT01238
;讀碼裝入41H/42H(用戶碼)43H/44H(數(shù)據(jù)識別碼)完成.+++++++++++++++++++
MOV A,41H;比較高8位地址碼
XRL A,#2H ;判斷1AH的值是否等于00000000,相等的話A為0
JNZ INTRET;如果不相等說明解碼失敗退出解碼程序
MOV A,42H;比較低8位地址
XRL A,#0BDH ;再判斷高8位地址是否正確
JNZ INTRET;如果不相等說明解碼失敗退出解碼程序
MOV A,43H;比較數(shù)據(jù)碼和數(shù)據(jù)反碼是否正確?
CPL A
XRL A,44H ;將1CH的值取反后和1DH比較 不同則無效丟棄,核對數(shù)據(jù)是否準確
JNZ INTRET;如果不相等說明解碼失敗退出解碼程序
;判讀入碼是否成功----------完成---------------------------------------
MOV A,44H;按鍵數(shù)值判斷執(zhí)行
CJNE A,#0E7H,INTRET
CPL P1.4;解碼成功發(fā)光二極管點亮指示!
CPL 01H
INTRET:MOV T28,#120
INTRET1:ACALL DY
CPL P1.2
JNB P3.3,INTRET
DJNZ T28,INTRET1
SETB EX1
POP ACC
CLR P1.2
RETI
TOO: INC 28H
RETI
END 1139201115.asm