单片机芯片使用STC15W408AS,由于PWM端数量只有3路,但实际使用到需要4路,为方便使用编写一段PWM,占空比是1/3,向大家分享下。
想了很久,自己思维定式,向大家请教,有没有另外一种更简洁的方案,并且能使PWM占空比是1:4(开:关),占空比的波形尽量小,谢谢大家,我继续思考中
单片机源程序如下,给大家分享看
u16 xdata JS1=0; //计时时间
u16 xdata JS2=0; //计时时间
u16 xdata JS3=0; //计时时间
u16 xdata JS4=0; //计时时间
u16 xdata JS11=0; //计时时间
u16 xdata JS22=0; //计时时间
u16 xdata JS33=0; //计时时间
u16 xdata JS44=0; //计时时间
u16 xdata JS111=0; //计时时间
u16 xdata JS222=0; //计时时间
u16 xdata JS333=0; //计时时间
u16 xdata JS444=0; //计时时间
u16 xdata QD1=60; //启动阀的时间
u16 xdata QD2=61; //启动阀的时间
u16 xdata GB1=20; //关闭延时
bit bdata IN1_BZ=0;
bit bdata IN2_BZ=0;
bit bdata IN3_BZ=0;
bit bdata IN4_BZ=0;
u16 xdata time_cnt;
bit bdata FZ_BZ=0;
void T0_Init(void) //T0初始化 60μS 11.0592
{
AUXR |= 0x80; //设置为1T工作模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x68; //设置定时初始值
TH0 = 0xFD; //设置定时初始值
TF0 = 0; //清除TF0
TR0 = 1; //定时器0启动
ET0=1; //T0开
EA=1; //总中断开
}
void T0_ZD(void) interrupt 1 //
{
time_cnt++;
if(time_cnt<1000)
{
FZ_BZ=0;
}
else if(time_cnt<2000)
{
FZ_BZ=1;
}
else
{
time_cnt=0;
}
if(FZ_BZ==0) //判断是否有输入信号
{
JS111=0;
JS1++;
IN1_BZ=1;
if(JS1<=QD1) //直接给电
{
OUT1=0; //开阀
}
else //进入pwm
{
JS1=QD2;
JS11++;
if(JS11<=1)//直接给电
{
OUT1=0; //开阀
}
else //不给电
{
if(JS11==3)
{
JS11 = 0; //置0
}
OUT1=1; //关阀
}
}
}
else
{
JS111++;
if(JS111<GB1)//
{
OUT1=0;
}
else
{
OUT1=1;
JS1=0;
IN1_BZ=0;
}
}
//***************************************************************************
if(FZ_BZ==0) //判断是否有输入信号
{
JS222=0;
JS2++;
IN2_BZ=1;
if(JS2<=QD1) //直接给电
{
OUT2=0; //开阀
}
else //进入pwm
{
JS2=QD2;
JS22++;
if(JS22<=1)//直接给电
{
OUT2=0; //开阀
}
else //不给电
{
if(JS22==3)
{
JS22 = 0; //置0
}
OUT2=1; //关阀
}
}
}
else
{
JS222++;
if(JS222<GB1)
{
OUT2=0;
}
else
{
OUT2=1;
JS2=0;
IN2_BZ=0;
}
}
//***********************************************************************
if(FZ_BZ==0) //判断是否有输入信号
{
JS333=0;
JS3++;
IN3_BZ=1;
if(JS3<=QD1) //直接给电
{
OUT3=0; //开阀
}
else //进入pwm
{
JS3=QD2;
JS33++;
if(JS33<=1)//直接给电
{
OUT3=0; //开阀
}
else //不给电
{
if(JS33==3)
{
JS33 = 0; //置0
}
OUT3=1; //关阀
}
}
}
else
{
JS333++;
if(JS333<GB1)
{
OUT3=0;
}
else
{
OUT3=1;
JS3=0;
IN3_BZ=0;
}
}
//************************************************************
if(FZ_BZ==0) //判断是否有输入信号
{
JS444=0;
JS4++;
IN4_BZ=1;
if(JS4<=QD1) //直接给电
{
OUT4=0; //开阀
}
else //进入pwm
{
JS4=QD2;
JS44++;
if(JS44<=1)//直接给电
{
OUT4=0; //开阀
}
else //不给电
{
if(JS44==3)
{
JS44 = 0; //置0
}
OUT4=4; //关阀
}
}
}
else
{
JS444++;
if(JS444<GB1)
{
OUT4=0;
}
else
{
OUT4=1;
JS4=0;
IN4_BZ=0;
}
}
}
|