专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

PWM控制LED台灯程序带红外遥控

作者:佚名   来源:本站原创   点击数:  更新时间:2010年01月07日   【字体:

;/*******************************************************************************
;* 标题: 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

关闭窗口

相关文章