下位机通过串口中断接收上位机传来的控制命令,其程序如下:
com_interrupt(void) interrupt 4 using 3//接收
{
if(RI)
RI=0; //软件复位RI
buffer[point]=SBUF;
point++ ;
}
3.下位机串行口波特率
串行口的通信波特率恰到好处地反映了串行传输数据的速率。通信波特率的选用,不仅和所选通信设备、传输距离和MODEM型号有关,还受传输线状况所制约。用户应根据实际需要加以正确选用。
本设计主要用串口方式1,下面简单介绍一下其波特率的产生和计算方法,方式1下串行口波特率是由定时器的溢出率决定的,本设计中主要用到了定时器T1。
波特率= x定时器T1溢出率
定时器T1溢出率=
波特率= x
式中:K为定时器T1的位数,它和定时器T1的设定方式有关。即:
若定时T1为方式0,则K=13
若定时器T1为方式1,则K=16
若定时器T1为方式2或方式3,则K=8
其实,定时器T1通常采用方式2,因为定时器T1在方式2下工作,THl和TLl分别设定为两个8位重装计数器(当TLl从全“1”变为全“0”时,THl重装TLl)。这种方式,不仅可以使操作方便,也可避免因重装初值(时间常数初值)而带来的定时误差。由公式可知,方式1所选波特率常常可通过计算来确定初值。
下位机串口初始化程序如下:
/*****************初始化串行端口函数*********/
void UART_init()
{
SCON= 0x50; //串口方式1 允许接收
PCON=0; //SMOD=0
TMOD= 0x20; //定时器1定时方式2
TH1= 0xfd; //11.0592M 9600波特率
TL1= 0xfd;
TR1= 1; //启动定时器
ES= 1;
EA= 1;
}
4.2.2 下位机步进电机程序实现
下位机接收到上位机的命令后就开始执行相关程序控制电机运行,单片机此时的任务就是产生一定频率的环形脉冲信号,这里主要用到了单片机的P0口、P1口、P2口、P3口,其中P0口控制腰部回转关节的步进电机,P1口控制肩关节的步进电机、P2口控制肘关节的步进电机,P3口控制手爪步进电机。
电机的转动方向是通过环形脉冲信号的变化顺序来实现的,本设计所用的步进电机为两相八拍型,其正反转环形脉冲为[20]
uchar code FFW[8]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9};
uchar code REV[8]={0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1};
电机的转动速度主要是通过控制环型脉冲信号的切换频率,电机每收到一个脉冲信号,就转动一个角度,通过控制脉冲频率可以使电机加减速,由于电机为两相八拍型,步进角为0.9,假如上位机要求电机速度为a步/S,则每个脉冲之间应该延时1/a秒,延时可以通过定时器实现,也可已通过延时函数实现,本设计中为了简化程序,直接调用延时函数(晶振11.0592MHZ),具体程序如下:
/*****************************延时1ms函数*******************/
void delay(uint p)
{ AT89S51单片机全地形八足机器人机械手的设计(15):http://www.youerw.com/jixie/lunwen_2398.html