电工技术基础_电工基础知识_电工之家-电工学习网

欢迎来到电工学习网!

UART串口通讯的底子运用

2017-04-11 12:02分类:PLC基础知识 阅读:

 

  1、通讯的三种底子类型

  咱们常用的通讯通常能够分为单工、半双工、全双工通讯。

  单工即是指只容许一方向别的一方传送信息,而另一方不能回传信息。比方咱们的电视遥控器,咱们的收音机播送等,都是单工通讯技能。

  半双工是指数据能够在两头之间彼此传达,但是同一时刻只能其间一方发给别的一方,比方咱们的对讲机即是典型的半双工。

  全双工通讯就发送数据的一同也能够承受数据,两者同步进行,就好像咱们的电话相同,咱们说话的一同也能够听到对方的动态。

  2、UART模块介绍

  IO口仿照串口通讯,咱们了解了串口通讯的本质,但是咱们的单片机程序却需求不断的检查扫描单片机IO口收到的数据,许多占用了CPU本钱。这时分就会有聪明人想了,正本咱们不是很关怀通讯的进程,咱们只需求一个通讯的效果,究竟得到接纳到的数据就行了。这么咱们能够在单片机内部做一个硬件模块,让他自动接纳数据,接纳完了,通知咱们一下就能够了,咱们的51单片机内部就存在这么一个UART模块,要准确运用它,当然还得先把对应的分外功用寄存器配备好。

  51单片机的UART串行口的构造由串行口操控寄存器SCON、发送和接纳电路三有些构成,先来了解一下串口操控寄存器SCON。

  表1SCON--串行操控寄存器的位分配(地址:98H)

可位寻址;复位值:0x00;复位源:任何复位

7

6

5

4

3

2

1

0

符号

SM0

SM1

SM2

REN

TB8

RB8

TI

RI

表2SCON--串行操控寄存器的位描写

符号

描写

7

SM0

这两位一同挑选了串口通讯的方法0到方法3共4种方法。咱们最常用的即是方法1,也即是SM0=0,SM1=1,下边咱们要害就讲方法1,别的方法从略。

6

SM1

5

SM2

多机通讯操控位(很少用),方法1直接清零。

4

REN

使能串行接纳。由软件置位使能接纳,软件清零则阻遏接纳

3

TB8

方法2和3中行将发送的第9位数据(很少用)

2

RB8

方法2和3中接纳第9位数据(很少用),方法1用来接纳接连位

1

TI

发送接连象征位,方法1下,在数据位究竟一位发送结束,开端发送接连位时由硬件自动置1,有必要经过软件清零。也即是说,再发送前咱们清零TI,发送数据,数据发送到接连位时,TI硬件置1,便当咱们CPU查询发送结束状况。

0

RI

接纳接连象征位,当接纳电路接纳到接连位的基当方位时,RI由硬件置1。也即是说,接纳数据之前咱们有必要清零RI,承受数据到接连位的基当方位时,RI硬件置1,便当咱们CPU查询到接纳状况。

  前边学了那么多寄存器的配备,信任SCON这个本地,关于大大都同学来说现已不是难点了,应当能看懂并且能够自个配备了。关于串口的四种方法,方法1是最常用的,即是咱们前边说到的1位开端位,8位数据位和1位结束位。因为咱们的教程纷歧样于教科书,只需有的功用都逐一介绍,咱们只介绍有用的技能,所以别的3种方法,实在遇到需求运用的时分咱们再去查资料就行。

  在咱们运用IO口仿照串口通讯的时分,咱们串口的波特率是运用守时器0的接连表现出来的。在实习串口模块中,有一个专门的波特率发作器用来操控发送数据的速度和读取接纳数据的速度。关于STC89C52RC单片机来讲,这个波特率发作器只能由守时器1或守时器2发作,而不能由守时器0发作,这和咱们仿照的通讯是完全纷歧样的概念。

  假定用守时器2,需求配备额外的寄存器,默许是运用守时器1的,咱们本章内容首要是运用守时器1作为波特率发作器来阐明,方法1下的波特率发作器有必要运用守时器1的方法2,也即是自动重装载方法,守时器的初值详细的核算公式是:

TH1=TL1=256-晶振值/12/2/16/波特率

  和波特率有关的还有一个寄存器,是一个电源处理寄存器PCON,他的最高位能够把波特率跋涉一倍,也即是假定写PCON|=0x80往后,核算公式就成了

TH1=TL1=256-晶振值/12/16/波特率

  数字的意义这儿阐明一下,256是8位数据的溢出值,也即是TL1的溢出值,11059200即是咱们板子上单片机的晶振,12是说1个机器周期是12个时钟周期,值得注重的是这个16,要害阐明。咱们在IO口仿照串口通讯接纳数据的时分,咱们搜集的是这一位数据的基当方位,而实习上串口模块比咱们仿照的要杂乱和准确一些。他选用的方法是把一位信号搜集16次,其间第7、8、9次取出来,这三次中其间两次假定是高电平,那么就断定这一位数据是1,假定两次是低电平,那么就断定这一位是0,这么一旦遭到意外搅扰读错一次数据,也依然能够确保究竟数据的准确性。

  了解了串口搜集方法,在这儿要给咱们留一个思考题。“晶振值/12/2/16/波特率”这个本地核算的时分,呈现不能除尽,或许呈现小数怎样办,容许呈现多大的过失?把这有些了解了,也就了解了咱们的晶振为何运用11.0592M了。

  串口通讯的发送和接纳电路,咱们首要了解一下他们在物理上有2个名字相同的SBUF寄存器,他们的地址也都是99H,但是一个用来做发送缓冲,一个用来做接纳缓冲。意思即是说,有2个房间,两个房间的门商标是相同的,其间一个只出人不进人,别的一个只进人不出人,这么的话,咱们就能够结束UART的全双工通讯,彼此之间不会发作搅扰。但是在逻辑上呢,咱们每次只操作SBUF,单片时机自动根据对它施行的是“读”仍是“写”操作来挑选是接纳SBUF仍是发送SBUF,后边经进程序,咱们就会完全了解这个疑问。

  3、UART串口程序

  通常状况下,咱们编写串口通讯程序的底子进程如下所示:

  1、配备串口为方法1。

  2、配备守时器T1为方法2,即自动重装方法。

  3、断定波特率巨细,核算守时器TH1和TL1的初值,假定有需求能够运用PCON进行波特率加倍。

  4、翻开守时器操控寄存器TR1,让守时器跑起来。

  这个本地还要分外留神一下,即是在运用T1做波特率发作器的时分,千万不要再使能T1的接连了。

  咱们先来看一下由IO口仿照串口通讯直接改为运用硬件UART模块时程序代码,看看程序是不是简略了许多,因为大有些的工作硬件模块都替咱们做了。程序功用和IO口仿照的是完全相同的。

#include

voidConfigUART(unsignedintbaud);

voidmain()

{

ConfigUART(9600);//配备波特率为9600

while(1)

{

while(!RI);//等候接纳结束

RI=0;//清零接纳接连象征位

SBUF=SBUF+1;//接纳到的数据+1后,发送回去;

//等号左面的SBUF实习上即是发送SBUF,因为对它的操作是“写”;

//等号右边的是接纳SBUF,因为对它的操作是“读”。

while(!TI);//等候发送结束

TI=0;//清零发送接连象征位

}

}

voidConfigUART(unsignedintbaud)//串口配备函数,baud为波特率

{

SCON=0x50;//配备串口为方法1

TMOD&=0x0F;//清零T1的操控位

TMOD|=0x20;//配备T1为方法2

TH1=256-(11059200/12/32)/baud;//核算T1重载值

TL1=TH1;//初值等于重载值

ET1=0;//阻遏T1接连

TR1=1;//主张T1

}

  当然了,这个程序仍是在主循环里等候接纳接连象征位和发送接连象征位的方法来编写的,而实习工程开发中,当然就不能这么干了,所以就用到了串口接连,来看一下程序。

#include

voidConfigUART(unsignedintbaud);

voidmain()

{

ConfigUART(9600);//配备波特率为9600

while(1);

}

voidConfigUART(unsignedintbaud)//串口配备函数,baud为波特率

{

SCON=0x50;//配备串口为方法1

TMOD&=0x0F;//清零T1的操控位

TMOD|=0x20;//配备T1为方法2

TH1=256-(11059200/12/32)/baud;//核算T1重载值

TL1=TH1;//初值等于重载值

ET1=0;//阻遏T1接连

TR1=1;//主张T1

ES=1;//翻开串口接连

EA=1;//翻开总接连

}

voidInterruptUART()interrupt4

{

if(RI)//接纳到字节

{

RI=0;//手动清零接纳接连象征位

SBUF=SBUF+1;//接纳数据+1发回去,左面为发送SBUF,右边为接纳SBUF。

}

if(TI)//字节发送结束

{

TI=0;//手动清零发送接连象征位

}

}

   咱们能够实验一下试试,看看是不是和前边用IO口仿照通讯结束的效果一同,而主循环却完全空出来了,咱们就能够随意添加其它功用代码进入。

上一篇:8051单片机时钟电路的构成

下一篇:单片机串行通讯操控寄存器的运用

相关推荐

电工推荐

    电工技术基础_电工基础知识_电工之家-电工学习网
返回顶部