您的位置 首页 主动

根据51单片机的pwm波发生

利用定时器的中断来实现PWM调制。如果我们设定脉冲的周期为1000毫秒;每20毫秒产生一次中断,则知道要中断50次。那么我们可以这样编写程序

使用定时器的中止来完成PWM调制。假如咱们设定脉冲的周期为1000毫秒;每20毫秒发生一次中止,则知道要中止50次。
那么咱们能够这样编写程序
TH0=0XFF;
TL0=0XEC;这是定时器0发生一次中止的时刻,即20毫秒发生一次中止。咱们再界说一个计数的变量NUM,让NUM从0开端加到50,程序如下
void Timer0Interrupt(void) interrupt 1
{
TH0 = 0x0FE;
TL0 = 0x0C;
NUM++;
if(NUM==33)
{
NUM=0;
}
if(NUM<=PWM)P1=0x00;
if(NUM>PWM)P1=0xff;

}
其间的PWM为0到50的数值,这样经过操控PWM的值让小于PWM的NUM值里所发生的中止全为低电平,大于PWM的为高电平,这样经过操控计数就完成了PWM。
一切程序如下
#include
#define uint unsigned int
#define uchar unsigned char
sbit k1=P3^2;
sbit k2=P3^3;
sbit beep=P2^7;
uchar PWM=10; //用来操控脉宽
uchar NUM;//中止次数变量
void delay(uint t)
{
uchar j;
while(t–)for(j=0;j<120;j++);
}
void bee()
{
beep=0;
delay(10);
beep=1;
delay(10);

}
void keycheck()
{
if(k1==0)
{
delay(10);
if(k1==0)
{
if(PWM!=0X20)
{
PWM++;
delay(20);
}
}
else
bee();
}
if(k2==0)
{
delay(10);
if(k2==0)
{
if(PWM!=0X01)
{
PWM–;
delay(20);
}
}
else
bee();
}
}
void InitTimer0(void)
{
TMOD = 0x01;
TH0 = 0xfe; //咱们设定500毫秒中止一次 共中止32次即一个周期
TL0 = 0x0c;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void main()
{
InitTimer0();
while(1)
{

keycheck();
}
}
void Timer0Interrupt(void) interrupt 1
{
TH0 = 0x0FE;
TL0 = 0x0C;
NUM++;
if(NUM==33)
{
NUM=0;
}
if(NUM<=PWM)P1=0x00;
if(NUM>PWM)P1=0xff;

}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ziliao/zhudong/257176.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部