;/*************************************************
;* 标题: 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[page]
;------------------------------------------------
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
上一篇:DS18B20读取温度并显示-汇编程序
下一篇:Watchdog在Philips 8XC552系列单片机系统中的应用
推荐阅读最新更新时间:2024-03-16 13:11