求好心人,帮我解决这个问题
MCU:STC12C5A60S2
晶振:22.1184
我想实现的效果:
通过电脑串口发送start,单片机处理程序,然后返回start-ok;
发送left,单片机处理程序,然后返回left-ok;
简单来讲就是我要通过电脑串口发送任意字符串,在单片机中做相应比较后,再简单处理程序,返回一个字符串给电脑串口。
现在的问题是我的接收和发送字符串有问题。而且我保存接收字符串的数组是否存在问题呢?
#include"STC_NEW_8051.H"
#include"delay.h"
#include"INTRINS.H"
#define uchar unsigned char
#define uint unsigned int
#define ON 0
#define OFF 1
#define LOW 0
#define HIGH 1
#define M_TIME 100//定义不进电机频率为75
#define BUFSIZE 80//定义串口字节数组长度保存变量
/*-----------inductor-----------*/ //感应器端口定义
sbit G=P0^0; //用做步进电机原点感应器
sbit L = P0^4; //标志步进电机终点感应器
sbit zhengzhuan=P0^1; //手动 正转
sbit fanzhuan=P0^2; //手动 反转
sbit zidong=P0^3; //自动
/*----------motor_GPIO()---------*/ //马达输出口定义
sbit M_Z = P2^0 ; //脉冲正极,
sbit M_F = P2^1; //脉冲负极,
unsigned char date ,CHZT;
uchar idata Rec_Buff[BUFSIZE]; //接收字符数组BUFSIZE长度
uchar Rec_cnt = 0;
uchar testcount = 0;
bit Rec_ok;
uint Rec_timeout;
uchar stop_cnt = 0;
void zz_key_press();
void zd_key_press();
void fz_key_press();
void init_m();
void Send_Buf(uchar *p,uchar len) ;
void init_com() ;
void clear_rec();
void zd();
uint i , j = 300;
void main()
{
zhengzhuan = 1;
fanzhuan = 1;
G = 1;
L = 1;
M_Z = 0;
M_F = 0;
init_m(); // 初始化步进电机归初始状态
init_com();
while(1)
{
Send_Buf("111---",6);//测试串口
Rec_ok = 0;
clear_rec();
Rec_cnt = 0;
if (testcount == 0x11)
{
//这里做一个相应的动作,表示有正常接收到字串
zd();
testcount = 0;
}
if (testcount == 0x12)
{
//这里做一个相应的动作,表示有正常接收到字串
M_F = 0;
for(i=0;i<=j && L == 1;i++)
{
M_Z = 1;
delay_us(M_TIME);
M_Z = 0;
delay_us(M_TIME);
}
testcount = 0;
}
zz_key_press();
fz_key_press();
zd_key_press();
}
}
/**************初始化串口通讯函数********************/
void init_com() //COM初始化
{
AUXR=0x20;
SCON=0x50;
PCON=0x00;
TMOD=0x21;
TH1=0xfa;
TL1=0xfa;
PS=1;
EA=1;
ES=1;
TR1=1;
}
void send_byte(char date)
{
ES=0;
//REN=0;
TI=0;
SBUF=date;
while(!TI);
TI = 0; //串口发送完毕后,将在标志位TI置1
//REN=1;
ES=1;
}
void Send_Buf(uchar *p,uchar len) //发送函数 *P(字符串) len(字符串的长度)
{
while(len>0)
{
send_byte(*p);
p++;
len--;
}
}
void clear_rec() //清空 Rec_Buff[BUFSIZE]里面的数据
{
uchar i;
for(i=0;i<BUFSIZE;i++)
{
Rec_Buff = 0;
}
}
//******************检测串行中断********************//
void RX_com() interrupt 4
{
//Send_Buf("test\r\n",6);
if(TI)
{
TI = 0;
}
if(RI==1)
{
RI=0;
Rec_timeout = 0;//超时函数
Rec_Buff[Rec_cnt] = SBUF; //循环把SBUF(串口接收的字符串)保存在数组 Rec_Buff[]里面 数组长度 BUFSIZE
Rec_cnt++;
if(Rec_cnt>=BUFSIZE)
{
Rec_cnt = 0;
}
if ((Rec_Buff[0]=='s')&&(Rec_Buff[1]=='t')&&(Rec_Buff[2]=='a')&&(Rec_Buff[3]=='r')&&(Rec_Buff[4]=='t') )
{
testcount = 0x11;
}
if ((Rec_Buff[0]=='l')&&(Rec_Buff[1]=='e')&&(Rec_Buff[2]=='f')&&(Rec_Buff[3]=='t') )
{
testcount = 0x12;
}
ES = 0;
}
}
void zd()
{
M_F = 0;
while(L == 1 )
{
M_Z = 1;
delay_us(M_TIME);
M_Z = 0;
delay_us(M_TIME);
}
M_F=1;
while( G == 1)//当原点感应器不在初始状态下,步进电机回原点
{
M_Z = 1;
delay_us(M_TIME);
M_Z = 0;
delay_us(M_TIME);
}
}
/**************自动按钮控制函数********************/
void zd_key_press()
{
if(CHZT = 1)//只有在步进电机在初始位置,自动按钮才生效
{
if(zidong == 0 )
{
delay_us(20);
if(zidong == 0 || G == 0 )
{
zd();
}
CHZT = 1;//标志步进电机在初始位置
}
}
}
/**************手动反转按钮控制函数********************/
void fz_key_press()
{
if(fanzhuan == 0)
{
delay_us(20);
if(fanzhuan == 0 )
{
M_F = 1;
/*while(fanzhuan == 0 ) //反转按钮按下,而且初始状态感应器断开,才可以转。
{
M_Z = 1;
delay_us(M_TIME);
M_Z = 0;
delay_us(M_TIME);
} */
if(G == 1)
{
M_Z = 1;
delay_us(M_TIME);
M_Z = 0;
delay_us(M_TIME);
}
CHZT = 1;//标志步进电机在初始位置
}
}
}
/**************手动正转按钮控制函数********************/
void zz_key_press()
{
if(zhengzhuan == 0)
{
delay_us(20);
if(zhengzhuan == 0)
{
M_F = 0;
/*while(zhengzhuan == 0 || L == 1) //正转按钮按下,而且初始状态感应器断开,才可以转。
{
M_Z = 1;
delay_us(M_TIME);
M_Z = 0;
delay_us(M_TIME);
}*/
if(L == 1)
{
M_Z = 1;
delay_us(M_TIME);
M_Z = 0;
delay_us(M_TIME);
}
CHZT = 1;//标志步进电机在初始位置
}
}
}
/**************初始化不进电机位置控制函数********************/
void init_m()
{
M_F = 1;
while(G == 1) //当原点感应器不在初始状态下,步进电机回原点
{
M_Z=1;
delay_us(M_TIME);
M_Z=0;
delay_us(M_TIME);
}
CHZT = 1;//标志 步进电机在初始位置
}
|