51单片机驱动 mg996r金属舵机 STC89C52单片机直接驱动金属大舵机

在这里插入图片描述

/*
	无论是大舵机,还是小舵机,控制方法都一样会
	区别在  大舵机只能接P0口(此口外接上拉,驱动电流最大)
			小舵机任意口
*/
//#include<reg51.h>
//#define uint unsigned int
//#define uchar unsigned char
//sbit S1=P0^3;
//sbit S2=P0^4;
//sbit S3=P0^5;
//sbit S4=P0^6;
//sbit S5=P0^7;
//
********舵机************//
//uchar count=0,jd=10;
//sbit duoji_pwm=P0^1;
//void Timer1Init();
//void key();
//void delay(uint x);
//void main()
//{
    
    
//	Timer1Init();
//	while(1)
//	{
    
    
//	  key();
//	}
//}
//void key()
//{
    
    
//	 if(S1==0)
//	 {
    
    
//		delay(5);
//		if(S1==0)
//		{		
//		  jd=13;
//		}
//		while(!S1);	
//	 }
//  	else if(S2==0)
//	 {
    
    
//		delay(5);
//		if(S2==0)
//		{
    
    
//		  jd=10;
//		}
//		while(!S2);	
//	 }
//	 else if(S3==0)
//	 {
    
    
//		delay(5);
//		if(S3==0)
//		{		 
//		   jd=6;
//		}
//		while(!S3);	
//	 }
//}
///*******************************************************************************
//* 函 数 名 :Timer1Init
//* 函数功能 :定时器1  舵机,PWM
///*******************************************************************************/
void Timer1Init()//舵机		//0.5毫秒@11.0592MHz   定时器时钟12T模式
{
    
    
	TMOD |= 0x10;		//设置定时器模式
//	IE = 0X82;		// (EA = 1;//开总中断  ET1=1;//开中断)
	TH1 = 0xFE;		//设置定时初值
	TL1 = 0x33;		//设置定时初值
	TR1 = 1;		//定时器1开始计时
	ET1=1;//开中断	 
	EA = 1;//开总中断      
}
//void Timer1Init(void)		//100微秒@12.000MHz
//{
    
    
//	TMOD |= 0x10;		//设置定时器模式
//	TL1 = 0x9C;		//设置定时初值
//	TH1 = 0xFF;		//设置定时初值
//	TF1 = 0;		//清除TF1标志
//	TR1 = 1;		//定时器1开始计时
//	ET1=1;//开中断	 
//	EA = 1;//开总中断  
//}
//
//void tiem1() interrupt 3
//{
    
    
//	static uchar t=1;
	TH1 = 0xFE;		//设置定时初值
	TL1 = 0x33;		//设置定时初值
//    TL1 = 0x9C;		//设置定时初值
//	TH1 = 0xFF;		//设置定时初值
//	t++;
//
	if(t>50)	t=0;
	if(t<SPEED)	motor_pwm=1; 
	else 
	motor_pwm=0;

//
//	if(count<=jd)
//	duoji_pwm=1;
//	else 
//	duoji_pwm=0;
//	count=count+1;	//0.5毫秒 次数加一
//	count=count%200;	//始终保持40,即周期20毫秒
//}
//void delay(uint x)
//{
    
    
//	uint i,j;
//	for(i=x;i>0;i--)
//	for(j=110;j>0;j--);
//}


/*
	无论是大舵机,还是小舵机,控制方法都一样会
	区别在  大舵机只能接P0口(此口外接上拉,驱动电流最大)
			小舵机任意口
*/

#include<reg52.h>       
#include<stdio.h>        

#define uint unsigned int         
#define uchar unsigned char 
sbit S1=P0^3;
sbit S2=P0^4;
sbit S3=P0^5;
sbit S4=P0^6;
sbit S5=P0^7;
int i=0,k=1;  
//int a[3]={700,1500,2200};//700 左极限,2300右极限	(数组的调用和单独写等效, 但为什么实践混乱)
uchar ss1,ss2=1,ss3,ss4;
sbit duoji_pwm=P0^0;                                     
void Init_t0(void);
void delay(uint x);
void key();
void main()  
{
    
             
    duoji_pwm=1;                                                      
    Init_t0(); 
    while(1)
	{
    
    
		key();
	}
}
void key()
{
    
    
	 if(S1==0)
	 {
    
    
		delay(5);
		if(S1==0)
		{
    
    		
		//	k=0;
			ss1=1;ss2=0;ss3=0;ss4=0;
		}
		while(!S1);	
	 }
  	else if(S2==0)
	 {
    
    
		delay(5);
		if(S2==0)
		{
    
    		 
		//	k=1; 
			ss1=0;ss2=1;ss3=0;ss4=0;
		}
		while(!S2);	
	 }
	 else if(S3==0)
	 {
    
    
		delay(5);
		if(S3==0)
		{
    
    		 
		//	k=2; 
			ss1=0;ss2=0;ss3=1;ss4=0;
		}
		while(!S3);	
	 }
	 else if(S4==0)
	 {
    
    
		delay(5);
		if(S4==0)
		{
    
    		 
		//	k=2; 
			ss1=1;ss2=0;ss3=0;ss4=0; delay(200);
			ss1=0;ss2=0;ss3=1;ss4=0; delay(200);
			ss1=1;ss2=0;ss3=0;ss4=0; delay(200);
			ss1=0;ss2=0;ss3=1;ss4=0; delay(200);
			ss1=1;ss2=0;ss3=0;ss4=0; delay(200);
			ss1=0;ss2=0;ss3=1;ss4=0; delay(200);
			ss1=1;ss2=0;ss3=0;ss4=0; delay(200);
			ss1=0;ss2=0;ss3=1;ss4=0; delay(200);
			ss1=0;ss2=1;ss3=0;ss4=0; delay(200);
		}
		while(!S4);	
	 }								
}
void Init_t0(void)
{
    
       
    TMOD|=0x01;                 
    TH0=(65536-700)/256;//初始化值 不起作用 
    TL0=(65536-700)%256;       
    EA=1; 
    ET0=1; 
    TR0=1;         
}



void PWM0() interrupt 1       
{
    
      

//		if(P0_0==1)                        
//	    {  
//		    TH0=(65536-(19950-a[k]))/256;                
//	        TL0=(65536-(19950-a[k]))%256;                                            
//	    } 
//	    else                                       
//	    { 
//	        TH0=(65536-a[k])/256; 
//	        TL0=(65536-a[k])%256; 
//
//	    } 
//
	if(ss1==1)
	{
    
    
		if(duoji_pwm==1)                        
	    {
    
      
	
	        TH0=(65536-(19950-1150 ))/256;                
	        TL0=(65536-(19950-1150))%256;                                            
	    } 
	    else                                       
	    {
    
     
	        TH0=(65536-1150)/256; 
	        TL0=(65536-1150)%256; 
	    } 
	}
	if(ss2==1)
	{
    
    
		if(duoji_pwm==1)                        
	    {
    
      
	
	        TH0=(65536-(19950-1500))/256;                
	        TL0=(65536-(19950-1500))%256;                                            
	    } 
	    else                                       
	    {
    
     
	        TH0=(65536-1500)/256; 
	        TL0=(65536-1500)%256; 
	    } 
	}
	if(ss3==1)
	{
    
    
		if(duoji_pwm==1)                        
	    {
    
      
	
	        TH0=(65536-(19950-1800))/256;                
	        TL0=(65536-(19950-1800))%256;                                            
	    } 
	    else                                       
	    {
    
     
	        TH0=(65536-1800)/256; 
	        TL0=(65536-1800)%256; 
	
	    } 
	}
    duoji_pwm=~duoji_pwm; 
//    i++;
//    if (i>=80)         
//    {
    
    
//        i=0;
//        k++;
//        if(k==8)k=0;
//    }

} 
void delay(uint x)
{
    
    
	uint i,j;
	for(i=x;i>0;i--)
	for(j=110;j>0;j--);
}             

猜你喜欢

转载自blog.csdn.net/m0_51233386/article/details/131556534