利用51单片机输出pwm

  51单片机是可以输出PWM的,比较的麻烦。此时需要用到内部定时器来实现,可用两个定时器实现,也可以用一个定时器实现。

  用两个定时器的方法是用定时器T0来控制频率,定时器T1来控制占空比。大致的的编程思路是这样的:T0定时器中断让一个I0口输出高电平,在这个定时器T0的中断当中起动定时器T1,而这个T1是让IO口输出低电平,这样改变定时器T0的初值就可以改变频率,改变定时器T1的初值就可以改变占空比。

  下面重点介绍用一个定时器的实现PWM的方法。以周期为1ms(1kHZ)为例,要产生其它频率的PWM波,程序中只需作简单修改即可。用一个定时器时(如定时器T0),首先要确定PWM的周期T和占空比D,确定了这些以后,就可以用定时器产生一个时间基准t,比如定时器溢出n次的时间是PWM的高电平的时间,则D*T=n*t,类似的可以求出PWM低电平时间需要多少个时间基准n。

  因为这里我们是产生周期为1ms(1kHZ)的PWM,所以可设置中断的时间基准为0.01ms,,然后中断100次即为1ms。在中断子程序内,可设置一个变量如time,在中断子程序内,有三条重要的语句:

   1、当time>=100时,time清零(此语句保证频率为1kHZ);

   2、当time>n时(n应该在0-100之间变化开),让单片相应的I/O口输出低电平;

   3、当time<=n时,让单片相应的I/O口输出高电平,此时占空比就为%n。

 下面程序产生30%占空比的pwm:

#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char

sbit PWM=P2^0;//  P2.0输出pwm
uchar time;  // 定义占空比的变量

void main()
{
	TMOD=0x01;//定时器0工作方式1
	TH0=0xff;//(65536-10)/256;//赋初值定时
	TL0=0xf7;//(65536-10)%256;//0.01ms
	EA=1;//开总中断
	ET0=1;//开定时器0中断
	TR0=1;//启动定时器0 
	while(1)
	{			
	}			
}

void tim0() interrupt 1
{
	TR0=0;//赋初值时,关闭定时器
	TH0=0xff;//(65536-10)/256;//赋初值定时
	TL0=0xf7;//(65536-10)%256;//0.01ms
	TR0=1;//打开定时器

	time++;
	if(time>=100)  //1khz
	  time=0;   
	if(time<=30)   //占空比%30,可改
	  PWM=1;  
	else PWM=0;
}


   最后的到波形,在示波器上显示如下图所示:


   如果想修改占空比,直接在程序里面修改下面这句即可。
    if(time<=30)//占空比%30,可改占空比

   当然我们可以加入其它的手段来动态改变占空比,比如按键,上位机等。
按键动态调节占空比可参考我另一篇博客:http://blog.csdn.net/dmfylb/article/details/72605221


  • 157
    点赞
  • 779
    收藏
    觉得还不错? 一键收藏
  • 27
    评论
51单片机模拟PWM是通过控制引脚的高低电平来实现的。具体的实现步骤如下: 1. 首先,需要对GPIO引脚进行初始化,确定哪些引脚用于PWM输出。在给定的代码中,引脚P54被定义为PWM输出引脚。 2. 然后,需要初始化定时器0,并设置定时器的中断函数。定时器0用于生成PWM信号的周期。 3. 在主函数中,进行引脚初始化和定时器初始化。 4. 在定时器0的中断函数中,根据占空比的设定,控制PWM输出引脚的高低电平。具体做法是通过一个计数器来计算PWM的高电平持续时间,当计数器超过设定的占空比值时,将PWM引脚置低,否则置高。在给定的代码中,PWM占空比的设定值为变量Dut。 5. 最后,在主循环中调用按键扫描函数,用于调整PWM的占空比。按键扫描函数根据按键的状态来增加或减少占空比的值。 总结来说,51单片机模拟PWM是通过设置定时器和中断函数来控制引脚的高低电平,从而实现PWM输出。通过调节占空比的值,可以调整PWM信号的占空比。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [利用51单片机定时器模拟输出PWM波](https://blog.csdn.net/qq_43265868/article/details/126194347)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 27
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值