飞道的博客

基于51单片机+SG90舵机

239人阅读  评论(0)

基本介绍

舵机的分类

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

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

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

接线

接线其实很简单。

51单片机 SG90舵机
VCC VCC(红色)
GND GND(棕色)
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语音播报

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

继续加油!


转载:https://blog.csdn.net/weixin_47457689/article/details/116754222
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场