|
這是我當(dāng)時(shí)寫的一個(gè)簡(jiǎn)單的51定時(shí)器輸出PWM方式控制三個(gè)舵機(jī)按順序依次旋轉(zhuǎn)。你可以借鑒下,不推薦用延遲函數(shù)的方式去控制舵機(jī)
#include "reg51.h"//此文件中定義了單片機(jī)的一些特殊功能寄存器
typedef unsigned int u16;//對(duì)數(shù)據(jù)類型進(jìn)行聲明定義
typedef unsigned char u8;
sbit KEY=P3^1;//控制按鍵
sbit Servo_1=P2^0;//舵機(jī)輸出
sbit Servo_2=P2^1;//舵機(jī)輸出
sbit Servo_3=P2^2;//舵機(jī)輸出
u16 Servo_PWM1,Servo_PWM2,Servo_PWM3;//三個(gè)舵機(jī)的PWM值
//PWM:5-22
//對(duì)應(yīng)0-180°
#define LOW 5
#define HIGH 22
u8 Flag_step;//舵機(jī)動(dòng)作步驟
bit start;//隨著按鍵按下開始動(dòng)作
void delay_ms(u16 j) //j=1,1ms
{
u8 i=250;
for(;j>0;j--)
{
while(--i);
i=249;
while(--i);
i=250;
}
}
void step(void)//舵機(jī)動(dòng)作
{
if(start==1)//按鍵按下,標(biāo)志位置1,滿足條件進(jìn)入if()
{
if(Flag_step==1)//第一步
{
Servo_PWM1=HIGH;//一舵機(jī)轉(zhuǎn)到180
delay_ms(500);//延時(shí)一段時(shí)間,根據(jù)需求更改時(shí)間,靈活可調(diào)
Flag_step=2; //下一步
}
if(Flag_step==2)//第二步
{
Servo_PWM1=LOW;//一舵機(jī)轉(zhuǎn)到0
delay_ms(500);//延時(shí)一段時(shí)間
Flag_step=3;//下同,分別是二三舵機(jī)動(dòng)作
}
if(Flag_step==3)
{
Servo_PWM2=HIGH;
delay_ms(500);
Flag_step=4;
}
if(Flag_step==4)
{
Servo_PWM2=LOW;
delay_ms(500);
Flag_step=5;
}
if(Flag_step==5)
{
Servo_PWM3=HIGH;
delay_ms(500);
Flag_step=6;
}
if(Flag_step==6)
{
Servo_PWM3=LOW;
delay_ms(500);
Flag_step=1;//形成一個(gè)循環(huán),回到第一步
start=0;//將標(biāo)志位置0,等待下一次按鍵按下,將標(biāo)志位置1,重新開始一周期
}
}
}
/*******************************************************************************
* 函 數(shù) 名 : Timer1Init
* 函數(shù)功能 : 定時(shí)器1初始化
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void Timer1Init()
{
TMOD|=0X10;//選擇為定時(shí)器1模式,工作方式1,僅用TR1打開啟動(dòng)。
TH1=0XFF; //給定時(shí)器賦初值,定時(shí)0.1ms
TL1=0X9C;
ET1=1;//打開定時(shí)器1中斷允許
EA=1;//打開總中斷
TR1=1;//打開定時(shí)器
}
/*******************************************************************************
* 函 數(shù) 名 : main
* 函數(shù)功能 : 主函數(shù)
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void main()
{
Timer1Init();//定時(shí)器1初始化
start=0;//初始狀態(tài)舵機(jī)不動(dòng)作
Flag_step=1;//初始第一步
Servo_PWM1=5;//將三個(gè)舵機(jī)初始化成0°位置
Servo_PWM2=5;
Servo_PWM3=5;
while(1)
{
if(KEY==0)//按鍵按下
{
start=~start;//重新開始一個(gè)周期
while(!KEY);//等待按鍵松開
}
step();//舵機(jī)動(dòng)作
}
}
/*******************************************************************************
* 函 數(shù) 名 : void Timer1() interrupt 3
* 函數(shù)功能 : 定時(shí)器0中斷函數(shù)
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void Timer1() interrupt 3
{
static u16 t;
TH1=0XFF; //給定時(shí)器賦初值,定時(shí)0.1ms
TL1=0X9C;
t++;
//根據(jù)改變Servo_PWM1內(nèi)容,改變占空比,從而達(dá)到控制舵機(jī)達(dá)到不同的角度
//———— ————
// —————— ————————.......
if(t<Servo_PWM1)Servo_1=1;//高電平輸出
if(t>=Servo_PWM1)Servo_1=0;//低電平輸出
if(t<Servo_PWM2)Servo_2=1;
if(t>=Servo_PWM2)Servo_2=0;
if(t<Servo_PWM3)Servo_3=1;
if(t>=Servo_PWM3)Servo_3=0;
if(t>200)t=0;//舵機(jī)控制頻率50HZ,200*0.1=20ms
}
|
|