2
收藏
微博
微信
复制链接

单片机通讯问题?(如发送:1,回复:完成)

提问于
2022-07-31 09:17

下面程序,可以实现收发。现在我想给单片机发送一个代码,然后要求单片机回复一个我自己定义的字符或者文字。(比如发送:1,单片机回复:完成)
小弟初学单片机,不知道能不能实现?希望各位大侠指教!感激不尽!
/******************************
十六进制发送和接收数据                              


******************************/
#include
bit Flag;
unsigned int ReData,SenData;
void main (void) {
        SCON = 0x50;             //REN=1允许串行接受状态,串口工作模式1                             
            TMOD|= 0x20;        //定时器工作方式2                    
                PCON|= 0x00;                                                           
                TH1 = 0xFD;        //baud*2  /*  波特9600、数据位8、停止位1。效验位无 (12M)
            TL1 = 0xFD;         
                TR1  = 1;                                                            
                ES   = 1;        //开串口中断                  
                EA   = 1;        // 开总中断
                                    // IE = 0x0;
        while(1)
    {
          if (Flag==1)
          {  
             SBUF=SenData;             //SUBF接受/发送缓冲器
            while(TI==0);
         TI=0;
                 Flag=0;
          }
}
}
/****************************************************
               串口中断程序
******************************************************/
void ser_int (void) interrupt 4 using 1
{
if(RI == 1)                //RI接受中断标志
{
        RI = 0;                    //清除RI接受中断标志
        ReData = SBUF;      //SUBF接受/发送缓冲器
        SenData=ReData;
        Flag=1;
}
}



收藏 861 0 2
粉丝
0
关注
0
主题
4
本帖最后由 ahshmj 于 2013-9-9 18:04 编辑

你自己仿真了没有?提出的问题要清晰明了。

照这样修改一下:
/******************************
十六进制发送和接收数据                              


/******************************
十六进制发送和接收数据                              


******************************/
#include
bit Flag;
unsigned char ReData;
unsigned char i,SenData[]="完成";
void main (void)
{
        SCON = 0x50;             //REN=1允许串行接受状态,串口工作模式1                              
            TMOD|= 0x20;        //定时器工作方式2                    
                PCON|= 0x00;                                                           
                TH1 = 0xFD;        //baud*2  /*  波特9600、数据位8、停止位1。效验位无 (12M)
            TL1 = 0xFD;         
                TR1  = 1;                                                            
                ES   = 1;        //开串口中断                  
                EA   = 1;        // 开总中断
                                    // IE = 0x0;
        while(1)
        {
          if (Flag==1 /*& ReData == 1*/)    //  可能要根据你接收的字符或数字应加上 & ReData =='1'  或  & ReData == 1
             {                        // if (Flag==1 & ReData == 1)
                ES=0;                     //关闭串口中断
                for(i=0;i<4;i++)
                   {SBUF=SenData;
                    while(!TI);        //等待发送结束
                    TI=0;              //软件清发送中断标志位
                   }
//             SBUF=SenData;             //SUBF接受/发送缓冲器
//            while(TI==0);
//         TI=0;
                 Flag=0;
                 ES   = 1;        //开串口中断
             }
         }
}
/****************************************************
               串口中断程序
******************************************************/
void ser_int (void) interrupt 4 using 1
{
   if(TI == 1)
       { TI=0; }
     else
        { if(RI == 1)                //RI接受中断标志
         {
        RI = 0;                    //清除RI接受中断标志
        ReData = SBUF;      //SUBF接受/发送缓冲器
//        SenData=ReData;
        Flag=1;
          }
}
}

0

回答于 · 2022-07-31 12:15

粉丝
0
关注
0
主题
4
楼主注意:回复的完整的帖子里面的那一句,应该是上面的帖子里的那样{SBUF=SenData[i]........完整的程序里面无法纠正。
0

回答于 · 2022-07-31 13:47