PWM波形产生流程图:
定义变量,定义状态指示量flag flag=0,渐亮,flag=1,渐暗
选择定时器T0中断,
给定时器T0装初值,
开启总中断,
开启定时器T0中断,
给定拓宽最大周期counter,
进入循环{
判断状态变量flag的值
flag!=0,PWM_ON高电平右移,直到PWM_ON==最大周期CYCLE,flag=1
flag=1,PWM_ON左移,直到PWM_ON=0,flag=0,
}
进入中断{
给定时器T0装初值,判断中断次数counter的值
若counter=PWM_ON,则LED控制I/O口至高电平,即P1=0xFF,继续中断(counter++)若counter=CYCLE,则中断次数counter=0,此时当PWM_ON!=0,点亮LED
}
程序如下:
#include
#include
#define uchar unsigned char
uchar CYCLE;
uchar counter=0;
uchar PWM_ON;
void delay(void) //误差0us
{
unsigned char a,b,c;
for(c=62;c>0;c--)
for(b=251;b>0;b--)
for(a=1;a>0;a--);
_nop_; //if Keil,require use intrins.h
}
void main()
{
bit flag;// FLAG=0,渐亮,FLAG=1,渐暗
TMOD=0x01;
TH0=(65536-100)/256;
TL0=(65536-100)%256;
EA=1;
ET0=1;
TR0=1;
CYCLE=10;
while(!flag)
{
delay();
PWM_ON++;
if(PWM_ON==CYCLE)
{
flag=1;
}
}
while(flag)
{
delay();
PWM_ON--;
if(PWM_ON==0)
{
flag=0;
}
}
}
void timeo()interrupt 1
{
TH0=(65536-100)/256;
TL0=(65536-100)%256;
if(counter==PWM_ON){
P1=0xFF;
}
counter++;
if(counter==CYCLE)
{
counter=0;
if(PWM_ON!=0)
{
P1=0;
}
}
}