宁波.Net技术讨论区

51系列单片机采用脉冲宽度调制(PWM)

      介绍一个51系列单片机采用脉冲宽度调制(PWM)方式控制LED灯亮度的一个程序,大家都知道,51单片机本身是没有pwm接口的,这个程序是

通过软件模拟pwm.在一定的频率的方波中,调整高电平和低电平的占空比,即可实现LED灯亮度控制。程序中使用定时器0产生2.5ms周期脉冲,

使用占空比控制变量scale控制占空比,在低电平期间使LED灯亮,在高电平期间使LED灯灭,改变scale就改变了高电平与低电平的时间,因此

也就控制了LED灯的亮度。
    
#include "AT89X51.H"  //模拟PWM输出控制灯的10个亮度级 
unsigned int scale;  //占空比控制变量 
void main(void)  // 主程序 

    unsigned int n; //延时循环变量 
    TMOD=0x02;  //定时器0,工作模式2(0000,0010),8位定时模式 
    TH0=0x06;  //写入预置初值6到定时器0,使250微秒溢出一次(12MHz) 
    TL0=0x06;  //写入预置值 
    TR0=1;   //启动定时器 
    ET0=1;   //允许定时器0中断 
    EA=1;   //允许总中断 
    while (1)  //无限循环,实际应用中,这里是做主要工作 
    { 
        for(n=0;n<50000;n++); //每过一段时间,就自动加一个档次的亮度 
        scale++; //占空比控制变量scale加1 
        if(scale==10)    scale=0; //如果scale=10,使scale为0 
    } 
}

void timer0(void) interrupt 1 //定时器0中断服务程序 

    static unsigned int tt ; //tt用来保存当前时间在一秒中的比例位置 
    tt++;   //每250微秒增加1 
    if(tt==10)  //2.5毫秒的时钟周期 
    { 
        tt=0;  //使tt=0,开始新的PWM周期 
        P2_0=0; //使LED灯亮 
    } 
    if(scale==tt)  //按照当前占空比切换输出为高电平 
        P2_0=1; //使LED灯灭 
}

程序中从tt=0开始到scale为低电平,从scale开始到tt=10为高电平,由于scale是变量,所以改变scale就可以改变占空比。

posted @   山 人  阅读(1337)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述
点击右上角即可分享
微信分享提示