c51实验指导书Word格式.docx
《c51实验指导书Word格式.docx》由会员分享,可在线阅读,更多相关《c51实验指导书Word格式.docx(45页珍藏版)》请在冰点文库上搜索。
![c51实验指导书Word格式.docx](https://file1.bingdoc.com/fileroot1/2023-5/7/9d1fe67b-97fc-4176-aace-697812de5d41/9d1fe67b-97fc-4176-aace-697812de5d411.gif)
读者可以到网站上下载使用
8.2.3Keil软件使用
相信读者在学习51单片机的过程中对Keil软件的用法比较熟悉了,不太熟悉的读者需要看看KeilC51入门教程,网站有很多相关的资料。
第八章实验源程序代码中完整的工程文件,读者可以很方便的上手应用。
8.2.4将*.hex文件烧录到新控制卡中。
由于两块控制卡的芯片使用不同,所以C51MultiFLEX控制卡程序的烧写方法也与MultiFLEX控制卡不一样,下文将具体介绍。
首先要安装flip-2_4_6烧写软件,打开实验指导书配套光盘,打开“flip-2_4_6烧写软件”文件夹,双击
,很轻松的就安装该软件了。
安装好了该软件后,打开桌面上的快捷方式,进入Setings->
Precerences->
AutoISP->
More
选择芯片AT89C51ED2
选择通信:
Settings->
Communication->
RS232,选择连接板子的COM口号,选择波特率
57600。
连接好的界面,请注意照下面的选项来选择。
调用编译成功的HEX烧写文件。
注意:
Flip下载软件不支持中文路径。
调用文件后点击Run按纽,烧写完毕点击红色按键StartApplication,这时候通信已经中断,并且单片机已经复位运行起来。
这时候可以打开其它的串口调试软件用这条下载线对板子进行通信。
调试完毕如果还要烧写,关闭串口调试软件,重新链接Flip下载软件。
8.3C51MultiFLEX控制卡系统程序简介
在本节,我们将介绍C51MultiFLEX控制卡的程序总体结构以及介绍如何编写用户自己的c语言程序实现对机器人的控制。
8.3.1C51MultiFLEX控制卡的程序总体结构简介
通过第七章的实验,相信大家已经非常熟悉如何使用电脑对创意之星进行控制。
实际上,
我们通过电脑设置的命令会通过电脑串口传递给C51MultiFLEX控制卡,控制卡通过内部程序程序实现命令,进而实现对机器人的控制,那么控制卡具体是怎么工作的呢?
MultiFLEX控制卡的工作流程图如下所示:
当给控制卡通电后,控制卡首先会读取控制卡功能选择拨码开关的用户设置情况,然后
进行系统的初始化。
控制卡会根据用户设置判断是执行用户下载到控制卡的动作序列还是将各关机回复到初始位置等待上位机(电脑)的命令:
如果是用户下载到控制卡的动作序列,控制卡将循环执行该序列,直到接收到上位机的命令为止;
如果是回复到初始位置等待上位机命令,则控制卡将使机器人各关节处于初始位置,然后等待上位机的指令。
然后控制卡就一直进行“等待命令——》执行上位机指令——》等待命令……”循环。
由于整个控制卡的控制程序比较复杂,并且设计到很多单片机最根本的知识(如波特率
设置,io口设置,中断等)还有数据结构方面的知识,对于初学者想弄明白可能需要花上
一个月甚至更多的时间,所以在此不对其源程序进行具体剖析,同学们可在每次做完实验之
余,或着利用课余时间自己研究,不懂的多查阅资料(建议大家研究透彻,将此卡的系统程
序研究透彻之后基本上你就可以进行51单片机的基础开发了)。
8.3.2与用户编写C程序有关的系统程序简介
用户首先要安装好KEIL软件,打开创意之星C51\C51Multifilex控制卡原始程序\C51Multifilex.Uv2,打开后程序界面如下图所示:
在图框1中的是项目管理树,在展开SourceGroup1和inc后,我们会发现整个控制卡程序由6个源文件(.c),和6个头文件(.h)组成,其中和我们编写自己的c语言程序有关的只有Public.h、Usertask.h、USERTASK.C,其余的都是系统文件,在出厂前均已设置好,大家不需要进行更改(更改后可能导致控制卡不能正常工作,如出现此情况请将位于实验指导书配套光盘中对应的文件夹拷过来覆盖原来的文件夹就可以了。
右边带注释的是程序编辑栏,当在左边树状表中双击一个文件的时候在右边就可以对该文件进行编辑。
下面让我们来好好分析一下Public.h、Usertask.h、USERTASK.C这三个文件。
Public.h
#ifndefPublic_h
#definePublic_h
#include<
REG51xD2.h>
#include<
intrins.h>
absacc.h>
stdio.h>
typedefcharint8;
typedefunsignedcharuint8;
typedefintint16;
typedefunsignedintuint16;
typedeflongint32;
typedefunsignedlonguint32;
#definetrue0x01
#definefalse0x00
///////////////////////////////舵机控制方法//////////////////////////////////
//舵机控制数据命令包括两个值一个是最终到达的旋转终止角度,另外一个是速度范围0-255,
//255代表最大速度,MG995舵机速度是0.2秒60度,0代表最小速度设定为2.55秒每60度
//255减去速度参数.比如转动30度,速度参数200,255-200=55,代表550MS完成60度角度
//550MS/60=9.16MS运行一度,30度,时间30*9.16=275,舵机20MS一个周期,275/20=13.75个周期
//完成动作.一共要转动30度,每周期转动:
30/13.75=2.18,每度11.11US,2.18*11.11=24.24US
//定时器0.5425US为计数单位,24.24/0.5425=44.6us,每20MS一个周期每次改变数字计数器45,
//改变14个周期完成60度.另外还要考虑角度是增加还是减少.计算出来有小数点,以及误差,
//在最末尾的时候补足角度.计算出最终计数器数字,程序在中断里面自动按照计算出来的
//改变步进时间以及步进次数进行逼近,当和运行到计算最终数据时停止,中断里面每个周期
//都将查询角度数据是否被改变
/////////////////////////////////////////////////////////////////////////////
///////////////////////舵机控制数据结构///////////////////////////////////
structPWM_DATA
{
volatileuint16buff;
//舵机控制寄存器
volatileuint16angle;
//计算出的最终到达角度计数器数据=(角度*111111)/5425
volatileuint16value;
//每周期改变的计数器数值
};
//////////////////////控制板端口定义////////////////////////////////////////
#defineWORK_LED_ONP5_7=1//WORK灯亮
#defineWORK_LED_OFFP5_7=0//WORK灯灭
///////////////////////舵机控制端口/////////////////////////////////////////
#definePWM1_HP0_2=1//1路舵机控制PWM1
#definePWM1_LP0_2=0
#definePWM2_HP0_3=1//2路舵机控制PWM2
#definePWM2_LP0_3=0
#definePWM3_HP5_5=1//3路舵机控制PWM3
#definePWM3_LP5_5=0
#definePWM4_HP0_4=1//4路舵机控制PWM4
#definePWM4_LP0_4=0
#definePWM5_HP5_4=1//5路舵机控制PWM5
#definePWM5_LP5_4=0
#definePWM6_HP5_3=1//6路舵机控制PWM6
#definePWM6_LP5_3=0
#definePWM7_HP0_5=1//7路舵机控制PWM7
#definePWM7_LP0_5=0
#definePWM8_HP0_6=1//8路舵机控制PWM8
#definePWM8_LP0_6=0
#definePWM9_HP0_7=1//9路舵机控制PWM9
#definePWM9_LP0_7=0
#definePWM10_HP5_2=1//10路舵机控制PWM10
#definePWM10_LP5_2=0
#definePWM11_HP5_1=1//11路舵机控制PWM11
#definePWM11_LP5_1=0
#definePWM12_HP5_0=1//12路舵机控制PWM12
#definePWM12_LP5_0=0
////////////////减速电机端口//////////////////////////////////////////////
#defineM1_RP1_0=1//电机1正转
#defineM1_LP1_0=0//电机1反转
#defineM1_TCCAP0H=0xff//电机1停转
#defineM2_RP1_1=1//电机2正转
#defineM2_LP1_1=0//电机2反转
#defineM2_TCCAP1H=0xff//电机2停转
#defineM3_RP1_2=1//电机3正转
#defineM3_LP1_2=0//电机3反转
#defineM3_TCCAP2H=0xff//电机3停转
#defineM4_RP1_7=1//电机4正转
#defineM4_LP1_7=0//电机4反转
#defineM4_TCCAP3H=0xff//电机4停转
///////////////蜂鸣器控制////////////////////////////////////////////////////
#defineBEEP_ONP3_7=1//蜂鸣器发声
#defineBEEP_OFFP3_7=0//蜂鸣器停止发声
///////////////ADC芯片控制//////////////////////////////////////////////////
#defineADC_ClkP5_6//ADC接口通信时钟线
#defineADC_DataP0_1//ADC接口通信数据线
#defineADC_Data_IP0_1=1//为输入做准备
#endif/*Public_h*/
经过分析之后,我们发现public.h实际上就是一些为了方便我们编程(如typedefchar
int8;
)及将实际电路的与程序进行联系(如#defineWORK_LED_ONP5_7=1)而进
行的一些预操作而已,就这么简单。
Usertask.h
#include"
public.h"
///////////////////////////////用户可自定义使用的控制板功能函数声明////////////////////////////////////////////////////////
/********************************************************************************
*函数原型:
voidrc_moto_control(uint8*point)
*参数说明:
*point指向24字节舵机控制数据,控制数据定义见控制板舵机控制命令说明
*返回值:
无
*说明:
设定12路舵机角度控制
********************************************************************************/
externvoidrc_moto_control(uint8*point);
voiddc_moto_control(uint8*point)
*point指向8字节直流电机控制数据,控制数据定义见控制板电机控制命令说明
设定4路直流电机控制
externvoiddc_moto_control(uint8*point);
voidgpio_mode_set(uint16temp16)
temp1616位GPIO设置字
设置16位GPIO模式
externvoidgpio_mode_set(uint16temp16);
voidwrite_gpio(temp16)
temp1616位GPIO值
写16位GPIO值
externvoidwrite_gpio(uint16temp16);
uint16read_gpio(void)
读取16位GPIO输入
********************************************************************************/
externuint16read_gpio(void);
voidbeep_set(uint8time)
time持续时间,单位0.1秒
板载喇叭输出控制
externvoidbeep_set(uint8time);
voiddelay(uint8time)
time延时,分辩率20MS
延时操作,分辩率20MS
externvoiddelay(uint8time);
uint8read_voltage(void)
读取当前电池的电压值
externuint8read_voltage(void);
voidADC_Read(uint8Channel,uint8*data)//读取8路模拟量
Channel:
ADC通道选择0-7
**data:
返回8位ADC数据
读取8路模拟量
externvoidADC_Read(uint8Channel,uint8*byte);
//读取8路模拟量
//***********************************************************************************/
/////////////////////////////用户可自定义使用的控制板功能函数声明end/////////////////////////
经过分析之后,我们发现Usertask.h实际上就是对我们可以使用的控制卡功能函数的外部声明,通过这些声明,我们可以在USERTASK.C中调用这些函数,实现对机器人的控制。
控制卡的所有功能都可以通过调用这些函数实现:
有12路舵机的控制函数,有4路电机的控制函数,有IO口的设置函数,有AD口的读取函数等等,这些函数的定义以及算法代码在工程里的其他几个系统文件里面,在此不作介绍,在后面我们会介绍如何使用这些函数。
USERTASK.C
Usertask.h"
/********************************************************************************
voiduser_task(void)
用户自己编写的任务,所有用户自己定义的功能都在函数里面做
voiduser_task(void)
//这里用户可以进行自己的程序编写
}
经过分析我们可以看出,USERTASK.C首先包含了一些必备的头文件,然后就是user_task