乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      [原創(chuàng)] 51串口通訊編程(C程序) --- 單片機(jī)論壇|51單片機(jī)|AVR單片機(jī)|ARM...

       fcs_110 2010-11-10

       

      MCS-51單片機(jī)的串行口具有兩條獨(dú)立的數(shù)據(jù)線——發(fā)送端TXD和接收端RXD,它允許數(shù)據(jù)同時(shí)往兩個(gè)相反的方向傳輸。一般通信時(shí)發(fā)送數(shù)據(jù)由TXD端輸出,接收數(shù)據(jù)由RXD端輸入。

       

      MCS-51單片機(jī)的串行口既可以用于網(wǎng)絡(luò)通信,亦可實(shí)現(xiàn)串行異步通信,還可以用作同步移位寄存器。如果在串行口的輸入輸出引腳上加上電平轉(zhuǎn)換器,就可方便地構(gòu)成標(biāo)準(zhǔn)的RS-232接口。

       

      MCS-51單片機(jī)的串行接口是一個(gè)全雙工通信接口,它有兩個(gè)物理上獨(dú)立的接收、發(fā)送緩沖器SBUF,可以同時(shí)發(fā)送和接收數(shù)據(jù)。但是發(fā)送緩沖器只能寫入,不能讀出;接收緩沖器只能讀出,不能寫入。兩個(gè)緩沖器共用一個(gè)地址(99H)。

       

      1 數(shù)據(jù)通信的基本概念

       

      常用于數(shù)據(jù)通信的傳輸方式有單工、半雙工、全雙工和多工方式。

       

      上傳的圖片
        抱歉,您所在的組無權(quán)下載附件,請(qǐng)注冊(cè)登陸

       

      ? 單工方式:數(shù)據(jù)僅按一個(gè)固定方向傳送。因而這種傳輸方式的用途有限,常用于串行口的打印數(shù)據(jù)傳輸與簡(jiǎn)單系統(tǒng)間的數(shù)據(jù)采集。

       

      ? 半雙工方式:數(shù)據(jù)可實(shí)現(xiàn)雙向傳送,但不能同時(shí)進(jìn)行,實(shí)際的應(yīng)用采用某種協(xié)議實(shí)現(xiàn)收/發(fā)開關(guān)轉(zhuǎn)換。

       

      ? 全雙工方式:允許雙方同時(shí)進(jìn)行數(shù)據(jù)雙向傳送,但一般全雙工傳輸方式的線路和設(shè)備較復(fù)雜。

       

      ? 多工方式:以上三種傳輸方式都是用同一線路傳輸一種頻率信號(hào),為了充分地利用線路資源,可通過使用多路復(fù)用器或多路集線器,采用頻分、時(shí)分或碼分復(fù)用技術(shù),即可實(shí)現(xiàn)在同一線路上資源共享功能。

       

      根據(jù)同步方式,串行數(shù)據(jù)通信有兩種形式,如圖5-5所示。

       

      ? 異步通信。在這種通信方式中,接收器和發(fā)送器有各自的時(shí)鐘,它們的工作是非同步的。異步通信用一幀來表示一個(gè)字符,其內(nèi)容是一個(gè)起始位,緊接著是若干個(gè)數(shù)據(jù)位。

       

      ? 同步通信。同步通信格式中,發(fā)送器和接收器由同一個(gè)時(shí)鐘源控制,在異步通信中,每傳輸一幀字符都必須加上起始位和停止位,占用了傳輸時(shí)間,若要求傳送數(shù)據(jù)量較大,速度就會(huì)慢得多。同步傳輸方式去掉了這些起始位和停止位,只在傳輸數(shù)據(jù)塊時(shí)先送出一個(gè)同步頭(字符)標(biāo)志即可。

       

      同步傳輸方式比異步傳輸方式速度快,這是它的優(yōu)勢(shì)。但同步傳輸方式也有其缺點(diǎn),即它必須要用一個(gè)時(shí)鐘來協(xié)調(diào)收發(fā)器的工作,所以它的設(shè)備也較復(fù)雜。

       

      .2 MCS-51的串行口控制寄存器

       

      在完成串行口初始化后,發(fā)送數(shù)據(jù)時(shí),采用MOV SBUF,A指令,將要發(fā)送的數(shù)據(jù)寫入SBUF,則CPU自動(dòng)啟動(dòng)和完成串行數(shù)據(jù)的輸出;接收數(shù)據(jù)時(shí),采用MOV A,SBUF指令,CPU就自動(dòng)將接收到的數(shù)據(jù)從SBUF中讀出。

       

      控制MCS-51單片機(jī)串行接口的控制寄存器有兩個(gè)——特殊功能寄存器SCON和PCON,用以設(shè)置串行端口的工作方式、接收/發(fā)送的運(yùn)行狀態(tài)、接收/發(fā)送數(shù)據(jù)的特征、數(shù)據(jù)傳輸率的大小,以及作為運(yùn)行的中斷標(biāo)志等,其格式如下:

       

      ① 串行口控制寄存器SCON。SCON的字節(jié)地址是98H,位地址(由低位到高位)分別是98H一9FH。SCON的格式如下:

       

      上傳的圖片
        抱歉,您所在的組無權(quán)下載附件,請(qǐng)注冊(cè)登陸

       

      ? SM0、SMl:串行口工作方式控制位。

       

      n 00——方式0;01——方式1;

       

      n 10——方式2;11——方式3。

       

      ? SM2:僅用于方式2和方式3的多機(jī)通信控制位。

       

      發(fā)送機(jī)SM2=1(要求程控設(shè)置)。

       

      當(dāng)為方式2或方式3時(shí):

       

      接收機(jī) SM2=1時(shí),若RB8=1,可引起串行接收中斷;若RB8=0,不引起串行接收中斷。SM2=0時(shí),若RB8=1,可引起串行接收中斷;若RB8=0,亦可引起串行接收中斷。

       

      ? REN串行接收允許位:0——禁止接收;1——允許接收。

       

      ? TB8:在方式2、3中,TB8是發(fā)送機(jī)要發(fā)送的第9位數(shù)據(jù)。

       

      ? RB8:在方式2、3中,RB8是接收機(jī)接收到的第9位數(shù)據(jù),該數(shù)據(jù)正好來自發(fā)送機(jī)的TB8。

       

      ? TI:發(fā)送中斷標(biāo)志位。發(fā)送前必須用軟件清零,發(fā)送過程中TI保持零電平,發(fā)送完一幀數(shù)據(jù)后,由硬件自動(dòng)置1。如要再發(fā)送,必須用軟件再清零。

       

      ? RI:接收中斷標(biāo)志位。接收前,必須用軟件清零,接收過程中RI保持零電平,接收完一幀數(shù)據(jù)后,由片內(nèi)硬件自動(dòng)置1。如要再接收,必須用軟件再清零。

       

      ② 電源控制寄存器PCON。PCON的字節(jié)地址為87H,無位地址,其格式如下:

       

      上傳的圖片
        抱歉,您所在的組無權(quán)下載附件,請(qǐng)注冊(cè)登陸

       

      PCON是為在CMOS結(jié)構(gòu)的MCS-51單片機(jī)上實(shí)現(xiàn)電源控制而附加的,對(duì)于HMOS結(jié)構(gòu)的MCS-51系列單片機(jī),除了第7位外,其余都是虛設(shè)的。與串行通信有關(guān)的也就是第7位,稱作SMOD,它的用處是使數(shù)據(jù)傳輸率加倍。

       

      SMOD:數(shù)據(jù)傳輸率加倍位。在計(jì)算串行方式1,2,3的數(shù)據(jù)傳輸率時(shí);0表示不加倍;1表示加倍。

       

      其余有效位說明如下。

       

      GF1、GF2:通用標(biāo)志位。

       

      PD:掉電控制位,0表示正常方式,1表示掉電方式。

       

      IDL:空閑控制位,0表示正常方式,1表示空閑方式。

       

      除了以上兩個(gè)控制寄存器外,中斷允許寄存器IE中的ES位也用來作為串行I/O中斷允許位。當(dāng)ES=1,允許串行I/O中斷;當(dāng)ES=0,禁止串行I/O中斷。中斷優(yōu)先級(jí)寄存器IP的PS位則用作串行I/O中斷優(yōu)先級(jí)控制位。當(dāng)PS=1,設(shè)定為高優(yōu)先級(jí);當(dāng)PS=0,設(shè)定為低優(yōu)先級(jí)。

       

      3 工作方式

       

      MCS-51 單片機(jī)可以通過軟件設(shè)置串行口控制寄存器SCON中SM0(SCON.7)和SMl(SCON.6)來指定串行口的4種工作方式。串行口操作模式選擇如表5-2所示。

       

      表5-2 串行口操作模式選擇表

       

       

       

       

       

       

       

       

       

       

       

       

       

       

       

       

       

       

       

       

       

       

       

       

       

       

       

       

      SM0 SM1

       

      模 式

       

      功 能

       

      波 特 率

       

      0 0

       

      0

       

      同步移位寄存器

       

      fOSC/12

       

      0 1

       

      1

       

      8位UART

       

      可變(T1溢出率)

       

      1 0

       

      0

       

      9位UART

       

      fOSC/64或fOSC/32

       

      1 1

       

      1

       

      9位UART

       

      可變(T1溢出率)

       

      其中,fOSC是振蕩器的頻率,UART為通用異步接收和發(fā)送器的英文縮寫。下面對(duì)這4種工作模式作進(jìn)一步介紹。

       

      1.方式0

       

      當(dāng)設(shè)定SM1、SM0為00時(shí),串行口工作于方式0,它又叫同步移位寄存器輸出方式。在方式0下,數(shù)據(jù)從RXD(P3.0)端串行輸出或輸入,同步信號(hào)從TXD(P3.1)端輸出,發(fā)送或接收的數(shù)據(jù)為8位,低位在前,高位在后,沒有起始位和停止位。數(shù)據(jù)傳輸率固定為振蕩器的頻率1/12,也就是每一機(jī)器周期傳送一位數(shù)據(jù)。方式0可以外接移位寄存器,將串行口擴(kuò)展為并行口,也可以外接同步輸入/輸出設(shè)備。

       

      執(zhí)行任何一條以SBUF為目的的寄存器指令,就開始發(fā)送。

       

      2.方式1

       

      當(dāng)設(shè)定SM1、SM0為01時(shí),串行口工作于方式1。方式1為數(shù)據(jù)傳輸率可變的8位異步通信方式,由TXD發(fā)送,RXD接收,一幀數(shù)據(jù)為10位,1位起始位(低電平),8位數(shù)據(jù)位(低位在前)和1位停止位(高電平)。數(shù)據(jù)傳輸率取決于定時(shí)器1或2的溢出速率(1/溢出周期)和數(shù)據(jù)傳輸率是否加倍的選擇位SMOD。

       

      對(duì)于有定時(shí)器/計(jì)數(shù)器2的單片機(jī),當(dāng)T2CON寄存器中RCLK和TCLK置位時(shí),用定時(shí)器2作為接收和發(fā)送的數(shù)據(jù)傳輸率發(fā)生器,而RCLK=TCLK=0時(shí),用定時(shí)器1作為接收和發(fā)送的數(shù)據(jù)傳輸率發(fā)生器。兩者還可以交叉使用,即發(fā)送和接收采用不同的數(shù)據(jù)傳輸率。

       

      類似于模式0,發(fā)送過程是由執(zhí)行任何一條以SBUF為目的的寄存器指令引起的。

       

      3.方式2

       

      當(dāng)設(shè)定SM0、SM1二位為10時(shí),串行口工作于方式2,此時(shí)串行口被定義為9位異步通信接口。采用這種方式可接收或發(fā)送 11 位數(shù)據(jù),以 11 位為一幀,比方式 1 增加了一個(gè)數(shù)據(jù)位,其余相同。第 9 個(gè)數(shù)據(jù)即 D8 位用作奇偶校驗(yàn)或地址/數(shù)據(jù)選擇,可以通過軟件來控制它,再加特殊功能寄存器 SCON 中的 SM2 位的配合,可使 MCS-51 單片機(jī)串行口適用于多機(jī)通信。發(fā)送時(shí),第9位數(shù)據(jù)為TB8,接收時(shí),第9位數(shù)據(jù)送入RB8。方式 2 的數(shù)據(jù)傳輸率固定,只有兩種選擇,為振蕩率的 1/64 或 1/32 ,可由 PCON 的最高位選擇。

       

      4.方式3

       

      當(dāng)設(shè)定SM0、SM1二位為11時(shí),串行口工作于方式3。方式3與方式2類似,唯一的區(qū)別是方式3的數(shù)據(jù)傳輸率是可變的。而幀格式與方式2一樣為11位一幀。所以方式3也適合于多機(jī)通信。

       

      4 數(shù)據(jù)傳輸率的確定

       

      串行口每秒鐘發(fā)送(或接收)的位數(shù)就是數(shù)據(jù)傳輸率。

       

      對(duì)方式0來說,數(shù)據(jù)傳輸率已固定成fosc/12,隨著外部晶振的頻率不同,數(shù)據(jù)傳輸率亦不相同。常用的fosc有12MHz和6MHz,所以數(shù)據(jù)傳輸率相應(yīng)為1000×103和500×103bit/s。在此方式下,數(shù)據(jù)將自動(dòng)地按固定的數(shù)據(jù)傳輸率發(fā)送/接收,完全不用設(shè)置。

       

      對(duì)方式2而言,數(shù)據(jù)傳輸率的計(jì)算式為2SMOD·fosc/64。當(dāng)SMOD=0時(shí),數(shù)據(jù)傳輸率為fm/64;當(dāng)SMOD=1時(shí),數(shù)據(jù)傳輸率為fosc/32。在此方式下,程控設(shè)置SMOD位的狀態(tài)后,數(shù)據(jù)傳輸率就確定了,不需要再作其他設(shè)置。

       

      對(duì)方式1和方式3來說,數(shù)據(jù)傳輸率和定時(shí)器1的溢出率有關(guān),定時(shí)器1的溢出率為:

       

      定時(shí)器1的溢出率=定時(shí)器1的溢出次數(shù)/秒

       

      方式1和方式3的數(shù)據(jù)傳輸率計(jì)算式為:

       

      2SMOD/32×T1溢出率

       

      根據(jù)SMOD狀態(tài)位的不同,數(shù)據(jù)傳輸率有Tl/32溢出率和T1/16溢出率兩種。由于T1溢出率的設(shè)置是方便的,因而數(shù)據(jù)傳輸率的選擇將十分靈活。

       

      前已敘及,定時(shí)器Tl有4種工作方式,為了得到其溢出率,而又不必進(jìn)入中斷服務(wù)程序,往往使T1設(shè)置在工作方式2的運(yùn)行狀態(tài),也就是8位自動(dòng)加入時(shí)間常數(shù)的方式。

       

      表5-3所示常用數(shù)據(jù)傳輸率的設(shè)置方法。

       

      表5-3 常用數(shù)據(jù)傳輸率設(shè)置方法

       

       

       

       

       

       

       

       

       

       

       

       

       

       

       

       

       

       

       

      數(shù)據(jù)傳輸率/Hz

       

      fOSC/MHz

       

      SMOD

       

      定時(shí)器1

       

      C/

       

      方 式

       

      重新裝入值

       

      方式0最大:1M

       

      方式2最大:375k

       

      方式1、3:62.5k

       

      19.2k

       

      9.6k

       

      4.8k

       

      2.4k

       

      1.2k

       

      110

       

      12

       

      12

       

      12

       

      11.0592

       

      11.0592

       

      11.0592

       

      11.0592

       

      11.0592

       

      12

       

      X

       

      1

       

      1

       

      1

       

      0

       

      0

       

      0

       

      0

       

      0

       

      X

       

      X

       

      0

       

      0

       

      0

       

      0

       

      0

       

      0

       

      0

       

      X

       

      X

       

      2

       

      2

       

      2

       

      2

       

      2

       

      2

       

      1

       

      X

       

      X

       

      FFH

       

      FDH

       

      FDH

       

      FAH

       

      F4H

       

      E8H

       

      0FEEH

       

      5 串行通信實(shí)例

       

      這是一個(gè)單片機(jī)C51串口接收(中斷)和發(fā)送例程,可以用來測(cè)試51單片機(jī)的中斷接收和查詢發(fā)送。

       

      #include <reg51.h>

       

      #include <string.h>

       

      #define length 4 //數(shù)據(jù)長(zhǎng)度

       

      unsigned char inbuf[length];

       

      unsigned char checksum,counter;

       

      bit flag = 0; //取數(shù)標(biāo)記

       

      main()

       

       

      init_serial(); //串行口初始化

       

      while (1)

       

       

      if (flag!=0) //如果取數(shù)標(biāo)志已置位,就將讀到的數(shù)從串口發(fā)出

       

       

      flag= 0; //取數(shù)標(biāo)志清0

       

      send_string(inbuf,length); //向串口發(fā)送字符串

       

       

       

       

      /* 串行口初始化 */

       

      void init_serial( void )

       

       

      SCON = 0x50; //串行工作方式1, 8位異步通信方式

       

      TMOD |= 0x20; //定時(shí)器1, 方式 2, 8位自動(dòng)重裝

       

      PCON |= 0x80; //SMOD=1,表示數(shù)據(jù)傳輸率加倍

       

      TH1 = 0xF4; //數(shù)據(jù)傳輸率:4800 fosc=11.0592MHz

       

      IE |= 0x90; //允許串行中斷

       

      TR1 = 1; //啟動(dòng)定時(shí)器1

       

       

      /* 向串口發(fā)送一個(gè)字符 */

       

      void send_char( unsigned char x)

       

       

      SBUF=x;

       

      while (TI== 0 );

       

      TI= 0;

       

       

      /* 向串口發(fā)送一個(gè)字符串,string_length為該字符串長(zhǎng)度 */

       

      void send_string( unsigned char *s, unsigned int string_length)

       

       

      unsigned int i= 0;

       

      do

       

       

      send_char(*(s + i)); //向串口發(fā)送一個(gè)字符

       

      i++;

       

       

      while ( i<string_length);

       

       

      /* 串口接收中斷函數(shù) */

       

      void serial () interrupt 4 using 3

       

       

      if (RI)

       

       

      unsigned char x;

       

      RI = 0;

       

      x=SBUF; //接收字符

       

      if ( x> 127 )

       

       

      counter= 0;

       

      inbuf[counter]=x;

       

      checksum= x- 128;

       

       

      else

       

       

      counter++;

       

      inbuf[counter]=x;

       

      checksum ^= x;

       

      if ((counter==(length- 1)) && (!checksum))

       

       

      flag= 1; //如果串口接收的數(shù)據(jù)達(dá)到length個(gè),且校驗(yàn)沒錯(cuò),

       

      //就置位取數(shù)標(biāo)志

       

       

       

       

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多