要用51发生PWM去操控LED,首先要确认PWM的周期T和占空比D,确认了这些今后,能够用定时器发生一个时刻基准T,比方定时器溢出N次的时刻是PWM的高电平的时刻,则D*T=N*T,相似的能够求出PWM低电平时刻需求多少个时刻基准N。
那么就能够编写程序,依据定的时刻基准T给定时器赋值初始化,然后敞开定时器,界说一个标志位Flag,依据Flag的状况决议输出高平仍是低电平,假定 界说Flag=1的时分输出高电平,用一个变量去记载定时器中止的次数,每次中止就让记载中止次数的变量+1,在中止程序里边判别这个变量的值是否到了 N,假如到了阐明高电平的时刻够了,那么就改动Flag为0,输出低电平,一起记载中止变量的值清零,每次中止的时分仍旧+1,依据Flag=0的状况跳 去判别记载变量的值是否到了N 假如到了,阐明PWM的低电平时刻够了,那么就改Flag=1,输出改高电平,一起记载次数变量清零,重新开始,如此循环便可得到想要的PWM波形。
#I Nclude
Unsigned Char CYCLE;
Unsigned Char Count = 0;
Unsigned Char PWM_ON;
Void Delay()
{
Unsigned Char I, J;
For(J = 100; J; J–)
For(I = 255; I; I–)
;
}
Void Main()
{
Bit Flag;
TMOD = 0x01;
TH0 = (65536 – 100) / 256;
TL0 = (65536 – 100) % 256;
IE = 0x82;
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 Time0_server() Interrupt 1 Using 1
{
TH0 = (65536 – 100) / 256;
TL0 = (65536 – 100) % 256;
If(Count == PWM_ON)
{
P2 = 0xFF;
}
Count++;
If(Count == CYCLE)
{
Count = 0;
If(PWM_ON != 0)
{
P2 = 0;
}
}
}
声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/257055.html