打印

STC12C5A60S2单片机串口通讯判断字符串问题

[复制链接]
684|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Evanboys|  楼主 | 2016-10-13 08:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
求好心人,帮我解决这个问题
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;//标志 步进电机在初始位置
}


相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

1

帖子

0

粉丝