电路连接:灯由P2口控制,引脚输出高电平则熄灭,输出低电平则点亮;MCU时钟6兆赫兹。
占空比从0%,10%,20%,……到100%共11级。定时器设置为固定间隔,例如一毫秒触发一次中断,那么输出一个占空比40%的10毫秒方波的逻辑可以是:
Timer0_ISR: 1、重装计数器;2、计数值加一,若大于等于10说明一个周期结束,计数值归零(***);、3、若计数值大于等于4则输出“0”,否则输出“1”;4、结束。
若每种亮度等级的方波重复N次,则从完全熄灭到完全点亮再到完全熄灭的用时是:T=方波周期×N×(2倍等级个数-1),若重复10次,则T=10ms×10×21=2.1秒。
为了让每种方波各重复10次,需要修改上面的逻辑。即在(***)处添加一个针对计数值记录当前方波已经重复了几次,如果计数值达到N,则修改亮度等级(占空比)。这样,灯就会有“呼吸”的效果了。
DIR BIT 00H;亮度等级变化方向,0代表下一次占空比要增加10%,1代表要减少10%
CT DATA 30H;定时器计数值
DT DATA 31H;占空比
RPT DATA 32H;一种方波的重复次数
ORG 00H
JMP START
ORG 0BH
T0ISR:
MOV TL0,#0CH
MOV TH0,#0FEH
;IF ++CT >= 10 THEN CT=0
MOV A,CT
INC A
MOV CT,A
CLR C
SUBB A,#10
JC L1
MOV CT,#0
; IF ++RPT >= 10 THEN RPT=0
MOV A,RPT
INC A
MOV RPT,A
CLR C
SUBB A,#10
JC L1
MOV RPT,#0
; IF DIR=0 ++DT IF DUTY=10 DIR=1, ELSE DT=DT-1 IF DUTY=0 DIR=0 (BLOCK L4)
JB DIR,L4
MOV A,DT
INC A
MOV DT,A
CJNE A,#10,L1
SETB DIR
JMP L1
L4: MOV A,DT
DEC A
MOV DT,A
JNZ L1
CLR DIR
L1: ;IF CT<DT THEN TURN ON LED ELSE TURN OFF
MOV A,CT
CLR C
SUBB A,DT
JC L2
MOV P2,#0FFH
JMP L3
L2: MOV P2,#0F0H
L3: RETI
START:
MOV SP,#40H
CLR DIR
MOV CT,#0
MOV DT,#0
MOV RPT,#0
MOV TMOD,#01H
MOV TL0,0CH ;1MS @6MHZ
MOV TH0,#0FEH
SETB EA
SETB ET0
SETB TR0
JMP $
END
用Proteus仿真看不出效果,得用逻辑分析仪接到引脚上看波形。实物证明上述代码可以正常工作。
标签:10,8051,RPT,MOV,呼吸,单片机,DT,DIR,CT From: https://www.cnblogs.com/tingzhouduruo/p/8051mcu-led-breathe.html