51单片机
回帖(1)
2021-10-26 15:03:51
基本介绍
舵机的分类
大致分为以下三种吧 只是我现在用过就三种 。
180° 有限位 (不上电 只能转180度 真正转也就是180° )
180° 无限位 (不上电 能转360° 但是真正转也就是180°)
360° 无限位 (这个就是上电不上电都能转360°以上)
我这里用的是 180° 无限位的舵机
首先看看一下图片:
接线
接线其实很简单。
[tr]51单片机SG90舵机[/tr]
VCC | VCC(红色) |
GND | GND(棕色) |
P1.0 | 信号线 (橙色) |
代码
#include
#include "delay.h"unsigned int count; //次数标识unsigned int angle=5; //角度标识***it 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 #include "delay.h"#include "intrins.h"//延时约1msvoid 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 void delay_ms(unsigned int ms);#endif
基本介绍
舵机的分类
大致分为以下三种吧 只是我现在用过就三种 。
180° 有限位 (不上电 只能转180度 真正转也就是180° )
180° 无限位 (不上电 能转360° 但是真正转也就是180°)
360° 无限位 (这个就是上电不上电都能转360°以上)
我这里用的是 180° 无限位的舵机
首先看看一下图片:
接线
接线其实很简单。
[tr]51单片机SG90舵机[/tr]
VCC | VCC(红色) |
GND | GND(棕色) |
P1.0 | 信号线 (橙色) |
代码
#include
#include "delay.h"unsigned int count; //次数标识unsigned int angle=5; //角度标识***it 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 #include "delay.h"#include "intrins.h"//延时约1msvoid 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 void delay_ms(unsigned int ms);#endif
举报
更多回帖