一、背景描述
自己在DIY航模,属于小白,把自己做的舵机控制做个简单的记录,大佬们不要嘲笑~~。如果是初学单片机的,可以参考下。
程序的主要功能是,通过ADC读取旋钮(滑动变阻器的电压),然后对应的调节舵机的位置。
二、直接上程序
初始化定义
#include"c8051f340.h" //引入头文件
#define SYSCLK 12000000 //定义系统晶振
void Port_Init (void); // 定义端口初始化函数
void Timer0_Init (void); // Timer0初始化函数
void delay_50us(unsigned long N50us); // 定义延时函数
void OSCIN_init(void); //定义晶振初始化函数
void Volt_measure(void); //定义电压测量函数
//定义全局变量
xdata unsigned long Volt1_value=0;
xdata unsigned long Time_flag=0;
sbit LED = P2^2; // P2.2连接了一个LED
sbit PPM0=P0^0; //P0.0控制PPM
贴上main函数:
main()
{
unsigned long coeff=0;
PCA0MD &= ~0x40; // 清看门狗
OSCIN_init(); //晶振初始化
Port_Init(); //端口初始化
EA=1;
while(1)
{
PPM0=0;
Volt_measure();
coeff=Volt1_value/60;
if(coeff>10)
coeff=10;
delay_50us(342-2*coeff);
PPM0=1;
delay_50us(20+2*coeff);
}
}
定时器0终端函数:
void Timer0_ISR (void) interrupt 1
{
TH0 = 0xff; // Reinit Timer0 High register
TL0 = 0xce; // Reinit Timer0 Low register
Time_flag++;
}
延时函数:
void delay_50us(unsigned long N50us)
{
unsigned long i=0;
Timer0_Init();
Time_flag=0;
while(Time_flag<N50us);
ET0=0;
Time_flag=0;
}
电压测量函数:
void Volt_measure(void)
{
ADC0_Init ();
Volt1_value=0;
AD0BUSY=1;
while(AD0INT==0);
AD0INT=0;
Volt1_value=ADC0H;
Volt1_value<<=8;
Volt1_value|=ADC0L;
}
三、效果
能够实现舵机的简单控制,根据旋钮位置,控制舵机的位置。