久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 15525|回復: 8
收起左側

51單片機的串口通信詳解-原理 寄存器 編程等

  [復制鏈接]
ID:101489 發表于 2016-1-5 02:01 | 顯示全部樓層 |閱讀模式
單片機的通信一般有并行通信和串行通信。并行通訊是數據的各位同時發送或接收,并行通信控制簡單,傳輸速度快,傳輸線較多。
參看下圖:



串行通訊傳輸線少,可利用電話網,但傳送控制復雜。數據一位一位順序發送或接收。



串行通訊中有一種是異步通信,即我們通常所說的串口通信。這是我們今天要分享的內容:
異步通訊用一個起始位表示字符的開始,用停止位表示字符的結束。其每幀的格式如下:在一幀格式中,先是一個起始位0,然后是8個數據位,規定低位在前,高位在后,接下來是奇偶校驗位(可以省略),最后是停止位1。用這種格式表示字符,則字符可以一個接一個地傳送。


一、在異步通訊中,CPU與外設之間必須有兩項規定,即字符格式和波特率。
1、字符格式的規定是雙方能夠在對同一種0和1的串理解成同一種意義,即我們所說的通信協議。
2、波特率即數據傳送的速率,其定義是每秒鐘傳送的二進制數的位數。例如,數據傳送的速率是120字符/s,而每個字符如上述規定包含10數位,則傳送波特率為1200波特。


二、通訊方向。
1、在串行通訊中,把通訊接口只能發送或接收的單向傳送方法叫單工傳送。
2、把數據在甲乙兩機之間的雙向傳遞,稱之為雙工傳送。在雙工傳送方式中又分為半雙工傳送和全雙工傳送。半雙工傳送是兩機之間不能同時進行發送和接收,任一時該,只能發或者只能收信息。

接下來我們分享下單片機串口的結構和寄存器相關的知識。
  51單片機通過引腳RXD(P3.0,串行數據接收端)和引腳TXD(P3.1,串行數據發送端)與外界通訊。SBUF是串行口緩沖寄存器,包括發送寄存器和接收寄存器。它們有相同名字和地址空間,但不會出現沖突,因為它們兩個一個只能被CPU讀出數據,一個只能被CPU寫入數據。





  TH1和TL1是裝計數初值的計數器,用于產生波特率。TI是發送標志位,RI是接收標志位,具體作用我們會在下面的分享中接觸到。
  下面我們看看單片機串口相關的寄存器:

一、工作方式寄存器SCON
位  D7   D6   D5   D4   D3   D2   D1   D0
功能 SM0  SM1  SM2  REN  TB8  RB8  TI   RI


其中fosc為晶振頻率

SM2:多機通訊控制位。在方式0時,SM2一定要等于0。在方式1中,當(SM2)=1則只有接收到有效停止位時,RI才置1。在方式2或方式3當(SM2)=1且接收到的第九位數據RB8=0時,RI才置1。
REN:接收允許控制位。由軟件置位以允許接收,又由軟件清0來禁止接收。
TB8:是要發送數據的第9位。
RB8:接收到的數據的第9位。
TI:發送中斷標志。在方式0中,第8位發送結束時,由硬件置位。TI置位既表示一幀信息發送結束,同時也是申請中斷,可根據需要,用軟件查詢的方法獲得數據已發送完畢的信息,或用中斷的方式來發送下一個數據。TI必須用軟件清0。
RI:接收中斷標志位。在方式0,當接收完第8位數據后,由硬件置位。RI置位表示一幀數據接收完畢,可用查詢的方法獲知或者用中斷的方法獲知。RI也必須用軟件清0。


波特率的概念:
   波特率的定義:串行口每秒鐘發送的位數稱為波特率。比如說2400的波特率就是每秒鐘發送2400個位數。串行口的波特率是用定時器T1作為波特率發生器的,這是定時器自動設置在工作方式2(可自動重裝初值)。



接下來我們分享下怎樣通過編程實現串口通信,串口的操作步驟:

一、先設置波特率:

   設置定時器T1為工作方式2(設置TMOD寄存器)

   給計數器賦初值(工作方式2會自動重裝)


二、設置串口工作方式:

   設置SCON

   如果使用中斷方式,那么打開相應的中斷和總中斷。


三、打開定時器T1,開始產生波特率。


四、設置TRx



下面我們看個例程:

  1. #include <reg52.h>

  2. //FOSC=11.0592MHz,12T模式,SMOD=0


  3. #define 1200bps 0xe8     

  4. //1200波特率計數初值宏定義

  5. #define 2400bps 0xf4     

  6. //2400波特率計數初值宏定義

  7. #define 4800bps 0xfa     

  8. //4800波特率計數初值宏定義

  9. #define 9600bps 0xfd     

  10. //9600波特率計數初值宏定義



  11. unsigned char zifu='a';               

  12. //待顯示字符。



  13. sbit SWITCH_S7 = P3^4;               



  14. void delay(int In,int Out)

  15. {

  16. int i,j;

  17. for(i=0;i<In;i++)

  18. {

  19.   for(j=0;j<Out;j++)

  20.   {;}

  21. }


  22. void serial_port_initial(char TH,char TL)  

  23. //串口初始化函數

  24. {

  25. SCON = SCON | 0x50;   

  26. //8位可變波特率,無奇偶校驗位

  27. TMOD = TMOD | 0x20;   

  28. //設置定時器1為8位自動重裝記數器                                             

  29. PCON = PCON | 0x00;

  30. TH1  = TH;   

  31. //設置定時器1自動重裝數                  

  32. TL1  = TL;        

  33. //設置定時器1自動重裝數

  34. ES   = 1;  

  35. //允許串口中斷                                EA   = 1;  

  36. //開總中斷                                    TR1  = 1;              

  37. //開定時器1                       

  38. }



  39. void send_UART(unsigned char i)         

  40. //發送一節函數

  41. {

  42. ES = 0;  

  43. //關串口中斷

  44. TI = 0;  

  45. //清零串口發送完成中斷請求標志

  46. SBUF = i;  

  47. //發送數據

  48. while(TI==0);                    

  49. //等特數據傳送  

  50. TI = 0;      

  51. //清除數據傳送標志

  52. ES = 1;

  53. }



  54. void main()

  55. {

  56. serial_port_initial(1200bps,1200bps);



  57. while(1)

  58. {

  59.   if(SWITCH_S7 == 0)   

  60.    //判斷按鍵是否按下

  61.   {

  62.    delay(5,200);

  63.    if(SWITCH_S7 == 0)

  64.     //消抖

  65.    {

  66.     while(SWITCH_S7 == 0);                  

  67.      //等待按鍵松開

  68.     send_UART(zifu);              

  69.      //發送字符a

  70.    }

  71.   }

  72. }

  73. }
復制代碼


回復

使用道具 舉報

ID:134288 發表于 2016-8-2 17:27 | 顯示全部樓層
我直接把你程序復制過去 好多錯誤。。。。。。。。
回復

使用道具 舉報

ID:134288 發表于 2016-8-2 17:28 | 顯示全部樓層
為什么我把你的程序直接復制進去 好多錯誤
回復

使用道具 舉報

ID:134288 發表于 2016-8-2 17:30 | 顯示全部樓層
為什么我把你的程序直接復制進去 好多錯誤。。
回復

使用道具 舉報

ID:164118 發表于 2017-2-10 12:19 | 顯示全部樓層
因為書寫格式的有問題,你自己敲進去應該會好點兒 吧,我猜
回復

使用道具 舉報

ID:474982 發表于 2019-2-18 22:55 | 顯示全部樓層
這是用的STC單片機嗎?
回復

使用道具 舉報

ID:85480 發表于 2019-7-29 16:36 | 顯示全部樓層
正在學習單片機通訊,謝過,先自己試驗試驗。
回復

使用道具 舉報

ID:686387 發表于 2020-4-19 23:12 | 顯示全部樓層
學習了,終于搞懂了,不過還得再消化一下,謝謝分享
回復

使用道具 舉報

ID:704585 發表于 2020-8-27 10:13 | 顯示全部樓層
感謝樓主分享
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日本精品视频 | 亚洲国产精品一区二区第一页 | 亚洲理论在线观看电影 | 精品av久久久久电影 | 99亚洲视频 | yiren22综合网成人 | 高清视频一区二区三区 | 在线观看亚洲专区 | 国产欧美一区二区三区在线看 | 国产精品成av人在线视午夜片 | 一区二区在线不卡 | 一级全黄少妇性色生活免费看 | 亚洲精品久久久9婷婷中文字幕 | 亚洲成人精品 | 亚洲精品电影 | 久久久久国产一区二区三区 | 午夜精品久久久久久久久久久久 | 国产高清视频在线 | 中文字幕在线观看 | 精品一区二区三区四区视频 | 欧美一区免费 | 精品国产一区一区二区三亚瑟 | 九九热精品在线 | 成人在线观 | 中文字幕乱码一区二区三区 | 韩日免费视频 | 久久久久久久电影 | 国产激情在线播放 | 欧美一区二区三区在线观看 | 天天插天天射天天干 | 伊人亚洲| 99免费视频 | 成人亚洲精品 | 国产精品69久久久久水密桃 | 国产精品一二三区在线观看 | 精品日韩一区 | 国产精品久久久亚洲 | 秋霞在线一区二区 | 中文字幕在线播放不卡 | 激情 亚洲| 亚洲午夜精品一区二区三区 |