專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計實例 >> 瀏覽文章

PIC16F877A一路舵機(jī)參數(shù)化控制程序

作者:huqin   來源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時間:2014年03月25日   【字體:


;**    日期:  2010年.10月
;**    描述:  一路舵機(jī)參數(shù)化控制
;**    功能:  用Time1中斷,RD6口輸出
;**    晶振:       12M        
;**    適用機(jī)型:  PIC16F877A,TowerPro MG995
*********************************************************************************/
#include<pic.h>
#define uchar unsigned char
#define uint  unsigned int
uint f;
uchar servo_angle_H;
uchar servo_angle_L;
uchar compensate_L;
uchar compensate_H;
void delay(uint x)
{
      uint a,b;
      for(a=x;a>0;a--)
           for(b=110;b>0;b--);
}
void init()
{
      TRISD=0x00;
      PORTD=0x00;
      INTCON=0xc0;
      PIE1=0x01;
      TMR1L=0; 
      TMR1H=0; 
      T1CON=0x21;
       f=0;
}
void servo(uint angle)
{
      uint temp,value;
      value=(65536-368)-(75*angle)/9;
      temp=(65536-14617)+(75*angle)/9;
      servo_angle_H=value%256;
      servo_angle_L=value/256 ;
      compensate_L=temp%256;
      compensate_H=temp/256;
}
void main()
{
      init();
      uint angle;
      servo(0);
      delay(200);
      while(1)
      {
             for(angle=0;angle<181;angle++)
            {
                 servo(angle);
                 delay(100);
            }
            for(angle=180;angle>0;angle--)
            {
                 servo(angle);
                 delay(100);
            }
      }
}
 
void interrupt time1()
{
      TMR1IF=0;
       f=~f;
       if(f==0)
       {
             TMR1L=servo_angle_H;
             TMR1H=servo_angle_L;      
              RD6=1;
       }
       else
       {
              TMR1L=compensate_L;
              TMR1H=compensate_H;
               RD6=0;
         }
}
 

關(guān)閉窗口

相關(guān)文章