超简单“手把手教你写PWM程序”(基于STC89C52)

180it 2022-04-09 PM 579℃ 0条

前言
学习单片机总要接触一些控制,比如电机调速,舵机驱动,步进电机驱动。这是必不可少需要用到一种控制机制———PWM(脉冲宽度调制)

提示:以下是本篇文章正文内容,下面案例可供参考

一、学习前需要掌握哪些内容?
1.掌握单片机定时器的使用方法
2.掌握c语言基础
二、开始
1.基操来一下
代码如下(示例):

#include <reg52.h>

typedef unsigned int u16;
typedef unsigned char u8; //声明变量

sbit PWM = P1^0; //定义PWM输出口

2.重头戏
以下代码就是具体实现方案
代码如下(示例):

u16 A = 0; //定义变量
u16 Speed; 
void Time0Init()    //初始化定时器
{
    TMOD|=0x01;        //配置定时器1
    TH0 = (65536-1000)/256;    //配置1ms定时
    TL0 = (65536-1000)%256;
    TR0 = 1;    
    ET0 = 1;    //打开定时器中断
    EA = 1;     //打开总中断
        
}

//中断里面就是PWM具体实现的代码

void time()interrupt 1
{
    TH0 = (65536-1000)/256;    //配置1ms定时
    TL0 = (65536-1000)%256;
    A++;    //A开始计数,每1毫秒加一
    if(A > 1000)    //A计数到1000就清零,也就是说每经过1s就是一个
    {                //PWM周期,所以频率是1Hz
        A = 0;
    }
    //该Speed出场了,speed作为比较器跟A比较,通过调Speed来调节占空比
    if(Speed < A)
    {
        PWM = 1;    //当Speed小于A时,PWM引脚输出高电平
    }
    else
    {
        PWM = 0;    //否则就输出0
    }
    if(Speed>999)
    {
        Speed =999;
    }
    
}

所以我们只要调节Speed 的值就可以调节占空比了
Speed的值应该比A小
总结
main函数里面也比较简单

void main()
{
    Time0Init();
    while(1);
}

原理方面就介绍到这了

来源:https://blog.csdn.net/linfengXBB/article/details/110950991

支付宝打赏支付宝打赏 微信打赏微信打赏

如果文章或资源对您有帮助,欢迎打赏作者。一路走来,感谢有您!

标签: none

超简单“手把手教你写PWM程序”(基于STC89C52)