PWM控制LED台灯程序带红外遥控.docx
《PWM控制LED台灯程序带红外遥控.docx》由会员分享,可在线阅读,更多相关《PWM控制LED台灯程序带红外遥控.docx(11页珍藏版)》请在冰豆网上搜索。
PWM控制LED台灯程序带红外遥控
PWM控制LED台灯程序带红外遥控
;/*******************************************************************************
;*标题:
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.0PWM端口,p3.1蜂鸣器报警*
;********************************************************************************
LEVEL0EQU2FH;亮度等级9
LEVEL1EQU4FH;亮度等级8
LEVEL2EQU6FH;亮度等级7
LEVEL3EQU8FH;亮度等级6
LEVEL4EQU0AFH;亮度等级5
LEVEL5EQU0BFH;亮度等级4
LEVEL6EQU0CFH;亮度等级3
LEVEL7EQU0DFH;亮度等级2
LEVEL8EQU0EFH;亮度等级1
LEVEL9EQU0FFH;亮度等级0
PWMEQU7FH;PWM赋初始值
LED_RAMEQU30H
IRCOMEQU50H;50H-53HIR使用
IR_NEWEQU60H;新的遥控代码值用
LED_PORTEQUP1;数码管接口,共阴极
PWM_OUTEQUP3.0;PWM控制输出接口
INCKEY
EQUP3.5;K1,PWM值增加键。
DECKEY
EQUP3.4;K2,PWM值减小键。
BEEP
EQUP3.1;蜂鸣器
IRIN
EQUP3.2
;---------------------------
ORG0000H
SJMPSTART
ORG0003H
LJMPREMOT;IRF
ORG000BH
SJMPINTT0
ORG001BH
SJMPINTT1
ORG0030H
;---------------------------
;主程序
;定时器0工作在模式1,定时器1工作在模式2。
;---------------------------
START:
MOVSP,#30H
MOVTMOD,#21H
MOVIP,#00001010B
MOVTH1,PWM;脉宽调节
MOVTL1,#00H
MOVTH0,#0FEH;1ms延时常数0FC
MOVTL0,#0CH;频率调节066
SETBEA
;开总中断
SETBET0;定时器0允许
SETBET1;定时器1允许
SETBTR0;定时器0启动
SETBEX0;外中断0打开
SETBIT0
;外中断0采用脉冲方式
;
LOOP:
LCALLDISPLAY
MOVA,PWM;
JBINCKEY,LOOP1;增加键是否按下?
CALLDELAY;延时去抖动
JBINCKEY,LOOP1
CJNEA,#0FFH,PWMINC;是否到最大值?
CALLBEEP_BL;是,蜂鸣器报警。
SJMPLOOP
PWMINC:
INCPWM;调节脉宽(脉宽减小)
SJMPLOOP
LOOP1:
JBDECKEY,LOOP2;减小键是否按下?
CALLDELAY;延时去抖动
JBDECKEY,LOOP2
CJNEA,#01H,PWMDEC;是否到最小值?
CALLBEEP_BL;是,蜂鸣器报警。
SJMPLOOP
PWMDEC:
DECPWM;调节脉宽(脉宽增加)
LOOP2:
SJMPLOOP
;-----------------------------
;T0中断服务子程序(频率)
;控制定时器1中断
;-----------------------------
INTT0:
CLRTR1
MOVTH0,#0FEH;1ms延时常数
MOVTL0,#0CH;频率调节
MOVTH1,PWM
SETBTR1
CLRPWM_OUT;启动输出
RETI
;-----------------------------
;T1中断服务子程序(脉宽)
;控制PWM脉冲宽度
;-----------------------------
INTT1:
CLRTR1;脉宽调节结束
SETBPWM_OUT;结束输出
RETI
;-----------------------------
;************************有接收到遥控器信号*******
REMOT:
CLREA
PUSHACC
PUSHPSW
SETBPSW.3;选择工作寄存器组1(SETBPSW.3)
CLRPSW.4;
(CLRPSW.4)
MOVR0,#IRCOM
I1:
JNBIRIN,I2;等待IR信号出现
JMPIR_SHOW1;I1;原值I1
I2:
MOVR4,#20
I20:
CALLDEL
DJNZR4,I20
JBIRIN,IR_SHOW1;I1;确认IR信号出现
I21:
JBIRIN,I3;等IR变为高电平
CALLDEL
JMPI21
I3:
MOVR3,#0;8位数清为0
LL:
JNBIRIN,I4;等IR变为低电平
CALLDEL
JMPLL
I4:
JBIRIN,I5;等IR变为高电平
CALLDEL
JMPI4
I5:
MOVR2,#0;0.14ms计数
L1:
CALLDEL
JBIRIN,N1;等IR变为高电平;IR=0,检查R2中的计数值
MOVA,#8
CLRC
SUBBA,R2;判断高低位;IFC=0BIT=0
MOVA,@R0
RRCA
MOV@R0,A;处理完一位
INCR3
CJNER3,#8,LL;需处理完8位
MOVR3,#0
INCR0
CJNER0,#54H,LL;收集到4字节了
JMPIR_SHOW
N1:
INCR2
CJNER2,#30,L1;30--0.14ms计数过长则时间到自动离开
JMPIR_SHOW1
;------------------------------------------------
IR_SHOW:
;使用我的5644遥控器。
MOVA,50H
;
XRLA,#40H
;判断遥控器低8位地址是否正确(40H)
JNZIR_SHOW1
;
MOVA,51H
XRLA,#3FH
;再判断遥控器高8位地址是否正确(3FH)
JNZIR_SHOW1
MOVA,52H
CPLA;
将52H取反后和53H比较
CJNEA,53H,IR_SHOW1;如果不等表示接收数据发生错误,放弃。
CALLD1;解码成功则调用相应按键的处理程序+++++++++++++++++++++++++
;MOVA,IR_NEW
;CJNEA,#0FFH,IR_PWM;不是数字键则退出
;JMPIR_SHOW1
IR_PWM:
MOVDPTR,#IR_ASC
MOVA,IR_NEW
MOVCA,@A+DPTR
MOVPWM,A
IR_SHOW1:
POPPSW
POPACC
SETBIRIN
SETBEA
RETI
D1:
MOVA,52H
CJNEA,#01H,D2;是数字键1吗?
MOVIR_NEW,#01H;是则送数据01H
CALLBEEP_BL;蜂鸣器报警。
RET
D2:
CJNEA,#02H,D3;是数字键2吗?
MOVIR_NEW,#02H;是则送数据02H
CALLBEEP_BL;蜂鸣器报警。
RET
D3:
CJNEA,#03H,D4;是数字键3吗?
MOVIR_NEW,#03H;是则送数据03H
CALLBEEP_BL;蜂鸣器报警。
RET
D4:
CJNEA,#04H,D5;是数字键4吗?
MOVIR_NEW,#04H;是则送数据04H
CALLBEEP_BL;蜂鸣器报警。
RET
D5:
CJNEA,#05H,D6;是数字键5吗?
MOVIR_NEW,#05H;是则送数据05H
CALLBEEP_BL;蜂鸣器报警。
RET
D6:
CJNEA,#06H,D7;是数字键6吗?
MOVIR_NEW,#06H;是则送数据06H
CALLBEEP_BL;蜂鸣器报警。
RET
D7:
CJNEA,#07H,D8;是数字键7吗?
MOVIR_NEW,#07H;是则送数据07H
CALLBEEP_BL;蜂鸣器报警。
RET
D8:
CJNEA,#08H,D9;是数字键8吗?
MOVIR_NEW,#08H;是则送数据08H
CALLBEEP_BL;蜂鸣器报警。
RET
D9:
CJNEA,#09H,D0;是数字键9吗?
MOVIR_NEW,#09H;是则送数据09H
CALLBEEP_BL;蜂鸣器报警。
RET
D0:
CJNEA,#00H,D15;是数字键0吗?
MOVIR_NEW,#00H;是则送数据00H
CALLBEEP_BL;蜂鸣器报警。
RET
D13:
CJNEA,#11H,D14;是音量加键吗?
实现速度加
MOVIR_NEW,#0FFH;非数字键标示为0FFH
INCPWM
MOVA,PWM
CJNEA,#00H,D13_OUT
CALLBEEP_BL;蜂鸣器报警。
MOVPWM,#0FFH
D13_OUT:
RET
D14:
CJNEA,#10H,D15;是音量减键吗?
实现速度减
MOVIR_NEW,#0FFH;非数字键标示为0FFH
DECPWM
MOVA,PWM
CJNEA,#0FFH,D14_OUT;9
CALLBEEP_BL;蜂鸣器报警。
MOVPWM,#01H
D14_OUT:
RET
D15:
;MOVIR_NEW,#0FFH;非数字键标示为0FFH
RET
;**********************************************
;判断显示程序
;-------------
DISPLAY:
DIS0:
MOVA,PWM
SUBBA,#LEVEL0
JNCDIS1
MOVLED_RAM,#9
JMPLED_DISP
DIS1:
MOVA,PWM
SUBBA,#LEVEL1
JNCDIS2
MOVLED_RAM,#8
JMPLED_DISP
DIS2:
MOVA,PWM
SUBBA,#LEVEL2
JNCDIS3
MOVLED_RAM,#7
JMPLED_DISP
DIS3:
MOVA,PWM
SUBBA,#LEVEL3
JNCDIS4
MOVLED_RAM,#6
JMPLED_DISP
DIS4:
MOVA,PWM
SUBBA,#LEVEL4
JNCDIS5
MOVLED_RAM,#5
JMPLED_DISP
DIS5:
MOVA,PWM
SUBBA,#LEVEL5
JNCDIS6
MOVLED_RAM,#4
JMPLED_DISP
DIS6:
MOVA,PWM
SUBBA,#LEVEL6
JNCDIS7
MOVLED_RAM,#3
JMPLED_DISP
DIS7:
MOVA,PWM
SUBBA,#LEVEL7
JNCDIS8
MOVLED_RAM,#2
JMPLED_DISP
DIS8:
MOVA,PWM
SUBBA,#LEVEL8
JNCDIS9
MOVLED_RAM,#1
JMPLED_DISP
DIS9:
MOVA,PWM
SUBBA,#LEVEL9
JNCLED_DISP
MOVLED_RAM,#0
LED_DISP:
MOVDPTR,#LED_ASC
MOVA,LED_RAM
MOVCA,@A+DPTR
MOVLED_PORT,A
RET
LED_ASC:
;共阴极LED代码
DB3FH,06H,5BH,4FH,66H;0~F代码
DB6DH,7DH,07H,7FH,6FH
DB77H,7CH,39H,5EH,79H
DB71H
DB0BFH,086H,0DBH,0CFH,0E6H;0.~9.(带小数点)代码
DB0EDH,0FDH,087H,0FFH,0EFH
DB039H;字符“C”
;****************************************************
IR_ASC:
DB0FAH,0EAH,0DAH,0CAH,0BAH
DB0A0H,80H,60H,40H,02H
;------------------------------------------------
;DELAYR5*0.14MS
DEL:
MOVR5,#1;IR解码使用
DEL0:
MOVR6,#2
DEL1:
MOVR7,#32
DEL2:
DJNZR7,DEL2
DJNZR6,DEL1
DJNZR5,DEL0
RET
;------------------------
;10ms延时子程序,按键去抖动用
DELAY:
MOVR5,#50
DELAY1:
MOVR6,#100
DJNZR6,$
DJNZR5,DELAY1
RET
;-----------------------------------------------
;蜂鸣器响一声子程序
BEEP_BL:
MOVR6,#100
BL1:
CALLBL2
CPLBEEP
DJNZR6,BL1
MOVR5,#25
CALLDELAY2
RET
BL2:
MOVR7,#180
BL3:
NOP
DJNZR7,BL3
RET
DELAY2:
MOVR6,#50;延时R5×10MS
BL4:
MOVR7,#100
BL5:
DJNZR7,BL5
DJNZR6,BL4
DJNZR5,DELAY2
RET
;---------------------------------------------------
END