两个吃奶一个添下面视频_人妻第一页香蕉网_欧美xxxx少妇_妺妺窝人体色www婷婷

串口是非常常用的一個調(diào)試工具,我們都必須熟練使用串口的各個功能。


1.題目要求和解決方案

我們要做的是,電腦端發(fā)送字符串過來給單片機,然后單片機這邊接收完之后要回復(fù)給電腦端,回復(fù)內(nèi)容為“接收完成!”。單片機這邊把接收到的數(shù)據(jù)存放在定義好的全局變量數(shù)組里面,我們可以通過按K4發(fā)送回去給電腦端查看剛剛接收到的內(nèi)容并把它顯示出來。

我們要知道,一個漢字是需要兩個字節(jié)內(nèi)存的,比如電腦端發(fā)送的字符串為“好好學(xué)習(xí),天天向上!”其中的兩個標點符號也是中文輸入法打上的話,一個標點符號也是占用兩個字節(jié),這個字符串就是一共占用10*2=20個字節(jié)內(nèi)存。

那么怎樣判斷是否把字符串的數(shù)據(jù)都接收完成了呢?我們參考了宋老師的編程思想,使用定時計數(shù)器,也就是讓定時器0使用工作模式1計時,接收到第一個數(shù)據(jù)的時候我們先把TH0和TL0清0,然后打開定時器開始計時,當接收到第二個數(shù)據(jù)的時候又把TH0和TL0清0讓他們從0開始再次計時,直到當TH0大于等于200的時候證明時間過去了50ms左右( 200*256*(12/11059200)= 0.055秒 ),如果在這50ms里面都不再接收地到數(shù)據(jù),那么斷定已經(jīng)把字符串的數(shù)據(jù)都接收完成。

我們程序里定義的數(shù)組有關(guān)鍵字pdata,大家在《手把手教你學(xué)51單片機》文檔10.4節(jié)了解一下知識點即可。


2.main.c測試代碼

#include <reg52.h> 
#include <function.h> //詳見第六章第8講
#include <uart.h>     //詳見第十章第4講
 
u8 uart_i=0;
u8 pdata RXDBUF[64];
void COUNT_TIMES()
{
    TMOD&=0xF0;    //清0低四位
    TMOD|=0x01;    //設(shè)置定時器0為工作模式1
}
 
void main()
{    
    u8 key,x;
    KEY_Init();    //初始化按鍵模塊
    EA = 1;        //閉合總中斷開關(guān)
    COUNT_TIMES(); //初始化計數(shù)器
    ConfigUART(9600);
   
    while(1)
    {  
        key=KEY_Scan(0,500);
        if(key==4)
        {
            printf_str("收到的內(nèi)容為:\r\n");
            printf_str(RXDBUF);                 //把接收到的字符串發(fā)送給電腦端
            for(x=0;x<64;x++)RXDBUF[x]=0x00;    //發(fā)送完接收到的字符串之后,內(nèi)存區(qū)全部清除數(shù)據(jù),統(tǒng)一改為0x00以便下次接收新的字符串
        }
        
        if(TH0>=200)                            //判斷是否把數(shù)據(jù)接收完畢
        {
            TR0=0;                              //關(guān)閉定時器,停止計時
            printf_str("\r\n接收完成!\r\n"); 
           
            RXDBUF[uart_i]='\0';                //增加結(jié)束符,滿足了“printf_str(RXDBUF);”該發(fā)送多少數(shù)據(jù)就是多少
            uart_i=0;                           //uart_i歸0是為了下次接收新的字符串是從RXDBUF[0]開始存取數(shù)據(jù)
            TH0=0;                              //清零定時器的寄存器,下次再從0開始計時  
            TL0=0;     
        }
    } 
}
 
void InterruptUART() interrupt 4
{  
    if (RI)   //接收到字節(jié)
    {
        RI = 0;
   
        TH0=0;//每接收到一個字節(jié)數(shù)據(jù),就清0寄存器的值,定時時間又是從0開始計時,直到TH0大于等于200的時候,
        TL0=0;//時間超過50ms,也就是沒有再接收到數(shù)據(jù),因為接收到數(shù)據(jù)都會進入“if (RI)”把TH0和TL0清0,TH0大于等于200,
              //超出了等待時間,證明后面沒有數(shù)據(jù)發(fā)送過來了   
        TR0=1;//接收到第一個數(shù)據(jù)就打開定時器開始計時,后面接收到第二,第三個數(shù)據(jù)照樣打開定時器計時,直到在主函數(shù)里面被關(guān)閉為止
   
        RXDBUF[uart_i]=SBUF;//接收一個字節(jié)數(shù)據(jù)
        uart_i++;           //RXDBUF從0號元素不停往下存取數(shù)據(jù)   
    }
}


3.實驗現(xiàn)象

我們先把串口調(diào)試助手的設(shè)置選項選好

串口1


打開串口之后,在輸入框打上“好好學(xué)習(xí),天天向上!”,點擊發(fā)送,可以看到如下界面

串口2


我們在開發(fā)板上按下K4,把剛才接收到的字符串發(fā)送回來給電腦端顯示出來

串口3


如果不斷按K4,將沒有顯示新的內(nèi)容,因為程序里一但把上次的數(shù)據(jù)發(fā)送給電腦端顯示就清除掉這些數(shù)據(jù)了,我們接著不斷按K4會有如下所示

串口4


只有再次發(fā)送內(nèi)容,再按K4才會顯示新的內(nèi)容

串口5

點贊(0)

C語言網(wǎng)提供由在職研發(fā)工程師或ACM藍橋杯競賽優(yōu)秀選手錄制的視頻教程,并配有習(xí)題和答疑,點擊了解:

一點編程也不會寫的:零基礎(chǔ)C語言學(xué)練課程

解決困擾你多年的C語言疑難雜癥特性的C語言進階課程

從零到寫出一個爬蟲的Python編程課程

只會語法寫不出代碼?手把手帶你寫100個編程真題的編程百練課程

信息學(xué)奧賽或C++選手的 必學(xué)C++課程

藍橋杯ACM、信息學(xué)奧賽的必學(xué)課程:算法競賽課入門課程

手把手講解近五年真題的藍橋杯輔導(dǎo)課程

Dotcpp在線編譯      (登錄可減少運行等待時間)