- ;/*******************************************************************************
- ;* 标题: 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
复制代码
|