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

📄 main.c

📁 51单片机控制产生4路标准舵机PWM(周期20ms
💻 C
字号:
#include<REG51F.H>
#include<KEY.h>
#include<LED.h>
#include<communicate.h>

sbit pwms=P1^6;
sbit pwmout=P1^7;
sbit key1=P1^0;
sbit key2=P1^1;
sbit key3=P1^2;
sbit key4=P1^3;
unsigned char pkey;	
unsigned int pwmset[4];
unsigned char highTh[4],highTl[4],lowTh[4],lowTl[4],mode,i,Mtoset;
float ftemp;
unsigned int temp;
bit pwmhigh;
/////
							   
////



void delay()
{unsigned i;
for(i=0;i<200;i++);
}
 void INIT_PWM()
{
TMOD=0x01;									   
IP=0x08;
IE|=0x02;
EA=1;
TH0=0xee;  //20us;
TL0=0xee;
TR0=1;
}

#if 0
void init_serialcomm( void ) 
{ 
    SCON  = 0x50;		        /* SCON: mode 1, 8-bit UART, enable receive     */
    TMOD |= 0x20;               /* TMOD: timer 1, mode 2, 8-bit reload        */
    TH1   = 0xF4;                /* TH1:  reload value for 2400 baud @ 11.0592MHz   */
    TR1   = 1;                  /* TR1:  timer 1 run                          */
    TI    = 0;
	ES=1;
	RI	=0;                  /* TI:   set TI to send first char of UART    */

}  
#endif


void int1() interrupt 1
{ 

EA=0;	
TF0=0;


if(pwmhigh)
{
	P1=P1&(~(0x80>>Mtoset));
	TH0=lowTh[Mtoset];
	TL0=lowTl[Mtoset];
	pwmhigh=0;
	 Mtoset++;
if(Mtoset>=4)Mtoset=0;
}
else
{	
	P1=P1|(0x80>>Mtoset);
	TH0=highTh[Mtoset];
	TL0=highTl[Mtoset];
	pwmhigh=1;	  
	
}
EA=1;

}

void sett(unsigned char a,unsigned int temp2)
{
pwmset[a]=temp2;
if(pwmset[a]>5000)pwmset[a]=0;
if(pwmset[a]>995)pwmset[a]=995;
 ftemp=(pwmset[a]+1000)/1.085;
 temp=0xffff-ftemp;
 highTh[a]=temp>>8;
 highTl[a]=temp&0x00ff;
 temp=0xffff-(temp-0xedff);
 lowTh[a]=temp>>8;
 lowTl[a]=temp&0x00ff;
}

void comintreputer()
{
switch(command[0])
{

case 0x01:	  //+=5,as key1
{
	if(mode==0)
	{ 
	for(i=0;i<4;i++)
		{
		  sett(i,pwmset[i]+5);		 
		  setdig(&pwmset[0]);
		}					   

	}
	else
	{
	   sett(mode-1,pwmset[mode-1]+5);
	   if(pwmset[mode-1]>995)pwmset[mode-1]=995;
	   setdig(&pwmset[mode-1]);
	}
	break; 
}
case 0x02:	 //-=5,as key2
{
	if(mode==0)
	{ 
	for(i=0;i<4;i++)
		{
		sett(i,pwmset[i]-5);		 
		 setdig(&pwmset[0]);
		}
	}
	else
	{
	 sett(mode-1,pwmset[mode-1]-5);
	   setdig(&pwmset[mode-1]);
	}
	break;
}
case 0x03:		   //set pwmset=0;
{
if(mode==0)
	{ 
	for(i=0;i<4;i++)
		{
		  sett(i,0); 		 
		  setdig(&pwmset[0]);
		}					   

	}
	else
	{
	 sett(mode-1,0);
	
	   setdig(&pwmset[mode-1]);
	  
	}

break;
}
case 0x04:		 //mode++;
{
mode++;
if(mode>=5)mode=0;
if(!mode)
{setdig(&pwmset[0]);}
else
{
setdig(&pwmset[mode-1]);
}
dig[3]=mode;
break;

}	 
case 0x05:	//set mode
{
mode=command[1]%4;
if(!mode)
{setdig(&pwmset[0]);}
else
{
setdig(&pwmset[mode-1]);
}
dig[3]=mode;
break;

}
case 0x06:		//set pmw[command[1]]=command[2]<<8+command[3]
{ 		mode=command[1];
		temp=command[2];
		temp=temp<<8;
		temp+=command[3];
		sett(mode-1,temp);
		setdig(&pwmset[mode-1]);
		dig[3]=mode;
break;
}

}//end of switch
}//end of comintpretor

void main()
{


INIT_PWM();
Init_UART();
SBUF='#';	  
IP=0x02;//set timer0 high interrupt level
mode=0;
for(i=0;i<4;i++)
{
sett(i,0);
}
setdig(&pwmset[0]);
dig[3]=mode;

while(1)
{
//key4
if((P1&0x08)==0)
{
if(pkey&0x08)
{
//begin of 	cottents a keypress
mode++;
if(mode>=5)
mode=0;
if(!mode)
{setdig(&pwmset[0]);}
else
{
setdig(&pwmset[mode-1]);
}
dig[3]=mode;


//end of cottens of a keypress
}
pkey&=0xff-0x08;
}
else
{
pkey|=0x08;
}//end key4

	
 ///key1
 if((P1&0x01)==0)
 {	 if(pkey&0x01==1)
 	{ 

//////////
	if(mode==0)
	{ 
	for(i=0;i<4;i++)
		{
		  sett(i,pwmset[i]+5);
		  
		  setdig(&pwmset[0]);
		

		}					   

	}
	else
	{
	   sett(mode-1,pwmset[mode-1]+5);
	   setdig(&pwmset[mode-1]);
	   

	}
	  
////////////////
	}
	pkey&=0xfe;	 //set pkey.0=0;
 }	
  else
 {
 pkey|=0x01;		//set pkey.0=1;
 }


 //key2
 	 if((P1&0x02)==0)
 {
 	 if(pkey&0x02)
 	{ 
	////////////////
	if(mode==0)
	{ 
	for(i=0;i<4;i++)
		{
		sett(i,pwmset[i]-5);
		 
		  setdig(&pwmset[0]);
		 

		}					   

	}
	else
	{
	 sett(mode-1,pwmset[mode-1]-5);
	   setdig(&pwmset[mode-1]);
	  

	}
  /////////////////////
 }
 pkey&=0xff-0x02;
 }
 else{
 pkey|=0x02;
 }

 ///key3

if(SW3_Pressed)
 {
	  
	if(mode==0)
	{ 
	for(i=0;i<4;i++)
		{
		  sett(i,pwmset[i]-5);
		 
		  setdig(&pwmset[0]);
	

		}					   

	}
	else
	{
	 sett(mode-1,pwmset[mode-1]-5);
	
	   setdig(&pwmset[mode-1]);
	}
	
	}

   if(commandready)
   {
   ES=0;
   comintreputer();
   commandready=0;
   ES=1;
   }
	showdig();
}//end while
}//end main

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -