51系列单片机舵机

STC89C52.舵机

我和其他小伙伴之前用51系列单片机实现了简单的遥控小车,其中用到了舵机,电机,蓝牙,等等。这里就先给舵机的代码,这些可以给以后刚开始接触单片机的朋友借鉴一下。
最后建议一下,51系列单片机是最最基础的,用来简单的学习可以,但是要向我们小组一样写一个小车,还是有些牵强。建议大家用32系列的。据我了解,目前不少学校学生刚开始就从32起步。毕竟51还是有点力不从心了。

#include<reg52.h>
unsigned char count;								   //0.5ms 次数标识
sbit pwm=P1^3;												// pwm信号输出
sbit jia=P3^7;												//角度增加按键检测I/O口
sbit jan=P3^6;												//角度增减少键检测I/O口
unsigned char jd;
sbit dula=P2^6;
sbit wela=P2^7;
 unsigned char code table[]={
 0x3f,0x06,0x5b,0x4f,0x66,
 0x6d,0x7d,0x07,0x7f,0x6f,
 0x77,0x7c,0x39,0x5e,0x79,0x71};
  void delayms(unsigned char i)							   //延时
  {
    unsigned char j,k;
	for(j=i;j>0;j--)
	  for(k=125;k>0;k--);
   }
 void time0_Init()												//定时器初始化
 {
   TMOD=0x01;													//定时器0工作在方式1
   IE=0x82;
   TH0=0xfe;
   TL0=0x33;													//11.0592MHz 晶振,0.5ms
   TR0=1;														//定时器开始
   }

 void time0_Int()interrupt 1								  
	{
	 TH0=0xfe;													//重新赋值
	 TL0=0x33;
	if(count<jd)												//判断0.5ms次数是否小于角度标识
	  pwm=1;													//确实小于,pwm输出高电平
    else
	  pwm=0;												     //大于则输出低电平
	  count=(count+1);											 //0.5ms次数加1
	  count=count%40;											 //次数始终保持在40即保持周期为20ms
	  }
	void keyscan()													   //键盘扫描	 
	{
	  if(jia==0)													  //角度增加按键是否按下
	  {
	   delayms(10);													 //按键延时,消抖
	   if(jia==0)													 //确实按下
	    {
		 jd++;														//角度标识加1 
		 count=0;												   //按键按 下则20ms周期从新开始
		 if(jd==6)
		    jd=5;												   //已近是180°,则保持
			while(jia==0);										   //等待按键放开
			}
		}
	   if(jan==0)													//角度减小按键是否按下
	  {
	   delayms(10);
	   if(jan==0)
	    {
		 jd--;														 //角度标识减1
		 count=0;
		 if(jd==0)
		    jd=1;													//已近是0°,则保持
			while(jan==0);
			}
		}
     }
 void display()														 //数码管显示函数
 {
   unsigned char bai,shi,ge;
   switch(jd)														 //根据角度标识显示相应的数值
   {
     case 1:														//为1,角度为0,前三个数码管显示000
	   bai=0;
	   shi=0;
	   ge=0;
	   break;
	 case 2:
	   bai=0;
	   shi=4;
	   ge=5;
	   break;   
	case 3:
	   bai=0;
	   shi=9;
	   ge=0;
	   break;
	case 4:
	   bai=1;
	   shi=3;
	   ge=5;
	   break;
    case 5:														//为5,角度为180,前三个数码管显示180
	   bai=1;
	   shi=8;
	   ge=0;
	   break;
	}
  dula=0;
  P0=table[bai];
  dula=1;
  dula=0;
  wela=0;
  P0=0xfe;
  wela=1;
  wela=0;
  delayms(5);
  P0=table[shi];
  dula=1;
  dula=0;
  P0=0xfd;
  wela=1;
  wela=0;
  delayms(5);
   P0=table[ge];
  dula=1;
  dula=0;
  P0=0xfb;
  wela=1;
  wela=0;
  delayms(5);
	}
   void main()
   {
    jd=1;
	count=0;
	time0_Init();
	while(1)
	{
	   keyscan();									  //按键扫描
	   display();
	   }
    }


若要稳定控制舵机转动还是要求大量的试验,调整pwm(脉宽),延时等等。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值