微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 51单片机脉冲调制(PWM)控制源程序

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

时间: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波形。

#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;       

}

}

}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top