#include <REGX52.H>
sbit LED1=P2^0; //第一路PWM
sbit LED2=P2^1; //第二路PWM
sbit KeyNumber=P3^1; //按键
unsigned char Counter1,Counter2,Compare;
unsigned char Speed,Num,KeyNum;
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[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
void Nixie(unsigned char Location,Number)
{
switch(Location) //位码输出
{
case 1:P2_4=1;P2_3=1;P2_2=1;break;
case 2:P2_4=1;P2_3=1;P2_2=0;break;
case 3:P2_4=1;P2_3=0;P2_2=1;break;
case 4:P2_4=1;P2_3=0;P2_2=0;break;
case 5:P2_4=0;P2_3=1;P2_2=1;break;
case 6:P2_4=0;P2_3=1;P2_2=0;break;
case 7:P2_4=0;P2_3=0;P2_2=1;break;
case 8:P2_4=0;P2_3=0;P2_2=0;break;
}
P0=NixieTable[Number]; //段码输出
Delay(10); //显示一段时间
P0=0x00; //段码清0,消影
}
unsigned char Key()
{
unsigned char KeyNumber=0;
if(P3_1==0){KeyNumber=1;}
if(P3_0==0){KeyNumber=2;}
if(P3_2==0){KeyNumber=3;}
if(P3_3==0){KeyNumber=4;}
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单片机(江科大自化协A2开发板)双路互补带死区PWM占空比可调
最新推荐文章于 2024-08-30 17:22:50 发布
文章介绍了如何使用C语言和REGX52.H库在嵌入式系统中实现PWM控制两个LED灯,并通过定时器0和按键调整LED的占空比,同时利用Nixie管显示占空比档位。
摘要由CSDN通过智能技术生成