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

PIC16F877A一路舵机参数化控制程序

作者:huqin   来源:本站原创   点击数:  更新时间:2014年03月25日   【字体:


;**    日期:  2010年.10月
;**    描述:  一路舵机参数化控制
;**    功能:  用Time1中断,RD6口输出
;**    晶振:       12M        
;**    适用机型:  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;
         }
}
 

关闭窗口

相关文章