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

📄 防止乱改找不到源码的副本 servo.c

📁 按键控制舵机PWM电路源程序例子文件,需要的可以
💻 C
字号:
/******************************************************************************
标题:按键控制舵机PWM电路C语言版
说明:AT8951改变脉冲宽度控制舵机正反向(C语言版)
作者:kaka000      论坛:http://www.proteus.com.cn
日期:2007年11月10日
******************************************************************************/

#include"at89x51.h" 
unsigned char TL01;
unsigned char TH01;
unsigned char TL02;
unsigned char TH02;
int A,C;

//延时10ms子程序****************************************************************
void delay10ms(void)	
{ 
	unsigned char i,j; 
	for(i=20;i>0;i--) 
	for(j=248;j>0;j--) ;
} 
//延时200ms子程序***************************************************************
void delay02s(void)			
{ 
	unsigned char i; 
	for(i=20;i>0;i--) 
	delay10ms();
} 

//主程序***********************************************************************
void main(void) 
{
	EA=1;		//开总中断
	ET0=1;		//允许T0中断
	P3_7=0;		//脉冲波形起始状态 
	TMOD=0x01; 	//定时,方式0
	F0=0;		//清标志位
	TR0=1;		//启动T0
	TL01=0x2E;	//舵机0 位,1.5ms定时初始值
	TH01=0x0FA;	
	TL02=0x0B2;	//8.5ms定时初始值
	TH02=0x0B7;
	while(1)
	{
		if(P1_0==0)
		{
			delay10ms();		//按下,延时,防抖
			if(P1_0==0)
			{					//等待释放
				delay02s();
				A=TL01;
				if(A!=0xFF)		//判断是否到+90°
				{
	    			C=0;
					A=A-20;		
					if(A<=0)
					{A+=255;C=1;}
					if(C==0)
					{
						TL01=A;
		 				C=0;
						A=TL02;
						A=A+20;
						if(A>=255)
			    			{A-=255;C=1;}
						if(C==0)
							{TL02=A;}
						else
							{TH02++;TL02=A;C=0;}
					}
					else
					{
						TH01--;
						TL01=A;
			 			C=0;
						A=TL02;
						A=A+20;
						if(A>=255)
				    		{A-=255;C=1;}
						if(C==0)
							{TL02=A;}
						else
							{TH02++;TL02=A;C=0;}
					}
				}
			}
         }
		if(P1_1==0)
		{
			delay10ms();		//按下,延时,防抖
			if(P1_1==0)
			{					//等待释放
				delay02s();
				A=TL01;
				if(A!=0x22)		//判断是否到-90°
				{
				    C=0;
					A=A+20;		
					if(A>=255)
						{A-=255;C=1;}
					if(C==0)
					{
						TL01=A;
	 					C=0;
						A=TL02;
						A=A-20;
						if(A<=0)
		    				{A+=255;C=1;}
						if(C==0)
							{TL02=A;}
						else
							{TH02--;TL02=A;C=0;}
					}
	··				else
					{
						TH01++;
						TL01=A;
	 					C=0;
						A=TL02;
						A=A-20;
						if(A<=0)
		 				   	{A+=255;C=1;}
						if(C==0)
							{TL02=A;}
						else
							{TH02--;TL02=A;C=0;}
					}	
				}
			}
		}
		if(P1_2==0)
		{
			delay10ms();  //按下,延时,防抖
			if(P1_2==0)
			{		      //等待释放
				delay02s();
				TL01=0x2E;	  
				TH01=0x0FA;	
				TL02=0x0B2;	
				TH02=0x0B7;
			}	
		}
	}
}
//中断服务程序*************************************************************
void timer0() interrupt 1 using 1  
{
	F0=~F0;	
	P3_7=~P3_7;		//输出高、低电平脉冲
	if(F0==1)
	{
		TL0=TL01;	//高电平脉冲定时常数
		TH0=TH01;
	}
	else
	{
		TL0=TL02;	//低电平脉冲定时常数
		TH0=TH02;	
	}
}

⌨️ 快捷键说明

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