<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 51單片機串行口--同步移位寄存器

51單片機串行口--同步移位寄存器

作者: 時(shí)間:2016-11-26 來(lái)源:網(wǎng)絡(luò ) 收藏

1.方式0

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

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

2.方式1

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

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

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

3.方式2

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

4.方式3

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

數據傳輸率的確定

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

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

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

對方式1和方式3來(lái)說(shuō),數據傳輸率和定時(shí)器1的溢出率有關(guān),定時(shí)器1的溢出率為:

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

方式1和方式3的數據傳輸率計算式為:

2SMOD/32×T1溢出率

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

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

表5-3所示常用數據傳輸率的設置方法。

表5-3 常用數據傳輸率設置方法

數據傳輸率/Hz

fOSC/MHz

SMOD

定時(shí)器1

C/T

方 式

重新裝入值

方式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

串行通信實(shí)例

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

#include  #include  #define length 4 //數據長(cháng)度 unsigned char inbuf[length]; unsigned char checksum,counter; bit flag = 0; //取數標記 main() { init_serial(); //串行口初始化 while (1) { if (flag!=0) //如果取數標志已置位,就將讀到的數從串口發(fā)出 { flag= 0; //取數標志清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,表示數據傳輸率加倍 TH1 = 0xF4; //數據傳輸率:4800 fosc=11.0592MHz IE |= 0x90; //允許串行中斷 TR1 = 1; //啟動(dòng)定時(shí)器1 } void send_char( unsigned char x) { SBUF=x; while (TI== 0 ); TI= 0; } void send_string( unsigned char *s, unsigned int string_length) { unsigned int i= 0; do { send_char(*(s + i)); //向串口發(fā)送一個(gè)字符 i++; } while ( i 127 ) { counter= 0; inbuf[counter]=x; checksum= x- 128; } else { counter++; inbuf[counter]=x; checksum ^= x; if ((counter==(length- 1)) && (!checksum)) { flag= 1; //如果串口接收的數據達到length個(gè),且校驗沒(méi)錯, //就置位取數標志 } } } }

資料整理自:http://hi.baidu.com/mikenoodle/blog/item/53920ffa87544d9259ee908a.html


上一頁(yè) 1 2 下一頁(yè)

評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>