色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

51單片機的串口通信協議的6個特征

h1654155971.7688 ? 來源:未知 ? 作者:李倩 ? 2018-04-13 09:17 ? 次閱讀

現實生活中, 我們總是要與人打交道,互通有無。單片機也一樣,需要跟各種設備交互。例如汽車的顯示儀表需要知道汽車的轉速及電動機的運行參數,那么顯示儀表就需要從汽車的底層控制器取得數據。而這個數據的獲得過程就是一個通信過程。類似的例子還有控制器通常是單片機或者PLC變頻器的通信。通信的雙方需要遵守一套既定的規則也稱為協議,這就好比我們人之間的對話,需要在雙方都遵守一套語言語法規則才有可能達成對話。通信協議又分為硬件層協議和軟件層協議。硬件層協議主要規范了物理上的連線,傳輸電平信號及傳輸的秩序等硬件性質的內容。常用的硬件協議有串口,IIC, SPI, RS485CANUSB。軟件層協議則更側重上層應用的規范,比如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的原理圖。

好了直接上代碼吧。

[cpp]view plaincopy

#include"reg51.h"

/*

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

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

因為波特率是9600bit/s

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

*/

sbitTX=P3^1;//P1^0outputTTLsignal,needtotransferredtors232signal,canbeconnectedtoP3^1

#defineu16unsignedint//宏定義

#defineu8unsignedchar

u8sbuf;

bitti=0;

voiddelay(u16x)

{

while(x--);

}

voidTimer0_Init()

{

TMOD|=0x01;

TH0=65440/256;

TH0=65440%256;

TR0=0;

}

voidIsr_Init()

{

EA=1;

ET0=1;

}

voidSend_Byte(u8dat)

{

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

TX=0;//A起始位

TR0=1;

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

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

}

voidTF0_isr()interrupt1//每104us進入一次中斷

{

staticu8i;//記錄進入中斷的次數

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;//發送完成

}

}

voidmain()

{

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

Timer0_Init();

Isr_Init();

while(1)

{

Send_Byte(65);//0x41

delay(60000);

}

}

實驗引入了定時器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,這樣就保證了串口的時序更加準確,雖然犧牲了定時器的準確度。

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

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

[cpp] view plain copy

# 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; //啟動發送,只需要把發送內容給SBUF這個寄存器

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

TI = 0;

}

void main()

{

Uart_Init();

while (1)

{

Send_Byte('m');

delay(60000);

}

}

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

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

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

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

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

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

[cpp]view plaincopy

#include"reg51.h"

#defineu16unsignedint

#defineu8unsignedchar

voiddelay(u16x)

{

while(x--);

}

voidUart_Init()//串口初始化

{

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

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

TH1=253;//9600bit/s

TR1=1;

}

voidSend_Byte(u8dat)//串口發送一個字節

{

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

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

TI=0;

}

voidSend_String(u8*str)//發送一個字符串*str為字符串第一個字符的地址

{

abc://標號

if(*str!=0) {

Send_Byte(*str);

str++;

gotoabc;

}

}

voidmain()

{

Uart_Init();

while(1)

{

Send_String("HelloWorld!第一!");

Send_Byte(10);

delay(60000);

delay(60000);

}

}

實驗效果

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 單片機
    +關注

    關注

    6041

    文章

    44616

    瀏覽量

    637418
  • C語言
    +關注

    關注

    180

    文章

    7614

    瀏覽量

    137394
  • 串口通信
    +關注

    關注

    34

    文章

    1627

    瀏覽量

    55646

原文標題:單片機C語言之串口通信協議

文章出處:【微信號:weixin21ic,微信公眾號:21ic電子網】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    51單片機串口通信協議的特點是什么

    介紹51單片機串口通信協議,以下簡稱串口
    發表于 02-23 07:46

    使用51單片機完成一簡單的串口通信協議

    轉載自:自定義串口通信協議的實現weixin_33885253 2017-01-18 21:11:00 1926收藏 4 文章標簽: 嵌入式 c/c++ java版權使用51單片機完成
    發表于 01-19 07:30

    單片機串口通信協議的實現實例分享

    調試和做一些簡單人機交互的一種重要的通信方式,其原理網上有一大堆,這里就不再贅述了,下面主要和大家分享一種我在實際項目中經常用到的一簡單的串口通信協議和實現方式。下面以STM32F1
    發表于 01-20 07:35

    51單片機串口通信代碼

    51單片機串口通信的代碼設計
    發表于 11-09 17:47 ?180次下載

    PC與單片機串口通信協議

    PC與單片機串口通信協議
    發表于 12-26 22:12 ?0次下載

    掌握串口通信協議的收發過程

    現在我們要做一實驗,將一字節從51單片機發送到電腦串口調試助手上。這個實驗的目的是為了掌握串口
    的頭像 發表于 12-22 10:02 ?7.9w次閱讀
    掌握<b class='flag-5'>串口</b><b class='flag-5'>通信協議</b>的收發過程

    單片機C語言之串口通信協議

    本文首先介紹了串口的基本結構,其次介紹了串口通信方式,最后詳細介紹了單片機C語言之串口通信協議
    發表于 05-22 12:37 ?4955次閱讀
    <b class='flag-5'>單片機</b>C語言之<b class='flag-5'>串口</b><b class='flag-5'>通信協議</b>

    如何使用51單片機實現串口通信

    51單片機串口引腳為P3.0引腳與P3.1引腳,分別是RXD和TXD引腳。串口通信可以用于單片機
    發表于 11-21 15:47 ?3w次閱讀
    如何使用<b class='flag-5'>51</b><b class='flag-5'>單片機</b>實現<b class='flag-5'>串口</b><b class='flag-5'>通信</b>

    串口通信詳解(51單片機

    串口傳輸,實現單片機與PC的雙機通信串口控制(51單片機
    發表于 11-12 10:06 ?81次下載
    <b class='flag-5'>串口</b><b class='flag-5'>通信</b>詳解(<b class='flag-5'>51</b><b class='flag-5'>單片機</b>)

    單片機:Modbus 通信協議介紹

    實用串口通信程序的時候,我們通過串口發給單片機三條指令,讓單片機做了三件不同的事情,分別是“buzz on”、“buzz off”和“sho
    發表于 11-13 20:51 ?11次下載
    <b class='flag-5'>單片機</b>:Modbus <b class='flag-5'>通信協議</b>介紹

    51單片機串口通信

    串口成本低、容易使用、通信線路簡單,可實現兩設備的互相通信單片機串口可以使得
    發表于 11-18 14:06 ?22次下載
    <b class='flag-5'>51</b><b class='flag-5'>單片機</b><b class='flag-5'>串口</b><b class='flag-5'>通信</b>

    51單片機學習篇-- --基于51單片機串口通信協議

    開篇先說一句廢話····本旺名字叫薩摩耶,,Please 叫我旺財,,,哈哈,招財進寶嘛!開篇計算機按照下行數據通信協議串口發送數據,地址為自己的學號(十六進制),單片機收到后(收到的是數據,不是
    發表于 11-20 15:06 ?8次下載
    <b class='flag-5'>51</b><b class='flag-5'>單片機</b>學習篇-- --基于<b class='flag-5'>51</b><b class='flag-5'>單片機</b>的<b class='flag-5'>串口</b><b class='flag-5'>通信協議</b>

    51單片機IIC通信協議

    * @author Byron (from3900@gmail.com) * @version V1.0.0 * @date 05/12/2020 * @brief 51系列單片機I2C通信協議頭文件 * ----
    發表于 11-20 20:06 ?5次下載
    <b class='flag-5'>51</b><b class='flag-5'>單片機</b>IIC<b class='flag-5'>通信協議</b>

    51單片機串口通信

    串口成本低、容易使用、通信線路簡單,可實現兩設備的互相通信單片機串口可以使得
    發表于 11-21 20:36 ?64次下載
    <b class='flag-5'>51</b><b class='flag-5'>單片機</b><b class='flag-5'>串口</b><b class='flag-5'>通信</b>

    制定通信協議,實現單片機與PC通信

    單片機與PC串口通信編程實驗目的利用PROTUES仿真軟件、串口調試助手、虛擬串口,搭建
    發表于 12-17 18:30 ?22次下載
    制定<b class='flag-5'>通信協議</b>,實現<b class='flag-5'>單片機</b>與PC<b class='flag-5'>機</b><b class='flag-5'>通信</b>
    主站蜘蛛池模板: 97午夜精品| 国产成人精品久久久久婷婷| 父亲在线日本综艺免费观看全集| 免费成人高清在线视频| 最近2018年手机中文字幕| 久9视频这里只有精品123| 亚洲在线视频自拍精品| 娇喘嗯嗯 轻点啊视频福利| 亚洲精品自在线拍2019| 后入式啪gif动态图| 国产美女影院| 无码人妻少妇色欲AV一区二区| 国产精品ⅴ视频免费观看| 午夜国产精品影院在线观看| 国产麻豆AV伦| 影音先锋色av男人资源网| 老师的脚奴| YY8848高清私人影院| 无码欧美XXXXX在线观看裸| 花蝴蝶高清影视视频在线播放| 樱花草在线观看影院| 欧美506070| 国产99视频精品免费播放| 亚洲国产在线播放在线| 久久99国产亚洲高清观着| 99久久国产宗和精品1上映| 日本三级黄色大片| 国产亚洲精品久久久久久一区二区 | 国产午夜精品自在自线之la| 亚洲熟女乱色一区二区三区| 巨乳中文无码亚洲| 不卡的在线AV网站| 午夜性爽视频男人的天堂在线| 久久成人伊人欧洲精品AV| 99在线观看免费| 午夜看片a福利在线观看| 久久99精品AV99果冻| pkf女尸studiosxnxx| 亚洲AV永久无码精品老司机蜜桃| 久久久久久人精品免费费看| 大地影院免费观看视频|