请大神看看我的代码哪里有问题呢,电位器控制舵机的谢谢啦

2019-07-15 14:58发布

电位器控制舵机 随动,单片机是STC15W408AS   暂时没有用PWM模块,只是用的定时器0中断发出PWM,P3.2脚接4.7K电阻到舵机信号线, P1.1接5K电位器,但是接上电后舵机不稳定,电位器转到头了  ,舵机开始抖动,无法运转,求高手看看指教谢谢! 程序如下:
#include <reg51.h>
#include <intrins.h>
typedef unsigned char uchar;
typedef unsigned int uint;
sbit k=P3^2;
uint a=0,v,c;
/*********************************
  定义相应操作位
***********************************/

sfr  AUXR       =   0x8e;       //辅助寄存器                              
sfr ADC_CONTR   =   0xBC;           //ADC控制寄存器
sfr ADC_RES     =   0xBD;           //ADC高8位结果
sfr ADC_LOW2    =   0xBE;           //ADC低2位结果
sfr P1ASF       =   0x9D;           //P1口第2功能控制寄存器
#define ADC_POWER   0x80            //ADC电源控制位
#define ADC_FLAG    0x10            //ADC完成标志
#define ADC_START   0x08            //ADC起始控制位
#define ADC_SPEEDLL 0x00            //540个时钟
/*********************************
10微秒 定时器初始化  
***********************************/
void Inittimer0(void)                //10微秒@11.0592MHz
{
        ET0 = 1;      //使能定时器0中断
    EA = 1;
        AUXR |= 0x80;                //定时器时钟1T模式
        TMOD &= 0xF0;                //设置定时器模式
        TL0 = 0x91;                //设置定时初值
        TH0 = 0xFF;                //设置定时初值

        TR0 = 1;                //定时器0开始计时
       

}

/*********************************
读取ADC结果
***********************************/
uint GetADCResult(uchar ch)
{
        int V;
        ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
    _nop_();                        //等待4个NOP
    _nop_();
    _nop_();
    _nop_();
    while (!(ADC_CONTR & ADC_FLAG));//等待ADC转换完成
    ADC_CONTR &= ~ADC_FLAG;         //Close ADC

        V=ADC_RES;
    return V;
  }

/*----------------------------
软件延时
----------------------------*/

void Delay(uint n)
{
    uint x;

    while (n--)
    {
        x = 5000;
        while (x--);
    }
}


/*----------------------------
初始化ADC
----------------------------*/
void InitADC()
{
    P1ASF = 0x02;                   //设置P1口为AD口
    ADC_RES = 0;
                    //清除结果寄存器
    ADC_CONTR = ADC_POWER | ADC_SPEEDLL;
    Delay(2);                       //ADC上电并延时
}

/*----------------------------
舵机控制
----------------------------*/

void kongzhi()
{

   c=(v+50);
   if(a<=c)

    k=1;

        else

        k=0;

}



/*----------------------------
主函数
----------------------------*/

void main ()
{
        InitTimer0();
        while(1)
          {
                   InitADC();
                   GetADCResult(1);
                   v=GetADCResult(1);
                 c=0;

          }

}

void timer0int()interrupt 1         

   {
        TL0 =0x91;                //设置定时初值
        TH0 =0xFF;                //设置定时初值
        a++;
        kongzhi();
        if(a=2000)
        a=0;
        }

1212.png
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。