📄 pwm.txt
字号:
#include "reg52.h"
unsigned char code Duan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
0x6f,0X76,0X3e,0x55,0x37,0x77,0x5e,0x72};
unsigned char Data_Buffer[4]={1,2,0,0};
unsigned char Pwm_out=50;//范围:10-90,步长为5
unsigned char Pwm_in=0;
unsigned char th0_1,tl0_1,th0_0,tl0_0;
sbit P10=P1^0;
sbit P11=P1^1;
sbit P12=P1^2;
sbit P13=P1^3;
sbit P23=P2^3;
sbit P32=P3^2;
sbit DOWN=P2^2;
sbit UP=P2^1;
bit flag=0;
bit G_flag=0;
//1:PWM正在输出高电平,0:PWM正在输出低电平
void Comute_pwmout()
{
float t;
unsigned int x;
t=20;
t=t*Pwm_out/100;//计算高\低宽度时间ms为单位
t=t*921.6;
t=65535-t;
x=t;
th0_1=x/256;
tl0_1=x%256;
t=20;
t=t*(100-Pwm_out)/100;//计算高\低宽度时间ms为单位
t=t*921.6;
t=65535-t;
x=t;
th0_0=x/256;
tl0_0=x%256;
Data_Buffer[0]=Pwm_out/10;
Data_Buffer[1]=Pwm_out%10;
}
void main()
{
unsigned char Bit=0;
unsigned int xx=100,yy=0;
float t;
bit x=1,y=1,z=1;
Comute_pwmout();
TMOD=0x11;
TH0=th0_1;
TL0=tl0_1;
TR0=1;
ET0=1;
EA=1;
IT0=1;
EX0=1;
TH1=0;
TL1=0;
TR1=1;
while(1)
{
if(UP==1)x=1;//pwm增加
else if(x==1)
{
x=0;
Pwm_out+=5;
if(Pwm_out>90)Pwm_out=90;
Comute_pwmout();
}
if(DOWN==1)y=1;//pwm减小
else if(y==1)
{
y=0;
if(Pwm_out>10)
Pwm_out-=5;
Comute_pwmout();
}
if(P32==0)z=1;
else if(z==1)//P32上升沿
{
z=0;
TH1=0; //重新置0
TL1=0;
TR1=1;
}
if(flag)//重新计算频率
{
flag=0;
xx=TH1*256+TL1;
if(xx<yy-20||xx>yy+20)//PWM基本不变时,不用重新计算
{
yy=xx;
t=xx;
t=t/921.6;//计算高电平的时间,MS为单位
t=t*(100/20);//周期为20MS,计算百分比
Pwm_in=t;
Data_Buffer[2]=Pwm_in/10;//计算的频率在后两位数码管显示
Data_Buffer[3]=Pwm_in%10;
}
}
Bit++;//数码管扫描
if(Bit>=4)Bit=0;
P1|=0x0f;
P0=Duan[Data_Buffer[Bit]];
switch(Bit)
{
case 0: P10=0;break;
case 1: P11=0;break;
case 2: P12=0;break;
case 3: P13=0;break;
}
}
}
void timer0() interrupt 1 //方波发生定时器
{
if(G_flag==0)//输出PWM的低电平
{
TH0=th0_0;
TL0=tl0_0;P23=0;G_flag=1;
}
else //输出PWM的高电平
{
TH0=th0_1;
TL0=tl0_1;P23=1;G_flag=0;
}
P32=P23;//实际当中应用线连接
}
void int0() interrupt 0 //外部中断,P32作测频。
{
flag=1; //需要更新PWM值
TR1=0;//下降沿,停止计数
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -