使用51单片机控制舵机转动(按键),示波器检测

对于一般的舵机来说,所对应的PWM波的周期为20ms。
其空占比与转动角度的关系。普通舵机的舵量是0~180°

0.5ms/20 ms = 0 度

1.0ms/20ms = 45 度

1.5ms/20ms = 90 度

2.0ms/20ms = 135 度

2.5ms/20ms = 180 度

本文代码中使用的晶振是12Mhz。我是使用定时器方式2,自动填装初值才能够使周期控制在50hz,刚开始使用的是方式1,使用示波器检测是52hz。不知道是为什么,不过还好问题解决了,本代码很稳。
-------------------------------------------------------------------------------------------*/

#include<reg52.h>
#define uint unsigned int

sbit key1 = P3^2;				  //减	
sbit key2 = P3^3;				  //加
sbit pwm1 = P2^0;				  
uint target = 15;
uint percent = 0;

void Timer0Initial();			  //定时器0装初值
void initial_Timer();			  //定时器初始化
void delay(unsigned int x);		  //延时
void keyscan();					  //键盘扫描



void keyscan()					  
{
	delay(30);				      //缓冲舵机速度
	if(key1 == 0)				  //减
	 {
		 delay(10);				  //消抖
	     if(key1 == 0)
        {
		   if(target >= 5)
			  target -= 1;
		      while (key1 ==0);
	     }
     }
//	  while (key1 != 1);

	 if(key2 == 0)				  //加
	{
		delay(10);
	    if(key2 == 0)
		{
		   if(target < 25)
		      target += 1;
			   while (key2 ==0);
	    }
	 } 
//	 while (key2 != 1);
}

void initial()					//键盘、定时器初始化
{
	 key1 = 1;
	 key2 = 1;
	 initial_Timer();
}


void Timer0Initial()			 //定时器0装初值
{
//	 TH0 = (65536-65)/256;		 //该初值使每0.1ms产生一次中断.理论上,12Mhz晶振12分频之后,应该是100次计数时间是100us
//	 TL0 = (65536-65)%256;		 //通过示波器实测
	 TH0 = 0x9C;	     	     //选用65次计数产生一次中断
	 TL0 = 0x9C;     

}

void initial_Timer()			//定时器初始化
{								
	 EA = 1;				    //开总中断--学校总闸
	 ET0 = 1;					//开定时器0中断--光电楼总闸
	 TMOD = 0x02;				//设置定时器0为工作方式
	 Timer0Initial();			//装初值
	 TR0 = 1;				    //启动定时器0--N707B总闸
}

void delay(unsigned int x)		//延时
{
	 uint i,j;
	 for(i=x;i>0;i--)
	 for(j=110;j>0;j--);
}

void main()
{
	 initial();					  //键盘、定时器初始化
	 while(1)					  //不断扫描键盘
	 {
	  keyscan();
	 }
}

void Timer0() interrupt 1 		 //中断服务程序
{
	percent+=1;
	
	if(percent<=target)			 //target初值是15,接电时居中
		pwm1=1;					 
	else
		pwm1=0;
	if(percent==200)
		percent=0;		 
		  
}
  • 4
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个基于51单片机的舵机控制代码,可以通过按键来调节角度: ```c #include <reg51.h> sbit key1 = P1^0; // 按键1 sbit key2 = P1^1; // 按键2 sbit key3 = P1^2; // 按键3 sbit servo = P2^0; // 舵机控制信号 void delay(unsigned int t) // 延时函数 { unsigned int i, j; for (i = 0; i < t; i++) for (j = 0; j < 125; j++); } void main() { unsigned char angle = 0; // 舵机角度 unsigned char key_state = 0; // 按键状态 while (1) { if (!key1) // 检测按键1 { key_state = 1; angle += 10; // 调节角度 if (angle > 180) angle = 180; // 角度限制 } else if (!key2) // 检测按键2 { key_state = 1; angle -= 10; // 调节角度 if (angle < 0) angle = 0; // 角度限制 } else if (!key3) // 检测按键3 { key_state = 1; angle = 90; // 调节角度为90度 } if (key_state) // 如果有按键按下 { key_state = 0; servo = 1; // 舵机控制信号置高 delay(20); // 延时20ms servo = 0; // 舵机控制信号置低 delay(180 - angle); // 延时,控制角度 } else // 如果没有按键按下 { servo = 1; // 舵机控制信号置高 delay(20); // 延时20ms servo = 0; // 舵机控制信号置低 delay(180 - angle); // 延时,控制角度 } } } ``` 说明: 1. 使用 P1.0、P1.1、P1.2 三个按键来调节舵机角度。 2. 使用 P2.0 控制舵机的控制信号。 3. 使用 delay() 函数来实现延时。 4. 当按下按键1时,舵机角度增加 10 度,当按下按键2时,舵机角度减少 10 度,当按下按键3时,舵机角度调节为 90 度。 5. 角度限制在 0 到 180 度之间。 6. 控制舵机角度的延时时间为 180-角度,因为舵机信号高电平的时间为 20ms。 希望这个代码对你有帮助!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值