找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

帖子
查看: 6101|回復: 2
收起左側(cè)

stc8單片機串口2和傳感器收發(fā)指令,讓串口2收到的數(shù)據(jù)在串口助手顯示

[復制鏈接]
ID:531986 發(fā)表于 2019-11-28 14:19 | 顯示全部樓層 |閱讀模式
希望大佬幫我看看哪里的問題,232通信協(xié)議,波特率都一樣,串口2和傳感器通信的協(xié)議如圖,實在寫不出來,沒基礎(chǔ)都自學的,拜托了

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

接線說明:         1:STC8A單片機-->USB轉(zhuǎn)TTL&電源模塊
                    P10-->UTXD       
                           P11-->URXD
                  
                  
注意事項: USB連接線給開發(fā)板通電下載程序,STC下載軟件中內(nèi)部IRC時鐘選擇11.0592MHZ                                                                                                                                                                  
***************************************************************************************/


#include "STC8.H"
#include "intrins.h"


#define MAIN_Fosc                11059200L        //定義主時鐘
#define  uint32   unsigned long
#define  uint16   unsigned int  
#define  uint8    unsigned char
#define  uchar    unsigned char  



/*************        本地變量聲明        **************/
#define  TRUE    1
#define  FALSE   0

#define Buf_Max 50
#define S2_S 0x01       
#define S2RI 0x01
#define S2TI 0x02

volatile uint8 Flag=FALSE;

uint8 xdata Rec_Buf[Buf_Max];
uint8 i = 0;
                 


bit busy;

uchar table2[3]={0x04,0x04,0x04};          //串口2循環(huán)發(fā)送指令
uchar rec2[14];                         //接收數(shù)組
uchar rec1[14];



/**************************************
功能描述:延時函數(shù)
入口參數(shù):uint16 x ,該值為1時,延時1ms
返回值:無
***************************************/
void delay_ms(uint16 x)
{  
        uint16 j,i;   
        for(j=0;j<x;j++)   
        {   
                for(i=0;i<1100;i++);   
        }  
}



/***************************************************************************
* 描  述 : 串口2初始化函數(shù)
* 入  參 : 無
* 返回值 : 無
備注:波特率9600bps   晶振11.0592MHz
**************************************************************************/
void Uart2_Init(void)
{       
        S2CON = 0x50;                //8位數(shù)據(jù),可變波特率,啟動串行接收器       
        AUXR |= 0x04;                //定時器2時鐘為Fosc,即1T
        T2L = 0xE0;                    //設(shè)定定時初值
        T2H = 0xFE;         //設(shè)定定時初值
        AUXR |= 0x10;       //啟動定時器2
        IE2 |= 0x01;        // 串口2中斷打開
        EA = 1;             // 總中斷打開
}




/***************************************************************************
* 描  述 : 串口1初始化函數(shù)
* 入  參 : 無
* 返回值 : 無
備注:波特率9600bps   晶振11.0592MHz
**************************************************************************/
void Uart1_Init(void)
{               
        PCON &= 0x3f;                //波特率不倍速,串行口工作方式由SM0、SM1決定
        SCON = 0x50;                //8位數(shù)據(jù),可變波特率,啟動串行接收器
        AUXR |= 0x40;                //定時器1時鐘為Fosc,即1T
        AUXR &= 0xfe;                //串口1選擇定時器1為波特率發(fā)生器
        TMOD &= 0x0f;                //清除定時器1模式位
        TMOD |= 0x20;                //設(shè)定定時器1為8位自動重裝方式
        TL1 = 0xDC;                    //設(shè)定定時初值
        TH1 = 0xDC;                    //設(shè)定定時器重裝值
        ET1 = 0;                    //禁止定時器1中斷
        TR1 = 1;                    //啟動定時器1
        ES = 1;             // 串口1中斷打開
        EA = 1;             // 總中斷打開
}


/***************************************************************************
* 描  述 : 串口2發(fā)送數(shù)據(jù)函數(shù)
* 入  參 : uint8 數(shù)據(jù)
* 返回值 : 無
**************************************************************************/
void SendDataByUart2()
{
    S2BUF =table2[3] ;            //寫數(shù)據(jù)到UART數(shù)據(jù)寄存器
        while(!(S2CON&S2TI));        //在停止位沒有發(fā)送時,S2TI為0即一直等待
    S2CON&=~S2TI;                //清除S2CON寄存器對應S2TI位(該位必須軟件清零)
}

/**************************************************************************************
* 描  述 : USART2接收到數(shù)據(jù)后串口發(fā)送出去
* 入  參 : 無
* 返回值 : 無
**************************************************************************************/
void USART2_Tx_Puts(void)
{
          if(Flag)      //有新數(shù)據(jù)通過串口被接收到
        {
                IE2 &= 0xFE;                                              // 串口2中斷關(guān)閉       
            rec1[14]=rec2[14];                       
                IE2 |= 0x01;                           // 串口2中斷打開                                                                                                       
                Flag=FALSE;                            //清除接收標識符
          }
}

/***************************************************************************
* 描  述 : 串口1發(fā)送數(shù)據(jù)函數(shù)
* 入  參 : uint8 數(shù)據(jù)
* 返回值 : 無
**************************************************************************/
void SendDataByUart1(void)
{
    rec1[14]=S2BUF ;                 //寫數(shù)據(jù)到UART數(shù)據(jù)寄存器
        while(TI == 0);             //在停止位沒有發(fā)送時,TI為0即一直等待
        TI = 0;                     //清除TI位(該位必須軟件清零)
}


/**************************************************************************************
* 描  述 : USART1接收到數(shù)據(jù)后串口發(fā)送出去
* 入  參 : 無
* 返回值 : 無
**************************************************************************************/
void USART1_Tx_Puts(void)
{
          if(Flag)                //有新數(shù)據(jù)通過串口被接收到
        {       
                ES = 0;                                             //串口1中斷關(guān)閉                  
            SendDataByUart1();                 //發(fā)送字符                                                
                ES = 1;                                  //串口1中斷打開                       
                Flag=FALSE;                       //清除接收標識符
          }
}


/***************************************************************************
* 描  述 : 串口2中斷服務函數(shù)
* 入  參 : 無
* 返回值 : 無
**************************************************************************/
void Uart2() interrupt 8 using 1
{
        IE2 &= 0xFE;                                        // 串口2中斷關(guān)閉
        Flag=TRUE;                       //接收到數(shù)據(jù),接收標識符有效
        if (S2CON & S2RI)                //串行接收到停止位的中間時刻時,該位置1
          {
              S2CON &= ~S2RI;              //清除S2CON寄存器對應S2RI位(該位必須軟件清零)
                rec2[14] = S2BUF;      
           }
          if (S2CON & S2TI)                //在停止位開始發(fā)送時,該位置1
           {
              S2CON &= ~S2TI;                                //清除S2CON寄存器對應S2TI位(該位必須軟件清零)
           }
        IE2 |= 0x01;                    // 串口2中斷打開       
}


/***********************
功能描述:主函數(shù)
入口參數(shù):無
返回值:無
************************/
int main()
{
          P1M1 &= 0xFE;        P1M0 &= 0xFE;                          //設(shè)置P1.0為準雙向口
        P1M1 &= 0xFD;        P1M0 |= 0x02;                          //設(shè)置P1.1為推挽輸出
        P3M1 &= 0xFE;        P3M0 &= 0xFE;                          //設(shè)置P3.0為準雙向口
        P3M1 &= 0xFD;        P3M0 |= 0x02;                          //設(shè)置P3.1為推挽輸出

        Uart2_Init();
        Uart1_Init();

        while(1);
       
}



///***************************************************************************
// * 描  述 : 串口1中斷服務函數(shù)
// * 入  參 : 無
// * 返回值 : 無
// **************************************************************************/
//void Uart1() interrupt 4 using 1
//{
//        ES = 0;                            // 串口1中斷關(guān)閉
//        Flag=TRUE;                  //接收到數(shù)據(jù),接收標識符有效
//        if (RI)                     //串行接收到停止位的中間時刻時,該位置1
//          {
//              RI = 0;                 //清除RI位 (該位必須軟件清零)
//    SBUF=S2BUF;      
//           }
//           if (TI)                    //在停止位開始發(fā)送時,該位置1
//           {
//              TI = 0;                 //清除TI位(該位必須軟件清零)
//           }
//        ES =  1;                   // 串口1中斷打開
//}


1574921904.png
回復

使用道具 舉報

ID:600627 發(fā)表于 2021-7-30 18:51 | 顯示全部樓層
兄弟,你這個調(diào)通了沒有,我也搞一天了,串口2 就是不能發(fā)送數(shù)據(jù)
回復

使用道具 舉報

ID:94031 發(fā)表于 2021-7-30 20:40 | 顯示全部樓層
要和外部設(shè)備通信,stc單片機最好用外部晶振,內(nèi)部IRC時鐘波特率不準,無法正常通信。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表