- ;/*******************************************************************************
- ;* 標題: LED臺燈程序*
- ;* 文件: LED臺燈PWM控制.asm *
- ;* 日期: 2009-11-28 *
- ;* 版本: 1.0*
- ;* 作者: 部分程序參考網上修改而成,本人最終改編測試,特別對原作致敬!*
- ;* 郵箱: wqhanxing@163.com *
- ;********************************************************************************
- ; 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
復制代碼
|