专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

51单片机舵机控制程序

作者:竹园电科技   来源:本站原创   点击数:  更新时间:2014年03月18日   【字体:

    不记得多久没接触过程序这东东了,C++是完全忘了,因为第一个VC的hello world是编译不出来的,虽然后来确认了是设置路径的问题。也在怀疑自己是否曾经读过大学,因为虽然知道那玩意叫微积分,但已经不知道哪个叫微分,哪个是积分了。好吧,虽然有点夸张,但绝对是不过份的!^o^ 买了个单片机开发板确实是明智的,因为那玩意确实好玩,也依然兴趣不减,因为编程的心依然不死,觉得那东西是必须要学会并熟练的,否则太对不起我那夭折的第二学历了。虽然那就只差三科就过了。好吧,我得承认那是最难的也是最主要的三科:数据结构、数据库原理、信息系统开发与管理。出来也曾经想过要去考的,但后来东奔西跑的还是没去成。现在已是完全放弃了,也觉得没那个必要了,也不会觉得多了个本本又什么重要的了,你学会了才是重要的!所以现在观念也改变了:我学是因为我喜欢!所以这个项目也是会一直延续下去的,不管中间是否会停顿,但总会春风吹又生的!
      男人之于机械就好比女人之于衣服!还记得小时候自己干的坏事吧,多好的玩具总被好奇地拆坏!好吧,虽然你已经长大了,但看到汽车还是会忍不住的喜欢,对吧,也总是会有想把它改造的冲动,对吧!看到飞机模型还是会想玩,对吧!所以想玩就玩呗,有兴趣是一件幸福的事情!更何况是个多么科幻和挑战的兴趣呢~所以,开始吧,确定你一生的目标和兴趣!
       好吧,这是一条漫长的路。路漫漫其修远兮,吾将上下而求索!俺在大学里最受用的是确立了一个信仰:活到老,学到老!所以路不怕漫长!蒹葭苍苍,白露为霜。所谓伊人,在水一方!溯洄从之,道阻且长。溯游从之,宛在水中央。我将像追求美女一样地坚韧与不拔~
       但海市蜃楼虽然美丽,却是建不起的,万丈高楼平地起,所以先来基础研究,哈哈~如果你有兴趣,那就一起吧,那个什么子的曰:与其独乐乐,不如与人乐乐,孰乐?这个世界需要Team,创业需要Team,研究需要Team,连大盗也需要Team,如果你不需要Team,YOU OUT了!
       单片机也买一段时间了,挺好玩的,很基础很踏实的东西,发现是大学时期最最应该拥有的玩意!但那时却并没拥有过,那个恨呀!那个泪流啊~如果冬天里落在黄河上,它也就不用再干枯了~!
       好了,口水多过长江水,太多了污染环境,不知长江里的白海豚是不是我害的,听说再也找不到了~
       先记录几个相关试验先~
       单片机一来就迫不及待地试验了,程序虽然不是自己写的,但C程序还是能看得懂的,C51也就多了些关键字,研究研究修改修改引脚就能用上了。但单片机与硬件是密切相关的,要驱动外围硬件要放大信号,要了解下上拉电阻的概念。舵机买的是辉盛的9克舵机,便宜货,干扰就会动,供电得单独供电,不能和单片机共用。另供电的和单片机还得共地线,否则也是不动的。
      单片机AI练习之舵机控制程序:通电舵机到中位,P1.1角度减少,P1.2增加。原程序是一接通到180度位置的,舵机的中位不太准的,没到180度就被限位了,害得我第一天就弄坏了个舵机。源程序如下,备档
 
#include <reg52.h>
unsigned char count;      //0.5ms次数标识
sbit pwm =P0^1 ;          //PWM信号输出
sbit jia =P1^2;           //角度增加按键检测IO口
sbit jan =P1^1;           //角度减少按键检测IO口
unsigned char jd;         //角度标识
void delay(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.0592MZ晶振,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)               //角度增加按键是否按下
  {
    delay(10);              //按下延时,消抖
    if(jia==0)              //确实按下
     {
      jd++;                 //角度标识加1
      count=0;              //按键按下 则20ms周期从新开始
      if(jd==6)
        jd=5;               //已经是180度,则保持
      while(jia==0);        //等待按键放开
     }
  }
  if(jan==0)                //角度减小按键是否按下
  {
    delay(10);
    if(jan==0)
     {
      jd--;                 //角度标识减1
      count=0;
      if(jd==0)
        jd=1;               //已经是0度,则保持
      while(jan==0);
     }
  }
}
void main()
{
jd=3;
count=0;
Time0_Init();            
while(1)
{
  keyscan();               //按键扫描
 
}
}
 

关闭窗口

相关文章