单个舵机控制程序

/*****************************************************************************
 ** 文件			: main.c
 ** 作者			: Zheng23
 ** 日期			: 			
 ** 功能			: 
/*****************************************************************************/
//#include 
//#include"STC89C5xRC.H"


//一定要用12M的晶振
//一定要用12M的晶振
//一定要用12M的晶振
//一定要用12M的晶振
//一定要用12M的晶振
//一定要用12M的晶振

#include "reg51.h"

#define uint8	unsigned char    
#define uint16	unsigned short int
#define uint32	unsigned long 

sbit SERVO0=P1^4;			//控制舵机的PWM输出口

uint16 Servo0PwmDuty=1500;	//PWM脉冲宽度

/***********************************************************
* 名    称: DelayMs(uint16 ms) 
* 功    能: 延时ms毫秒
* 入口参数: ms	毫秒
* 出口参数: 无
* 说    明: 					 
/**********************************************************/
void DelayMs(uint16 ms)
{
	uint16 i,j;
	for(i=0;i<85;i++)		//89单片机用85,12系列单片机用800
		for(j=0;j>8;		//将16位数据右移8位,也就是将高8位移到低八位,再赋值给8位数据	
	TR0 = 1;
}
/***********************************************************
* 名    称: main()
* 功    能: 入口函数
* 入口参数: 无
* 出口参数: 无
* 说    明: 					 
/**********************************************************/ 
void main(void)
{

	InitTimer0();	//定时器0初始化
	EA = 1;			//开总中断
	while(1)		//大循环
	{	
		Servo0PwmDuty = 500;		//脉冲宽度在500微秒,对应-90°
		DelayMs(1000);		//延时1秒
		Servo0PwmDuty = 1000;	//脉冲宽度在1000微秒,对应-45°
		DelayMs(1000);
		Servo0PwmDuty = 1500;
		DelayMs(1000);
		Servo0PwmDuty = 2000;
		DelayMs(1000);
		Servo0PwmDuty = 2500;
		DelayMs(1000);
		Servo0PwmDuty = 2000;
		DelayMs(1000);
		Servo0PwmDuty = 1500;
		DelayMs(1000);
		Servo0PwmDuty = 1000;
		DelayMs(1000);
	}
}

/***********************************************************
* 名    称: Timer0_isr() interrupt 1 using 1
* 功    能: 时钟0中断处理
* 入口参数: 无
* 出口参数: 无
* 说    明: 					 
/**********************************************************/ 
void Timer0_isr(void) interrupt 1 using 1
{
	static uint16 i = 1;	//静态变量:每次调用函数时保持上一次所赋的值,
							//跟全局变量类似,不同是它只能用于此函数内部
	switch(i)
	{
		case 1:
			SERVO0 = 1;	//PWM控制脚高电平
			//给定时器0赋值,计数Pwm0Duty个脉冲后产生中断,下次中断会进入下一个case语句
			Timer0Value(Servo0PwmDuty);	
			break;
		case 2:
			SERVO0 = 0;	//PWM控制脚低电平
			//高脉冲结束后剩下的时间(20000-Pwm0Duty)全是低电平了,Pwm0Duty + (20000-Pwm0Duty) = 20000个脉冲正好为一个周期20毫秒 
			Timer0Value(20000-Servo0PwmDuty);
			i = 0;	
			break;	 
	}
	i++;
}

 

你可能感兴趣的:(单片机相关,电设相关)