国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

單片機(jī)C語言串口通信協(xié)議

電子設(shè)計 ? 來源:電子設(shè)計 ? 作者:電子設(shè)計 ? 2022-02-09 17:49 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

通信協(xié)議又分為硬件層協(xié)議和軟件層協(xié)議。硬件層協(xié)議主要規(guī)范了物理上的連線,傳輸電平信號及傳輸?shù)闹刃虻扔布再|(zhì)的內(nèi)容。常用的硬件協(xié)議有串口,IIC, SPI, RS485CANUSB。軟件層協(xié)議則更側(cè)重上層應(yīng)用的規(guī)范,比如modbus協(xié)議。

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

(1)、物理上的連線至少3根,分別是Tx數(shù)據(jù)發(fā)送線,Rx數(shù)據(jù)接收線,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)、發(fā)送秩序。低位先發(fā)。

(4)、波特率。收發(fā)雙方共同約定的一個數(shù)據(jù)位(0或1)在數(shù)據(jù)傳輸線上維持的時間。也可理解為每秒可以傳輸?shù)奈粩?shù)。常用的波特率有300bit/s, 600bit/s, 2400bit/s, 4800bit/s, 9600bit/s。

(5)、通信的起始信號。發(fā)送方在沒有發(fā)送數(shù)據(jù)時,應(yīng)該將Tx置1 。當(dāng)需發(fā)送時,先將Tx置0,并且保持1位的時間。接受方不斷地偵測Rx,如果發(fā)現(xiàn)Rx常時間變高后,突然被拉低(置為0),則視為發(fā)送方將要發(fā)送數(shù)據(jù),迅速啟動自己的定時器,從而保證了收發(fā)雙方定時器同步定時。

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

100058398-111325-1.png

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

虛擬串口

實驗一、虛擬串口實驗

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

100058398-111326-2.png

好了直接上代碼吧。

#include "reg51.h" /* 將P1.0虛擬成串口發(fā)送腳TX 以9600bit/s的比特率向外發(fā)送數(shù)據(jù) 因為波特率是 9600bit/s 所以me發(fā)送一位的時間是 t=1000000us/9600=104us */ sbit TX=P3^1; //P1^0 output TTL signal, need to transferred to rs232 signal, can be connected to P3^1 #define u16 unsigned int //宏定義 #define u8 unsigned char u8 sbuf; bit ti=0; void delay(u16 x) { while(x--); } void Timer0_Init() { TMOD |= 0x01; TH0=65440/256; TH0=65440%256; TR0=0; } void Isr_Init() { EA=1; ET0=1; } void Send_Byte(u8 dat) { sbuf=dat;//通過引入全局變量sbuf,可以保存形參dat TX=0; //A 起始位 TR0=1; while(ti==0); //等待發(fā)送完成 ti=0; //清除發(fā)送完成標(biāo)志 } void TF0_isr() interrupt 1 //每104us進(jìn)入一次中斷 { static u8 i; //記錄進(jìn)入中斷的次數(shù) TH0=65440/256; TL0=65440%256; i++; if(i>=1 && i<=8) { if((sbuf&(1<<(i-1)))==0) // (sbuf&(1<<(i-1)))表示取出i-1位 { TX=0; } else { TX=1; } } if(i==9) //停止位 { TX=1; } if(i==10) { TR0=0; i=0; ti=1; //發(fā)送完成 } } void main() { TX=1; //使TX處于空閑狀態(tài) Timer0_Init(); Isr_Init(); while(1) { Send_Byte(65); //0x41 delay(60000); } }

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

片上串口

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

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

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

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

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

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

x=256-f/(384*b)

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

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

實驗二,片外串口發(fā)送一個字節(jié)。

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

# include "reg51.h" #define u16 unsigned int # define u8 unsigned char void delay(u16 x) { while (x--); } void Uart_Init() //串口初始化 { SCON = 0x50; //8位異步模式 TMOD |= 0x20; //定時器1工作方式2 TH1 = 253; //9600bit/s TR1 = 1; } void Send_Byte(u8 dat) { SBUF = dat; //啟動發(fā)送,只需要把發(fā)送內(nèi)容給SBUF這個寄存器 while (TI == 0); //等待發(fā)送完成,因為TI為1時表示在發(fā)送停止位 TI = 0; } void main() { Uart_Init(); while (1) { Send_Byte('m'); delay(60000); } }

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

實驗三、片上串口發(fā)送一個字符串

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

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

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

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

#include "reg51.h" #define u16 unsigned int #define u8 unsigned char void delay(u16 x) { while(x--); } void Uart_Init() //串口初始化 { SCON=0x50; //8位異步模式 TMOD|=0x20; //定時器1工作方式2 TH1=253;//9600bit/s TR1=1; } void Send_Byte(u8 dat) //串口發(fā)送一個字節(jié) { SBUF=dat; //啟動發(fā)送,只需要把發(fā)送內(nèi)容給SBUF這個寄存器 while(TI==0); //等待發(fā)送完成,因為TI為1時表示在發(fā)送停止位 TI=0; } void Send_String(u8 *str) //發(fā)送一個字符串 *str為字符串第一個字符的地址 { abc: //標(biāo)號 if(*str != 0) { Send_Byte(*str); str++; goto abc; } } void main() { Uart_Init(); while(1) { Send_String("Hello World! 第一!"); Send_Byte(10); delay(60000); delay(60000); } }

實驗效果

版權(quán)聲明:本文為博主原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接和本聲明。
本文鏈接:https://blog.csdn.net/a514371309/article/details/73481423

審核編輯:何安

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 單片機(jī)
    +關(guān)注

    關(guān)注

    6076

    文章

    45495

    瀏覽量

    670412
  • 串口通信
    +關(guān)注

    關(guān)注

    34

    文章

    1662

    瀏覽量

    57980
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    手把手教你學(xué)51單片機(jī)-C語言

    ,沒有專業(yè)的人員帶領(lǐng)大家入門。 基于這些原因,我們編寫了這本《手把手教你學(xué)51單片機(jī)-C語言版》(第3版),并且配套了相關(guān)的視頻教程、電子教案、源代碼和實驗開發(fā)板(詳情瀏覽青島金思特電子有限公司網(wǎng)站獲取
    發(fā)表于 03-05 11:47

    串口協(xié)議的深度剖析

    串口通信協(xié)議作為電子設(shè)備間數(shù)據(jù)交互的基礎(chǔ)技術(shù),自20世紀(jì)60年代誕生以來,始終在工業(yè)控制、嵌入式系統(tǒng)和物聯(lián)網(wǎng)等領(lǐng)域扮演著核心角色。本文將從技術(shù)原理、協(xié)議架構(gòu)、應(yīng)用場景及未來演進(jìn)四個維度,對串口
    的頭像 發(fā)表于 03-02 17:32 ?1044次閱讀

    單片機(jī)中的串口通訊串行同步通信與串行異步通信

    中始終保持精確的同步時鐘,即發(fā)送時鐘和接收時鐘要嚴(yán)格的同步。常用的做法是兩個設(shè)備使用同一個時鐘源。 在串口通信與編程中應(yīng)用最多的是異步通信方式。STM32中串口
    發(fā)表于 01-15 08:06

    基于FPGA的I2C通信協(xié)議設(shè)計

    I2C(Inter-Integrated Circuit)是一種由飛利浦半導(dǎo)體(現(xiàn)為恩智浦半導(dǎo)體)在1980年代初開發(fā)的同步、串行、半雙工的總線型通信協(xié)議。主要用于近距離(同一塊印刷電路板(PCB
    的頭像 發(fā)表于 12-26 09:44 ?6137次閱讀
    基于FPGA的I2<b class='flag-5'>C</b><b class='flag-5'>通信協(xié)議</b>設(shè)計

    為什么單片機(jī)還在用C語言編程?

    說起單片機(jī)我們就會想到C語言單片機(jī)為什么還在用C語言編程?現(xiàn)在有很多很好用的高級
    發(fā)表于 11-28 07:37

    C語言單片機(jī)C語言有什么差異

    單片機(jī)c語言相對于普通C語言增加了一些基本的指令,還有變量的賦值是16進(jìn)制,當(dāng)然單片機(jī)
    發(fā)表于 11-14 07:55

    工業(yè)通信協(xié)議都有哪些?#三格電子

    通信協(xié)議
    三格電子科技
    發(fā)布于 :2025年08月28日 10:35:26

    哪些協(xié)議是工業(yè)通信協(xié)議?#三格電子

    通信協(xié)議
    三格電子科技
    發(fā)布于 :2025年08月27日 14:16:07

    單片機(jī)實例項目:CH9121以太網(wǎng)網(wǎng)卡(串口協(xié)議)

    單片機(jī)實例項目:CH9121以太網(wǎng)網(wǎng)卡(串口協(xié)議),推薦下載!
    發(fā)表于 06-03 20:53

    單片機(jī)C語言實例(350+例)

    350+單片機(jī)C語言實例! 純分享帖,需要者可點擊附件免費獲取完整資料~~~【免責(zé)聲明】本文系網(wǎng)絡(luò)轉(zhuǎn)載,版權(quán)歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權(quán)問題,請第一時間告知,刪除內(nèi)容!
    發(fā)表于 05-22 21:47

    單片機(jī)c語言編程實例大全

    單片機(jī)c語言編程實例大全_18
    發(fā)表于 04-30 16:11 ?7次下載

    新概念51單片機(jī)C語言教程入門、提高、開發(fā)、拓展全攻略

    資料介紹 從實際應(yīng)用入手,以實驗過程和實驗現(xiàn)象為主導(dǎo),循序漸進(jìn)地講述51單片機(jī)C語言編程方法以及51單片機(jī)的硬件結(jié)構(gòu)和功能應(yīng)用。全書共分5篇,分別為入門篇、內(nèi)外部資源操作篇、提高篇、實
    發(fā)表于 04-15 13:57

    瑞薩Cortext-M85內(nèi)核RA8系列單片機(jī)串口輸出實現(xiàn)方法

    串口是最常見的通信方式之一,也是單片機(jī)調(diào)試最常見的通信接口,也是現(xiàn)在的單片機(jī)必備的通信接口,目前
    的頭像 發(fā)表于 03-21 09:58 ?1870次閱讀
    瑞薩Cortext-M85內(nèi)核RA8系列<b class='flag-5'>單片機(jī)</b>的<b class='flag-5'>串口</b>輸出實現(xiàn)方法

    單片機(jī)C語言編程寶典大全,初學(xué)必備【強(qiáng)推下載!】

    資料介紹:包含 1. 51單片機(jī)入門教程 2. 初學(xué)者適用:單片機(jī)C語言實例100例(代碼及釋義) 3. 51單片機(jī)
    發(fā)表于 03-14 11:03