(完整版)基于单片机的遥控小车的设计毕业设计 下载本文

图14 矩阵键盘原理图 图15 独立键盘原理图

4.3.2遥控部分程序介绍

在遥控的部分中本次设计使用的是一对编解码电路,和一对收发电路所组成的。发射控制引脚4个,可以组成16种不同的编码,在这里因为一共设置了7个按键,所以使用了7种编码。在接收端使用单片机P2口的4路引脚接接收芯片的4路控制输出。通过函数KeyScan(); 循环扫描P2口,如果有输入的话,该引脚电平为低电平。GPIO_Key存放的就是P2口引脚的值,没有输入信号是,GPIO_Key = 0xF0。程序扫描时要是有信号输入的话,键值就会发生变化,判断程序:

void KeyScan() {

if(GPIO_Key != 0xF0) //检查是否有按键按下。

//键值扫描程序,扫描无线输入状态。

{

Key_Value = GPIO_Key; //将键值存储下来。 Key_Count++;

//用作延时。

if(Key_Value != 0xF0) //键值发生变化。 {

else

通过Switch条件选择语句,判断发射的键值,然后选择相应的操作。在switch语句中根据实际的小车控制按键的设计,将每个语句都赋予不同的键值以对应不同的功能。

switch(Key_Value) 在case中:

第一个为停车:当然电机的占空比为0,速度为0,舵机控制Steer_Ctrl = 24,舵机控制的前轮在中间位置。

case 0xF1:

Motor_Ctrl = 0;

break; //停中

//键值选择。

Steer_Ctrl = 24;

第二个为3档:电机输出占空比最高,为100% case 0xF2:

Motor_Ctrl = 500;

break; //3档

第三个为2档:电机输出占空比为70%

case 0xF4: Motor_Ctrl = 350; break; //2档

第四个为1档:电机输出占空比为40% case 0xF8:

Motor_Ctrl = 200;

break; //1档

第五个为1档直线。 case 0xF9: Motor_Ctrl = 200;

Steer_Ctrl = 24;

break; 第六个为左转:Steer_Ctrl减小 case 0xFA: if(Key_Count % 50 == 0)

Steer_Ctrl -= 1;

break; 第七个为右转:Steer_Ctrl增大 case 0xFC: if(Key_Count % 50 == 0)

Steer_Ctrl += 1; break; 但是处于多舵机的保护,需要对舵机转角进行上下限设置。

if(Steer_Ctrl >29) //舵机保护。

Steer_Ctrl = 29;

else if(Steer_Ctrl < 19)

Steer_Ctrl = 19;

//1档中//右转

//左转

舵机的变化在某个占空比范围內,在这个周期范围內,中心值就是24,占空比为24/500,Key_Count++;是按键按下时的延时,使舵机转角变化变慢,防止舵机直接打死。

Key_Count = 0; //无按键按下,延时清零。

最后就是对主程序进行编程了,这是其实只要做定时器的初始化,还有电机舵机的初始值,在循环中,只要做对管脚的循环扫描就可以了。

void main() {

Time_config(); EA = 1;

//定时器初始化。

//使能全局变量。

//舵机的初始值,中间位置,(值变小往右偏,大左)。

Steer_Ctrl =24;

Motor_Ctrl = 0; //这里设定了电机的初始值,电机的起始状态应为禁止,

所以转速初始值为0。

while(1) {

KeyScan(); //此为键盘扫描函数,其作用为扫描无线接收端的值,进

而正确反映按键功能。

}

4.4总程序介绍与总程序流程图

遥控小车的总程序是将上诉遥控以及电机与舵机两部分的程序相整合,将遥控的控制程序已定时器中断的方式接入电机与舵机的程序当中,随后将两部分程序接入到对定时器初始化并设置舵机与电机的初始值的主程序当中,最后主程序最主要的工作就是对管脚的循环进行扫描。其程序流程图如图16所示,而主程序及其程序注解见附录。

图16 系统程序流程图

5.结果展示与分析