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

1.題目要求

作為本教程最后一個例程,我們也不打算寫的太復雜,這次還是運用串口的知識,實現(xiàn)用串口往EEPROM寫入數(shù)據(jù),同時也能用串口讀出EEPROM里的數(shù)據(jù)出來顯示在電腦端的窗口上。根據(jù)前幾講的串口與液晶屏的代碼理解,這一講的例程也不難理解。

2.main.c測試代碼

#include <reg52.h> 
#include <function.h> //詳見第六章第8講
#include <uart.h>     //詳見第十章第4講
#include <iic.h>      //詳見第十二章第3講
 
u8 uart_i=0;
u8 pdata RXDBUF[130];
void COUNT_TIMES()
{
    TMOD&=0xF0;   //清0低四位
    TMOD|=0x01;   //設(shè)置定時器0為工作模式1
}
   
void UART_E2Write()
{
    u8 j,k;
    u8 E2_add;
    u8 pdata E2BUF[102];//存取從RXDBUF[12]開始后的數(shù)據(jù),RXDBUF[0]~RXDBUF[11]是字符串“E2Write:xxx,”(xxx表示地址)
    if(  RXDBUF[0]=='E'&&RXDBUF[1]=='2'&&RXDBUF[2]=='W'&&RXDBUF[3]=='r'
       &&RXDBUF[4]=='i'&&RXDBUF[5]=='t'&&RXDBUF[6]=='e'&&RXDBUF[7]==':')                               
    {
        E2_add=(RXDBUF[8]-'0')*100+(RXDBUF[9]-'0')*10+(RXDBUF[10]-'0'); //確定要開始寫入的地址  
        k=uart_i-12;                                                    //由于uart_i在“InterruptUART()”函數(shù)中的最后自加了一次,
                                                                        //所以“k=uart_i-12;”表示的是收到要寫入EEPROM的字符串的個數(shù)
         
        for(j=0; j<k; j++)E2BUF[j]=RXDBUF[j+12];                        //把接收到要寫入EEPROM的字符串存儲在E2BUF數(shù)組中
    
        E2Write(E2BUF,E2_add,k);                                        //把內(nèi)容寫入進EEPROM中
        printf_str("\r\n寫入完成!\r\n");
        printf_str("地址寫到了");
        printf_num( (u32)E2_add+j-1 );                                  //打印出此時EEPROM寫到了哪個地址位置了,因為要傳入的參數(shù)為u32類型,所以必須強制轉(zhuǎn)換
        printf_rn();   
    }
}
  
void UART_E2Read()
{
    u8 E2_add,n;
    u8 pdata E2BUF[102];//接收緩沖區(qū),最多能接收50個漢字
    if(  RXDBUF[0]=='E'&&RXDBUF[1]=='2'&&RXDBUF[2]=='R'&&RXDBUF[3]=='e'
       &&RXDBUF[4]=='a'&&RXDBUF[5]=='d'&&RXDBUF[6]==':')                               
    {
        E2_add=(RXDBUF[7]-'0')*100+(RXDBUF[8]-'0')*10+(RXDBUF[9]-'0'); //確定要開始讀出的地址  
        n=(RXDBUF[11]-'0')*100+(RXDBUF[12]-'0')*10+(RXDBUF[13]-'0');   //確定要讀出的個數(shù)
    
        E2Read(E2BUF,E2_add,n);        
        E2BUF[n]='\0';     //添加結(jié)束符
    
        printf_str(E2BUF); //打印出從EEPROM讀出的數(shù)據(jù)    
    }
}
  
void main()
{   
    u8 x; 
    EA = 1;        //閉合總中斷開關(guān)
    COUNT_TIMES(); //初始化計數(shù)器
    ConfigUART(9600);
   
    while(1)
    {    
        if(TH0>=200)        //判斷是否把數(shù)據(jù)接收完畢
        {
            TR0=0;          //關(guān)閉定時器,停止計時
     
            UART_E2Write(); //查看串口發(fā)送來的信息是否滿足EEPROM寫入數(shù)據(jù)的命令
            UART_E2Read();  //查看串口發(fā)送來的信息是否滿足EEPROM讀出數(shù)據(jù)的命令
     
            uart_i=0;       //uart_i歸0是為了下次接收新的字符串是從RXDBUF[0]開始存取數(shù)據(jù)
            TH0=0;          //清零定時器的寄存器,下次再從0開始計時  
            TL0=0;     
     
            for(x=0;x<64;x++)RXDBUF[x]=0x00; //發(fā)送完接收到的字符串之后,內(nèi)存區(qū)全部清除數(shù)據(jù),統(tǒng)一改為0x00以便下次接收新的字符串
        }
    } 
}
   
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ù)   
    }
}

下一講我們再教大家如何實踐操作,代碼可以了解了解意思先。

點贊(0)

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

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

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

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

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

信息學奧賽或C++選手的 必學C++課程

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

手把手講解近五年真題的藍橋杯輔導課程

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