您的位置 首页 电源

用Keil C51开发串行口

MCS-51单片机的串行口具有两条独立的数据线——发送端TXD和接收端RXD,它允许数据同时往两个相反的方向传输。一般通信时发送数据由TXD端输…

MCS-51单片机串行口具有两条独立的数据线——发送端TXD和接纳端RXD,它答应数据一起往两个相反的方向传输。一般通讯时发送数据由TXD端输出,接纳数据由RXD端输入。

MCS-51单片机的串行口既能够用于网络通讯,亦可完结串行异步通讯,还能够用作同步移位寄存器。假如在串行口的输入输出引脚上加上电平转化器,就可便利地构成规范的RS-232接口

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个,且校验没错,

//就置位取数标志

}

}

}

}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/dianyuan/275935.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部