一个程序写了一半了,是用51单片机输出pwm信号的

2024-11-18 20:27:41
推荐回答(1个)
回答(1):

很简单哦,在中断服务函数中用一个变量用来计每个占空比要时间持续的时间,case 0:如果第一次占空比时间到了的话就让a++;ZR赋予你想要的占空比,就进去case 1这里来哦,你想模拟PWM是吧,你定时2ms作为一等分时间太长了,调节起来不会很明显,还会晃动,我们一般模拟PWM,都是100us作为一等分的哦
#include
#define uchar unsigned char
sbit P1.0 = P1^0;
uchar ZR=4; //ZR每次加3到13之后又变回来,控制占空比
uchar a = 0;
unsigned int T1sCount = 0;
void Timer0(void) interrupt 1 // 定时器0 PWM 控制
{
TH0=(65536-2000)/256; // 定时时间 可以修改
TL0=(65536-2000)%256;
counter++;
if(counter >= 16)
counter = 0; // PWM 16级 可以修改
if(counter >=ZR)
P1_0 = 0;
else
P1_0 = 1;
Flag_T2ms = 1;
}
void main()
{
TMOD=0x01;
TH0=(65536-2000)/256; // 定时时间 可以修改
TL0=(65536-2000)%256;
EA=1;
ET0=1;
TR0=1;
while(1)
{
if(Flag_T2ms == 1)
{
Flag_T2ms = 0;
switch(a)
{
case 0:
T1sCount++;
if(T1sCount >= 500)//500*2ms = 1000ms = 1s
{
T1sCount = 0;
BR = 7;//重新赋占空比的值
a++;//跳转到case 1执行
}
break;

case 1:
T1sCount++;
if(T1sCount >= 500)//500*2ms = 1000ms = 1s
{
T1sCount = 0;
BR = 7;//重新赋占空比的值
a++;//跳转到case 1执行
}
break;
case 2:
T1sCount++;
if(T1sCount >= 500)//500*2ms = 1000ms = 1s
{
T1sCount = 0;
BR = 10;//重新赋占空比的值
a = 0;//跳转到case 1执行
}
break;
fefault:
a = 0;
BR = 4;
break;

}
}
}
}