娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2025年05月06日(星期二)

正在發生

2018年05月06日 | 單片機C語言之串口通信協議

發布者:冰山火影1977 來源: eefocus關鍵字:單片機  C語言  串口通信協議 手機看文章 掃描二維碼
隨時隨地手機看文章

現實生活中, 我們總是要與人打交道,互通有無。單片機也一樣,需要跟各種設備交互。例如汽車的顯示儀表需要知道汽車的轉速及電動機的運行參數,那么顯示儀表就需要從汽車的底層控制器取得數據。而這個數據的獲得過程就是一個通信過程。類似的例子還有控制器通常是單片機或者PLC與變頻器的通信。通信的雙方需要遵守一套既定的規則也稱為協議,這就好比我們人之間的對話,需要在雙方都遵守一套語言語法規則才有可能達成對話。

通信協議又分為硬件層協議和軟件層協議。硬件層協議主要規范了物理上的連線,傳輸電平信號及傳輸的秩序等硬件性質的內容。常用的硬件協議有串口,IIC, SPI, RS485, CAN和 USB。軟件層協議則更側重上層應用的規范,比如modbus協議。

好了,那這里我們就著重介紹51單片機的串口通信協議,以下簡稱串口。串口的6個特征如下。

(1)、物理上的連線至少3根,分別是Tx數據發送線,Rx數據接收線,GND共用地線。
(2)、0與1的約定。RS232電平,約定﹣5V至﹣25V之間的電壓信號為1,﹢5V至﹢25V之間的電壓信號為0 。TTL電平,約定5V的電壓信號為1,0V電壓信號為0 。CMOS電平,約定3.3V的電壓信號為1,0V電壓信號為0 。其中,CMOS電平一般用于ARM芯片中。
(3)、發送秩序。低位先發。
(4)、波特率。收發雙方共同約定的一個數據位(0或1)在數據傳輸線上維持的時間。也可理解為每秒可以傳輸的位數。常用的波特率有300bit/s, 600bit/s, 2400bit/s, 4800bit/s, 9600bit/s。
(5)、通信的起始信號。發送方在沒有發送數據時,應該將Tx置1 。 當需發送時,先將Tx置0,并且保持1位的時間。接受方不斷地偵測Rx,如果發現Rx常時間變高后,突然被拉低(置為0),則視為發送方將要發送數據,迅速啟動自己的定時器,從而保證了收發雙方定時器同步定時。

(6)、停止信號。發送方發送完最后一個有效位時,必須再將Tx保持1位的時間,即為停止位。


好了,理論暫時到這里,現在我們要做一個實驗,將一個字節從51單片機發送到電腦串口調試助手上。這個實驗的目的是為了掌握串口通信協議的收發過程。

虛擬串口

實驗一、虛擬串口實驗

一般單片機都有專門的串口引腳,51里面分別是P3.0和P3.1,這些引腳擁有串口的硬件電路,因此使用它們并不需要設置信號的發送停止。為了掌握協議,我們使用其他的引腳來模擬串口,所以也叫虛擬串口。這里我們選用P1.0,然而注意到我們51單片機要發送數據給電腦,必須經過一個串口轉USB設備(即TTL電平轉換為RS232電平),而限于我們的開發板只有P3.0與P3.1連接到了串口轉USB設備,所以我們可以將P1.0短接到P3.1 。 下圖是這個串口轉USB的原理圖。


好了直接上代碼吧。

  1. #include "reg51.h"  

  2. /* 

  3.   將P1.0虛擬成串口發送腳TX 

  4.   以9600bit/s的比特率向外發送數據 

  5.   因為波特率是    9600bit/s 

  6.   所以me發送一位的時間是 t=1000000us/9600=104us 

  7. */            

  8. sbit TX=P3^1; //P1^0 output TTL signal, need to transferred to rs232 signal, can be connected to P3^1  

  9. #define u16 unsigned int //宏定義  

  10. #define u8 unsigned char  

  11. u8 sbuf;  

  12. bit ti=0;  

  13.   

  14. void delay(u16 x)  

  15. {  

  16.     while(x--);  

  17. }  

  18. void Timer0_Init()  

  19. {  

  20.     TMOD |= 0x01;  

  21.     TH0=65440/256;  

  22.     TH0=65440%256;  

  23.     TR0=0;  

  24. }  

  25.   

  26. void Isr_Init()  

  27. {  

  28.     EA=1;  

  29.     ET0=1;  

  30. }  

  31.   

  32. void Send_Byte(u8 dat)  

  33. {  

  34.     sbuf=dat;//通過引入全局變量sbuf,可以保存形參dat  

  35.     TX=0; //A 起始位  

  36.     TR0=1;  

  37.     while(ti==0);    //等待發送完成  

  38.     ti=0; //清除發送完成標志  

  39. }  

  40.   

  41. void TF0_isr() interrupt 1     //每104us進入一次中斷  

  42. {  

  43.     static u8 i; //記錄進入中斷的次數  

  44.   

  45.     TH0=65440/256;  

  46.     TL0=65440%256;  

  47.     i++;  

  48.     if(i>=1 && i<=8)  

  49.     {  

  50.         if((sbuf&(1<<(i-1)))==0)  // (sbuf&(1<<(i-1)))表示取出i-1位  

  51.         {  

  52.             TX=0;  

  53.         }  

  54.         else  

  55.         {  

  56.             TX=1;  

  57.         }  

  58.     }  

  59.     if(i==9)  //停止位  

  60.     {  

  61.         TX=1;  

  62.     }  

  63.     if(i==10)     

  64.     {  

  65.         TR0=0;  

  66.         i=0;  

  67.         ti=1; //發送完成  

  68.     }  

  69. }  

  70.   

  71. void main()  

  72. {  

  73.     TX=1; //使TX處于空閑狀態  

  74.     Timer0_Init();  

  75.     Isr_Init();  

  76.     while(1)  

  77.     {  

  78.         Send_Byte(65); //0x41  

  79.         delay(60000);  

  80.     }  

  81. }  

實驗引入了定時器0來控制發送線上的各個位的保持時間。首先main函數進入,TX置1則使發送線處于空閑,這時候發送方和接受方都處于空閑。接下來初始化定時器0,TR0置0表示還不要啟動定時器0。接著中斷系統初始化,此時中斷系統已經開啟。進入while循環,先進Send_Byte()函數,將65傳給形參dat,dat再將65賦值給sbuf,到這里準備工作就做好了。接著TX置0,這個是起始位,要保持這個起始位104us。于是就啟動定時器TR0置1,計時器開始計數。當第一次溢出的時候,也就是過了104us,進入中斷,同時接收方也偵測到了這個突然被拉低的信號,于是迅速啟動自己的定時器。進入中斷子函數后,先是重裝定時器初值,然后i加1,也就是當i=1時,就應該發送數據的最低位了,總共有8位數據,所以使用條件語句if(i>=1 && i<=8)來判斷是否發送完數據位。然后再通過if(i==9) 來發送停止位,最后當i=10時,也就是發送完了,這時候要關閉定時器(那么程序也就),同時i置0,ti置1(才能跳出while(ti==0)循環),最后將ti置0,保證下次要發送字節時讓程序停留在while(ti==0)。


片上串口

以上說的是虛擬串口,上文中談到與串口相關的引腳P3.0與P3.1,事實上51單片機自帶片上串口,那這個串口又該怎么使用呢?

片上串口支持同步模式與異步模式。簡單來說同步模式就是指有時鐘線,而異步模式無時鐘線。這里的時鐘線是指在同步通信時,用一根線專門傳輸時鐘信號,這個信號用來與要發送的每一位保持同步,這樣就避免了例如異步通信中因為采用定時器而引入的時間誤差。

片上串口還支持8位模式和9位模式。如下圖所示


其中D0-D7是一個字節的8個位。9位模式只是多了一個位TB8,這個TB8的作用是奇偶校驗或多機通信。奇偶校驗原理這不加分析。多機通信時比如主機只發送數據給網絡中的一臺地址為0x02的設備,這時候先讓TB8為1,前面的D0-D7則為地址即0x02,之后再讓TB8為0,前面的D0-D7則為數據了。

上面設置了片上串口的模式,另外還要設置串口的波特率。

片上串口的波特率等于定時器1工作在方式2時溢出率的32分頻。如果要定時器1工作在方式2,那么TMOD=0x20。另外要保證為32分頻,我們還必須設置計數器初值。設晶振為11.0592Mhz,則定時器的計數脈沖為F=f/12,則定時器每計一個脈沖的時間為T=12/f。又令計數器的起點為x,則溢出一次要計的脈沖數為(256-x)。所以在計數起點為x時,溢出一次的時間為t=12/f*(256-x)。則對應的溢出率為1/t=f/(12*(256-x))。對應的波特率就為b=f/(384*(256-x))。

x=256-f/(384*b)

其中f為晶振頻率,b為希望的波特率,x為定時器的計數起點TH1的值。

例如當晶振為11.0592M,希望波特率為9600bit/s,則TH1=253。題外話,我們同樣可以演算出在其他常用波特率情況下,TH1始終為一個整數。這里也就解釋了為什么51里面選用了11.0592M的晶振而不是12M,這樣就保證了串口的時序更加準確,雖然犧牲了定時器的準確度。

實驗二,片外串口發送一個字節。

好了現在開始我們的實驗之旅。直接看代碼吧。


  1. #include "reg51.h"  

  2. #define u16 unsigned int  

  3. #define u8 unsigned char  

  4.   

  5. void delay(u16 x)  

  6. {  

  7.     while(x--);  

  8. }  

  9.   

  10. void Uart_Init() //串口初始化  

  11. {  

  12.     SCON=0x50; //8位異步模式  

  13.     TMOD|=0x20; //定時器1工作方式2  

  14.     TH1=253;//9600bit/s  

  15.     TR1=1;  

  16. }  

  17.   

  18. void Send_Byte(u8 dat)  

  19. {  

  20.     SBUF=dat; //啟動發送,只需要把發送內容給SBUF這個寄存器  

  21.     while(TI==0); //等待發送完成,因為TI為1時表示在發送停止位  

  22.     TI=0;  

  23. }  

  24.   

  25. void main()  

  26. {  

  27.     Uart_Init();  

  28.     while(1)  

  29.     {  

  30.        Send_Byte('m');  

  31.        delay(60000);  

  32.     }  

  33. }  


實驗二較之實驗一,代碼減少了很多,而且不用考慮繁瑣的位發送時序。只需要明白各個寄存器SCON,TMOD,TCON,SBUF的用法。TI是SCON中的第一位,為發送中斷請求標志位。在本方式中,在停止位開始發送時由內部硬件置位,響應中斷后TI必須又軟件清零。

實驗三、片上串口發送一個字符串

上面介紹了如何發送一個字節,那如何發送一個字符串甚至文本呢?這里我們首先介紹下字符串的概念。

字符串:從存儲器的某個地址開始,連續存放多個字符的ASCII碼,并且在最后一個字符的后面存放一個0,這段連續的內存空間就叫字符串,最后的0叫字符串的結束符。注意這里的0和加單引號的0不是一個概念,加單引號的0是指0的ASCII碼。

數組與字符串的關系:字符串是數組的一種特殊情況,數組在特定條件下可當做字符串用。C語言用雙引號描述一個字符串,如“abcd”。

下面我們通過一個實驗來展示如何發送字符串。我們實驗的目標是打印字符串“Hello World ! 第一!”到打印機。直接上代碼。


  1. #include "reg51.h"  

  2. #define u16 unsigned int  

  3. #define u8 unsigned char  

  4.   

  5. void delay(u16 x)  

  6. {  

  7.     while(x--);  

  8. }  

  9.   

  10. void Uart_Init() //串口初始化  

  11. {  

  12.     SCON=0x50; //8位異步模式  

  13.     TMOD|=0x20; //定時器1工作方式2  

  14.     TH1=253;//9600bit/s  

  15.     TR1=1;  

  16. }  

  17.   

  18. void Send_Byte(u8 dat)    //串口發送一個字節  

  19. {  

  20.     SBUF=dat; //啟動發送,只需要把發送內容給SBUF這個寄存器  

  21.     while(TI==0); //等待發送完成,因為TI為1時表示在發送停止位  

  22.     TI=0;  

  23. }  

  24.   

  25.  void Send_String(u8 *str)   //發送一個字符串  *str為字符串第一個字符的地址  

  26.  {  

  27.     abc:      //標號  

  28.     if(*str != 0)  

  29.     {  

  30.         Send_Byte(*str);  

  31.         str++;  

  32.         goto abc;     

  33.     }  

  34.  }  

  35.   

  36. void main()  

  37. {  

  38.     Uart_Init();  

  39.     while(1)  

  40.     {  

  41.        Send_String("Hello World! 第一!");  

  42.        Send_Byte(10);  

  43.        delay(60000);  

  44.        delay(60000);  

  45.     }  

  46. }  

實驗效果


關鍵字:單片機  C語言  串口通信協議 引用地址:單片機C語言之串口通信協議

上一篇:單片機C語言之指針變量
下一篇:單片機C語言實現數碼管控制

推薦閱讀

未來不僅通過量子接口可以實現量子通信和量子互聯網的聯網,而且通信和網速將極大提高。?近日,清華大學交叉信息研究院段路明教授研究團隊宣布其在量子信息領域取得重要進展,首次實現25個量子接口之間的量子糾纏。該成果的研究論文已在4月20日出刊的美國《科學》雜志子刊《科學進展》刊載。?這項成果的發布意味著什么呢?即有了更高效率的量子接口,它...
三星在2016年發生了“電池門”事件后,好不容易經歷三年才走出陰霾,豈料又一款劃時代的折疊屏手機Galaxy Fold在媒體評測階段已經出現黑屏、閃屏、凸起等狀況,讓三星在發布會前倉促宣布推遲舉行,把注意力都集中在研究產品問題上。雖然這次“屏幕門”事件并沒有對人發生傷害,但是作為三星這樣一家廠商而言,也出現如此問題,不禁讓人有種一葉知秋之想法...
PROTEUS仿真電路圖:仿真實驗結果展示:漢字取模過程(軟件下載鏈接在文末):第一步:打開液晶仿真排版軟件設定相關參數:輸入漢字:隨便找個位置將圖片保存:第二步:打開液晶漢字模提取軟件設定相關參數:將剛才保存的圖片打開并保存數據:C語言程序代碼:#include <reg51.h>#define LCDLCDDisp_Off 0x3e#define LCDLCDDisp_On 0x3f#define...
晶圓制造企業不僅是電力“黑洞”,同時也是用水怪獸。近段時間以來,中國臺灣地區缺水危機日益嚴峻,也影響到用水大戶臺積電,甚至不少人開始擔心曠日持久的缺芯問題。那么,晶圓制造過程中水的角色到底有多重要?具體到臺積電,用水量又是如何?臺積電缺水會對世界有哪些影響?本文我們將對此逐一分析。“用水怪獸”,晶圓廠名副其實半導體產業是名副其實...

史海拾趣

問答坊 | AI 解惑

RFID標準遲到讓人擔心

“我們正在解決RF-SIM卡量產的問題,相信年內,將會逐步開展RF-SIM卡大規模測試,使大眾能夠盡快通過手機‘非接觸式’服務于公交和地鐵等票務的小額支付。”某省運營商領導在接受采訪時表示。其實,像這樣將新業務瞄準RFID的運營商不在少數,中國移 ...…

查看全部問答∨

解決醫療電子脫離PC控制USB HOST芯片VNC2簡介

  FTDI新推出VNC1,VNC2  等USB HOST芯片更可以實現脫離電腦的數據傳輸,常用于醫療設備以及原本使用USB轉串口并口的設備上。具體參數如下:一、關鍵特性:    1;嵌入式微處理器處理核心。16 bit Harvard 架構。 &nb ...…

查看全部問答∨

音頻驅動播放背景噪音很大,大家幫忙看看是電路的原因還是軟件的原因!!

平臺是三星2440,DAC是CS4344 基本參數配置如下:采樣率44.1KHZ,單聲道,主時鐘384fs。32fs的串行位時鐘。通過示波器量2440出來的sclk,cdclk,lrclk幾個時鐘都沒有問題。 但是播放音頻的時候就是有非常大的背景噪音,播放音樂是正確的。 & ...…

查看全部問答∨

evc下在檢測鍵盤按鍵的時候怎樣使用組合鍵,例如Shift+A???

代碼如下寫的話沒起作用.請教各位高手 BOOL CGGDlg::PreTranslateMessage(MSG* pMsg) {     long pos[1];                     unsigned short LmtSts;     ...…

查看全部問答∨

wince驅動開發

請問朋友們,wince驅動開發可以有什么具體的開發項目,介紹幾個,要求能夠拿出臺面展示或者能夠參加程序設計比賽的。 …

查看全部問答∨

peekb()的奇怪現象

諸位大蝦:       好!      小弟在編CAN卡驅動時,想清中斷位,于是寫這樣的語句:             recv_flag = peekb(address, 3); 工作正常,中斷位成功清 ...…

查看全部問答∨

u-boot-2010.03在tq6410上的移植詳解(連載)

http://bbs.embedsky.net/viewthread.php?tid=6761&extra=page%3D1 (一) 原創文章版權所有!如需轉載,請注明出處: http://hi.baidu.com/liushuiyue1/myhome謝謝合作!!!!!由于Uboot2010.03對S3C6410有了很好的支持,所以采用Uboot201 ...…

查看全部問答∨

借專家團的機會,問幾個關于6472的問題

第一個問題:6472的6個core的結構關系?不知道是SMP架構還是SMP+主從可配置架構,看了下手冊里邊沒講,也不知道該如何操作第二個問題:6472上的RAPIDI/O的傳輸是使用的EDMA么?對應的那個通道咧?第三個問題:6472+FPGA的PCB的電源設計該選用什么樣 ...…

查看全部問答∨

2011國賽元件清單出來了,大家討論一下出題方向吧!

本帖最后由 paulhyde 于 2014-9-15 09:35 編輯 2011年全國大學生電子設計大賽元件清單終于出來了,大家根據清單發表一下自己看法吧,國賽在即,明確一下方向!   2011年全國大學生電子設計競賽 基本儀器和主要元器件清單   1、基本 ...…

查看全部問答∨

求前輩指路

畢業不久,對硬件感興趣,想做一個硬件工程師,請問各位前輩,如果要做一個硬件工程師需要學習些什么東西呢?需要怎樣入行呢?或者可以參加什么樣的培訓呢?多謝各位指導。…

查看全部問答∨
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 新邵县| 穆棱市| 丹阳市| 盐亭县| 芮城县| 长治市| 墨竹工卡县| 梓潼县| 阜康市| 镇江市| 太保市| 珠海市| 白玉县| 米易县| 织金县| 永仁县| 岳阳县| 奉化市| 盐城市| 桦甸市| 乐清市| 金秀| 阜康市| 大姚县| 康定县| 揭东县| 湘乡市| 峡江县| 淮安市| 新建县| 静乐县| 曲阳县| 临夏县| 江口县| 石棉县| 会同县| 南安市| 正镶白旗| 秦皇岛市| 闵行区| 湟源县|