51单片机输出两路频率为30KHZ的相位差为180度的PWM控制半桥逆变电路程序
时间: 2023-05-29 11:01:25 浏览: 128
这是一段51单片机的C语言代码,用于输出两路频率为30KHz的相位差为180度的PWM控制半桥逆变电路:
```
#include<reg52.h> //51单片机头文件
sbit IN1=P1^0; //定义IN1引脚
sbit IN2=P1^1; //定义IN2引脚
sbit EN1=P1^2; //定义EN1引脚
sbit EN2=P1^3; //定义EN2引脚
sbit CTR=P3^2; //定义CTR引脚
//函数声明
void delay_us(unsigned int i);
void delay_ms(unsigned int i);
void PWM1(unsigned char i);
void PWM2(unsigned char i);
void main()
{
unsigned char i;
TMOD=0x02; //定时器0工作在8位自动重装模式
TH0=0x00; //定时器0自动重装值为0
TL0=0x00; //定时器0自动重装值为0
TR0=1; //启动定时器0
ET0=1; //开启定时器0中断
EA=1; //全局中断允许
IN1=0; //IN1引脚设置为低电平
IN2=0; //IN2引脚设置为低电平
EN1=1; //使能EN1引脚
EN2=1; //使能EN2引脚
CTR=1; //CTR引脚设置为高电平
while(1)
{
for(i=0;i<=255;i++)
{
PWM1(i); //输出PWM1波
PWM2(255-i); //输出PWM2波
delay_us(50); //延时50us
}
for(i=255;i>=0;i--)
{
PWM1(i); //输出PWM1波
PWM2(255-i); //输出PWM2波
delay_us(50); //延时50us
}
}
}
//中断函数,用于产生30KHz的PWM波
void timer0() interrupt 1
{
TH0=0xFF; //定时器0自动重装值为255
TL0=0x8E; //定时器0自动重装值为142
CTR=~CTR; //CTR引脚取反
}
//输出PWM1波
void PWM1(unsigned char i)
{
static unsigned char PWM1_value=0; //PWM1波占空比
if(i!=PWM1_value) //如果i与PWM1_value不相等
{
if(i<PWM1_value) //如果i小于PWM1_value
{
IN1=1; //IN1引脚设置为高电平
delay_us(2*(PWM1_value-i)); //延时,使得输出波形的占空比为i/255
IN1=0; //IN1引脚设置为低电平
delay_us(2*i); //延时,使得输出波形的周期为1/30000
}
else //如果i大于PWM1_value
{
IN1=1; //IN1引脚设置为高电平
delay_us(2*i); //延时,使得输出波形的占空比为i/255
IN1=0; //IN1引脚设置为低电平
delay_us(2*(PWM1_value-i)); //延时,使得输出波形的周期为1/30000
}
PWM1_value=i; //更新PWM1波的占空比
}
}
//输出PWM2波
void PWM2(unsigned char i)
{
static unsigned char PWM2_value=0; //PWM2波占空比
if(i!=PWM2_value) //如果i与PWM2_value不相等
{
if(i<PWM2_value) //如果i小于PWM2_value
{
IN2=1; //IN2引脚设置为高电平
delay_us(2*(PWM2_value-i)); //延时,使得输出波形的占空比为i/255
IN2=0; //IN2引脚设置为低电平
delay_us(2*i); //延时,使得输出波形的周期为1/30000
}
else //如果i大于PWM2_value
{
IN2=1; //IN2引脚设置为高电平
delay_us(2*i); //延时,使得输出波形的占空比为i/255
IN2=0; //IN2引脚设置为低电平
delay_us(2*(PWM2_value-i)); //延时,使得输出波形的周期为1/30000
}
PWM2_value=i; //更新PWM2波的占空比
}
}
//延时函数,每延时1us所占用的机器周期数为6
void delay_us(unsigned int i)
{
while(i--)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
}
//延时函数,每延时1ms所占用的机器周期数为248
void delay_ms(unsigned int i)
{
while(i--)
{
delay_us(1000);
}
}
```
阅读全文