⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pwm.txt

📁 PWM信号发生及测量仪(50Hz
💻 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 + -