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.0 PWM端口,p3.1 蜂鸣器报警*
;*********************************************************
LEVEL0EQU2FH;亮度等级9
LEVEL1EQU4FH;亮度等级8
LEVEL2EQU6FH;亮度等级7
LEVEL3EQU8FH;亮度等级6
LEVEL4EQU0AFH;亮度等级5
LEVEL5EQU0BFH;亮度等级4
LEVEL6EQU0CFH;亮度等级3
LEVEL7EQU0DFH;亮度等级2
LEVEL8EQU0EFH;亮度等级1
LEVEL9EQU0FFH;亮度等级0
PWM EQU 7FH ;PWM 赋初始值
LED_RAMEQU30H
IRCOM EQU 50H;50H-53H IR 使用
IR_NEWEQU 60H;新的遥控代码值用
LED_PORTEQUP1 ;数码管接口,共阴极
PWM_OUT EQU P3.0 ;PWM控制输出接口
INCKEY EQU P3.5 ;K1,PWM 值增加键。
DECKEY EQU P3.4 ;K2,PWM 值减小键。
BEEP EQU P3.1 ;蜂鸣器
IRINEQU 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
- 基于DSP的磁流变阻尼器的控制方法(04-14)
- 基于DSP并使用SPWM控制技术的变频器实现方案(12-21)
- 飞思卡尔那些事之PWM控制直流电机(11-23)
- 51单片机IO模拟PWM控制舵机转向(11-22)
- 51单片机PWM控制电机(11-19)
- PWM控制LED灯的亮度(C 语言)(11-17)