#include <REGX52.H>
sbit LED1=P2^0; //第一路PWM
sbit LED2=P2^1; //第二路PWM
sbit KeyNumber=P3^7; //按键
unsigned char Counter1,Counter2,Compare;
unsigned char Speed,Num,KeyNum;
void Delay(unsigned int xms) //延时函数
{
unsigned char i, j;
while(xms--)
{
i = 11;
j = 190;
do
{
while (--j);
} while (--i);
}
}
void Timer0_Init(void)
{
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0xA4; //设置定时初值
TH0 = 0xFF; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0=1;
EA=1;
PT0=0;
}
unsigned char NixieTable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
void Nixie(unsigned char Location,Number)
{
switch(Location) //位码输出
{
case 1:P1_0=0;break;
case 2:P1_1=0;break;
case 3:P1_2=0;break;
case 4:P1_3=0;break;
}
P0=NixieTable[Number]; //段码输出
Delay(1); //显示一段时间
P0=0xFF; //段码清0,消影
}
unsigned char Key()
{
unsigned char KeyNumber=0;
if(P3_7==0){Delay(10);while(P3_7==0);Delay(10);KeyNumber=1;} //按键及消抖
return KeyNumber;
}
void Timer0_Routine() interrupt 1 //设置跳变值,输出PWM,
//根据第一路情况计算第二路跳变值,并确保死区形成
{
TL0 = 0xA4; //设置定时初值
TH0 = 0xFF; //设置定时初值
Counter1++;
Counter2=Counter1;
Counter1%=100;
if(Counter1<Compare){LED1=1;}
else{LED1=0;}
Counter2%=100;
if(Counter2<(Compare+Num)){LED2=0;}
if((Counter2>(Compare+Num))&&(Counter2<(Compare+Compare+Num))){LED2=1;}
else{LED2=0;}
}
void main()
{
Timer0_Init();
while(1)
{
KeyNum=Key();
if(KeyNum==1)
{
Speed++;
Speed%=6;
if(Speed==0){Compare=20;Num=30;} //调节占空比,一共六个档位
if(Speed==1){Compare=25;Num=25;}
if(Speed==2){Compare=30;Num=20;}
if(Speed==3){Compare=35;Num=15;}
if(Speed==4){Compare=40;Num=10;}
if(Speed==5){Compare=45;Num=5;}
}
Nixie(1,Speed); //数码管显示占空比档位
}
}
51单片机输出双路PWM波,互补带死区,占空比可调
最新推荐文章于 2024-06-18 10:31:38 发布