/****************************************************
* 声明: 此制作为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灯灭
}
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』