http://www.amobbs.com/forum.php?mod=viewthread&tid=5484303&highlight=%E6%97%A0%E5%88%B7%E7%94%B5%E6%9C%BA
此链接的控制程序,跪求了,阿莫的大神们
单片机控制电调的程序
答案:1 悬赏:70 手机版
解决时间 2021-12-25 20:05
- 提问者网友:聂風
- 2021-12-24 20:09
最佳答案
- 五星知识达人网友:不想翻身的咸鱼
- 2021-12-24 20:15
做舵机信号测试一下用可以51的定时器中断实现。舵机信号一般脉宽为0.5ms~2.5ms的PWM方波周期20ms。
做四轴的话还是建议采用ARM,国外有个关于四轴的开源网站可以参考。
了解舵机信号可以参考 百度文库搜:航模舵机控制原详解
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar key_stime_counter,hight_votage=15,timeT_counter;
bit key_stime_ok;
sbit control_signal=P0^0;
sbit turn_left=P3^4;
sbit turn_right=P3^5;
void TimerInit()
{
control_signal=0;
TMOD=0x01; //设置定时器0为工作方式1
EA=1; //开总中断
ET0=1; //定时器0中断允许
TH0 = 0xFF; //定时器装初值
TL0 = 0xA3;
TR0=1; //启动定时器0
}
void timer0(void) interrupt 1 using 0
{
TH0=0xFF;
TL0=0xA3; //定时器0重新装入数值
if (++key_stime_counter>=200)
{
key_stime_counter=0;
control_signal=1;
key_stime_ok = 1; // 20ms到
timeT_counter=0;
}
if (key_stime_ok&&(++timeT_counter>=hight_votage))
{
key_stime_ok=0;
timeT_counter=0;
control_signal=0; // hight_votage*0.1ms到
}
}
uchar keyscan(void)
{
static char key_state = 0;
static char key_value = 0;
uchar key_press, key_return = 0;
key_press=turn_left&turn_right; //读按键I/O电平
switch (key_state)
{
case 0 : // 按键初始态
if (key_press==0) key_state = 1; // 键被按下,但需要确认是否是干扰
break;
case 1 : // 按键确认态
if (key_press==0)//如有键按下则不是干扰,判断键值
{
if(turn_left==0) //判断是哪一个按键被按下
key_value=1; //按键较多时可采用switch选择结构
else if(turn_right==0)
key_value=2;
else
key_value=0;
key_state = 2; // 状态转换到键释放态
}
else
key_state = 0; // 按键已抬起,属于干扰,转换到按键初始态
break;
case 2 :
if (key_press==1)
{
key_return=key_value;//按键释放后再输出键值,如果按下键就输出则可省略key_value
key_value=0;
key_state = 0; //如果按键释放,转换到按键初始态
}
break;
}
return key_return; //返回键值
}
void key_operation(void)
{
switch (keyscan()) //根据键值不同,执行不同的内容
{
case 1:
hight_votage-=1;
if(hight_votage<5)
hight_votage=5;
break;
case 2:
hight_votage+=1;
if(hight_votage>25)
hight_votage=25;
break;
default :
break;
}
}
//LED显示函数
void diplay()
{
if(hight_votage>=5&&hight_votage<=7) P1=0xFD; //1灯亮,舵机接近或到达右转极限位置
if(hight_votage>7&&hight_votage<=10) P1=0xFB; //2灯亮
if(hight_votage>10&&hight_votage<=13) P1=0xF7; //3灯亮
if(hight_votage>13&&hight_votage<=16) P1=0xEF; //4灯亮,舵机到达中间位置
if(hight_votage>16&&hight_votage<=19) P1=0xDF; //5灯亮
if(hight_votage>19&&hight_votage<=22) P1=0xBF; //6灯亮
if(hight_votage>22&&hight_votage<=25) P1=0x7F; //7灯亮,舵机接近或到达左转极限位置
}
void main(void)
{
TimerInit();
while(1)
{
key_operation();
diplay();
}
}以上代码我也是在网上下来的没做测试(现在在玩STM32。51的东西都收拾起来了)可以供你参考。
做四轴的话还是建议采用ARM,国外有个关于四轴的开源网站可以参考。
了解舵机信号可以参考 百度文库搜:航模舵机控制原详解
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar key_stime_counter,hight_votage=15,timeT_counter;
bit key_stime_ok;
sbit control_signal=P0^0;
sbit turn_left=P3^4;
sbit turn_right=P3^5;
void TimerInit()
{
control_signal=0;
TMOD=0x01; //设置定时器0为工作方式1
EA=1; //开总中断
ET0=1; //定时器0中断允许
TH0 = 0xFF; //定时器装初值
TL0 = 0xA3;
TR0=1; //启动定时器0
}
void timer0(void) interrupt 1 using 0
{
TH0=0xFF;
TL0=0xA3; //定时器0重新装入数值
if (++key_stime_counter>=200)
{
key_stime_counter=0;
control_signal=1;
key_stime_ok = 1; // 20ms到
timeT_counter=0;
}
if (key_stime_ok&&(++timeT_counter>=hight_votage))
{
key_stime_ok=0;
timeT_counter=0;
control_signal=0; // hight_votage*0.1ms到
}
}
uchar keyscan(void)
{
static char key_state = 0;
static char key_value = 0;
uchar key_press, key_return = 0;
key_press=turn_left&turn_right; //读按键I/O电平
switch (key_state)
{
case 0 : // 按键初始态
if (key_press==0) key_state = 1; // 键被按下,但需要确认是否是干扰
break;
case 1 : // 按键确认态
if (key_press==0)//如有键按下则不是干扰,判断键值
{
if(turn_left==0) //判断是哪一个按键被按下
key_value=1; //按键较多时可采用switch选择结构
else if(turn_right==0)
key_value=2;
else
key_value=0;
key_state = 2; // 状态转换到键释放态
}
else
key_state = 0; // 按键已抬起,属于干扰,转换到按键初始态
break;
case 2 :
if (key_press==1)
{
key_return=key_value;//按键释放后再输出键值,如果按下键就输出则可省略key_value
key_value=0;
key_state = 0; //如果按键释放,转换到按键初始态
}
break;
}
return key_return; //返回键值
}
void key_operation(void)
{
switch (keyscan()) //根据键值不同,执行不同的内容
{
case 1:
hight_votage-=1;
if(hight_votage<5)
hight_votage=5;
break;
case 2:
hight_votage+=1;
if(hight_votage>25)
hight_votage=25;
break;
default :
break;
}
}
//LED显示函数
void diplay()
{
if(hight_votage>=5&&hight_votage<=7) P1=0xFD; //1灯亮,舵机接近或到达右转极限位置
if(hight_votage>7&&hight_votage<=10) P1=0xFB; //2灯亮
if(hight_votage>10&&hight_votage<=13) P1=0xF7; //3灯亮
if(hight_votage>13&&hight_votage<=16) P1=0xEF; //4灯亮,舵机到达中间位置
if(hight_votage>16&&hight_votage<=19) P1=0xDF; //5灯亮
if(hight_votage>19&&hight_votage<=22) P1=0xBF; //6灯亮
if(hight_votage>22&&hight_votage<=25) P1=0x7F; //7灯亮,舵机接近或到达左转极限位置
}
void main(void)
{
TimerInit();
while(1)
{
key_operation();
diplay();
}
}以上代码我也是在网上下来的没做测试(现在在玩STM32。51的东西都收拾起来了)可以供你参考。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯