用Keil C51開發串行口

2021-01-08 電子產品世界
MCS-51單片機串行口具有兩條獨立的數據線——發送端TXD和接收端RXD,它允許數據同時往兩個相反的方向傳輸。一般通信時發送數據由TXD端輸出,接收數據由RXD端輸入。

MCS-51單片機的串行口既可以用於網絡通信,亦可實現串行異步通信,還可以用作同步移位寄存器。如果在串行口的輸入輸出引腳上加上電平轉換器,就可方便地構成標準的RS-232接口

本文引用地址:http://www.eepw.com.cn/article/201611/317358.htm

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

1 數據通信的基本概念

常用於數據通信的傳輸方式有單工、半雙工、全雙工和多工方式。

Ø 單工方式:數據僅按一個固定方向傳送。因而這種傳輸方式的用途有限,常用於串行口的列印數據傳輸與簡單系統間的數據採集。

Ø 半雙工方式:數據可實現雙向傳送,但不能同時進行,實際的應用採用某種協議實現收/發開關轉換。

Ø 全雙工方式:允許雙方同時進行數據雙向傳送,但一般全雙工傳輸方式的線路和設備較複雜。

Ø 多工方式:以上三種傳輸方式都是用同一線路傳輸一種頻率信號,為了充分地利用線路資源,可通過使用多路復用器或多路集線器,採用頻分、時分或碼分復用技術,即可實現在同一線路上資源共享功能。

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

Ø異步通信。在這種通信方式中,接收器和發送器有各自的時鐘,它們的工作是非同步的。異步通信用一幀來表示一個字符,其內容是一個起始位,緊接著是若干個數據位。

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

同步傳輸方式比異步傳輸方式速度快,這是它的優勢。但同步傳輸方式也有其缺點,即它必須要用一個時鐘來協調收發器的工作,所以它的設備也較複雜。

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

在完成串行口初始化後,發送數據時,採用MOV SBUF,A指令,將要發送的數據寫入SBUF,則CPU自動啟動和完成串行數據的輸出;接收數據時,採用MOV A,SBUF指令,CPU就自動將接收到的數據從SBUF中讀出。

控制MCS-51單片機串行接口的控制寄存器有兩個——特殊功能寄存器SCON和PCON,用以設置串行埠的工作方式、接收/發送的運行狀態、接收/發送數據的特徵、數據傳輸率的大小,以及作為運行的中斷標誌等,其格式如下:

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

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

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

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

Ø SM2:僅用於方式2和方式3的多機通信控制位。

發送機SM2=1(要求程控設置)。在方式1或0種,應該將SM2寫入0,表示不參與多及通訊。

當為方式2或方式3時:

接收機 SM2=1時,若RB8=1,可引起串行接收中斷;若RB8=0,不引起串行接收中斷。SM2=0時,若RB8=1,可引起串行接收中斷;若RB8=0,亦可引起串行接收中斷。

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

Ø TB8:在方式2、3中,TB8是發送機要發送的第9位數據。

Ø RB8:在方式2、3中,RB8是接收機接收到的第9位數據,該數據正好來自發送機的TB8。

Ø TI:發送中斷標誌位。發送前必須用軟體清零,發送過程中TI保持零電平,發送完一幀數據後,由硬體自動置1。如要再發送,必須用軟體再清零。

Ø RI:接收中斷標誌位。接收前,必須用軟體清零,接收過程中RI保持零電平,接收完一幀數據後,由片內硬體自動置1。如要再接收,必須用軟體再清零。

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

PCON是為在CMOS結構的MCS-51單片機上實現電源控制而附加的,對於HMOS結構的MCS-51系列單片機,除了第7位外,其餘都是虛設的。與串行通信有關的也就是第7位,稱作SMOD,它的用處是使數據傳輸率加倍。

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

其餘有效位說明如下。

GF1、GF2:通用標誌位。

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

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

除了以上兩個控制寄存器外,中斷允許寄存器IE中的ES位也用來作為串行I/O中斷允許位。當ES=1,允許串行I/O中斷;當ES=0,禁止串行I/O中斷。中斷優先級寄存器IP的PS位則用作串行I/O中斷優先級控制位。當PS=1,設定為高優先級;當PS=0,設定為低優先級。

3 工作方式

MCS-51 單片機可以通過軟體設置串行口控制寄存器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為通用異步接收和發送器的英文縮寫。下面對這4種工作模式作進一步介紹。

1.方式0

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

執行任何一條以SBUF為目的的寄存器指令,就開始發送。

2.方式1

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

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

類似於模式0,發送過程是由執行任何一條以SBUF為目的的寄存器指令引起的。

3.方式2

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

4.方式3

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

4 數據傳輸率的確定

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

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

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

對方式1和方式3來說,數據傳輸率和定時器1的溢出率有關,定時器1的溢出率為:

定時器1的溢出率=定時器1的溢出次數/秒

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

2SMOD/32×T1溢出率

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

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

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

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

數據傳輸率/Hz

fOSC/MHz

SMOD

定時器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 串行通信實例

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

#include

#include

#define length 4 //數據長度

unsigned char inbuf[length];

unsigned char checksum,counter;

bit flag = 0; //取數標記

main()

{

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

while (1)

{

if (flag!=0) //如果取數標誌已置位,就將讀到的數從串口發出

{

flag= 0; //取數標誌清0

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

}

}

}

/* 串行口初始化 */

void init_serial( void )

{

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

TMOD |= 0x20; //定時器1, 方式 2, 8位自動重裝

PCON |= 0x80; //SMOD=1,表示數據傳輸率加倍

TH1 = 0xF4; //數據傳輸率:4800 fosc=11.0592MHz

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

TR1 = 1; //啟動定時器1

}

/* 向串口發送一個字符 */

void send_char( unsigned char x)

{

SBUF=x;

while (TI== 0 );

TI= 0;

}

/* 向串口發送一個字符串,string_length為該字符串長度 */

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

{

unsigned int i= 0;

do

{

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

i++;

}

while ( i

}

/* 串口接收中斷函數 */

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; //如果串口接收的數據達到length個,且校驗沒錯,

//就置位取數標誌

}

}

}

}

相關焦點

  • keil c51 與 MDK 衝突的解決
    最近又作了一些C51的工作,發現keil c51與 mdk 有衝突。然後上網一查果然有很多人遇到這個問題,錯誤提示為下圖:本文引用地址:http://www.eepw.com.cn/article/201611/323622.htm其實這個是MDK和KEIL C51 配置文件衝突的問題,可以參考下兩個人的配置文件:[C51]PATH="D:Program FilesKeil_C702c51
  • keil C51中的本徵函數庫及使用說明
    >(unsigned int)val左移n位extern unsigned long _lrol_ (unsigned long val, unsigned char n));(unsigned long)val左移n位extern unsigned char _chkfloat_(float);測試並返回float的狀態一下摘自keil
  • 單片機keil 常見問題
    一、混合編程1、模塊內接口:使用如下標誌符:#pragma asm彙編語句#pragma endasm注意:如果在c51程序中使用了彙編語言
  • 簡析單片機keil常見問題
    一、混合編程  1、模塊內接口:  使用如下標誌符:  #pragma asm  彙編語句  #pragma endasm  注意:如果在c51程序中使用了彙編語言,注意在keil編譯器中需要激活Properties中的「
  • ARM DS-5開發STM32程序(Eclipse配合Keil插件使用)
    ARM DS-5是基於Eclipse的ARM開發環境,有完善的編譯流程,配合Keil插件開發STM32效果更佳。廢話不多,先介紹思路:1.安裝MDK軟體,就有編譯STM32的工具鏈。
  • KEIL4 工程到 KEIL5 程序的移植方法
    首先我們用 keil5 打開 keil4 的工程, 則會彈出下面的窗口, 這就是我們程序兼容的關鍵。第一步:選擇Migarte to Device Pack1.2、在"SysTick"下分別建立"Lib 發表於 2020-10-15 win7下keil4開發s3c2440裸機的開發環境搭建 ); }}void Delay(int delayTime){ int i,j; for
  • 單片機與C語言——keil c51教程(1)
    對於開發周期來說,中大型的軟體編寫用C語言的開發周期通常要小於彙編語言很多。綜合以上C語言的優點,我在學習時選擇了C語言。以後的教程也只是我在學習過程中的一些學習筆記和隨筆,在這裡加以整理和修改,希望和大家一起分享,一起交流,一起學習,一起進步。  *註:可以肯定的說這個教程只是為初學或入門者準備的,筆者本人也只是菜鳥一隻,有望各位大俠高手指點錯誤提出建議。
  • keil5.24創建uCOSIII工程實現stm32實時作業系統(環境配置)
    但是這個新版本os_cpu_a.s是禁止修改的,說明keil不建議這樣做。     你如果不想用系統的,就得自己寫2個同名函數,但是沒必要。     那麼我們直接修改中斷向量表文件,把startup_stm32f10x_hd.s 裡面的PendSV_handler全替換成OS_CPU_PendSV_handler。
  • 在keil中怎麼燒寫程序
    打開APP 在keil中怎麼燒寫程序 發表於 2017-11-16 10:52:58   什麼是keil
  • 非常詳細的Keil工程建立全過程講解
    在單片機的開發或使用過程中除了掌握必要的硬體外,同樣離不開軟體,只有通過軟體(程序)的執行,硬體才能發揮出具體的作用。機器如何認識我們用各種符號編寫的程序呢?早期我們寫的彙編語言源程序要變為CPU可以執行的機器碼有兩種方法,一種是手工彙編,另一種是機器彙編,目前已極少使用手工彙編的方法了。
  • 第5節:用keil軟體新建,關閉,打開一個完整工程的操作流程
    從業十年,教你單片機入門基礎 第五講:Keil平臺軟體的安裝我就不多講了,網上這方面的資料很多,大家可以百度一下如何安裝keil的教程。
  • Keil uVision5、RealView MDK、Keil C51之間的關係
    uVision是KEIL公司開發的一個集成開發環境(IDE),和Eclipse類似。它包括工程管理,原始碼編輯,編譯設uVision置,下載調試和模擬仿真等功能,uVision有uVision2、uVision3、uVision4、uVision5四個版本,目前最新的版本是uVision5.它提供一個環境,讓開發者易於操作,並不提供能具體的編譯和下載功能,需要軟體開發者添加。
  • Keil uVision4單片機
    今天也是第一次接觸到了單片機技術 想和大家分享關於Keil uVision4的一些問題和經驗Keil uVision4免費版是一款非常專業且權威的單片機開發工具。Keil4提供了包括C編譯器、宏彙編、連接器、庫管理和仿真調試器等在內的完整開發方案,通過一個集成開發環境(uVision)將這些部分組合在一起。在學習單片機,微型計算機控制等課程,或者在protuse軟體上,Keil uVision4免費版會給你很大幫助。
  • 自學單片機第三篇:keil軟體
    官網的軟體各方面都有保證,英文並不影響使用,因為我們能用的功能項目,位置就那幾個,記住就好了,而且不用擔心莫名其妙的問題。打開官網,點擊上方的「download」進入下載頁面。圖標雙擊打開軟體,界面如下。第一個選項是文件,下拉表中,我們當前要點擊下圖黃色部分,安裝證書。
  • 如何使用Keil uvision4軟體-入門教程
    Keil C51是美國Keil Software公司出品的51系列兼容單片機C語言軟體開發系統,與彙編相比,C語言在功能上、結構性、可讀性、可維護性上有明顯的優勢,因而易學易用。用過彙編語言後再使用C來開發,體會更加深刻。
  • Keil C51程序設計中幾種精確延時方法
    實際的單片機應用系統開發過程中,由於程序功能的需要,經常編寫各種延時程序,延時時間從數微秒到數秒不等,對於許多C51開發者特別是初學者編制非常精確的延時程序有一定難度。
  • Keil C51程序調試過程
    用MCS-51單片機軟體Keil C51編寫程序時,經常需要調試,如果不是經常用這個軟體的話,很容易忘記這些調試步驟,現在舉一個例子「驗證延遲函數delay()
  • 技巧1 -- 在 Keil C51 中增加 STC 型號
    ),插件提取碼:bewxzsp6#對於 Keil uVision4(簡稱 uv4),官網沒有,使用 uv3 的就可以……使用方法:在 Keil C51 安裝路徑中的 UV2(或 UV3、UV4)文件夾內,有 uv2.cdb(或 uv3.cdb、uv4.cdb)文件;對於 uv2 版本:備份 uv2.cdb 文件; 用
  • STM32開發環境(工具)之Keil MDK 介紹
    STM32微處理器基於ARM核,所以很多基於ARM嵌入式開發環境都可用於STM32開發平臺。開發工具都可用於STM32開發。選擇合適的開發環境可以加快開發進度,節省開發成本。