用stc15w4k48s4单片机,在调试过程中,串口一和串口2都接收不到正确的答案,想知道怎么办?

2019-07-14 15:36发布

这是我写程序,只要是想,用stc15w4k48s4单片机实现,串口1以1s的时间周期连续发送0 1 2 3 4 5 6 7 8 9(加上以为校验和),用串口2接收遗传协议规定的数据并判断是否正确,若正确,串口2发送oxAA。
可是在调试过程中,串口一和串口2都接收不到正确的答案,想知道怎么办。


#include<firstone.h>

#include <reg52.h>
#include<intrins.h>
#include <STC15F2K60S2.H>


#include<uart0.h>
#define second 1000
#define uchar unsigned char
#define uint unsigned int
//#define FOSC 22118400L
//#define BAUD 115200
//        #define TM  (65536-(FOSC/4/BAUD))


//uchar xdata Data1_BUF[32],Data2_BUF[32];
uchar DATA_Send[10]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09};
uchar xdata UART1_DATA_Receive[10],UART2_DATA_Receive[10];
uchar UART1_Rec_flag=0,UART2_Rec_flag=0;


uchar i,pf,count,check1,check2,d[10];


                                            //函数声明//
void UART1_Send(uchar str1[]);                            //串口1发送数据
void UART2_Receive(uchar UART1_DATA_Receive[10]);             //串口2接受数据
void UART2_Send(uchar str2[]);                                     //串口2发送数据
void timer0_config();                                                                 //定时器0
void UART_init(void);                                                                    //初始化串口波特率,使用定时器2
//void PC_Send();                                                                            //PC机发送数据


                                           //主函数//
void main()
  {
    timer0_config();
    UART_init();        
     while(1)
     {

//if(0){
  SCON = 0x50;






if(UART1_Rec_flag==1)
        
           UART1_Rec_flag=0;
                 
        S2CON=0x50;
        while(count==second)        
          {
             count=0;
             UART1_Send(UART1_DATA_Receive);
             if(UART2_Rec_flag==1)
             {
                UART2_Rec_flag=0;
                                S2CON &=0x04;//关闭串口2接收控制
               // if((check1^check2)==0)
                 //{


                     UART2_Send(UART1_DATA_Receive);
                // }
                    //ES2=1;
             }
                  //ES1=1;
          }
      }
    }




//                                    //串口1发送数据 //
//void UART1_Send(uchar d[])
//        {
//           uchar i;
//           for(i=0;i<10;i++)
//           SBUF=d;        
//           while(!TI)
//           TI=0;
//         }




                                 //串口2发送数据//
void UART2_Send(uchar d[])
     {
          uchar i;
          for(i=0;i<10;i++)
          S2BUF=d ;
          while(!(S2CON&0x02));
              S2CON&=~0x02;
     }




                            //串口1中断处理函数
void UART1_Routine() interrupt 4
      {
          uchar d[10];
          uchar length=10;
       while(1) {


                       while(RI==0)  {}  RI=0;
                   pf=0;
                   for(i=0;i<length;i++)
                        {
                        
                           d=SBUF;
                           //P1=d;
                           pf+=d;
                                                     check1=pf;
                                                      SBUF=pf;
                                                  // while(RI==0)  {}  RI=0;
                        }
                           //P1=pf;
                           while(RI==0) {}  RI=0;
                           //P1=SBUF;
                           //check1=pf;
                           if((SBUF^pf)==0)
                              {
                                 //P1=0;//time(500)
                                 SBUF=0xaa;
                                                          }
                                 UART1_Rec_flag=1;
                                 //while(TI==0) {} TI=0;
                             
               }
      }


                                           //串口2中断处理函数//
void UART2_Routine() interrupt 8
      {
        while(1) {
                  
                   while(RI==0)  {}  RI=0;
                                     pf=0;
                    //uchar check2
                   for(i=0;i<10;i++)  {
      
                     d=S2BUF;
                    //P3=d;
                     check2+=d;
                     pf=check2;
                  }
                   //P3=check2;
                     if((S2BUF^pf)==0)
                         {
                             //time(500)
                               SBUF=0xAA;
                                                 }
                               UART2_Rec_flag=1;
                               //while(TI==0) {} TI=0;
                     }
     }


                                         //定时器0的初始化//        
void timer0_config()
   {
                AUXR |= 0x80;                //定时器时钟1T模式
             TMOD &= 0xF0;                //设置定时器模式
            TL0 = 0xCD;                //设置定时初值
            TH0 = 0xD4;                //设置定时初值
             TF0 = 0;                //清除TF0标志
             TR0 = 1;                //定时器0开始计时
   }






                                         //定时器T0中断服务函数//
void timer0_Routine () interrupt 1
      {
           uchar count;
                   TF0=0;
           TR0=1;
           while(count==second)
                 {
                    count=0;
                    TF0=0;
                  }
      }        
    //串口初始化函数

void UART_init(void)                //115200bps@22.1184MHz
{
    SCON = 0x50;                //8位数据,可变波特率
        AUXR |= 0x40;                //定时器1时钟为Fosc,即1T
        AUXR &= 0xFE;                //串口1选择定时器1为波特率发生器
        TMOD &= 0x0F;                //设定定时器1为16位自动重装方式
        TL1 = 0xD0;                //设定定时初值
        TH1 = 0xFF;                //设定定时初值
        ET1 = 0;                //禁止定时器1中断
        TR1 = 1;                //启动定时器1


   S2CON = 0x50;                //8位数据,可变波特率
        AUXR |= 0x04;                //定时器2时钟为Fosc,即1T
        T2L = 0xD0;                //设定定时初值
        T2H = 0xFF;                //设定定时初值
        AUXR |= 0x10;                //启动定时器2

     EA=1;
         ES=1;                          //开启串口中断
//PS=1;         
//PS2=0;
}




0条回答

一周热门 更多>