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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 15295|回復(fù): 8
打印 上一主題 下一主題
收起左側(cè)

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

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:101489 發(fā)表于 2016-1-5 02:01 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
單片機(jī)的通信一般有并行通信和串行通信。并行通訊是數(shù)據(jù)的各位同時(shí)發(fā)送或接收,并行通信控制簡單,傳輸速度快,傳輸線較多。
參看下圖:



串行通訊傳輸線少,可利用電話網(wǎng),但傳送控制復(fù)雜。數(shù)據(jù)一位一位順序發(fā)送或接收。



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


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


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

接下來我們分享下單片機(jī)串口的結(jié)構(gòu)和寄存器相關(guān)的知識(shí)。
  51單片機(jī)通過引腳RXD(P3.0,串行數(shù)據(jù)接收端)和引腳TXD(P3.1,串行數(shù)據(jù)發(fā)送端)與外界通訊。SBUF是串行口緩沖寄存器,包括發(fā)送寄存器和接收寄存器。它們有相同名字和地址空間,但不會(huì)出現(xiàn)沖突,因?yàn)樗鼈儍蓚(gè)一個(gè)只能被CPU讀出數(shù)據(jù),一個(gè)只能被CPU寫入數(shù)據(jù)。





  TH1和TL1是裝計(jì)數(shù)初值的計(jì)數(shù)器,用于產(chǎn)生波特率。TI是發(fā)送標(biāo)志位,RI是接收標(biāo)志位,具體作用我們會(huì)在下面的分享中接觸到。
  下面我們看看單片機(jī)串口相關(guān)的寄存器:

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


其中fosc為晶振頻率

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


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



接下來我們分享下怎樣通過編程實(shí)現(xiàn)串口通信,串口的操作步驟:

一、先設(shè)置波特率:

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

   給計(jì)數(shù)器賦初值(工作方式2會(huì)自動(dòng)重裝)


二、設(shè)置串口工作方式:

   設(shè)置SCON

   如果使用中斷方式,那么打開相應(yīng)的中斷和總中斷。


三、打開定時(shí)器T1,開始產(chǎn)生波特率。


四、設(shè)置TRx



下面我們看個(gè)例程:

  1. #include <reg52.h>

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


  3. #define 1200bps 0xe8     

  4. //1200波特率計(jì)數(shù)初值宏定義

  5. #define 2400bps 0xf4     

  6. //2400波特率計(jì)數(shù)初值宏定義

  7. #define 4800bps 0xfa     

  8. //4800波特率計(jì)數(shù)初值宏定義

  9. #define 9600bps 0xfd     

  10. //9600波特率計(jì)數(shù)初值宏定義



  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. //串口初始化函數(shù)

  24. {

  25. SCON = SCON | 0x50;   

  26. //8位可變波特率,無奇偶校驗(yàn)位

  27. TMOD = TMOD | 0x20;   

  28. //設(shè)置定時(shí)器1為8位自動(dòng)重裝記數(shù)器                                             

  29. PCON = PCON | 0x00;

  30. TH1  = TH;   

  31. //設(shè)置定時(shí)器1自動(dòng)重裝數(shù)                  

  32. TL1  = TL;        

  33. //設(shè)置定時(shí)器1自動(dòng)重裝數(shù)

  34. ES   = 1;  

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

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

  37. //開定時(shí)器1                       

  38. }



  39. void send_UART(unsigned char i)         

  40. //發(fā)送一節(jié)函數(shù)

  41. {

  42. ES = 0;  

  43. //關(guān)串口中斷

  44. TI = 0;  

  45. //清零串口發(fā)送完成中斷請求標(biāo)志

  46. SBUF = i;  

  47. //發(fā)送數(shù)據(jù)

  48. while(TI==0);                    

  49. //等特?cái)?shù)據(jù)傳送  

  50. TI = 0;      

  51. //清除數(shù)據(jù)傳送標(biāo)志

  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.      //發(fā)送字符a

  70.    }

  71.   }

  72. }

  73. }
復(fù)制代碼


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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

5#
ID:164118 發(fā)表于 2017-2-10 12:19 | 只看該作者
因?yàn)闀鴮懜袷降挠袉栴},你自己敲進(jìn)去應(yīng)該會(huì)好點(diǎn)兒 吧,我猜
回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

7#
ID:85480 發(fā)表于 2019-7-29 16:36 | 只看該作者
正在學(xué)習(xí)單片機(jī)通訊,謝過,先自己試驗(yàn)試驗(yàn)。
回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 在线视频久久 | 欧美一区二区三区视频 | 亚洲一区二区三区在线 | 国产亚洲一区在线 | 久久久久亚洲精品国产 | 国产精品久久久久久久免费大片 | 波多野结衣先锋影音 | 亚洲精选一区 | 黄免费观看 | 成人国产精品 | 台湾佬久久 | 久久久国产一区二区三区 | 日韩一二区 | av黄色在线 | 日韩在线免费播放 | 亚洲 欧美 综合 | 国产欧美视频一区二区 | 亚洲欧美视频一区 | 天天天操操操 | 91精品在线播放 | 日韩成人精品视频 | 欧美日韩a | 91精品国产综合久久福利软件 | 日韩精品在线一区 | 日韩三区 | 午夜精品久久久 | 欧美大片黄 | 天天插天天射天天干 | 精品国产欧美 | 成人综合视频在线观看 | 国产黑丝在线 | 久久99精品国产99久久6男男 | 在线视频成人 | 久久爱一区 | 免费一级欧美在线观看视频 | 一本色道精品久久一区二区三区 | 久久久久国产精品一区二区 | 国产一级片免费视频 | 久久99精品久久久久久噜噜 | 超碰97免费 | 日韩at|