;/*******************************************************************************
;* 標題: LED臺燈程序*
;* 文件: LED臺燈PWM控制帶紅外遙控.asm *
;* 日期: 2008-12-18 *
;* 版本: 1.0*
;* 作者: *
;********************************************************************************
; LED臺燈程序帶有紅外遙控功能*
; 利用定時器控制產生占空比可變的PWM 波*
; 按K1,PWM 值增加,則占空比減小,LED 燈漸暗。*
; 按K2,PWM 值減小,則占空比增加,LED 燈漸亮。*
; 我的5644遙控器上的0~9數字鍵對應10個亮度等級。*
; 當PWM 值增加到最大值或減小到最小值時,蜂鳴器將報警*
; 資源:p1 口,數碼管。p3.4,p3.5 亮度控制按鍵P3.0 PWM端口,p3.1 蜂鳴器報警*
;********************************************************************************
LEVEL0 EQU 2FH; 亮度等級9
LEVEL1 EQU 4FH; 亮度等級8
LEVEL2 EQU 6FH; 亮度等級7
LEVEL3 EQU 8FH; 亮度等級6
LEVEL4 EQU 0AFH; 亮度等級5
LEVEL5 EQU 0BFH; 亮度等級4
LEVEL6 EQU 0CFH; 亮度等級3
LEVEL7 EQU 0DFH; 亮度等級2
LEVEL8 EQU 0EFH; 亮度等級1
LEVEL9 EQU 0FFH; 亮度等級0
PWM EQU 7FH ;PWM 賦初始值
LED_RAM EQU 30H
IRCOM EQU 50H ;50H-53H IR 使用
IR_NEW EQU 60H ;新的遙控代碼值用
LED_PORT EQU P1 ;數碼管接口,共陰極
PWM_OUT EQU P3.0 ;PWM控制輸出接口
INCKEY EQU P3.5 ;K1,PWM 值增加鍵。
DECKEY EQU P3.4 ;K2,PWM 值減小鍵。
BEEP EQU P3.1 ;蜂鳴器
IRIN EQU P3.2
;---------------------------
ORG 0000H
SJMP START
ORG 0003H
LJMP REMOT ;IRF
ORG 000BH
SJMP INTT0
ORG 001BH
SJMP INTT1
ORG 0030H
;---------------------------
;主程序
;定時器0 工作在模式1,定時器1 工作在模式2。
;---------------------------
START:
MOV SP,#30H
MOV TMOD,#21H
MOV IP,#00001010B
MOV TH1,PWM ;脈寬調節
MOV TL1,#00H
MOV TH0,#0FEH ;1ms 延時常數0FC
MOV TL0,#0CH ;頻率調節066
SETB EA ;開總中斷
SETB ET0 ;定時器0允許
SETB ET1 ;定時器1允許
SETB TR0 ;定時器0啟動
SETB EX0 ;外中斷0打開
SETB IT0 ;外中斷0采用脈沖方式 ;
LOOP:
LCALL DISPLAY
MOV A,PWM ;
JB INCKEY,LOOP1 ;增加鍵是否按下?
CALL DELAY ;延時去抖動
JB INCKEY,LOOP1
CJNE A,#0FFH,PWMINC ;是否到最大值?
CALL BEEP_BL ;是,蜂鳴器報警。
SJMP LOOP
PWMINC: INC PWM ;調節脈寬(脈寬減小)
SJMP LOOP
LOOP1: JB DECKEY,LOOP2 ;減小鍵是否按下?
CALL DELAY ;延時去抖動
JB DECKEY,LOOP2
CJNE A,#01H,PWMDEC ;是否到最小值?
CALL BEEP_BL ;是,蜂鳴器報警。
SJMP LOOP
PWMDEC: DEC PWM ;調節脈寬(脈寬增加)
LOOP2: SJMP LOOP
;-----------------------------
;T0 中斷服務子程序(頻率)
;控制定時器1 中斷
;-----------------------------
INTT0:
CLR TR1
MOV TH0,#0FEH ;1ms 延時常數
MOV TL0,#0CH ;頻率調節
MOV TH1,PWM
SETB TR1
CLR PWM_OUT ;啟動輸出
RETI
;-----------------------------
;T1 中斷服務子程序(脈寬)
;控制PWM 脈沖寬度
;-----------------------------
INTT1:
CLR TR1 ;脈寬調節結束
SETB PWM_OUT ;結束輸出
RETI
;-----------------------------
;************************有接收到遙控器信號*******
REMOT:
CLR EA
PUSH ACC
PUSH PSW
SETB PSW.3 ;選擇工作寄存器組1(SETB PSW.3)
CLR PSW.4 ; (CLR PSW.4)
MOV R0,#IRCOM
I1: JNB IRIN,I2 ;等待IR 信號出現
JMP IR_SHOW1;I1;原值I1
I2: MOV R4,#20
I20: CALL DEL
DJNZ R4,I20
JB IRIN,IR_SHOW1;I1 ;確認IR 信號出現
I21: JB IRIN,I3 ;等IR 變為高電平
CALL DEL
JMP I21
I3: MOV R3,#0 ;8 位數清為0
LL: JNB IRIN,I4 ;等IR 變為低電平
CALL DEL
JMP LL
I4: JB IRIN,I5 ;等IR 變為高電平
CALL DEL
JMP I4
I5: MOV R2,#0 ;0.14ms 計數
L1: CALL DEL
JB IRIN, N1 ;等IR 變為高電平;IR=0,檢查R2 中的計數值
MOV A,#8
CLR C
SUBB A,R2 ;判斷高低位;IF C=0 BIT=0
MOV A,@R0
RRC A
MOV @R0,A ;處理完一位
INC R3
CJNE R3,#8,LL ;需處理完8 位
MOV R3,#0
INC R0
CJNE R0,#54H,LL ;收集到4 字節了
JMP IR_SHOW
N1: INC R2
CJNE R2,#30,L1 ;30--0.14ms 計數過長則時間到自動離開
JMP IR_SHOW1
;------------------------------------------------
IR_SHOW: ;使用我的5644遙控器。
MOV A,50H ;
XRL A,#40H ;判斷遙控器低8位地址是否正確(40H)
JNZ IR_SHOW1 ;
MOV A,51H
XRL A,#3FH ;再判斷遙控器高8位地址是否正確(3FH)
JNZ IR_SHOW1
MOV A,52H
CPL A ; 將52H 取反后和53H 比較
CJNE A,53H,IR_SHOW1 ;如果不等表示接收數據發生錯誤,放棄。
CALL D1; 解碼成功則調用相應按鍵的處理程序+++++++++++++++++++++++++
; MOV A,IR_NEW
; CJNE A,#0FFH,IR_PWM;不是數字鍵則退出
; JMP IR_SHOW1
IR_PWM:
MOV DPTR,#IR_ASC
MOV A,IR_NEW
MOVC A,@A+DPTR
MOV PWM,A
IR_SHOW1:
POP PSW
POP ACC
SETB IRIN
SETB EA
RETI
D1: MOV A,52H
CJNE A,#01H,D2 ;是數字鍵1嗎?
MOV IR_NEW,#01H ;是則送數據01H
CALL BEEP_BL ;蜂鳴器報警。
RET
D2: CJNE A,#02H,D3 ;是數字鍵2嗎?
MOV IR_NEW,#02H ;是則送數據02H
CALL BEEP_BL ;蜂鳴器報警。
RET
D3: CJNE A,#03H,D4 ;是數字鍵3嗎?
MOV IR_NEW,#03H ;是則送數據03H
CALL BEEP_BL ;蜂鳴器報警。
RET
D4: CJNE A,#04H,D5 ;是數字鍵4嗎?
MOV IR_NEW,#04H ;是則送數據04H
CALL BEEP_BL ;蜂鳴器報警。
RET
D5: CJNE A,#05H,D6 ;是數字鍵5嗎?
MOV IR_NEW,#05H ;是則送數據05H
CALL BEEP_BL ;蜂鳴器報警。
RET
D6: CJNE A,#06H,D7 ;是數字鍵6嗎?
MOV IR_NEW,#06H ;是則送數據06H
CALL BEEP_BL ;蜂鳴器報警。
RET
D7: CJNE A,#07H,D8 ;是數字鍵7嗎?
MOV IR_NEW,#07H ;是則送數據07H
CALL BEEP_BL ;蜂鳴器報警。
RET
D8: CJNE A,#08H,D9 ;是數字鍵8嗎?
MOV IR_NEW,#08H ;是則送數據08H
CALL BEEP_BL ;蜂鳴器報警。
RET
D9: CJNE A,#09H,D0 ;是數字鍵9嗎?
MOV IR_NEW,#09H ;是則送數據09H
CALL BEEP_BL ;蜂鳴器報警。
RET
D0: CJNE A,#00H,D15 ;是數字鍵0嗎?
MOV IR_NEW,#00H ;是則送數據00H
CALL BEEP_BL ;蜂鳴器報警。
RET
D13:CJNE A,#11H,D14 ;是音量加鍵嗎?實現速度加
MOV IR_NEW,#0FFH;非數字鍵標示為0FFH
INC PWM
MOV A,PWM
CJNE A,#00H,D13_OUT
CALL BEEP_BL ;蜂鳴器報警。
MOV PWM,#0FFH
D13_OUT:
RET
D14:CJNE A,#10H,D15 ;是音量減鍵嗎?實現速度減
MOV IR_NEW,#0FFH;非數字鍵標示為0FFH
DEC PWM
MOV A,PWM
CJNE A,#0FFH,D14_OUT ;9
CALL BEEP_BL ;蜂鳴器報警。
MOV PWM,#01H
D14_OUT:
RET
D15:
; MOV IR_NEW,#0FFH;非數字鍵標示為0FFH
RET
;**********************************************
;判斷顯示程序
;-------------
DISPLAY:
DIS0:
MOV A,PWM
SUBB A,#LEVEL0
JNC DIS1
MOV LED_RAM,#9
JMP LED_DISP
DIS1:
MOV A,PWM
SUBB A,#LEVEL1
JNC DIS2
MOV LED_RAM,#8
JMP LED_DISP
DIS2:
MOV A,PWM
SUBB A,#LEVEL2
JNC DIS3
MOV LED_RAM,#7
JMP LED_DISP
DIS3:
MOV A,PWM
SUBB A,#LEVEL3
JNC DIS4
MOV LED_RAM,#6
JMP LED_DISP
DIS4:
MOV A,PWM
SUBB A,#LEVEL4
JNC DIS5
MOV LED_RAM,#5
JMP LED_DISP
DIS5:
MOV A,PWM
SUBB A,#LEVEL5
JNC DIS6
MOV LED_RAM,#4
JMP LED_DISP
DIS6:
MOV A,PWM
SUBB A,#LEVEL6
JNC DIS7
MOV LED_RAM,#3
JMP LED_DISP
DIS7:
MOV A,PWM
SUBB A,#LEVEL7
JNC DIS8
MOV LED_RAM,#2
JMP LED_DISP
DIS8:
MOV A,PWM
SUBB A,#LEVEL8
JNC DIS9
MOV LED_RAM,#1
JMP LED_DISP
DIS9:
MOV A,PWM
SUBB A,#LEVEL9
JNC LED_DISP
MOV LED_RAM,#0
LED_DISP:
MOV DPTR,#LED_ASC
MOV A,LED_RAM
MOVC A,@A+DPTR
MOV LED_PORT,A
RET
LED_ASC:;共陰極LED代碼
DB 3FH,06H,5BH,4FH,66H;0~F代碼
DB 6DH,7DH,07H,7FH,6FH
DB 77H,7CH,39H,5EH,79H
DB 71H
DB 0BFH,086H,0DBH,0CFH,0E6H;0.~9.(帶小數點)代碼
DB 0EDH,0FDH,087H,0FFH,0EFH
DB 039H;字符“C”
;****************************************************
IR_ASC:
DB 0FAH,0EAH,0DAH,0CAH,0BAH
DB 0A0H, 80H, 60H, 40H, 02H
;------------------------------------------------
; DELAY R5*0.14MS
DEL: MOV R5,#1 ;IR 解碼使用
DEL0: MOV R6,#2
DEL1: MOV R7,#32
DEL2: DJNZ R7,DEL2
DJNZ R6,DEL1
DJNZ R5,DEL0
RET
;------------------------
;10ms 延時子程序,按鍵去抖動用
DELAY:
MOV R5,#50
DELAY1:
MOV R6,#100
DJNZ R6,$
DJNZ R5,DELAY1
RET
;-----------------------------------------------
;蜂鳴器響一聲子程序
BEEP_BL:MOV R6,#100
BL1:CALL BL2
CPL BEEP
DJNZ R6,BL1
MOV R5,#25
CALL DELAY2
RET
BL2:MOV R7,#180
BL3:NOP
DJNZ R7,BL3
RET
DELAY2: MOV R6,#50 ;延時R5×10MS
BL4: MOV R7,#100
BL5: DJNZ R7,BL5
DJNZ R6,BL4
DJNZ R5,DELAY2
RET
;---------------------------------------------------
END