#include <REGX52.H>
sbit LED1=P2^0; //第一路PWM
sbit LED2=P2^1; //第二路PWM
sbit KeyNum=P3^1; //按键
unsigned int f=1 ; //默认1HZ
unsigned int result; //result = 65535-100000/f
unsigned int Counter1,Counter2;
unsigned char Compare=4,Num=1; //默认占空比40%,死区10%,可以改值改变占空比
void Delay(unsigned int xms) //延时函数
{
unsigned char i, j;
while(xms--)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
void Timer0_Init() //定时器初始化
{
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模
TH0 = (65535-100000)/256; //将高八位储存在寄存器
TL0 = (65535-100000)%256; //将低八位储存在寄存器
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0=1;
EA=1;
PT0=0;
}
void key_scan() //按键加频率(1~20HZ按键加1,20~50HZ按键加5,50~100HZ按键加10)
{
if(KeyNum == 0)
{
Delay(20);while(P3_1==0);Delay(20);
if (f<20) {f ++ ;}
else if (f<50) {f += 5;}
else if (f<100) {f += 10;}
else {f=1;}
}
}
void Timer0_Routine() interrupt 1 //定时器中断
{
TH0 = (result/256); //将高八位储存在寄存器
TL0 = result%256; //将低八位储存在寄存器
Counter1++;
Counter2=Counter1;
Counter1%=10;
if(Counter1<Compare)
{
LED1=1;
}
else
{
LED1=0;
} //第一路PWM
Counter2%=10; //第二路PWM
if(Counter2<(Compare+Num))
{
LED2=0;
}
if((Counter2>(Compare+Num))&&(Counter2<(Compare+Compare+Num)))
{
LED2=1;
}
else
{
LED2=0;
}
}
void main(void)
{
Timer0_Init();
while(1)
{
result = 65535-100000/f;
key_scan();
}
}
51单片机输出两路PWM波(互补带死区)频率可调
于 2023-11-01 15:05:54 首次发布