求一个51单片机控制舵机机器人的程序。其他单片机的也行!最好改改。一定要好使哦!

作者&投稿:琦昭 (若有异议请与网页底部的电邮联系)
你好 求一个51单片机控制舵机机器人的程序~

我没有现成的,但是可以给你一个思路。
我假定你是个51单片机的新手,只懂一些简单的C语言和怎么把程序写入单片机中,那么我教你如何一步一步实现这个功能。
1、学会怎么操作51的IO口。这个还用学吗?
sbit LED = P1 ^ 0;void main( void ){ LED = 1; while(1);}或者 LED = ~LED; 这是什么?呵呵。复习一下C语言去。
2、学会怎么使用51单片机的定时器
void Init_timer0( void ){ TMOD = 0x01; TH0 = ( 65536 - 5000 ) / 256; TL0 = ( 65536 - 5000 ) % 256; EA = 1; ET0 = 1; TR0 = 1;}void main( void ){ Init_timer0(); while(1);}void timer0_isr( void ) interrupt 1{ TH0 = ( 65536 - 5000 ) / 256; TL0 = ( 65536 - 5000 ) % 256; LED = ~LED; // 脉宽为 5毫秒的方波 }3、尝试输出一个占空比为20%的PWM。
void timer0_isr( void ) interrupt 1{ static unsigned char cnt = 0; TH0 = ( 65536 - 5000 ) / 256; TL0 = ( 65536 - 5000 ) % 256; cnt++; if( cnt = 100 ) cnt = 0; else LED =0; }4、彻底地查一下你的舵机,有几个参数一定要知道。输入PWM频率范围、合适的PWM正脉宽范围。
5、尝试驱动一个舵机。
6、尝试驱动两个...

下面是我之前写的程序51单片机写的和你的一样我的是12Mhz的,里面有很详细的注解。用什么不懂的问题,追问我。//////////////////////////////////////////////////////////////////////////////////////////////程序名称:小车循迹程序。//程序目的:跟着黑线走。//时 间:2013年10月///////////////////////////////////////////////////////////////////////////////////////////// #include unsigned int int_time; //用于记录 溢出的次数。sbit PWM=P0^0; //舵机的控制位。sbit SS1=P2^0; //前面的光感应定义 I/O 口sbit SS2=P2^1;sbit SS3=P2^2;sbit SS4=P2^3;sbit SS5=P2^4;sbit M1_in1=P1^0; //电机定义 I/O 口 M1右电机M2左电机;sbit M1_in2=P1^1;sbit M2_in1=P1^2;sbit M2_in2=P1^3;/*void delay(unsigned int N)//延时程序: 实现(16*N+24)us 的延时,11.0592的条件下。N=1000 对应 20ms.{ int i; for(i=0;iall) //all表示一个周期所用int_time(中断一次的时间)的次数, int_time=0;if(int_time<=part)//part表示一个周期类高电平时所用int_time的次数。PWM=1;else PWM=0; } main() //主函数{ int s1=0,s2=0,s3=0,s4=0,s5=0;init(); //初始化中断 ||(LED1==1&&LED2==1&&LED3==1&&LED4==1&&LED5==1 while(1){ if(SS1==0&&SS2==0&&SS3==0&&SS4==0&&SS5==0) // 当没有检测到黑线时,电机(M1 M2)停止工作。{ M1_in1=0; M1_in2=0; M2_in1=0; M2_in2=0; } while(SS1==1||SS2==1||SS3==1||SS4==1||SS5==1) { M1_in1=1; M1_in2=0; M2_in1=0; M2_in2=1; while(SS1==0&&SS2==1&&SS3==1&&SS4==1&&SS5==1) // 向左转弯时:SS1检测到黑线。 {occupy(1000,60);} while(SS1==0&&SS2==0&&SS3==1&&SS4==1&&SS5==1) // 向左转弯时:SS1和SS2检测到黑线。 {occupy(1000,85);} while(SS1==1&&SS2==0&&SS3==1&&SS4==1&&SS5==1) // 向左转弯时:SS2检测到黑线。 {occupy(1000,80);} while(SS1==1&&SS2==0&&SS3==0&&SS4==1&&SS5==1) // 向左转弯时:SS2和SS3检测到黑线。 {occupy(1000,77);}while(SS1==1&&SS2==1&&SS3==0&&SS4==1&&SS5==1) // 直线向前时:SS3检测到黑线。 8888888888888 {occupy(1000,75);} while(SS1==1&&SS2==1&&SS3==0&&SS4==0&&SS5==1) // 向右转弯时:SS3和SS4 检测到黑线。 {occupy(1000,72);} while(SS1==1&&SS2==1&&SS3==1&&SS4==0&&SS5==1) // 向右转弯时:SS4检测到黑线。 {occupy(1000,70);} while(SS1==0&&SS2==0&&SS3==1&&SS4==0&&SS5==0) // 向左转弯时:SS4和SS5检测到黑线。 {occupy(1000,65);} while(SS1==1&&SS2==1&&SS3==1&&SS4==1&&SS5==0) // 向右转弯时:SS5检测到黑线。 {occupy(1000,90);} } }} void ABC(void) interrupt 1 //进入中断一次,将计数量int_time加1。 {int_time++;} // M2_in1=0;//M2_in2=1;//delay(1000);// M2_in1=0;//M2_in2=0;//delay(1000);

#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int

/*
变量定义
*/
uchar key_stime_counter,hight_votage=15,timeT_counter;
bit key_stime_ok;

/*
引脚定义
*/
sbit control_signal=P0^0;
sbit turn_left=P3^4;
sbit turn_right=P3^5;

/*****************************************************************
名称:定时器0初始化
功能:20ms定时,11.0592M晶振
初值=65536-11059200*0.02/12=65536-18432=47104=0xB800 20ms
初值=65536-11059200*0.0001/12=65536-92.16=64430=0xFFA3 0.1ms
*****************************************************************/
void TimerInit()
{
control_signal=0;
TMOD=0x01; //设置定时器0为工作方式1
EA=1; //开总中断
ET0=1; //定时器0中断允许
TH0 = 0xFF; //定时器装初值
TL0 = 0xA3;
TR0=1; //启动定时器0
}

/**********************************************
定时器0中断服务函数
***********************************************/
void timer0(void) interrupt 1 using 0
{
TH0=0xFF;
TL0=0xA3; //定时器0重新装入数值

if (++key_stime_counter>=200)
{
key_stime_counter=0;
control_signal=1;
key_stime_ok = 1; // 20ms到
timeT_counter=0;
}

if (key_stime_ok&&(++timeT_counter>=hight_votage))
{
key_stime_ok=0;
timeT_counter=0;
control_signal=0; // hight_votage*0.1ms到
}
}

/*********************************************
名称:键盘扫描
功能:在按键稳定期内判断键值,并返回键值
**********************************************/
uchar keyscan(void)
{
static char key_state = 0;
static char key_value = 0;
uchar key_press, key_return = 0;
key_press=turn_left&turn_right; //读按键I/O电平

switch (key_state)
{
case 0 : // 按键初始态
if (key_press==0) key_state = 1; // 键被按下,但需要确认是否是干扰
break;
case 1 : // 按键确认态
if (key_press==0)//如有键按下则不是干扰,判断键值
{
if(turn_left==0) //判断是哪一个按键被按下
key_value=1; //按键较多时可采用switch选择结构
else if(turn_right==0)
key_value=2;
else
key_value=0;

key_state = 2; // 状态转换到键释放态
}
else
key_state = 0; // 按键已抬起,属于干扰,转换到按键初始态
break;
case 2 :
if (key_press==1)
{
key_return=key_value;//按键释放后再输出键值,如果按下键就输出则可省略key_value
key_value=0;
key_state = 0; //如果按键释放,转换到按键初始态
}
break;
}

return key_return; //返回键值
}

/*********************************************
名称:按键处理
功能:
**********************************************/
void key_operation(void)
{
switch (keyscan()) //根据键值不同,执行不同的内容
{
case 1:
hight_votage-=1;
if(hight_votage<5)
hight_votage=5;
break;
case 2:
hight_votage+=1;
if(hight_votage>25)
hight_votage=25;
break;
default :
break;
}
}

//LED显示函数
void diplay()
{
if(hight_votage>=5&&hight_votage<=7) P1=0xFD; //1灯亮,舵机接近或到达右转极限位置
if(hight_votage>7&&hight_votage<=10) P1=0xFB; //2灯亮
if(hight_votage>10&&hight_votage<=13) P1=0xF7; //3灯亮
if(hight_votage>13&&hight_votage<=16) P1=0xEF; //4灯亮,舵机到达中间位置
if(hight_votage>16&&hight_votage<=19) P1=0xDF; //5灯亮
if(hight_votage>19&&hight_votage<=22) P1=0xBF; //6灯亮
if(hight_votage>22&&hight_votage<=25) P1=0x7F; //7灯亮,舵机接近或到达左转极限位置
}

/*主程序*/
void main(void)
{
TimerInit();
while(1)
{
key_operation();
diplay();
}
}

这程序我有,怎么发给你?这是我们比赛用的程序,你改改应该可以 回答时间:2011-10-23 20:46:18

求一个51单片机控制舵机机器人的程序。其他单片机的也行!最好改改...
答:control_signal=0;TMOD=0x01; //设置定时器0为工作方式1 EA=1; //开总中断 ET0=1; //定时器0中断允许 TH0 = 0xFF; //定时器装初值 TL0 = 0xA3;TR0=1; //启动定时器0 } / 定时器0中断服务函数 / void timer0(void) interrupt 1 using 0 { TH0=0xFF;TL0=0xA...

急求51单片机控制舵机C语言程序,舵机可以根据设定旋转任意角度!急求...
答:这时舵机处于0度TL1=-1500%256;EA=1;//开总断TR0=1;//开定时器0ET0=1;TR1=1;//开定时器1ET1=1;}void timer0(void) interrupt 1//定时器0中断函数{pwm=1;TH0=-20000/256;

求个51单片机控制舵机的程序 我用的郭天祥书上的程序 舵机内部只响一下...
答:else PWM1=0;} void main(){ uint i=60000;init();while(i--) //一开机就让舵机有一个转动 { jiman20();} while(1){ while(key1==0) //当开关打开,启动定时器,进入转动程序并循环 { TR0=1;jiman20();} TR0=0;//当开关关闭,关闭定时器,舵机保持最末时刻状 } } void...

请问用89S51单片机如何控制电动舵机呢?谢谢!(舵机的控制芯片是KC5188的...
答:用51 做舵机的编译码有很多成功的案例。它和舵机的电路没有关系,只要是满足舵机的信号就可以。一般是电位器的电压信号经过AD转换,送给微处理器,经过换算,输出脉冲位置随电位器位置变化的脉位调制信号。译码器把这个信号再转换成脉宽变化的信号,这个信号给舵机,舵机就会输出角度和脉宽对应的行程。

怎么用51单片机控制舵机?
答:操作步骤:1 单片机,舵机,电源共地;2 用两个稳压芯片进行供电,将电源分开来;3 舵机信号端没有直接连接单片机IO口,我串了一个10K的电阻,也就是这一步之后就可以控制舵机。

如何用51单片机控制舵机的??单片机程序是怎么写的?希望你也能给我发...
答:单片机系统实现对舵机输出转角的控制,必须首先完成两项任务:首先,产生基本的PWM周期信号,即产生20ms的周期信号;其次,调整脉宽,即单片机调节PWM信号的占空比。单片机能使PWM信号的脉冲宽度实现微秒级的变化,从而提高舵机的转角精度。单片机完成控制算法,再将PWM信号输出到舵机。发一个自己原来写的简单的...

一个51单片机能控制几个舵机
答:如果完全要精确控制舵机,使用51是比较困难的。比如20ms周期,控制占空比。占空比的计算时间使用终端就会造成程序一直进入中断。所以控制每个舵机都使用51独立时钟(每个舵机使用一个独立时钟,占空比用延时实现),只能控制2个舵机。要是每个舵机使用2个独立时钟(周期占空比个使用一个时钟中断)只能控制一个舵机...

怎么用51单片机控制多路舵机
答:控制舵机的原理图很简单,用51的任何一个IO口,连舵机的控制脚就行了。 舵机的电源(5V)和地也连好,原理图就这么简单。 关键在于程序。

51单片机如何控制舵机左转和右转,以及舵机左右转的原理,谢谢
答:宽度1.5MS的基准信号,有一个比出较器,将外加信号与基准信号相比较,判断出方向和大小,从而生产电机的转动信号。由此可见,舵机是一种位置伺服驱动器,转动范围不能超过180度,适用于那些需要不断变化并可以保持的驱动器中,比如说机器人的关节、飞机的舵面等。图7 舵机输出转角与输入脉冲的关系 ...

怎样用51单片机控制舵机的转动角度,求C语言程序?用郭天祥写的书上的程 ...
答:所以寄存器都写负数,如想要20ms就写-20000,这样往上加到0需要的计数的次数就为20000,一次计数为1us,所以为20ms,而寄存器是由两个八位寄存器组成的,所以20000要分开写 建议有时间可以去看一下郭天祥老师的51单片机视频,能搜到而且不多,貌似第三集是讲的定时器 ...