51单片机除了几款加强版的带pwm,很多都不带,所以要用51控制伺服电机很多时候就要软件模拟pwm。看了些代码有的是通过延时来输出pwm波,有的也用了定时器但是那些代码要驱动多路伺服电路就显得比较麻烦。下面的代码是通过定时器0产生每0.5ms一次的提醒,程序在大循环中通过调用DJ()函数可以返还值给伺服电机信号引脚,DJ()函数可以定旋转的角度,但是因为定时器设置是0.5ms的中断这就决定了旋转呢角度只能是-45,-90,0,45,90。如果要提高精度就要通过设置定时器的初值,改变函数的num值来达成。
#include"reg52.h"
unsigned int num=0;
//舵机
sbit DJ1=P3^6;
sbit DJ2=P3^7; /*引脚定义*/
int DJ(int a); //函数声明
timerinit() //定时器中断初始化
{
TMOD=0x01; //设置定时器0为工作方式1
EA=1; //开总中断
ET0=1; //定时器0中断允许
TH0 = (65536-500)/256; //初值使得定时器0.5毫秒溢出
TL0 = (65536-500)%256;
TR0=0;
}
main()
{
timerinit();
while(1)
{
}
}
timer() interrupt 0 //0.5ms发生一次中断,20ms后定时器置0重新计数
{
num++;
DJ1=DJ(3);
DJ2=DJ(3);
if(num>=40)
{
num=0;
TH0 = (65536-500)/256; //初值使得定时器0.5毫秒溢出
TL0 = (65536-500)%256;
return;
}
}
int DJ(char a) //当a=3舵机所在的位置是0度a=2 a=1分别对应的位置是-45 -90度a=4 a=5对应位置为45 90度
{
if(num>=a||num>=5)
return 0;
if(num>=1)
return 1;
}
时间仓促还没有测试程序的可行性(通常是没有问题呢,呵呵),等有时间的话会继续完善程序加上可以控制舵机旋转速度的功能。如果要弄机器人的话还是弄块专业的驱动板吧,那样调试起来会很直观很方便呢减少许多不必要的麻烦呢。