×
单片机 > 单片机程序设计 > 详情

51模拟PWM

发布时间:2020-05-28 发布时间:
|

 /****************************************************

 * 声明:        此制作为CIKY单片机学习过程,欢迎爱好者

 *              一起学习和探讨,共同进步。

 * Title:       模拟PWM输出

 * Description: 51单片机模拟PWM输出控制灯的100个亮度级

 * @author      CIKY

 * Date:        Jan. 06, 2010

 *我的理解:一共分为100个档位,一个档位以100个定时器中断为一个周期

 一个档位的重复时间是延时函数部分,这该时段中,某个档位的周期函数在不停地循环

****************************************************/


#include


#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单片机中断源的扩展方法