导航:首页 > 操作系统 > 单片机驱动舵机程序

单片机驱动舵机程序

发布时间:2022-09-10 17:17:35

① 求一段简单的51单片机的程序,通电后舵机顺时针旋转180度,2秒后恢复。

51单片机控制舵机程序

#include <reg52.h>

#define Stop 0 //宏定义,停止

#define Left 1 //宏定义,左转

#define Right 2 //宏定义,右转

sbit ControlPort = P2^0; //舵机信号端口

sbit KeyLeft = P1^0; //左转按键端口

sbit KeyRight = P1^1; //右转按键端口

sbit KeyStop = P1^2; //归位按键端口

unsigned char TimeOutCounter = 0,LeftOrRight = 0; //TimeOutCounter:定时器溢出计数 LeftOrRight:舵机左右旋转标志

void InitialTimer ( void )

{

TMOD=0x10; //定时/计数器1工作于方式1

TH1 = ( 65535 - 500 ) / 256; //0.25ms

TL1 = ( 65535 - 500 ) % 256;

EA=1; //开总中断

ET1=1; //允许定时/计数器1 中断

TR1=1; //启动定时/计数器1 中断

}

void ControlLeftOrRight ( void ) //控制舵机函数

{

if( KeyStop == 0 )

{

//while ( !KeyStop ); //使标志等于Stop(0),在中断函数中将用到 LeftOrRight = Stop;

}

if( KeyLeft == 0 )

{

//while ( !KeyLeft ); //使标志等于Left(1),在中断函数中将用到 LeftOrRight = Left;

}

if( KeyRight == 0 )

{

//while ( !KeyRight ); //使标志等于Right(2),在中断函数中将用到 LeftOrRight = Right;

}

② 单片机控制舵机程序

//12MHz
#include
<reg51.h>
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来忽悠啊)

我现在也在做舵机控制,这是控制一个舵机的程序,可以参考!
通过按键,改变单片机输出脉冲宽度1ms~2ms,使舵机在-90°~+90°间转动

ORG 0000H
AJMP MAIN ;转主程序
ORG 000BH
AJMP INTT0 ;转定时中断子程序

MAIN: MOV SP,#80H
SETB EA ;开总中断
SETB ET0 ;允许T0中断
CLR P3.7 ;脉冲波形起始状态
MOV TMOD,#01H ;定时,方式0
MOV 30H,#2EH ;舵机0 位,1.5ms定时初始值,TL0值存30H
MOV 31H,#0FAH ;TH0值存31H
MOV 32H,#0B2H ;18.5ms定时初始值,TL0值存32H
MOV 33H,#0B7H ;TH0存33H
CLR F0 ;清标志位
SETB TR0 ;启动T0

K1: JB P1.4,K2 ;右转键未按下,转K2,判左转键
ACALL D10MS ;按下,延时,防抖
JNB P1.4,$ ;等待释放
ACALL D10MS
MOV A,30H
CJNE A,#3AH,K10 ;判断是否到90°
AJMP K2 ;到90°,不改变定时时间常数,转K2
K10: CLR C ;未到90°,清进位位,下条指令为带进位减,必须先清进位
SUBB A,#20 ;减小时间常数,即加大高电平脉冲宽度,每次0.02ms递增,舵机转动3.6°
JNC K11
DEC 31H ;借位
K11: MOV 30H,A
CLR C
MOV A,32H
ADD A,#20 ;加大时间常数,即减小低电平脉冲宽度
JNC K12
INC 33H
K12: MOV 32H,A

K2: JB P1.5,K3
ACALL D10MS
JNB P1.5,$
ACALL D10MS
MOV A,30H
CJNE A,#22H,K20
AJMP K3
K20: CLR C
ADD A,#20
JNC K21
INC 31H
K21: MOV 30H,A
CLR C
MOV A,32H
SUBB A,#20
JNC K22
DEC 33H
K22: MOV 32H,A
CLR C

K3: JB P1.6,K1 ;判断电机回0 键是否按下
ACALL D10MS
JNB P1.6,$
ACALL D10MS
MOV 30H,#2EH ;舵机0 位,脉宽1.5ms
MOV 31H,#0FAH
MOV 32H,#0B2H
MOV 33H,#0B7H
AJMP K1

INTT0: CPL F0 ;中断服务程序
CPL P3.7 ;输出高、低电平脉冲
JB F0,HIGH1
LOW0: MOV TL0,32H ;低电平脉冲定时常数
MOV TH0,33H
RETI
HIGH1: MOV TL0,30H ;高电平脉冲定时常数
MOV TH0,31H
RETI
D10MS: MOV R2,#20
MOV R1,#250
DJNZ R1,$
DJNZ R2,$-4
RET

END

④ 专家进!怎样用单片机控制舵机 (满意+100分)

请看图,图上标注了角度和脉冲两个参数,你仔细看,每个脉冲宽度对应一个角度,你只要写程序,用单片机给舵机发送图上任意一个有效的固定宽度的脉冲,那么舵机就转到这个脉冲对应的角度上了。

⑤ 如何用51单片机控制舵机的怎样编写程序啊大哥帮帮忙

舵机是一种位置伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统。其工作原理是:控制信号由接收机的通道进入信号调制芯片,获得直流偏置电压。它内部有一个基准电路,产生周期为20ms,宽度为1.5ms的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出。最后,电压差的正负输出到电机驱动芯片决定电机的正反转。当电机转速一定时,通过级联减速齿轮带动电位器旋转,使得电压差为0,电机停止转动。编程的时候也很简单,你将一根管脚初始化为低电平,然后写一个while循环,在循环中将该脚职位高电平,延时,再拉为低电平,如此不停的循环就是PWM波,你需要控制的是高电平产生的时间,根据高电平的时间来控制舵机的角度的,希望能帮的上你

⑥ 单片机控制舵机程序

//12MHz
#include <reg51.h>

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;
}

⑦ 单片机 舵机程序

//12MHz
#include <reg51.h>

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;
}

⑧ 求一个PWM单片机简单控制舵机程序

以前帮人解决的;
/**舵机控制——火柴天堂作品-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 TRUE 1 //定义 逻辑真
//#define FALSE 0 //定义 逻辑假

//最小角度4.5°,时间应该为2ms×4.5°/180°=50us,故定时器T0定时时间为 50us
#define th0 0xce //50us for Model2 at 12HMz Fosc
#define DutyDeno 40 //定义 占空比分母(舵机转动范围) 为:180°/4.5°=40
#define SteeringBasic 10 //舵机基准角 0.5ms, 0.5ms/50us=10
#define SteerineSigne 400 //舵机信号 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_Value 1 //定义 光电开关1 值
#define PS2_Value 2 //定义 光电开关2 值
#define PS3_Value 3 //定义 光电开关3 值
#define PS4_Value 4 //定义 光电开关4 值
#define PS5_Value 5 //定义 光电开关5 值
#define PS6_Value 6 //定义 光电开关6 值
#define PS7_Value 7 //定义 光电开关7 值

uchar DutyNume; //定义 占空比分子(舵机转角) 变量,单位4.5°

void Timer0() interrupt 1 //定时器T0 中断 函数
{
static uint ty_time=0; //定义静态变量,作为 占空比 输出时间的参考值(50us)
ty_time=++ty_time%SteerineSigne; //该句等效于:ty_time++;ty_time%=SteerineSigne;
if(ty_time<DutyNume+SteeringBasic) Steering=1; //若计时时间小于 占空比分子,则输出应为 高电平
else Steering=0; //若计时时间大于 占空比分子,则输出应为 低电平
}

void TimerInit() //定时器初始化 函数
{
TMOD=0x02; //T0 8位自重装定时器
EA=1; //允许系统中断
ET0=1; //允许T0中断
TH0=th0;
TL0=th0; //50us 初值
TR0=1; //T0开始计时
}

uchar PhotoSwitchScan() //光电开关扫描 函数
{
if(!PS4) return PS4_Value; //返回光电开关对应值
if(!PS1) return PS1_Value;
if(!PS7) return PS7_Value;
if(!PS2) return PS2_Value;
if(!PS6) return PS6_Value;
if(!PS3) return PS3_Value;
if(!PS5) return PS5_Value; //返回光电开关对应值
return PS4_Value; //其它情况,均保持跟最高级别一致
}

void PhotoSwitchResp() //光电开关响应 函数
{
//uchar PS_value=PhotoSwitchScan(); //扫描光电开关
//if(PS_value)DutyNume=SteeringList[PS_value]; //占空比分子 加1,即舵机转角加4.5°,到180°后,再加归零
DutyNume=SteeringList[PhotoSwitchScan()];
}

void main() //主函数
{
TimerInit(); //调用 定时器初始化 函数
while(1) //循环系统
{
PhotoSwitchResp(); //调用 光电开关响应 函数
}
}

⑨ 52单片机接口与舵机控制程序

可以用任意一个IO引脚和舵机连接,程序上,用两个定时器,定时器1定时20ms,中断时让IO管脚输出高电平,并启动定时器2,定时器2定时1.5至2.5ms,对应舵机的角度,中断时让该管脚输出低电平,并关闭自身。改变定时器2的定时时间,即改变了舵机的转角。

⑩ 如何用单片机控制舵机及程序详细

//双定时器产生PWM波,控制舵机
//定时器0负责置高电平和控制定时器1的开停,定时器1负责置低电平
#include<STC12C5A.H>
#define uchar unsigned char
#define uint unsigned int
sbit PWM=P3^7;
uint b=1500;//1.5ms 舵机0位
void Delay1ms(uint i) //1ms延时程序
{
uint j;
for(;i>0;i--)
{
for(j=0;j<125;j++)
{;}
}
}
void main()
{
b=1500;
TMOD=0X11;
TH0=(65536-20000)/256;
TL0=(65536-20000)%256;
TH1=(65536-b)/256;
TL1=(65536-b)%256;
ET0=1;
EA=1;
TR0=1;
PWM=1;
P1M0=0X0F; //P1低4位推挽输出 接L298N直流电机驱动模块 带动后轮两个电机
P1M1=0X00;
while(1)
{
P1=0x0a; //低4位 1010 正转
b=1500;Delay1ms(2000);//直行
b=1000;Delay1ms(1000);//左转
b=1500;Delay1ms(2000);//直行
b=2000;Delay1ms(1000);//右转
b=1500;Delay1ms(2000);//直行
P1=0x05; //低4位 0101 反转
b=1500;Delay1ms(2000);//后退
b=1000;Delay1ms(1000);//后左转
b=1500;Delay1ms(2000);//后退
b=2000;Delay1ms(1000);//后右转
b=1500;Delay1ms(2000);//后退
}
}
void timer0()interrupt 1//定时器0定时20ms
{
TH0=(65536-20000)/256;
TL0=(65536-20000)%256;
PWM=1;
TR1=1;
ET1=1;
}
void timer1()interrupt 3//定时器1定时1到2ms
{
TH1=(65536-b)/256;
TL1=(65536-b)%256;
PWM=0;
TR1=0;
ET1=0;
}

阅读全文

与单片机驱动舵机程序相关的资料

热点内容
天干地支年份算法 浏览:796
程序员打造的视频 浏览:4
java和php通信 浏览:679
为什么黑程序员 浏览:162
程序员男生 浏览:455
戴尔文件夹内文件怎么置顶 浏览:582
云服务器6m网速 浏览:722
vivo手机中国联通服务器地址 浏览:862
工程总控编译失败 浏览:706
燕赵红枫app如何下载 浏览:867
php查杀软件 浏览:878
教育管理学pdf 浏览:547
服务器均衡怎么使用 浏览:626
linux中jps 浏览:954
单片机实验感想 浏览:561
程序员级别数学算法逻辑 浏览:900
2k21公园怎么换服务器 浏览:724
php释放数据库连接 浏览:722
php网页抓取工具 浏览:726
android设置对齐方式 浏览:23