日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > 物聯(lián)網(wǎng) > 網(wǎng)絡(luò)協(xié)議
[導(dǎo)讀]   串口通信概述   串口通信指串口按位(bit)發(fā)送和接收字節(jié)。盡管比按字節(jié)(byte)的并行通信慢,但是串口可以在使用一根線發(fā)送數(shù)據(jù)的同時(shí)用另一根線接收數(shù)據(jù)。   常用三種串

  串口通信概述

  串口通信指串口按位(bit)發(fā)送和接收字節(jié)。盡管比按字節(jié)(byte)的并行通信慢,但是串口可以在使用一根線發(fā)送數(shù)據(jù)的同時(shí)用另一根線接收數(shù)據(jù)。

  常用三種串口通信協(xié)議   1、RS-232

  RS-232(ANSI/EIA-232標(biāo)準(zhǔn))是IBM-PC及其兼容機(jī)上的串行連接標(biāo)準(zhǔn)??捎糜谠S多用途,比如連接鼠標(biāo)、打印機(jī)或者M(jìn)odem,同時(shí)也可以接工業(yè)儀器儀表。用于驅(qū)動(dòng)和連線的改進(jìn),實(shí)際應(yīng)用中RS-232的傳輸長度或者速度常常超過標(biāo)準(zhǔn)的值。RS-232只限于PC串口和設(shè)備間點(diǎn)對點(diǎn)的通信。RS-232串口通信最遠(yuǎn)距離是50英尺。

  從計(jì)算機(jī)連出的線的截面。

  RS-232針腳的功能:

  數(shù)據(jù):

  TXD(pin 3):串口數(shù)據(jù)輸出(Transmit Data)

  RXD(pin 2):串口數(shù)據(jù)輸入(Receive Data)

  握手:

  RTS(pin 7):發(fā)送數(shù)據(jù)請求(Request to Send)

  CTS(pin 8):清除發(fā)送(Clear to Send)

  DSR(pin 6):數(shù)據(jù)發(fā)送就緒(Data Send Ready)

  DCD(pin 1):數(shù)據(jù)載波檢測(Data Carrier Detect)

  DTR(pin 4):數(shù)據(jù)終端就緒(Data Terminal Ready)

  地線:

  GND(pin 5):地線

  其它

  RI(pin 9):鈴聲指示

  2、RS-422

  RS-422(EIA RS-422-AStandard)是Apple的Macintosh計(jì)算機(jī)的串口連接標(biāo)準(zhǔn)。RS-422使用差分信號(hào),RS-232使用非平衡參考地的信號(hào)。差分傳輸使用兩根線發(fā)送和接收信號(hào),對比RS-232,它能更好的抗噪聲和有更遠(yuǎn)的傳輸距離。在工業(yè)環(huán)境中更好的抗噪性和更遠(yuǎn)的傳輸距離是一個(gè)很大的優(yōu)點(diǎn)。

  3、RS-485

  RS-485(EIA-485標(biāo)準(zhǔn))是RS-422的改進(jìn),因?yàn)樗黾恿嗽O(shè)備的個(gè)數(shù),從10個(gè)增加到32個(gè),同時(shí)定義了在最大設(shè)備個(gè)數(shù)情況下的電氣特性,以保證足夠的信號(hào)電壓。有了多個(gè)設(shè)備的能力,你可以使用一個(gè)單個(gè)RS-485口建立設(shè)備網(wǎng)絡(luò)。出色抗噪和多設(shè)備能力,在工業(yè)應(yīng)用中建立連向PC機(jī)的分布式設(shè)備網(wǎng)絡(luò)、其他數(shù)據(jù)收集控制器、HMI或者其他操作時(shí),串行連接會(huì)選擇RS-485。RS-485是RS-422的超集,因此所有的RS-422設(shè)備可以被RS-485控制。RS-485可以用超過4000英尺的線進(jìn)行串行通行。

  串口的基本結(jié)構(gòu)

  SBUF:51單片機(jī)中的特殊寄存器,串行數(shù)據(jù)緩沖器(一個(gè)接收一個(gè)發(fā)送),兩個(gè)其實(shí)是共用的一個(gè)地址99H,但是兩個(gè)在物理上面是分開的。

  當(dāng)發(fā)送使用時(shí),就采用SBUF=XXX; (XXX為需要傳送的數(shù)據(jù))

  當(dāng)接收使用時(shí),采用XXX=SBUF;

  記得因?yàn)槭谴械乃詡鬏敹际且晃灰晃贿M(jìn)行的。

  T1溢出率:T1計(jì)時(shí)器的溢出頻率(就是計(jì)時(shí)器每次低位計(jì)滿向高位進(jìn)位時(shí)間的倒數(shù))

  用處:用于計(jì)算波特率(每秒傳輸二進(jìn)制代碼的位數(shù))

  串口通信方式

  并行

  適合短距離通信,并行通信控制簡單、相對傳輸速度快(8位一起傳輸)。

  串行

  只能一位一位的傳送。

  同步(了解)

  建立發(fā)送方時(shí)鐘對接收方時(shí)鐘的直接控制,使雙方達(dá)到完全同步。此時(shí),傳輸數(shù)據(jù)的位之間的距離均為“位間隔”的整數(shù)倍,同時(shí)傳送的字符間不留間隙。

  發(fā)送方對接收方的同步可以通過外同步和自同步

  異步(常)

  以字符(構(gòu)成的幀)為單位進(jìn)行傳輸。數(shù)據(jù)位從低到高傳送。

  格式:

  這里的空閑時(shí)間是任意的。

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

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

  虛擬串口

  實(shí)驗(yàn)一、虛擬串口實(shí)驗(yàn)

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

  代碼如下:

  #include “reg51.h”

  /*

  將P1.0虛擬成串口發(fā)送腳TX

  以9600bit/s的比特率向外發(fā)送數(shù)據(jù)

  因?yàn)椴ㄌ芈适?9600bit/s

  所以me發(fā)送一位的時(shí)間是 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);

  }

  }

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

  片上串口

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

  片上串口支持同步模式與異步模式。簡單來說同步模式就是指有時(shí)鐘線,而異步模式無時(shí)鐘線。這里的時(shí)鐘線是指在同步通信時(shí),用一根線專門傳輸時(shí)鐘信號(hào),這個(gè)信號(hào)用來與要發(fā)送的每一位保持同步,這樣就避免了例如異步通信中因?yàn)椴捎枚〞r(shí)器而引入的時(shí)間誤差。

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

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

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

  片上串口的波特率等于定時(shí)器1工作在方式2時(shí)溢出率的32分頻。如果要定時(shí)器1工作在方式2,那么TMOD=0x20。另外要保證為32分頻,我們還必須設(shè)置計(jì)數(shù)器初值。設(shè)晶振為11.0592Mhz,則定時(shí)器的計(jì)數(shù)脈沖為F=f/12,則定時(shí)器每計(jì)一個(gè)脈沖的時(shí)間為T=12/f。又令計(jì)數(shù)器的起點(diǎn)為x,則溢出一次要計(jì)的脈沖數(shù)為(256-x)。所以在計(jì)數(shù)起點(diǎn)為x時(shí),溢出一次的時(shí)間為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í)器的計(jì)數(shù)起點(diǎn)TH1的值。

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

  實(shí)驗(yàn)二,片外串口發(fā)送一個(gè)字節(jié)。

  好了現(xiàn)在開始我們的實(shí)驗(yà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; //定時(shí)器1工作方式2

  TH1=253;//9600bit/s

  TR1=1;

  }

  void Send_Byte(u8 dat)

  {

  SBUF=dat; //啟動(dòng)發(fā)送,只需要把發(fā)送內(nèi)容給SBUF這個(gè)寄存器

  while(TI==0); //等待發(fā)送完成,因?yàn)門I為1時(shí)表示在發(fā)送停止位

  TI=0;

  }

  void main()

  {

  Uart_Init();

  while(1)

  {

  Send_Byte(‘m’);

  delay(60000);

  }

  }

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

  實(shí)驗(yàn)三、片上串口發(fā)送一個(gè)字符串

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

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

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

  下面我們通過一個(gè)實(shí)驗(yàn)來展示如何發(fā)送字符串。我們實(shí)驗(yàn)的目標(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; //定時(shí)器1工作方式2

  TH1=253;//9600bit/s

  TR1=1;

  }

  void Send_Byte(u8 dat) //串口發(fā)送一個(gè)字節(jié)

  {

  SBUF=dat; //啟動(dòng)發(fā)送,只需要把發(fā)送內(nèi)容給SBUF這個(gè)寄存器

  while(TI==0); //等待發(fā)送完成,因?yàn)門I為1時(shí)表示在發(fā)送停止位

  TI=0;

  }

  void Send_String(u8 *str) //發(fā)送一個(gè)字符串 *str為字符串第一個(gè)字符的地址

  {

  abc: //標(biāo)號(hà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);

  }

  }

  實(shí)驗(yàn)效果

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動(dòng)電源

在工業(yè)自動(dòng)化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動(dòng)力設(shè)備,其驅(qū)動(dòng)電源的性能直接關(guān)系到整個(gè)系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動(dòng)勢抑制與過流保護(hù)是驅(qū)動(dòng)電源設(shè)計(jì)中至關(guān)重要的兩個(gè)環(huán)節(jié),集成化方案的設(shè)計(jì)成為提升電機(jī)驅(qū)動(dòng)性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動(dòng)電源

LED 驅(qū)動(dòng)電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個(gè)照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動(dòng)電源易損壞的問題卻十分常見,不僅增加了維護(hù)成本,還影響了用戶體驗(yàn)。要解決這一問題,需從設(shè)計(jì)、生...

關(guān)鍵字: 驅(qū)動(dòng)電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動(dòng)電源的公式,電感內(nèi)電流波動(dòng)大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計(jì) 驅(qū)動(dòng)電源

電動(dòng)汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動(dòng)汽車的核心技術(shù)之一是電機(jī)驅(qū)動(dòng)控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動(dòng)系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動(dòng)汽車的動(dòng)力性能和...

關(guān)鍵字: 電動(dòng)汽車 新能源 驅(qū)動(dòng)電源

在現(xiàn)代城市建設(shè)中,街道及停車場照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動(dòng)電源 LED

LED通用照明設(shè)計(jì)工程師會(huì)遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動(dòng)電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動(dòng)電源的電磁干擾(EMI)問題成為了一個(gè)不可忽視的挑戰(zhàn)。電磁干擾不僅會(huì)影響LED燈具的正常工作,還可能對周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動(dòng)電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動(dòng)電源

關(guān)鍵字: LED 驅(qū)動(dòng)電源 開關(guān)電源

LED驅(qū)動(dòng)電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動(dòng)LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動(dòng)電源
關(guān)閉