基于51单片机+SG90舵机

基本介绍

舵机的分类

大致分为以下三种吧 只是我现在用过就三种 。

180° 有限位 (不上电 只能转180度 真正转也就是180° )
180° 无限位 (不上电 能转360° 但是真正转也就是180°)
360° 无限位 (这个就是上电不上电都能转360°以上)

我这里用的是 180° 无限位的舵机
首先看看一下图片:
在这里插入图片描述

接线

接线其实很简单。

51单片机SG90舵机
VCCVCC(红色)
GNDGND(棕色)
P1.0信号线 (橙色)

代码

我用的是STC89C52

main.c


#include <reg52.h>
#include "delay.h"

unsigned int count;      //次数标识
unsigned int angle=5;         //角度标识
sbit pwm =P1^0 ;          //PWM信号输出

/*定时器初始化函数*/
void Timer0_Init(void)		//100微秒@11.0592MHz
{
	TMOD |= 0x01;		//设置定时器模式
	TL0 = 0xA4;		//设置定时初值
	TH0 = 0xFF;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
	ET0 = 1;
}

/*串口初始化函数*/
void Uart_Init(void)		//9600bps@11.0592MHz
{
	SCON = 0x50;		//8位数据,可变波特率
	TMOD |= 0x20;		//设定定时器1为8位自动重装方式
	TL1 = 0xFD;		//设定定时初值
	TH1 = 0xFD;		//设定定时器重装值
	ET1 = 0;		//禁止定时器1中断
	TR1 = 1;		//启动定时器1
	ES = 1;
	EA = 1;
}

/*串口发送一字节函数*/
void Uart_SendData(unsigned char dat )
{
	SBUF = dat;
	while(TI == 0);
	TI = 0;
}

/*串口发送字符串函数*/
void Uart_SendString(char *s)
{
	while (*s)              
	{
		Uart_SendData(*s++);
	}
}

/*程序入口*/
void main(void)
{
	//angle与对应角度关系
	//4   5   6   ...... 19  20
	//0   11  22  ...... 166 177
	Uart_Init();
	Timer0_Init();
	Uart_SendString("舵机正在旋转。\r\n");
	for(angle=4;angle<21;angle++)//从0到177度,步进11度
	{
		delay_ms(2);
	}
	delay_ms(2000);
	for(angle=21;angle>4;angle--)//从177到0度,步进11度
	{
		delay_ms(2);
	}
	Uart_SendString("舵机正在往复旋转。\r\n");
	while(1)
	{ 
		            
	}
}

/*串口中断服务函数*/
void Uart_Isr() interrupt 4
{
    if (RI)
    {
        RI = 0;  
	}
}


/*定时器中断服务函数*/
void Timer0_Isr() interrupt 1
{
	TL0 = 0xA4;		//设置定时初值
	TH0 = 0xFF;		//设置定时初值
	if(count< angle)              //判断次数是否小于角度标识
      pwm=1;                  //确实小于,PWM输出高电平
    else
      pwm=0;                  //大于则输出低电平
    count=(count+1);          //0.1ms次数加1
    count=count%160;     //保持周期为20ms,普通51单片机定时100us有误差,经示波器测量约为50Hz
}

delay.c

#include <reg52.h>
#include "delay.h"
#include "intrins.h"

//延时约1ms
void delay_ms(unsigned int ms)               
{
	unsigned int a,b;
	for(a=ms;a>0;a--)
		for(b=114;b>0;b--);
}

delay.h

#ifndef __DELAY_H
#define __DELAY_H
#include <reg52.h>

void delay_ms(unsigned int ms);

#endif


基于 51单片机的其他项目

基于51单片机+遥控灯
基于51单片机+LCD1602显示
基于51单片机+红外遥控解码+LCD1602显示
基于51单片机+DHT11温湿度+LCD1602显示
基于51单片机+DS18B20温度测温器+LCD1602显示
基于51单片机+SYN6288语音播报
基于51单片机+LD3320语音模块+SYN6288语音合成——语音识别智能分类垃圾桶
基于51单片机+ESP8266模块(HTTP)上传温湿度到oneNET APP显示+LCD1602显示

如果觉得这篇文章对你有用。欢迎大家点赞、评论哈哈o( ̄︶ ̄)o

继续加油!

  • 37
    点赞
  • 210
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 16
    评论
在上一期的项目:最简单DIY的51蓝牙遥控小车设计方案 访问地址是:https://www.cirmall.com/circuit/20328源码里面有舵机控制部分的程序,但是被我注释掉了,由于舵机控制还是比较复杂,这里还是开一个专题来讲解51单片机如何控制180度舵机。接线请看详细的程序注解吧,学过51肯定啃得动的。 #include "reg52.h" unsigned char count; //0.5ms 次数标识 sbit pwm =P2^7 ; //PWM信号输出,接舵机的数据线 sbit jia =P3^7; //角度增加按钮 sbit jan =P3^6; //角度减少按钮,低电平触发 unsigned char jd; //角度标识 1.0ms->45 1.5->90 2.0->135 2.5->180 void delay(unsigned char i)//普通延时函数 { unsigned char j,k; for(j=i;j>0;j--) for(k=125;k>0;k--); } void Time0_Init() //定时器0初始化 { TMOD = 0x01; //定时器0工作在方式1,16位增计数定时器,16位全是1,最大计数值是65535,就溢出了 IE = 0x82;//EA=1全局中断允许,ET0=1,定时器中断允许 TH0 = 0xfe;//(65536-N)/256=0xef=254推出N=512,N就是需要计数的个数,机器周期是1.09us,所以 //512*1.09us=0.5ms,这时候舵机为0度,1ms是45度,2.5ms是180度,其他的类推 TL0 = 0x33; //11.0592MHz晶振的单片机,导致0.5ms计数器溢出一次,产生定时器中断 TR0=1; //开启定时器 } void Time0_Int() interrupt 1 //定时器0中断服务程序 { TH0 = 0xfe; //重新装载初值 TL0 = 0x33; if(count< jd) //判断计数次数是否小于标识 pwm=1; //输出高电平PWM else pwm=0; //低电平PWM count=(count+1); //计数次数继续增加 count=count@; //计数次数必须小于40,因为0.5ms*40=20ms,这是舵机PWM的固定周期 } void keyscan() //按键扫描 { if(jia==0) //按下增加按钮 { delay(10); //消除抖动 if(jia==0) //按下增加按钮 { jd++; //标识增加,一共有5档,jd=1对应0度,jd=2对应0,45度,jd=3对应90,4对应135,5对应180度 count=0; //计数清0,当count加到2的时候,溢出两次,时间是0.5*2=1ms,对应舵机转到45度 if(jd==6) jd=5; //标识清0 while(jia==0); //等待按键释放 } } if(jan==0) //按下减少按钮 { delay(10); if(jan==0) { jd--; //同理 count=0; if(jd==0) jd=1; //复位 while(jan==0); } } } void main() { jd=1; count=0; Time0_Init(); while(1) { keyscan(); //死循环,按键检测 } } 程序分析结束了。 总结: 根据工作原理,舵机的具体控制方法就是需要一个20ms左右的时基脉冲, 该脉冲的高电平部分一般为0.5ms~2.5ms范围内的角度控制脉冲部分。 脉冲宽度从0.5ms~2.5ms,相对应舵盘的位置为0~180度,呈线性变化。 ***************一般舵机脉冲宽度20ms,高电平宽度与角度对应关系*********** 0.5ms————0度; 1.0ms————45度; 1.5ms————90度; 2.
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

皮卡丘吉尔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值