如何用51单片机控制舵机的??单片机程序是怎么写的?希望你也能给我发一个编写程序和电路图

单片机系统实现对舵机输出转角的控制,必须首先完成两项任务:首先,产生基本的PWM周期信号,即产生20ms的周期信号;其次,调整脉宽,即单片机调节PWM信号的占空比。单片机能使PWM信号的脉冲宽度实现微秒级的变化,从而提高舵机的转角精度。单片机完成控制算法,再将PWM信号输出到舵机。
发一个自己原来写的简单的。
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar count,jd;
sbit pwm=P1^0;
sbit jia=P3^2;
sbit jian=P3^3;
uchar code table[10] = {0x3f,0x06,0x5b,
0x4f,0x66,0x6d,
0x7d,0x07,0x7f,0x6f};
//延时函数
void delay(uchar x)
{
uchar i,j;
for(i=x;i>0;i--)
for(j=125;j>0;j--);

}
//定时器初始化
void Time0_init()
{
TMOD=0x01; //定时器0工作方式1
IE=0x82;
TH0=0xfe;
TL0=0x33; //11.0592MHZ晶振,0.5ms
TR0=1;
}
//定时器0中断程序
void Time0() interrupt 1
{
TH0=0xfe;
TL0=0x33;
if(count<jd) //判断0.5ms次数是否小于角度标识
pwm=1; //是,pwm输出高电平
else
pwm=0; //否,输出低电平
count=count+1;
count=count%40; //次数始终保持为40,即保持周期为20ms
}
//按键扫描
void keyscan()
{
if(jia==0)
{
delay(10);
if(jia==0)
{
jd++; //角度增加 1
count=0; //按键按下则20ms周期重新开始计时
if(jd==6)
jd=5; //已经是180度,保持
while(jia==0);
}
}
if(jian==0)
{
delay(10);
if(jian==0)
{
jd--;
count=0;
if(jd==0)
jd=1; //已经0度,保持
while(jian==0);
}
}
}
//数码管显示
void display()
{
uchar bai ,shi,ge ;
switch(jd)
{
case 1:
bai=0;
shi=0;
ge=0;
break;
case 2:
bai=0;
shi=4;
ge=5;
break;
case 3:
bai=0;
shi=9;
ge=0;
break;
case 4:
bai=1;
shi=3;
ge=5;
break;
case 5:
bai=1;
shi=8;
ge=0;
break;
}
P0=table[bai];
P2=1;
delay(5);
P0=table[shi];
P2=2;
delay(5);
P0=table[ge];
P2=3;
delay(5);
}
void main()
{
//jd=1;
count=0;
Time0_init();
while(1)
{
keyscan();
display();
}
}
电路图很简单的,几个按键,再在单片机最小系统上接出一个信号线,再给舵机供上电就可以了。追问

但舵机只有三条线啊,怎样连接啊?根据你的编程能附上个图吗?

追答

画图太慢,描述一下,得了。红色VCC,橙色信号线,棕色GND。数码管和按键都会用吧?那些管口随便定义。如果你还不懂,只能说你没见过舵机,没看过有关舵机的资料,再看看书,在问吧。

追问

恩,已经看过资料了解过了,但还是不大明白那个按键是怎样连接的,我是个菜鸟,希望能给个图,谢谢!

追答

基本就是这样,接线随便。大哥你是我解答次数最多的一个人,如果你真的是初学者就基础一点吧,多看看流水灯,数码管,按键……一些基本的模块。不要好高骛远,不然你现在做的这些东西都是空中楼阁。你连我说换个管脚都不了解,你让我如何解答,一些知识还是要自己要付出学习才能学的到,不要什么问题都追问到底,给自己留一些思考的空间。话不说透,点到为止,祝你单片机学习之路辉煌。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-10-06
朋友你好,单片机的舵机控制是有多种控制方式的,单片机程序通常是用汇编和c语言编写的,你可以进我的空间看看,有一些我写的或我转载的单片机程序,有一些单片机知识,希望能对你有用,祝你好运!朋友。