- ;设计思路:用定时器中断产生最小时间单位T0,每m个T0组成一个子周期T10,其中前n个T0为LED导通时间,即Ton=n*T0,则Toff=(m-n)*T0
- ;每X个T10组成一个母周期T20,其中前y个T10为有效控制时间,后续的(x-y)个T10令LED熄灭或者子周期占空比调至最小。
- ;适当调节n/m和x/y的比例使显示效果达到最佳。
- ;以下是刚刚调试通过的小段程序,显示效果良好。
- ;实验过程本人有一种推测,不知是否成立:
- ;子周期的最小占空比的宽度应大于LED的点亮时间,即点亮LED的时间宽度n/m*T0应足够产生余辉。类似于动态数码管对点亮时间的要求。
- ;母周期的宽度应小于1/50s,提高刷新频率以令肉眼察觉不出闪烁。
- ;未经验证的推测,可能是错误的,请大家接着探讨。。。
- ;芯片: AT89C2051
- ;晶振:18.9375
- ;电路描述:输入5V电源,简易RC复位,P3.3对地接KEY(减1),P3.3对地接KEY2(加1),P3.7接三极管C106驱动LED。LED直径5mm,红色。限流电阻471、1/4W.
- ;功能描述:LED渐亮渐灭。按住KEY可以保持住当前某占空比的亮度(如一开始按住KEY再通电,将看到空度比为1%的亮度)。
- ;调节子周期和母周期,均可渐亮渐灭。 同时按下“加1”和“减1”按键切换选择调节对象(2004.11.04)
- LED BIT P3.7
- KEY BIT P3.3
- SOV BIT 20H.0 ;子周期显示完毕标志
- BOV BIT 20H.1 ;母周期显示完毕标志
- SSS EQU 30H ;子周期占空宽度调节
- T10 EQU 31H ;子周期宽度
- AAA EQU 32H ;子周期占空宽度入口
- BBB EQU 33H ;母周期占空宽度入口
- T20 EQU 34H ;母周期宽度
- MMM EQU 35H ;母周期占空宽度调节
- A10 EQU 36H ;子周期宽度缓冲
- B20 EQU 37H ;母周期宽度缓冲
- KEY2 BIT P3.2
- COM1 BIT P3.5
- COM2 BIT P3.4
- COM3 BIT P3.1
- COM4 BIT P3.0
- NOISE1 EQU 38H
- NOISE2 EQU 39H
- NOISE3 EQU 3AH
- ORG 00H
- LJMP MAIN
- ORG 0BH
- LJMP PWM
- PWM:
- MOV TH0,#0FFH
- MOV TL0,#90H
- PUSH ACC
- ;####################################################
- JB BOV,OUTLOW
- ;*********************************************
- JB SOV,IFSEND
- DEC T10 ;保持计数同步
- DJNZ SSS,LRET ;占空参数修正
- MOV SSS,AAA ;复原子周期占空参数
- MOV A,T10
- CJNE A,#0,SCTN ;对占空比为100%时的修正
- AJMP T10END
- SCTN:
- CLR LED
- SETB SOV
- AJMP LRET
- IFSEND:
- DJNZ T10,LRET
- T10END:
- MOV T10,A10 ;复原子周期宽度参数
- SETB LED
- CLR SOV ;子周期处理完毕
- ;**********************************************
- DEC T20
- DJNZ MMM,LRET
- MOV MMM,BBB
- MOV A,T20
- CJNE A,#0,MCTN ;对占空比为100%时的修正
- AJMP T20END
- MCTN:
- CLR LED
- SETB BOV
- AJMP LRET
- OUTLOW:
- CLR LED ;母周期低电平部分输出0
- DJNZ T10,LRET
- MOV T10,A10
- DJNZ T20,LRET
- T20END:
- MOV T20,B20
- SETB LED
- CLR BOV ;母周期处理完毕
- ;#############################
- LRET:
- POP ACC
- RETI
- MAIN:
- MOV P3,#00001100B
- MOV TMOD,#01H
- MOV A10,#10 ;子周期宽设置
- MOV B20,#20 ;母周期宽设置
- MOV T10,A10
- MOV T20,B20
- MOV AAA,#6 ;子周初始占空宽度设置
- MOV BBB,#20 ;母周初始占空宽度设置
- MOV SSS,AAA
- MOV MMM,BBB
- SETB ET0
- SETB TR0
- SETB EA
- SETB LED
- MOV 20H,#0;所有标志位清零
- MOV R0,#250
- MOV R1,#2 ;每隔0.07*250*2ms调节一次亮度
- FREE: ;KEY BBBBBBBBBBBBBBBBBBBBBBBBBBBB
- MOV PCON,#1
- CHANGE2:
- JB KEY,CHOU1
- JB KEY2,CHOU1
- DJNZ NOISE1,FREE
- JNB KEY,$
- JNB KEY2,$
- AJMP FREE3
- CHOU1:
- MOV NOISE1,#0
- DOWN1:
- JB KEY,UP1
- DJNZ NOISE2,FREE
- DJNZ BBB,NEXT ;减1修正
- MOV BBB,#1
- NEXT:
- JB KEY,FREE ;操作完成后待松键再退出
- JNB KEY2,FREE
- SJMP NEXT
- UP1:
- MOV NOISE2,#0
- IFUP:
- JB KEY2,LCRNOS
- DJNZ NOISE3,FREE
- INC BBB ;加1修正
- MOV A,BBB
- CJNE A,#21,NEXT2
- MOV BBB,#20
- NEXT2:
- JB KEY2,FREE ;操作完成后待松键再退出
- JNB KEY,FREE
- SJMP NEXT2
- LCRNOS:
- MOV NOISE3,#0
- AJMP FREE ;KEY B
- FREE3: ;KEY
- MOV PCON,#1
- CHANGE1:
- JB KEY,CHOU2
- JB KEY2,CHOU2
- DJNZ NOISE1,FREE3
- JNB KEY,$
- JNB KEY2,$
- AJMP FREE
- CHOU2:
- MOV NOISE1,#0
- DOWN2:
- JB KEY,UP2
- DJNZ NOISE2,FREE3
- DJNZ AAA,NEXT3 ;减1修正
- MOV AAA,#1
- NEXT3:
- JB KEY,FREE3 ;操作完成后待松键再退出
- JNB KEY2,FREE3
- SJMP NEXT3
- UP2:
- MOV NOISE2,#0
- IFUP2:
- JB KEY2,LCRNOS2
- DJNZ NOISE3,FREE3
- INC AAA ;加1修正
- MOV A,AAA
- CJNE A,#11,NEXT4
- MOV AAA,#10
- NEXT4:
- JB KEY2,FREE3 ;操作完成后待松键再退出
- JNB KEY,FREE3
- SJMP NEXT4
- LCRNOS2:
- MOV NOISE3,#0
- AJMP FREE3 ;
- END