搜档网
当前位置:搜档网 › PWM波形产生程序

PWM波形产生程序

PWM波形产生程序
PWM波形产生程序

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;

}

}

}

相关主题