单片机串行通信.docx

上传人:b****2 文档编号:1920627 上传时间:2023-05-02 格式:DOCX 页数:41 大小:192.25KB
下载 相关 举报
单片机串行通信.docx_第1页
第1页 / 共41页
单片机串行通信.docx_第2页
第2页 / 共41页
单片机串行通信.docx_第3页
第3页 / 共41页
单片机串行通信.docx_第4页
第4页 / 共41页
单片机串行通信.docx_第5页
第5页 / 共41页
单片机串行通信.docx_第6页
第6页 / 共41页
单片机串行通信.docx_第7页
第7页 / 共41页
单片机串行通信.docx_第8页
第8页 / 共41页
单片机串行通信.docx_第9页
第9页 / 共41页
单片机串行通信.docx_第10页
第10页 / 共41页
单片机串行通信.docx_第11页
第11页 / 共41页
单片机串行通信.docx_第12页
第12页 / 共41页
单片机串行通信.docx_第13页
第13页 / 共41页
单片机串行通信.docx_第14页
第14页 / 共41页
单片机串行通信.docx_第15页
第15页 / 共41页
单片机串行通信.docx_第16页
第16页 / 共41页
单片机串行通信.docx_第17页
第17页 / 共41页
单片机串行通信.docx_第18页
第18页 / 共41页
单片机串行通信.docx_第19页
第19页 / 共41页
单片机串行通信.docx_第20页
第20页 / 共41页
亲,该文档总共41页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

单片机串行通信.docx

《单片机串行通信.docx》由会员分享,可在线阅读,更多相关《单片机串行通信.docx(41页珍藏版)》请在冰点文库上搜索。

单片机串行通信.docx

单片机串行通信

串行接口及串行通信

1.串行通信的基础知识

串行数据通信要解决两个关键技术问题,一个是数据传送,另一个是数据转换。

所谓数据传送就是指数据以什么形式进行传送。

所谓数据转换就是指单片机在接受数据时,如何把接收到的串行数据转化为并行数据,单片机在发送数据时,如何把并行数据转换为串行数据进行发送。

1.1数据传送

单片机的串行通信使用的是异步串行通信,所谓异步就是指发送端和接收端使用的不是同一个时钟。

异步串行通信通常以字符(或者字节)为单位组成字符帧传送。

字符帧由发送端一帧一帧地传送,接收端通过传输线一帧一帧地接收。

1.字符帧的帧格式

字符帧由四部分组成,分别是起始位、数据位、奇偶校验位、停止位。

如图9.1所示:

1) 起始位:

位于字符帧的开头,只占一位,始终位逻辑低电平,表示发送端开始发送一帧数据。

2) 数据位:

紧跟起始位后,可取5、6、7、8位,低位在前,高位在后。

3) 奇偶校验位:

占一位,用于对字符传送作正确性检查,因此奇偶校验位是可选择的,共有三种可能,即奇偶校验、偶校验和无校验,由用户根据需要选定。

4) 停止位:

末尾,为逻辑“1”高电平,可取1、1.5、2位,表示一帧字符传送完毕。

图9.1字符帧格式

异步串行通信的字符帧可以是连续的,也可以是断续的。

连续的异步串行通信,是在一个字符格式的停止位之后立即发送下一个字符的起始位,开始一个新的字符的传送,即帧与帧之间是连续的。

而断续的异步串行通信,则是在一帧结束之后不一定接着传送下一个字符,不传送时维持数据线的高电平状态,使数据线处于空闲。

其后,新的字符传送可在任何时候开始,并不要求整倍数的位时间。

2.传送的速率

   串行通信的速率用波特率来表示,所谓波特率就是指一秒钟传送数据位的个数。

每秒钟传送一个数据位就是1波特。

即:

1波特=1bps(位/秒)

在串行通信中,数据位的发送和接收分别由发送时钟脉冲和接收时钟脉冲进行定时控制。

时钟频率高,则波特率高,通信速度就快;反之,时钟频率低,波特率就低,通信速度就慢。

1.2数据转换

MCS-51单片机只能处理8位的并行数据,所以在进行串行数据的发送时,要把并行数据转换为串行数据。

而在接收数据时,只有把接收的串行数据转换成并行数据,单片机才能进行处理。

能实现这种转换的设备,称为通用异步接收发送器(UniversalAsynchronousReceiver/Transmitter)。

这种设备已集成到单片机内部,称为串行接口电路。

串行接口电路为用户提供了两个串行口缓冲寄存器(SBUF),一个称为发送缓存器,它的用途是接收片内总线送来的数据,即发送缓冲器只能写不能读。

发送缓冲器中的数据通过TXD引脚向外传送。

另一个称为接收缓冲器,它的用途是向片内总线发送数据,即接收缓冲器只能读不能写。

接收缓冲器通过RXD引脚接收数据。

因为这两个缓冲器一个只能写,一个只能读,所以共用一个地址99H。

串行接口电路如图9.2所示。

图9.2MCS-51串行口寄存器结构

MCS-51单片机串行通信的控制寄存器

1.串行口控制寄存器(SCON)

SCON是MCS-51单片机的一个可位寻址的专用寄存器,用于串行数据通信的控制。

单元地址为98H,位地址为98H~9FH。

寄存器的内容及位地址表示如下:

位地址

9FH

9EH

9DH

9CH

9BH

9AH

99H

98H

位符号

SM0

SM1

SM2

REN

TB8

RB8

TI

RI

 各位的说明如下:

1) SM0、SM1——串行口工作方式选择位

其状态组合和对应工作方式为:

SM0SM1工作方式

0         0方式0

0         1方式1

1         0方式2

11方式3

2) SM2——允许方式2、3的多机通信控制位

在方式2和3中,若SM2=1且接收到的第九位数据(RB8)为1,才将接收到的前8位数据送入接收SBUF中,并置位RI产生中断请求;否则丢弃前8位数据。

若SM2=0,则不论第九位数据(RB8)为1还是为0,都将前8位送入接收SBUF中,并产生中断请求。

方式0时,SM2必须置0。

3) REN——允许接收位

REN=0禁止接收数据

REN=1允许接收数据

4) TB8——发送数据位8

在方式2、3时,TB8的内容是要发送的第9位数据,其值由用户通过软件来设置。

5) RB8——接收数据位8

在方式2、3时,RB8是接收的第9位数据。

在方式1时,RB8是接收的停止位

在方式0时,不使用RB8

6) TI——发送中断标志位

在方式0时,发送完第8位数据后,该位由硬件置位。

在其它方式下,于发送停止位之前,由硬件置位。

因此,TI=1表示帧发送结束,其状态既可供软件查询使用,也可请求中断。

TI由软件清“0”。

7) RI——接收中断标志位

在方式0时,接收完第8位数据后,该位由硬件置位。

在其它方式下,于接收到停止位之前,该位由硬件置位。

因此,RI=1表示帧接收结束,其状态既可供软件查询使用,也可请求中断。

RI由软件清“0”。

2.电源控制寄存器(PCON)

PCON不可位寻址,字节地址为87H。

它主要是为CHMOS型单片机80C51的电源控制而设置的专用寄存器。

其内容如下:

位序

D7

D6

D5

D4

D3

D2

D1

D0

位符号

SMOD

/

/

/

GF1

GF0

PD

IDL

与串行通信有关的只有D7位(SMOD),该位为波特率倍增位,当SMOD=1时,串行口波特率增加一倍,当SMOD=0时,串行口波特率为设定值。

当系统复位时,SMOD=0。

3.中断允许控制寄存器(IE)

此寄存器在第六章已经介绍过,在此不作赘述。

MCS-51单片机串行通信工作方式

串行口的工作方式由SM0和SM1确定,编码和功能如表8-1所示。

表8-1串行口工作方式

SM0SM1

方式

功能说明

波特率

00

方式0

移位寄存器方式

fosc/12

01

方式1

8位UART

可变

10

方式2

9位UART

fosc/64或者fosc/32

11

方式3

9位UART

可变

方式0和方式2的波特率是固定的,而方式1和方式3的波特率是可变的,由T1的溢出率决定。

1串行工作方式0

串行口工作在方式0时,串行口作同步移位寄存器使用。

以RXD(P3.0)端作为数据的输入或输出端,而TXD(P3.1)提供移位的时钟脉冲。

外接移位寄存器,实现数据并行输入或输出。

工作在方式0时,波特率为fosc/12,即一个机器周期移位一次。

1.数据输出(发送)

当数据写入SBUF后,数据从RXD端在移位脉冲(TXD)的控制下,逐位移入74LS164,74LS164能完成数据的串并转换。

当8位数据全部移出后,TI由硬件置位,发生中断请求。

若CPU响应中断,则从0023H单元开始执行串行口中断服务程序,数据由74LS164并行输出。

其接口逻辑如图9.3所示。

由逻辑图可知,通过外接74LS164,串行口能够实现数据的并行输出。

图.外接移位寄存器输出

2.数据输入(接收)

要实现接收数据,必须首先把SCON中的允许接收位REN设置为1。

当REN设置为1时,数据就在移位脉冲的控制下,从RXD端输入。

当接收到8位数据时,置位接收中断标志位RI,发生中断请求。

其接口逻辑如图9.4所示。

由逻辑图可知,通过外接74LS165,串行口能够实现数据的并行输入。

 

图.外接移位寄存器输入

比如,使用74LS164的并行输出端接8支发光二极管,利用它的串入并出功能,把发光二极管从左到右依次点亮,并反复循环。

假定发光二极管为共阴极接法。

图.电路设计

电路如图上。

软件部分如下:

 

ORG

0000H

 

 

LJMP

MAIN

 

 

ORG

1000H

 

MAIN:

MOV

SCON,#00H

;串行口工作在方式0

 

CLR

ES

;禁止串行中断

 

MOV

A,#80H

;发光二极管从左边亮起

DELR:

CLR

P1.0

;关闭并行输出

 

MOV

SBUF,A

;串行输出

WAINT:

JNB

TI,WAIT

;状态查询

 

SETB

P1.0

;开启并行输出

 

ACALL

DELAY

;调用延时子程序

 

CLR

TI

;清发送中断标志

 

RR

A

;发光右移

 

AJMP

DELR

;继续

 

EDN

 

 

2串行工作方式1

方式1为10位为一帧的异步串行通信方式。

其帧格式为1个起始位、8个数据位和1个停止位。

如图9.6所示。

 

图9.6方式1的帧格式

1.数据输出(发送)

数据写入SBUF后,开始发送,此时由硬件加入起始位和停止位,构成一帧数据,由TXD串行输出。

输出一帧数据后,TXD保持在高电平状态下,并将TI置位,通知CPU可以进行下一个字符的发送。

2.数据输入(接收)

 当REN=1且接收到起始位后,在移位脉冲的控制下,把接收到的数据移入接收缓冲寄存器(SBUF)中,停止位到来后,把停止位送入RB8中,并置位RI,通知CPU接收到一个字符。

3.波特率的设定

工作在方式1时,其波特率是可变的,波特率的计算公式为:

其中,SMOD为PCON寄存器最高位的值,其值为1或0。

当定时器1作波特率发生器使用时,选用工作方式2(即自动加载定时初值方式)。

选择方式2可以避免通过程序反复装入定时初值所引起的定时误差,使波特率更加稳定。

假定计数初值为X,则计数溢出周期为:

溢出率为溢出周期的倒数。

则波特率的计算公式为:

实际使用中,波特率是已知的。

因此需要根据波特率的计算公式求定时初值X。

用户只需要把定时初值设置到定时器1,就能得到所要求的波特率。

(1)通信双方的硬件连接

作为应用系统首先要研究通信双方如何连接。

一种办法是把两片8051的串行口直接相连,一片8051的TXD与另一片的RXD相连,RXD与另一片的TXD相连,地与地连通。

由于8051串行口的输出是TTL电平,两片相连所允许的距离极短。

(2)通信双方的软件约定

通信双方除了在硬件上进行连接外,在软件还必须作如下约定:

作为发送方,必须知道什么时候发送信息,发什么,对方是否收到,收到的内容有没有错误,要不要重发,怎样通知对方结束。

作为接收一方,必须知道对方是否发送了信息,发的是什么,收到的信息是否有错误,如果有错误怎样通知对方重发,怎样判断结束等等。

这些规定必须在编程之前确定下来。

为实现双机通信,我们规定如下:

●        假定A机为发送机,B机为接收机。

●        当A机发送时,先送一个“AA”信号,B机收到后回答一个“BB”信号,表示同意接收。

●        当A机接收到“BB”后,开始发送数据,每发送一次求一次“检查和”,假定数据块长16个字节,起始地址为30H,一个数据块发送完后再发出“检查和”。

●        B机接收的数据并转存到数据区,起始地址也为30H,同时每接收一次也计算一次“检查和”,当一个数据块收齐后,再接收A机发来的“检查和”,并将它与B机的“检查和”进行比较。

若两者相等,说明接收正确,B机回答一个00;若两者不相等,说明接收不正确,B机回答一个FF,请求重发。

●        A机收到00的答复后,结束发送。

若收到的答复非0,则重新将数据发送一次。

●        双方均以1200波特的速率传送。

假设晶振频率为6MHz,计算定时器1的计数初值:

为使波特率不倍增,设定PCON寄存器的SMOD=0,则PCON=00H

(3)基本的通信程序

设计程序框图如图9.7所示。

图9.7双机通信程序结构图

根据结构图设计出下述通信程序:

A机通信程序:

ASTART:

MOV

TMOD,#20H

;设定定时器1工作方式2

 

MOV

TL1,#0F2H

;设定计数初值

 

MOV

TH1,#0F2H

;计数重装值

 

MOV

PCON,#00H

;波特率不倍增

 

SETB

TR1

;启动T1

 

MOV

SCON,#50H

;设置串行口方式1

ATT1:

MOV

SBUF,#0AAH

;发送“AA”

AWAIT1:

JBC

TI,ARR1

;等待一帧发送完

 

SJMP

AWAIT1

 

ARR1:

JBC

RI,ARR2

;等待应答信号

 

SJMP

ARR1

 

ARR2:

MOV

A,SBUF

 

 

XRL

A,#0BBH

 

 

JNZ

ATT1

;判断是否是应答信号“00”

ATT2:

MOV

R0,#30H

 

 

MOV

R7,#10

 

 

MOV

R6,#00H

 

ATT3:

MOV

SBUF,@R0

 

 

MOV

A,R6

 

 

ADD

A,@R0

 

 

MOV

R6,A

 

 

INC

R0

 

AWAIT2:

JBC

TI,ATT4

 

 

SJMP

AWAIT2

;发送有效数据

ATT4:

DJNZ

R7,ATT3

;判断是否传送完毕

 

MOV

SBUF,R6

 

AWAIT3:

JBC

TI,ARR3

 

 

SJMP

AWAIT3

;等待

ARR3:

JBC

RI,ARR4

 

 

SJMP

ARR3

;等待

ARR4:

MOV

A,SBUF

 

 

JNZ

ATT2

 

AEND:

RET

 

 

 

B机通信程序:

 

BSTART:

MOV

TMOD,#20H

;设定定时器1工作方式2

 

MOV

TH1,#0F2H

;设定计数初值

 

MOV

TL1,#0F2H

;计数重装值

 

MOV

PCON,#00H

;波特率不倍增

 

SETB

TR1

 

 

MOV

SCON,#50H

 

BRR1:

JBC

RI,BRR2

 

 

SJMP

BRR1

;等待

BRR2:

MOV

A,SBUF

;把接收到的数据送入A

 

XRL

A,#0AAH

;判断接收到数据是否是“AA”

 

JNZ

BRR1

;如果不是继续等待

BTT11:

MOV

SBUF,0BBH

;发送应答信号

BWAIT1:

JBC

TI,BRR3

;等待

 

SJMP

BWAIT1

 

BRR3:

MOV

R0,#30H

;接收有效数据

 

MOV

R7,#10

 

 

MOV

R6,#00H

 

BRR4:

JBC

RI,BRR5

 

 

SJMP

BRR4

 

BRR5:

MOV

A,SBUF

 

 

MOV

@R0,A

 

 

INC

R0

 

 

ADD

A,R6

 

 

DJNZ

R7,BRR4

 

BWAIT2:

JBC

RI,BRR6

 

 

SJMP

BWAIT2

 

BRR6:

MOV

A,SBUF

 

 

XRL

A,R6

 

 

JZ

BEND

 

 

MOV

SBUF,#0FFH

 

BWAIT3:

JBC

TI,BRR3

 

 

SJMP

BWAIT3

 

BEND:

MOV

SBUF,#00H

 

 

RET

 

 

3串行工作方式2

方式2为11位为一帧的异步串行通信方式。

其帧格式为1个起始位、9个数据位和1个停止位。

如图9.8所示。

 

图9.8方式2的帧格式

在方式2下,字符还是8个数据位,只不过增加了一个第9个数据位(D8),而且其功能由用户确定,是一个可编程位。

在发送数据时,应先在SCON的TB8位中把第9个数据位的内容准备好。

这可使用如下指令完成:

SETBTB8;TB8位置“1”

CLRTB8;TB8位置“0”

发送数据(D0~D7)由MOV指令向SBUF写入,而D8位的内容则由硬件电路从TB8中直接送到发送移位器的第九位,并以此来启动串行发送。

一个字符帧发送完毕后,将TI位置“1”,其他过程与方式1相同。

方式2的接收过程也于方式1基本类似,所不同的只在第9数据位上,串行口把接收到的前8个数据位送入SBUF,而把第九数据位送入RB9.

方式2的波特率时固定的,而且有两种。

一种是晶振频率的三十二分之一;另一种是晶振频率的六十四分之一。

即fosc/32和fosc/64。

如用公式表示则为:

由此公式可知,当SMOD为0时,波特率为fosc/64,当SMOD为1时,波特率为fosc/32。

4串行工作方式3

方式3同方式2几乎完全一样,只不过方式3的波特率是可变的,有用户来确定。

其波特率的确定同方式1。

2.单片机与单片机的串行通信

/********************************************************************

*文件名:

单片机串行显示.c

*描述:

该程序实现了12864以串行的方式进行通信。

***********************************************************************/

#include

#include

#defineucharunsignedchar

#defineuintunsignedint

sbitCS=P2^5;//片选信号

sbitSID=P2^6;//数据信号

sbitSCLK=P2^7;//时钟信号

sbitRST=P2^4;//复位信号

sbitCH=P2^2;//并行、串行选择信号

/********************************************************************

*名称:

delay()

*功能:

延时,延时时间为100us*t。

这是通过软件延时,有一定误差。

*输入:

t

*输出:

***********************************************************************/

voiddelay(unsignedintt)

{

unsignedinti,j;

for(i=0;i

for(j=0;j<10;j++);

}

/********************************************************************

*名称:

sendbyte()

*功能:

按照液晶的串口通信协议,发送数据

*输入:

zdata

*输出:

***********************************************************************/

voidsendbyte(unsignedcharzdata)

{

unsignedinti;

for(i=0;i<8;i++)

{

if((zdata<

{

SID=1;

}

else

{

SID=0;

}

SCLK=0;

SCLK=1;

}

}

/********************************************************************

*名称:

write_com()

*功能:

写串口指令

*输入:

cmdcode

*输出:

***********************************************************************/

voidwrite_com(unsignedcharcmdcode)

{

CS=1;

sendbyte(0xf8);

sendbyte(cmdcode&0xf0);

sendbyte((cmdcode<<4)&0xf0);

delay

(2);

}

/********************************************************************

*名称:

write_data()

*功能:

写串口指令

*输入:

cmdcode

*输出:

***********************************************************************/

voidwrite_data(unsignedcharDispdata)

{

CS=1;

sendbyte(0xfa);

sendbyte(Dispdata&0xf0);

sendbyte((Dispdata<<4)&0xf0);

delay

(2);

}

/********************************************************************

*名称:

lcdinit()

*功能:

初始化函数

*输入:

cmdcode

*输出:

***********************************************************************/

voidlcdinit()

{

RST=0;

delay(100);

RST=1;

delay(20000);

write_com(0x30);

delay(50);

write_com(0x0c);

delay(50);

}

/********************************************************************

*名称:

hzkdis()

*功能:

显示字符串

*输入:

*s

*输出:

*****************

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 经管营销 > 财务管理

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2