找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5378|回復(fù): 2
收起左側(cè)

STC單片機串口發(fā)送 不需要while死等 串口接收執(zhí)行軟件復(fù)位

[復(fù)制鏈接]
ID:390416 發(fā)表于 2021-1-3 11:48 | 顯示全部樓層 |閱讀模式
//以下代碼在WQX-15開發(fā)板上,使用STC15W4K核心板調(diào)試串口1,晶振30M,波特率9600。
bit Uart1_Flag=1;
u8 code Uart1_Up_Symbol_Buffer[30]={"\r\n溫度:  遙控解碼:  超聲波:mm"};
u8 xdata Uart1_Up_Num_Buffer[10];
//*********************************《人人學(xué)會單片機》視頻教程,祁緒電子2020-05
//串口初始化,配置定時器&波特率。STC15W,30M晶振,9600.
//*********************************《人人學(xué)會單片機》視頻教程,祁緒電子2020-05
void Uart1_Init()
{
        SM0=0;
        SM1=1;
        REN=1;
        //SCON|=0x50;
        PCON&=0x3f;
        AUXR|=0x01;
        AUXR|=0X14;
        T2H=0xfc;
        T2L=0xf3;
        ES=1;
}

//*********************************《人人學(xué)會單片機》視頻教程,祁緒電子2020-05
//串口發(fā)送函數(shù)。主函數(shù)調(diào)用,或者串口發(fā)送完中斷后馬上調(diào)用
//*********************************《人人學(xué)會單片機》視頻教程,祁緒電子2020-05
void Uart1_Up_Data_Drive()
{
        static u8 xdata count=0;
        if(Uart1_Flag)                                                                                        //標(biāo)志允許,發(fā)送一個字節(jié)
        {
                Uart1_Flag=0;                                                                                //標(biāo)志位翻轉(zhuǎn),只允許發(fā)送一個字節(jié)
                count++;                                                                                        //字節(jié)編號增加。
                switch(count)
                {
                        case 1 : SBUF=Uart1_Up_Symbol_Buffer[0];break;        //發(fā)送漢字的ASCII
                        case 2 : SBUF=Uart1_Up_Symbol_Buffer[1];break;
                        case 3 : SBUF=Uart1_Up_Symbol_Buffer[2];break;
                        case 4 : SBUF=Uart1_Up_Symbol_Buffer[3];break;
                        case 5 : SBUF=Uart1_Up_Symbol_Buffer[4];break;
                        case 6 : SBUF=Uart1_Up_Symbol_Buffer[5];break;
                        case 7 : SBUF=Uart1_Up_Symbol_Buffer[6];break;
                        case 8 : SBUF=Uart1_Up_Num_Buffer[0];break;                //發(fā)送數(shù)值 溫度
                        case 9 : SBUF=Uart1_Up_Num_Buffer[1];break;
                        case 10 :SBUF=Uart1_Up_Num_Buffer[2];break;
                        case 11 :SBUF=Uart1_Up_Num_Buffer[3];break;
                       
                        case 12 : SBUF=Uart1_Up_Symbol_Buffer[7];break;        //發(fā)送漢字的ASCII
                        case 13 : SBUF=Uart1_Up_Symbol_Buffer[8];break;
                        case 14 : SBUF=Uart1_Up_Symbol_Buffer[9];break;
                        case 15 : SBUF=Uart1_Up_Symbol_Buffer[10];break;
                        case 16 : SBUF=Uart1_Up_Symbol_Buffer[11];break;
                        case 17 : SBUF=Uart1_Up_Symbol_Buffer[12];break;
                        case 18 : SBUF=Uart1_Up_Symbol_Buffer[13];break;
                        case 19 : SBUF=Uart1_Up_Symbol_Buffer[14];break;
                        case 20 : SBUF=Uart1_Up_Symbol_Buffer[15];break;
                        case 21 : SBUF=Uart1_Up_Symbol_Buffer[16];break;
                        case 22 : SBUF=Uart1_Up_Symbol_Buffer[17];break;
                        case 23 : SBUF=Uart1_Up_Num_Buffer[5];break;        //發(fā)送數(shù)值 遙控
                        case 24 : SBUF=Uart1_Up_Num_Buffer[6];break;
                       
                        case 25 : SBUF=Uart1_Up_Symbol_Buffer[18];break;//發(fā)送漢字的ASCII
                        case 26 : SBUF=Uart1_Up_Symbol_Buffer[19];break;
                        case 27 : SBUF=Uart1_Up_Symbol_Buffer[20];break;
                        case 28 : SBUF=Uart1_Up_Symbol_Buffer[21];break;
                        case 29 : SBUF=Uart1_Up_Symbol_Buffer[22];break;
                        case 30 : SBUF=Uart1_Up_Symbol_Buffer[23];break;
                        case 31 : SBUF=Uart1_Up_Symbol_Buffer[24];break;
                        case 32 : SBUF=Uart1_Up_Symbol_Buffer[25];break;
                        case 33 : SBUF=Uart1_Up_Symbol_Buffer[26];break;
                        case 34 : SBUF=Uart1_Up_Num_Buffer[7];break;        //發(fā)送數(shù)值 超聲波
                        case 35 : SBUF=Uart1_Up_Num_Buffer[8];break;
                        case 36 : SBUF=Uart1_Up_Num_Buffer[9];break;
                        case 37 : SBUF=Uart1_Up_Symbol_Buffer[27];break;//發(fā)送漢字的ASCII
                        case 38 : SBUF=Uart1_Up_Symbol_Buffer[28];break;
                        case 39 :count=0;break;//最后一步 沒有發(fā)送字節(jié),串口TI不會置1,所以不再發(fā)送
                }
        }
}
//*********************************《人人學(xué)會單片機》視頻教程,祁緒電子2020-05
//串口中斷,接收一個字節(jié),馬上發(fā)送N個字節(jié),發(fā)送數(shù)組顯示到電腦
//*********************************《人人學(xué)會單片機》視頻教程,祁緒電子2020-05
void Uart1_Routine() interrupt 4
{
        static char Uart1_ser_n=0;                                                                //用于接收計數(shù)
        if(RI)                                                                                                        //如果接收到一個字節(jié)
        {
                RI=0;                                                                                                //標(biāo)志位清除
                Uart1_Flag=1;                                                                                //串口發(fā)送允許
                if(SBUF==0x7f)//9600波特率                                                        //判斷連續(xù)多個0x7f
                {
                        Uart1_ser_n++;                                                                        //判斷連續(xù)多個0x7f
                        if(Uart1_ser_n>=10)                                                                //判斷連續(xù)多個0x7f
                        {
                                Uart1_ser_n=0;                                                                //清0
                                IAP_CONTR|=0xe0;                                                        //執(zhí)行自動軟復(fù)位,可以做調(diào)試用
                        }
                }
        }
        if(TI)                                                                                                        //如果上一個字節(jié)發(fā)送完成了       
        {
                TI=0;                                                                                                //標(biāo)志位清除
                Uart1_Flag=1;                                                                                //串口發(fā)送允許
                Uart1_Up_Data_Drive();                                                                //執(zhí)行串口發(fā)送下一個字節(jié)
        }
}

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復(fù)

使用道具 舉報

ID:878235 發(fā)表于 2021-1-16 22:10 | 顯示全部樓層
個人覺得,如果不死等,應(yīng)該有一個估計的時間等待。
回復(fù)

使用道具 舉報

ID:390416 發(fā)表于 2021-1-20 17:08 | 顯示全部樓層
zpmpok001 發(fā)表于 2021-1-16 22:10
個人覺得,如果不死等,應(yīng)該有一個估計的時間等待。

用了中斷了,就不需要死等了。發(fā)送完成就馬上發(fā)送下一個字節(jié)。
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表