51模拟PWM

 /****************************************************
 * 声明:        此制作为CIKY单片机学习过程,欢迎爱好者
 *              一起学习和探讨,共同进步。
 * Title:       模拟PWM输出
 * Description: 51单片机模拟PWM输出控制灯的100个亮度级
 * @author      CIKY
 * Date:        Jan. 06, 2010
 *我的理解:一共分为100个档位,一个档位以100个定时器中断为一个周期
 一个档位的重复时间是延时函数部分,这该时段中,某个档位的周期函数在不停地循环
****************************************************/

#include <reg52.h>

#define uInt unsigned int
#define uchar unsigned char

uchar PWM_T = 0;   //占空比控制变量

//////////////////主程序入口//////////////////////
void main(void)      
{
 bit flag = 1; //控制灯渐亮渐熄方式
 uInt n;
 EA=1;        //允许总中断
 TMOD=0x02;   //定时器0,工作模式2,8位定时模式
 TH0=210;     //写入预置初值(取值1-255,数越大PWM频率越高)
 TL0=210;     //写入预置值 (取值1-255,数越大PWM频率越高)
 ET0=1;       //允许定时器0中断
 TR0=1;       //启动定时器
    
 
 
 

 P1=0xff;  //初始化P1

 while(1)    
 {   
  for(n=0;n<1000;n++);  //延时,将响应定时器中断,灯会自动加/减一个档次的亮度    //while()循环的时间主要是在这里,这里即为一个档位的时间
                             //取值0-65535,数字越大变化越慢

  if(flag==1)   //灯渐亮
   PWM_T++;
  else    //灯渐熄
   PWM_T--;
   
  if(PWM_T>=100) //设置灯亮度级别为100
   flag=0;

  if(PWM_T==0)   //限定最低亮度级别为0
   flag = 1;
 }      

}
          
///////////////////定时器0中断模拟PWM////////////////////
void timer0() interrupt 1 using 2  
{
 static  uchar   t ;   //PWM计数

 t++;    //每次定时器溢出加1
 
 if(t==100)   //PWM周期

 {
  t=0;  //使t=0,开始新的PWM周期
  P1=0x00;  //使LED灯亮   
 }
 
 if(PWM_T==t)  //按照当前占空比切换输出为高电平
  P1=0xff;        //使LED灯灭   
}

### 使用51单片机实现PWM波形生成 #### 定义PWMPWM(Pulse Width Modulation,脉冲宽度调制)是一种通过调整高电平持续时间占整个周期的比例来传递信息的技术。对于51单片机而言,可以通过设置定时器中断的方式,在特定的时间间隔内改变引脚的状态,从而形成周期性的高低电平信号[^1]。 #### 实现方法概述 为了在51单片机上生成PWM信号,通常会利用其内部的定时/计数器功能。具体来说,可以配置一个定时器作为中断源,每次到达设定值时触发一次中断,并在此期间切换I/O口状态以完成PWM输出[^2]。 #### 配置步骤详解 以下是基于定时器0的一个简单例子: 1. **初始化硬件资源** - 设置定时器模式:选择合适的操作方式(如方式1),并加载初始值以便计算溢出时间和占空比。 - 开启全局中断以及相应的定时器中断允许位。 2. **编写服务程序** 在定时器中断处理函数里更新端口状态,依据当前计数值决定何时翻转输出电平。 下面给出一段具体的C语言代码示例用于演示上述过程: ```c #include <reg52.h> sbit PWM_OUT = P1^0; //定义PWM输出管脚为P1.0 unsigned char duty_cycle=50;//默认占空比设为50% void Timer0_Init() { TMOD |= 0x01; //设置T0工作于模式1 (16-bit) TH0 = 0xFC; //重载初值,对应约2ms总周期@12MHz晶振频率 TL0 = 0x18; ET0 = 1; //使能T0中断 EA = 1; //打开CPU中断开关 } void main(){ Timer0_Init(); while(1){ //主循环无需做任何事情 } } // T0 中断服务子程序 void timer0_ISR(void) interrupt 1{ static unsigned int count=0; if (++count >= duty_cycle){ PWM_OUT = 0; //当达到指定比例后拉低输出电压 }else{ PWM_OUT = 1; //其余时间内保持高电平 } if(count>=100) { count=0; //每满一百次重新开始一轮新的周期测量 } } ``` 此段代码展示了如何借助软件手段构建基本形式下的PWM输出机制[^4]。 #### 应用场景扩展 除了基础照明亮度调控外,该技术还广泛应用于诸如直流电机速度管理等领域之中[^3]。通过对不同负载施加相应参数定制化的PWM激励,则能够达成精确操控目标的效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值