https://www.bilibili.com/video/BV1jz41187vh/?p=3&spm_id_from=pageDriver&vd_source=761a4bd15f697c5f0d03eff06bd69b73
1.嵌入式-单片机-定时器实现PWM波
2.PWM是脉冲宽度调制的简称。PWM波有多种形式,我们常见的是本例中的脉冲周期固定,高电平宽度(占空比0%-100%)可调的方波
3.Proteus仿真图
4.本例中要求周期10ms(由晶振频率决定),占空比为20%、40%、60%和80%的方波(先默认都是高电平,只有当计数器到了指定数值,高电平变低电平,那么高电平持续那段时间就是占线,真正所谓工作的时间)
由于传统的51单片机没有PWM生成模块,在这里我们可以采用软件的方法实现。这里假定占空比从0-100%整数倍的变化,也就是分辨率为1%。
由于周期10ms,可以将周期分为100份,即0.1ms(100us)1份。
采用定时器T0定时100us中断1次,计100次中断就10ms周期,想要20%的方波,就累计20次中断就2ms.
而方波的产生可以如图,假定周期初始为高电平,开始记录中断次数,计20次(2ms)后变为低电平,计到100次 (10ms)变为高电平,如此反复即可实现占空比20%,周期10ms的PWM波
5.代码预览图
6.代码
#include<reg52.h>
#define TIM (256-100)
#define CYCLE 100
#define DUPY_CYCLE01 20
#define DUPY_CYCLE02 40
#define DUPY_CYCLE03 60
#define DUPY_CYCLE04 80
void t_isr(void);
void main(void){//定时器相关配置模式,可以跳过
TMOD = 0x02;
TH0 = TIM;
TL0 = TIM;
PT0 = 1;
ET0 = 1;
EA = 1;
TR0 = 1;
P1_0 = 1;
P1_1 = 1;
P1_2 = 1;
P1_3 = 1;
while(1){
;
}
}
void t0_isr(void) interrupt 1
{
static unsigned char count = 0;
count++;
if(count == CYCLE){
count = 0;
P1_0 = 1;
P1_1 = 1;
P1_2 = 1;
P1_3 = 1;
}
if (count == DUTY_CYCLE01){
P1_0 = 0;//当count累加到20时,P1_0变为低电平
}if (count == DUTY_CYCLE02){
P1_1 = 0;
}if (count == DUTY_CYCLE03){
P1_2 = 0;
}if (count == DUTY_CYCLE04){
P1_3 = 0;
}
}
}
7.总结:先默认初始都是高电平,只有当计数器到了指定数值,高电平变低电平,那么高电平持续那段时间就是占线,真正所谓工作的时间。
以上,完