新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 51单片机脉冲调制(PWM)控制源程序

51单片机脉冲调制(PWM)控制源程序

作者: 时间:2016-11-27 来源:网络 收藏
要用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波形。

本文引用地址:https://www.eepw.com.cn/article/201611/322219.htm
#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;       
}
}
}


评论


技术专区

关闭