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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 15295|回復: 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. }
復制代碼


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏6 分享淘帖 頂1 踩
回復

使用道具 舉報

沙發
ID:134288 發表于 2016-8-2 17:27 | 只看該作者
我直接把你程序復制過去 好多錯誤。。。。。。。。
回復

使用道具 舉報

板凳
ID:134288 發表于 2016-8-2 17:28 | 只看該作者
為什么我把你的程序直接復制進去 好多錯誤
回復

使用道具 舉報

地板
ID:134288 發表于 2016-8-2 17:30 | 只看該作者
為什么我把你的程序直接復制進去 好多錯誤。。
回復

使用道具 舉報

5#
ID:164118 發表于 2017-2-10 12:19 | 只看該作者
因為書寫格式的有問題,你自己敲進去應該會好點兒 吧,我猜
回復

使用道具 舉報

6#
ID:474982 發表于 2019-2-18 22:55 | 只看該作者
這是用的STC單片機嗎?
回復

使用道具 舉報

7#
ID:85480 發表于 2019-7-29 16:36 | 只看該作者
正在學習單片機通訊,謝過,先自己試驗試驗。
回復

使用道具 舉報

8#
ID:686387 發表于 2020-4-19 23:12 | 只看該作者
學習了,終于搞懂了,不過還得再消化一下,謝謝分享
回復

使用道具 舉報

9#
ID:704585 發表于 2020-8-27 10:13 | 只看該作者
感謝樓主分享
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美性久久久 | 精品久久一区二区三区 | 国产特级毛片 | 欧美精品二区 | 欧美1区2区 | 亚洲欧美在线视频 | 一区二区国产精品 | 在线视频 亚洲 | 91精品在线观看入口 | 91美女在线| 亚洲欧美一区二区三区视频 | 国产欧美日韩视频 | 国产精品区二区三区日本 | 成人在线电影网站 | 国产成人jvid在线播放 | av一区二区在线观看 | 米奇7777狠狠狠狠视频 | 午夜精品一区二区三区在线 | 精品一二区 | 欧洲国产精品视频 | 国产精品成人久久久久a级 久久蜜桃av一区二区天堂 | 丁香久久| 国产一二区视频 | 你懂的国产 | 亚洲福利一区 | 久久久久国产精品一区 | 日韩一二区在线 | 男女羞羞视频在线看 | 激情婷婷| 精品一区二区三区免费毛片 | 99成人免费视频 | 日韩一区二区三区在线视频 | 91视频久久| 免费的网站www| 性在线| 精品视频在线观看 | 国产视频福利在线观看 | 欧美日韩国产中文字幕 | 91精品久久久久久久久中文字幕 | 久久精品一区二区三区四区 | 特黄特色大片免费视频观看 |