51单片机sg90舵机

51单片机按键控制舵机旋转

一、舵机工作原理

1、这里介绍的sg90的可旋转角度为 0~180°

2、sg90有三条线,橙色(PWM)红色(5V)棕色(GND)

3、PMW的范围为0.5ms2.5ms,相应的旋转角度为0180°

在这里插入图片描述

在这里插入图片描述

二、控制代码

1、接线图如下(这里用到的PWM引脚为at89c52中的 P2.1):

photo_2022-12-10_22-51-59

2、实现的功能介绍:按下k2旋转角度为0°(复位),按下k3旋转角度递增,按下k4旋转角度递减,按下k5旋转角度最大(180°)

3、代码如下:

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

int count = 0; //全局变量,监控pwm周期
int jd=5; //初始化旋转角度,5是通过定时器定时长度和sg90高电平持续时间计算出来的(以下会说明)
sbit sg90=P2^1;
sbit key1 = P3^4;
sbit key2 = P3^5;
sbit key3 = P3^6;
sbit key4 = P3^7;

//延时函数
void delay(unsigned char i){
	unsigned int j,k;
 	for(j=i;j>0;j--)
	for(k=125;k>0;k--);
}

//定时器初始化函数
void Time0_init(){
	TMOD=0X01;      //T0定时方式1
  	TL0 = 0xA4;		//设置定时寄存器低八位初值
	TH0 = 0xFF;		//设置定时寄存器高八位初值
  	ET0=1;          //打开定时器0的中断
  	TR0=1;          //打开定时器0
  	EA=1;           //开总中断
}


void main(){
	delay(300);
	Time0_init();	
	while(1){
		//复位键
		if(key1 == 0){
			delay(50);
			if(key1 == 0){
				jd = 5;
				count = 0;
			}
		}
		//角度递增
		if(key2 == 0){
			delay(50);
			if(key2 == 0){
				if(jd>=5 && jd<=24){
					jd++;
				}	
				count = 0;
			}
		}
		//角度递减
		if(key3 == 0){
			delay(50);
			if(key3 == 0){
				if(jd>=6 && jd<=25){
					jd--;
				}			
				count = 0;
			}
		}
		//最大角度
		if(key4 == 0){
			delay(50);
			if(key4 == 0){
				jd = 25;
				count = 0;
			}
		}
	}
}



void Time_server() interrupt 1{
	TL0 = 0xA4;		//设置定时寄存器低八位初值
	TH0 = 0xFF;		//设置定时寄存器高八位初值
	if(count<=jd){
		sg90 = 1;
	}else{
		sg90 = 0;
	}
	count++;
	if(count >= 200){
		sg90 = 0;
		count = 0;
	}
}

4、关于中断

  • 定时器定时长度可通过工具算出:

    在这里插入图片描述

  • 1
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值