一:单片机控制舵机程序
//12MHz
#include
void InitTimer0(void)
{ TMOD = 0x01;
TH0 = 0x0B1;
TL0 = 0x0E0;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void delay(void) //误差 0us 延时1ms 此处可以修改高电平周期
//修改此处的延时可以更改舵机转的角度 ,45度具体是多少 你可以试试
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=142;b>0;b--)
for(a=2;a>0;a--);
}
void main(void)
{
InitTimer0();
P1_2=0;
while(1);
}
void Timer0Interrupt(void) interrupt 1
{
//20ms中断
TH0 = 0x0B1;
TL0 = 0x0E0;
P1_2=1;
delay();
P1_2=0;
}
二:51单片机控制舵机转角的C语言程序
舵机频率50hz就是说一周期是20ms,占空比在百分之2.5到12.5可以从-90转到90度
单片机内部有工作的晶振频率,定时器就是基于这个频率计时,根据程序可以知道,20ms计时20000,所以计时器每加一的时间为1us,这个程序的意思就是先工作定时器0,20ms后输出置为1并打开定时器1,定时器1计时到1.5ms后触发中断使得输出为0,即占空比为1.5/20=百分之7.5,中间位置
定时器的寄存器加到0会触发中断,所以寄存器都写负数,如想要20ms就写-20000,这样往上加到0需要的计数的次数就为20000,一次计数为1us,所以为20ms,而寄存器是由两个八位寄存器组成的,所以20000要分开写
建议有时间可以去看一下郭天祥老师的51单片机视频,能搜到而且不多,貌似第三集是讲的定时器
三:求个51单片机控制舵机的程序 我用的郭天祥书上的程序 舵机内部只响一下 也不转 50分
#include
#define uint unsigned int
#define uchar unsigned char
uchar k;//k表示总时间 因为定时器中断要用到k,所以放在程序头
sbit PWM1=P1^0;
sbit key1=P3^7;//舵机启动开关
void init()
{
TMOD=0X01;
TH0=(65536-92)/256;
TL0=(65536-92)%256;
EA=1;
ET0=1;
TR0=1;
}
void jiman20() //51模拟PWM波函数
{
static uchar flag=0,j=0; //flag当做PWM高电平变宽/变窄的标志;
//j表示高电平持续的时间;k表示总时间.因为重复调用该函数
if(k==200) //第一步:判断计时满20ms.
{
k=0; //k归零
if(flag==0) //标志为0时,高电平标志增加
j++;
else //标志为1时,高电平标志减小
j--;
if(j>=25)//当j=25时,高电平持续时间为2.5ms,此时角度为180.
flag=1;//必须改变宽/窄标志。
if(j<=0)//当j=0时,高电平持续时间为0ms,此时角度为0.
flag=0;//必须改变宽/窄标志。
}
if(k PWM1=1;//因为每20ms,k就归0.所以能通过判断k else PWM1=0; } void main() { uint i=60000; init(); while(i--) //一开机就让舵机有一个转动 { jiman20(); } while(1) { while(key1==0) //当开关打开,启动定时器,进入转动程序并循环 { TR0=1; jiman20(); } TR0=0;//当开关关闭,关闭定时器,舵机保持最末时刻状 } } void timer() interrupt 1//定时器计时0.1ms,即模拟PWM是以0.1s为分度, //高电平逐渐增加/减少 { TR0=0; TH0=(65536-92)/256; TL0=(65536-92)%256; TR0=1; k++; } 实测能用,不谢!...余下全文>> 舵机之前弄个一天,其实挺简单的,就是PWM驱动就行了。 #include #define OUT P0 #define CON P2 #define ms0_5Con 461 #define ms2_5Con 2304 typedef unsigned char unit8; typedef unsigned short unit_16; sbit servo0=OUT^0; sbit servo1=OUT^1; sbit servo2=OUT^2; sbit servo3=OUT^3; sbit servo4=OUT^4; sbit servo5=OUT^5; sbit servo6=OUT^6; sbit servo7=OUT^7; sbit KEY1=CON^0; sbit KEY2=CON^1; unit_16 pwm[8]={1382,1382,1382,1382,1382,1382,1382,1382}; //??90?,(???1382.4,???1382) void Inter_Form() { TMOD|=0x01; TH0 =0xf7; TL0 =0x00; TR0 =1; ET0 =1; EA =1; } void delay(unit8 x) { unit8 i=0; while(x--) { for(i=0;i<125;i++); } } /*------------------------?????--------------------------*/ /*unit_16 Transform(uchar val) { //0?=0.5ms, 45?=1ms, 90?=1.5ms, 135?=2ms, 180?=2.5ms //2.5 ms??? F700, (12n/11059200=2.5/1000, n=2304, X=65536-2304=63232 > F700) //return (unit_16)(((float)(2/180)*X+0.5)/1000*11059200/12); unit_16 a = (val+46)*10; if(a a=ms0_5Con; if(a>ms2_5Con) a=ms2_5Con; return a; } */ /*-------------------------???---------------------------*/ void Steering_UP(unit8 val) { if(pwm[val]>ms2_5Con) pwm[val]=ms2_5Con; pwm[val]=pwm[val]+10; } void Steering_Down(unit8 val) { if(pwm[val] pwm[val]=ms0_5Con; pwm[val]=pwm[val]-10; } void main(void) { Inter_Form(); while(1) { if(!KEY1) { delay(2); if(!KEY1) Steering_UP(0); } else if(!KEY2) { delay(2); if(!KEY2) ......余下全文>> 下面是我之前写的程序51单片机写的和你的一样我的是12Mhz的,里面有很详细的注解。用什么不懂的问题,追问我。//////////////////////////////////////////////////////////////////////////////////////////////程序名称:小车循迹程序。//程序目的:跟着黑线走。//时 间:2013年10月///////////////////////////////////////////////////////////////////////////////////////////// #include 这个工作可不是向你想象的那么简单。我是业余爱好者。我曾经用汇编语言做的一个8比例通道的编译码单元,到最后定稿就用了近1年的业余时间。包含硬件软件高频等电路。做到最后指令信号是可以精确到一个机器周期。但是控制信号是8位的,有255步的分度。就是1毫秒到2毫秒(又叫1.5毫秒+ -0.5毫秒)指令周期可以分成255步。 即使一个专业的单片机高手估计也得半个月的时间才可以作出像样的程序。 单片机系统实现对舵机输出转角的控制,必须首先完成两项任务:首先,产生基本的PWM周期信号,即产生20ms的周期信号;其次,调整脉宽,即单片机调节PWM信号的占空比。单片机能使PWM信号的脉冲宽度实现微秒级的变化,从而提高舵机的转角精度。单片机完成控制算法,再将PWM信号输出到舵机。 发一个自己原来写的简单的。 #include #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 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; ca......余下全文>> 以前帮人解决的; /**舵机控制——火柴天堂作品-20120314**/ /**50Hz舵机,0.5ms-2.5ms 对应 0-180°(-90°~90°)**/ /**51系列单片机,晶振12MHz,P1.0输出50Hz PWM调制方波(即周期20ms)驱动舵机,方波由T0定时器产生 P11-P17,7个光电检测,P11-130.5°,P12-108°,P13-99°,P14-90°,P15-81°,P16-72°,P17-49.5°,优先级高-低:P14→P11/P17→P12/P16→P13/P15 **/ #include"reg52.h"//包含52系列头文件 #define uchar unsigned char//定义 无符号字符型 #define uint unsigned int//定义 无符号整型 //#define TRUE1//定义 逻辑真 //#define FALSE0//定义 逻辑假 //最小角度4.5°,时间应该为2ms×4.5°/180°=50us,故定时器T0定时时间为 50us #define th00xce//50us for Model2 at 12HMz Fosc #define DutyDeno40//定义 占空比分母(舵机转动范围) 为:180°/4.5°=40 #define SteeringBasic10//舵机基准角 0.5ms, 0.5ms/50us=10 #define SteerineSigne400//舵机信号 20ms, 20ms/50us=400 uchar code SteeringList[8]={0,29,24,22,20,18,16,11};//P11-P17光电检测对应舵机转角列表,单位4.5°,第一个元素为空 sbit PS1=P1^0;//定义 光电开关1 接口 sbit PS2=P1^1;//定义 光电开关2 接口 sbit PS3=P1^2;//定义 光电开关3 接口 sbit PS4=P1^3;//定义 光电开关4 接口 sbit PS5=P1^4;//定义 光电开关5 接口 sbit PS6=P1^5;//定义 光电开关6 接口 sbit PS7=P1^6;//定义 光电开关7 接口 sbit Steering=P1^7;//定义 舵机输出 接口 #define PS1_Value1//定义 光电开关1 值 #define PS2_Value2//定义 光电开关2 值 #define PS3_Value3//定义 光电开关3 值 #define PS4_Value4//定义 光电开关4 值 #define PS5_Value5//定义 光电开关5 值 #define PS6_Value6//定义 光电开关6 值 #define PS7_Va......余下全文>>四:stm32舵机驱动程序 求教使stm32控制三个舵机完整程序
五:求51单片机直接控制舵机转动角度的程序
六:求帮我写一个简单的51单片机控制舵机程序 10分
七:求助一个舵机控制程序
八:如何用51单片机控制舵机的??单片机程序是怎么写的?希望你也能给我发一个编写程序和电路图
九:求一个PWM单片机简单控制舵机程序 5分