资源简介

利用51单片机控制双舵机,利用定时器0和定时器1分别控制水平和垂直方向的舵机,模拟实现云台的功能。内含分别利用T0和T1单独控制舵机的代码,利用数码管显示9度步进角,按键实现角度加减~

资源截图

代码片段和文件信息

#include “reg52.h“
unsigned char count;      //0.1ms次数标识
sbit pwm =P1^7 ;          //PWM信号输出
sbit jia =P3^6;           //角度增加按键检测IO口
sbit jan =P3^7;           //角度减少按键检测IO口
unsigned char jd;         //角度标识
unsigned char flag;
sbit dula=P2^6;
sbit wela=P2^7;
unsigned char code table[]={0x3f0x060x5b0x4f0x660x6d0x7d
                        0x070x7f0x6f0x770x7c0x390x5e0x790x71};
void delay(unsigned char i)//延时
{
  unsigned char jk;
  for(j=i;j>0;j--) //jiang jd=5fenli
    for(k=125;k>0;k--);
}
void Time0_Init()            //定时器初始化
{
TMOD = 0x02;             //定时器0工作在方式2自动重装TH0的值    
IE   = 0x82;
TH0  = 0xa4;
TL0  = 0xa4;      //11.0592MZ晶振,0.1ms
    TR0=1;                   //定时器开始
}
void Time0_Int() interrupt 1 //中断程序
{
// TH0  = 0xfe;             //重新赋值
// TL0  = 0x33;

    
    {
    if(count       pwm=1;                  //确实小于,PWM输出高电平
    else
      pwm=0;     
    }

    count=(count+1);          //0.1ms次数加1    
   if(count==200)   count=0;           //次数始终保持为200 即保持周期为20ms
    
}



void keyscan()               //按键扫描

   if(jia==0)                //角度增加按键是否按下
  {
    delay(30);               //按下延时,消抖
    if(jia==0)               //确实按下
     { 
       jd++;                  //角度标识加1
       count=0;               //按键按下 则20ms周期从新开始
     if(jd==25)
        jd=25;                //已经是180度,则保持
      while(jia==0);         //等待按键放开
     }
  }
  if(jan==0)                //角度减小按键是否按下
  {
    delay(30);
    if(jan==0)
     {

       jd--;                 //角度标识减1
      count=0;
      if(jd==0)
        jd=1;               //已经是0度,则保持
      while(jan==0);
     }
  }

}
void display()               //数码管显示函数
{
  unsigned char baishige; 
   switch(jd)                //根据角度标识显示相应的数值
{
      case 1:                //为1,角度为0,前3个数码管显示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,前3个数码管显示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;
   delay(5);
   P0=table[shi];
   dula=1;
   dula=0;
   P0=0xfd;
   wela=1;
   wela=0;
   delay(5);
   P0=table[ge];
   dula=1;
   dula=0;
   P0=0xfb;
   wela=1;
   wela=0;
   delay(5);
}
void main()
{
 jd=3;
 flag=0;
 count=0; 
 pwm=0;
 Time0_Init();              
 while(1)
 {
  keyscan();               //按键扫描
  display();
 }
}


 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       1689  2004-03-27 13:30  多舵机\REG51.H

     文件       1961  2008-02-17 00:06  多舵机\nmain.c

     文件       2754  2008-02-16 23:50  多舵机\main.LST

     文件       5115  2002-04-16 15:32  多舵机\STARTUP.A51

     文件       7407  2008-02-17 00:06  多舵机\11.plg

     文件       4333  2008-02-16 23:50  多舵机\main.OBJ

     文件       4563  2008-02-17 00:04  多舵机\nmain.LST

     文件       5946  2008-02-17 00:04  多舵机\nmain.OBJ

     文件       5710  2008-02-17 00:04  多舵机\11

     文件        914  2008-02-17 00:04  多舵机\STARTUP.obj

     文件       1221  2008-02-17 00:06  多舵机\11.Opt

     文件      11794  2008-02-17 00:04  多舵机\STARTUP.lst

     文件       8054  2008-02-17 00:04  多舵机\11.M51

     文件       1459  2008-02-17 00:04  多舵机\11.hex

    .......         0  2008-02-16 22:54  多舵机\11_Uv2.Bak

     文件       2081  2008-02-16 23:37  多舵机\11.Uv2

    .......      1196  2008-02-16 23:37  多舵机\11_Opt.Bak

     文件       1022  2008-02-16 23:50  多舵机\main.c

     目录          0  2008-02-16 22:54  多舵机

     文件       3080  2012-04-15 12:05  T1duoji.c

     文件       3048  2012-04-15 11:29  T0duoji.c

----------- ---------  ---------- -----  ----

                73347                    21


评论

共有 条评论