我用51做过一个机器人,主要是利用定时中断来控制舵机的运行,刚开始开一下这个程序吧,也许对你会有帮助
#include "reg52.h"
sbit control_signal=P0^0;
sbit turn_left=P3^0;
sbit turn_right=P3^1;
unsigned char PWM_ON=15 ;//定义高电平时间
/******************************************************************/
/* 延时函数 */
/******************************************************************/
void delay(unsigned int cnt)
{
while(--cnt);
}
void display()
{
if(PWM_ON>=5&&PWM_ON<=7) P1=0xFD; //1灯亮,舵机接近或到达右转极限位置
if(PWM_ON>7&&PWM_ON<=10) P1=0xFB; //2灯亮
if(PWM_ON>10&&PWM_ON<=13) P1=0xF7; //3灯亮
if(PWM_ON>13&&PWM_ON<=16) P1=0xEF; //4灯亮,舵机到达中间位置
if(PWM_ON>16&&PWM_ON<=19) P1=0xDF; //5灯亮
if(PWM_ON>19&&PWM_ON<=22) P1=0xBF; //6灯亮
if(PWM_ON>22&&PWM_ON<=25) P1=0x7F; //7灯亮,舵机接近或到达左转极限位置
}
/******************************************************************/
/* 主函数 */
/******************************************************************/
void main()
{
//bit Flag;
TMOD |=0x01; //定时器设置 0.1ms in 11.0592M crystal
TH0=(65536-78)/256;
TL0=(65536-78)%256; //定时0.1mS
ET0=1;//定时器中断打开
EA=1;//总中断
//IE= 0x82; //打开中断
TR0=1;
// PWM_ON=15 //的取值范围是6-25
while(1)
{
if(turn_left==0)
{
delay(1000);
if(turn_left==0)
{
while(!turn_left){}
PWM_ON+=1;
if(PWM_ON>25)
PWM_ON=25;
}
}
if(turn_right==0)
{
delay(1000);
if(turn_right==0)
{
while(!turn_right){}
PWM_ON-=1;
if(PWM_ON<6)
PWM_ON=6;
}
}
display();
}
}
/******************************************************************/
/* 定时器中断函数 */
/******************************************************************/
void tim(void) interrupt 1 using 1
{
static unsigned char count;
TH0=(65536-78)/256;
TL0=(65536-78)%256; //定时0.1mS,经过示波器的测量
if (count<PWM_ON)
{
control_signal = 1; //给高电平
}
else
{
control_signal=0 ;
}
count++;
if(count == 200)
{
count=0; //20ms一个周期
}
}
|