嵌入式-51单片机-定时器实现PWM波

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.总结:先默认初始都是高电平,只有当计数器到了指定数值,高电平变低电平,那么高电平持续那段时间就是占线,真正所谓工作的时间。
以上,完

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值