STC89C51RC步进电机串口控制程序(接收端)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

/**********************************************************
工程名称: STC89C51RC步进电机串口控制程序(接收端)
创建时间: 2012-8-20
作 者: 陈兴
说 明: 通过收到的串口数据0XAA、0XF0、0X0F控制步进电机的左转、右转和停止,并把接收到的数据在P1口显示

最后修改: 2012-8-21
**********************************************************/
#include //51芯片管脚定义头文件
#include //内部包含延时函数 _nop_();
#define uchar unsigned char
#define uint unsigned int
uchar code FFW[8]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09}; //四相八拍正转编码
uchar code REV[8]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01}; ////四相八拍反转编码
sbit K1 = P1^1; //正转
sbit K2 = P1^2; //反转
sbit K3 = P1^3; //停止
/********************************************************/
/*
/* 延时t毫秒
/* 11.0592MHz时钟,延时约1ms
/*
/********************************************************/
void delay(uint t)
{
uint k;
while(t--)
{
for(k=0; k<125; k++)
{ }
}
}
//串口初始化
void UART_Init(void)
{
SCON = 0x50; //串口工作方式为1 , 串行允许接收
//SM0=0;
//SM1=1;
//REN=1;
TMOD = 0x20; //定时器1 工作在方式2
//PCON = 0x80; //SMOD = 1; 波特率加倍
TH1 = 0xfd; //波特率 9600bps fosc="11".0592MHz
TL1 = 0xfd;
ES = 1; //开串口中断
TR1 = 1; //允许定时器1工作
EA = 1; //开总中断
}

/********************************************************/
/*
/*步进电机正转
/*
/********************************************************/
void motor_ffw()
{
uchar i;
uint j;
for (j=0; j<8; j++) //转1*n圈
{
if(P0==0X0F)
{break;} //退出此循环程序
for (i=0; i<8; i++) //一个周期转45度
{
P2 = FFW[i]; //取数据
delay(2); //调节转速
}
}
}

/********************************************************/
/*
/*步进电机反转
/*
/********************************************************/
void motor_rev()
{
uchar i;
uint j;
for (j=0; j<8; j++) //转1×n圈
{
if(P0==0X0F)
{break;} //退出此循环程序
for (i=0; i<8; i++) //一个周期转45度
{
P2 = REV[i]; //取数据
delay(2); //调节转速
}
}
}

/********************************************************
*
* 主程序
*
*********

************************************************/

main()
{
uchar r,N=64; //N 步进电机运转圈数
UART_Init();//串口初始化
while(1)
{
if(P0==0XAA)
{
for(r=0;r{
motor_ffw(); //电机正转
if(P0==0X0F)
{break;} //退出此循环程序
}
}
else if(P0==0XF0)
{
for(r=0;r{
motor_rev(); //电机反转
if(P0==0X0F)
{break;} //退出此循环程序
}
}
else
P2 = 0xf0;
}
}

/********************************************************/
void send_char(unsigned char txd)
// 传送一个字符
{
SBUF = txd;
while(!TI); // 等特数据传送
TI = 0; // 清除数据传送标志
}
/*-------------------------------------------------------------*/
//串口接收中断函数
void INT_UartRcv(void) interrupt 4
{
unsigned char tmp = 0;
if(RI) //查询接收标志位(有数据发送过来时置为1)
{
RI = 0; //接收标志位清零
tmp = SBUF; //存储缓冲区的数据
P0=SBUF;
send_char(tmp);
// Uart_SendChar(Rcv); //让从计算机上传到单片机的数据 , 传回到计算机显示
}
}

相关文档
最新文档