当前位置:首页 >> 信息与通信 >>

异步串行UART协议详解 中文版


异步串行UART协议

7.1.1 串行口的结构

2个物理上独立的接收、发送缓冲器SBUF,占用同一地 个物理上独立的接收、发送缓冲器 个物理上独立的接收 , 址99H ;接收器是双缓冲结构 。

7.1.2 串行口的控制
1、串行口控制寄存器SCON (98H)
设定工作方式、接收 发送控制以

及设置状态标志 设定工作方式、接收/发送控制以及设置状态标志 SCON (98H)

SM0

SM1

SM2

REN

TB8

RB8

TI

RI

SM0、SM1:工作方式设置位 、 :

SM2,多机通信控制位。 ,多机通信控制位。
主要用于方式2和方式 。 主要用于方式 和方式3。对于接收机 和方式 SM2=0,收到 ,收到RB8(0或1)既可使收到的数据进入 ( 或 )既可使收到的数据进入SBUF, , 并激活RI。 并激活 。 SM2=1,收到的 信息丢弃, ,收到的RB8=0时,收到的信息丢弃,不激活 ; = 时 收到的信息丢弃 不激活RI 若收到的RB8=1时,收到的数据进入 数据进入SBUF,并激活 ,进而 若收到的 = 时 收到的数据进入 ,并激活RI, 读走。 在中断服务中将数据从 读走 在中断服务中将数据从SBUF读走。 方式0时 必须是0。 方式 时,SM2必须是 。 必须是 方式1时 才激活。 方式 时,SM2=1时,只有接收到有效停止位时,RI才激活。 时 只有接收到有效停止位时, 才激活

REN,允许串行接收位。 ,允许串行接收位。
置REN=1,启动串口接收过程 , 置REN=0,则禁止串口接收 ,

TB8,在方式 、3中,是发送数据的第 位 ,在方式2、 中 是发送数据的第9位 数据的奇偶校验位 地址帧/数据帧的标志位 地址帧 数据帧的标志位

RB8,在方式 、3中,是接收到数据的第 位 ,在方式2、 中 是接收到数据的第9位 奇偶校验位 地址帧/数据帧的标志位 数据帧的标志位。 地址帧 数据帧的标志位。
方式1时 是接收到的停止位。 方式 时,若SM2=0,则RB8是接收到的停止位。 , 是接收到的停止位

TI,发送中断标志位。 ,发送中断标志位。
方式0时 串行发送第 位数据结束时 方式 时,串行发送第8位数据结束时 其它方式, 其它方式,串行发送停止位的开始时 硬件使TI置 ,发中断申请。 硬件使 置1,发中断申请。必须在中断服务程序中 软件将其清0。 用软件将其清 。

RI,接收中断标志位。 ,接收中断标志位。
方式0时,串行接收第8位数据结束时 方式 时 串行接收第 位数据结束时 其它方式, 其它方式,串行接收停止位的中间时 硬件使RI置 ,发中断申请。 硬件使 置1,发中断申请。必须在中断服务程序中 软件将其清0。 用软件将其清 。

2、电源功能寄存器PCON (87H)
PCON (87H)
SMOD

SMOD, 波特率倍增位。 , 波特率倍增位。 在方式1、 、 时 波特率与SMOD有关: 有关: 在方式 、2、3时,波特率与 有关 SMOD=1时,波特率提高一倍。复位时, 时 波特率提高一倍。复位时, SMOD=0。 。

7.2 串行口的工作方式
工作方式0 工作方式 工作方式1 工作方式 工作方式2 工作方式 工作方式3 工作方式

串行口工作方式
SM0、SM1 工作方式 00 01 10 11 方式0 方式1 方式2 方式3 功能描述 波特率

8位同步移位寄 Fosc/12 存器 10位UART 可变,由定时器 控制 11位UART Fosc/64或fosc/32 11位UART 可变,由定时器 控制

其中fosc为晶振频率。

方式0 方式

7.2.1 工作方式0

同步移位寄存器的输入输出方式。 同步移位寄存器的输入输出方式。用于扩展并行输入或 引脚输入或输出, 输出口。数据由RXD引脚输入或输出,移位脉冲由 输出口。数据由 引脚输入或输出 移位脉冲由TXD引 引 脚输出。 位数据 波特率为fosc/12。 位数据。 脚输出。8位数据。波特率为 。 方式0发送 方式 发送
写写SBUF

S6P2 SEND SHIFT RXD(DATA OUT) TXD(SHIFT CLOCK) S3P1 S6P1 TI D0 D1 D2 D3 D4 D5 D6 D7

方式0接收 方式 接收
清清SCON中的RI位

RI RECEIVE SHIFT RXD(DATA IN) D0 S5P2 TXD(SHIFT CLOCK) D1 D2 D3 D4 D5 D6 D7

方式0接收和发送电路 方式 接收和发送电路

7.2.2 工作方式1
方式1 方式
10位数据的异步通信。帧格式如图所示。 位数据的异步通信。帧格式如图所示。 位数据的异步通信
空 闲 起 始 位 D0 1帧共10位 数据位8位 D7 MSB 停 止 位 空 闲

方式1发送 方式 发送
TX CLOCK
写写SBUF

LSB

SEND S1P1 DATA

SHIFT TXD
起起位

D0

D1

D2

D3

D4

D5

D6

D7

停停位

TI

方式1接收 方式 接收
RX CLOCK RXD
起起位

D0

D1

D2

D3

D4

D5

D6

D7

停停位

位位位位位位位位

SHIFT RI

置REN为1时,接收器检测到 为 时 接收器检测到RXD引脚输入电平发 引脚输入电平发 生负跳变时,则说明起始位有效, 生负跳变时,则说明起始位有效,将其移入输入移位 寄存器,并开始接收这一帧信息的其余位。 寄存器,并开始接收这一帧信息的其余位。 当RI=0,且SM2=0(或接收到的停止位为1)时, , (或接收到的停止位为 ) 将收到的9位数据的前 位装入SBUF,第9位(停止位) 位数据的前8位装入 将收到的 位数据的前 位装入 , 位 停止位) 进入RB8,并置 请求中断。 进入 ,并置RI=1,向CPU请求中断。 , 请求中断

7.2.3 工作方式2、3
方式2和方式 方式 和方式3 和方式
11位数据的异步通信。 位数据的异步通信。 位数据的异步通信

起始位1位 数据 位 停止位1位 起始位 位,数据9位,停止位 位 方式2的波特率固定为晶振频率的 的波特率固定为晶振频率的1/64或1/32 方式 的波特率固定为晶振频率的 或 方式3的波特率由定时器 的溢出率决定 的波特率由定时器T1的溢出率 方式 的波特率由定时器 的溢出率决定

方式2和方式 发送 方式 和方式3发送 和方式
TX CLOCK
写写SBUF

SEND S1P1 DATA SHIFT TXD
起起位

D0

D1

D2

D3

D4

D5

D6

D7

TB8

停停位

TI STOP BIT GEN

先把起始位0输出到 先把起始位 输出到TXD,然后发送移位寄存器的 输出到 , 输出位( )。 )。每一移位脉冲都使输出移位寄存器 输出位(D0)。每一移位脉冲都使输出移位寄存器 的各位移动一位,并由TXD引脚输出。 引脚输出。 的各位移动一位,并由 引脚输出 最后一次移位后, 最后一次移位后,置TI=1,请求中断。 ,请求中断。

方式2和方式 接收 方式 和方式3接收 和方式
RX CLOCK RXD
起起位 停停位

D0

D1

D2

D3

D4

D5

D6

D7

RB8

位位位位位位位位

SHIFT RI

数据从右边移入输入移位寄存器, 数据从右边移入输入移位寄存器,最后一次移位 位数据为1) 后,若RI=0,且SM2=0(或接收到的第 位数据为 ) , (或接收到的第9位数据为 接收到的数据装入接收缓冲器SBUF和RB8(接 时,接收到的数据装入接收缓冲器 和 ( 收数据的第9位),置RI=1,向CPU请求中断。 收数据的第 位),置 , 请求中断。 请求中断 如果条件不满足,则数据丢失,且不置位RI 如果条件不满足,则数据丢失,且不置位

波特率的计算
方式0、 的波特率是固定的 而方式1、 的波 的波特率是固定的, 方式 、2的波特率是固定的,而方式 、3的波 特率是可变的,由定时器T1的溢出率来决定 的溢出率来决定。 特率是可变的,由定时器 的溢出率来决定。 方式0波特率 方式 波特率 = fosc/12 方式2波特率 ( 方式 波特率 =(2SMOD/64)? fosc ) 方式1波特率 ( 溢出率) 方式 波特率 =(2SMOD/32)?(T1溢出率) ) ( 溢出率 方式3波特率 ( 溢出率) 方式 波特率 =(2SMOD/32)?(T1溢出率) ) ( 溢出率 T1 溢出率 = fosc /{12×[256 -(TH1)]} × -( ) T1方式 ,TR1=1(以启动定时器) 方式2, 方式 (以启动定时器)

串行口初始化具体步骤: 串行口初始化具体步骤:
确定T1的工作方式(编程 寄存器); 确定 的工作方式(编程TMOD寄存器); 的工作方式 寄存器 计算T1的初值 装载TH1、TL1; 的初值, 计算 的初值,装载 、 ; 启动T1(编程TCON中的 中的TR1位); 启动 (编程 中的 位 确定串行口控制(编程SCON寄存器); 寄存器); 确定串行口控制(编程 寄存器 串行口在中断方式工作时, 串行口在中断方式工作时,还要进行中断设置 编程IE、 寄存器 寄存器)。 (编程 、IP寄存器)。

7.3 串行口应用举例
用串行口扩展I/O口 用串行口扩展 口 用串行口进行双机异步通信 用串行口进行多机异步通信

7.3.1 用串行口扩展I/O口
例1 用并行输入8位移位寄存器74HC165扩展16位并 行输入口。编程实现从16位扩展口读入20个字节数 据,并把它们转存到内部RAM的50H~63H中。
D0 6 P3.0 89S51
数数数写

D1 5 4

D2 3

D3 14

D4 13

D5 12

D6 11

D7 6 SIN 9 +5V 16 8

D0 5

D1 4

D2 3

D3 14

D4 13

D5 12

D6 11

D7

9 16 8

QH VCC GND 74HC165(1) CK 2

QH VCC GND 74HC165(2) CK 2

SIN

+5V

S/ L 1

S/ L 1

P3.1 P1.0

移位移移

MOV R7,#20 ; 设置读入字节数 MOV R0,#50H ; 设片内RAM指针 SETB F0 ; 设置读入字节奇偶数标志 RCV0: CLR P1.0 ; 允许并行置入数据 SETB P1.0 ; 允许串行移位 RCV1: MOV SCON,#10H ; 设串行口方式0并启动接收 JNB RI,$ ; 等待接收一帧数据 CLR RI ; 清除接收中断标志 MOV A,SBUF ; 取缓冲器数据 INC R0 CPL F0 JB F0,RCV2 ; 判断是否接收完偶数帧, 接收完则重新并行置入 DEC R7 SJMP RCV1 ; 否则再接收一帧 RCV2: DJNZ R7,RCV0 ; 判断是否已读入预定的字节数 ………… ; 对读入数据进行处理

例2 用两片8位串入并出移位寄存器74HC164扩展 16位输出接口。
+5V +5V

数数数数

P3.0 89S51 +5V

A B

Q0

Q1

Q2

Q3

Q4

Q5

Q6

Q7

Q0 A B +5V VCC GND

Q1

Q2

Q3

Q4

Q5

Q6

Q7

VCC GND

74HC164(1) CK CLR

74HC165(2) 74HC164(2) CK CLR

P3.1 移位移移 P1.0

ST: MOV SCON,#00H MOV A,#55H LP2: MOV R0,#2 CLR P1.0 极管 SETB P1.0 LP1: MOV SBUF,A JNB TI,$ CLR TI DJNZ R0,LP1 LCALL DEL2S CPL A SJMP LP2

; 设串行口方式0 ; 二极管间隔点亮初值 ; 输出口字节数 ; 对74HC164清零,熄灭所有发光二 ; 允许数据串行移位 ; 启动串行口发送 ; 等待一帧发送结束 ; 清串行口发送中断标志 ; 判断预定字节数送完否 ; 调用延时2S子程序(略) ; 交替点亮二极管 ; 循环显示

7.3.2 用串行口进行双机异步通信
例3 单片机串行口按双工方式收发ASCII字符,最高位用来作 奇偶校验位,采用奇校验方式,要求传送的波特率为1200bps, 编写有关的通信程序。
解:7位ASCII码加1位奇校验共8位数据,故可采用串行口方式1。 单片机的奇偶校验位P是当累加器A中1的数目为奇数时,P=1。如果直接把P 值放入ASCII码的最高位,恰好成了偶校验,与要求不符。因此,要把P的值取 反后,放入ASCII码的最高位,才是要求的奇校验。 双工通信要求收、发能同时进行。实际上,收发操作主要是在串行接口进 行,CPU只把数据从接收缓冲器读出和把数据写入发送缓冲器。数据传送用中 断方式进行,响应中断以后,通过检测是RI置位还是TI置位来决定CPU是进行 发送操作还是接收操作。发送和接收都通过调用子程序来完成,设发送数据区 的首地址为20H,接收数据区的首地址为40H,fosc为6MHz,通过计算初装值 x=256-fosc*(SMOD+1)/(384*波特率),可知定时器的初装值为F3H。定时 器T1采用工作方式2,可以避免计数溢出后用软件重装定时初值的工作。

主程序: MOV TMOD,#20H MOV TL1,#0F3H MOV TH1, #0F3H SETB TR1 MOV SCON,#50H REN=1 MOV R0,#20H MOV R1,#40H ACALL SOUT SETB ES SETB EA LOOP:SJMP $

; 定时器1设为工作方式2 ; 定时器初值 ; 8位重装值 ; 启动定时器1 ; 将串行口设置为方式1, ; 发送数据区首地址 ; 接收数据区首地址 ; 先输出一个字符

; 等待中断

中断服务程序如下: ORG 0023H AJMP SBR1 ORG 0100H SBR1: JNB RI,SEND ACALL SIN SJMP NEXT SEND:ACALL SOUT NEXT:RETI 发送子程序: SOUT: CLR TI MOV A,@R0 MOV C,P CPL C MOV ACC.7,C INC R0 MOV SBUF,A RET

; 串行口中断入口 ; 转至中断服务程序 ; TI=1,为发送中断 ; RI=1,为接收中断 ; 转至统一的出口 ; 调用发送子程序 ; 中断返回

; 取发送数据到A ; 奇偶标志赋予C ; 奇校验 ; 加到ASCII码高位 ; 修改发送数据指针 ; 发送ASCII码 ; 返回

接收子程序: SIN: CLR RI MOV A,SBUF MOV C,P CPL C ANL A,#7FH MOV @R1,A INC R1 RET

; 读出接收缓冲区内容 ; 取出校验位 ; 奇校验 ; 删去校验位 ; 读入接收缓冲区 ; 修改接收数据指针 ; 返回

在主程序中已初始化REN=1,则允许接收。以上程序 在主程序中已初始化 ,则允许接收。 基本上具备了全双工通信的能力,但还不够完善, 基本上具备了全双工通信的能力,但还不够完善,可以在 此基础上逐步完善。 此基础上逐步完善。

例4

单片机与单片机的通信

程序流程图

号机是发送方, 号机是接收方 号机是接收方。 号机发送时, 设1号机是发送方,2号机是接收方。当1号机发送时,先 号机是发送方 号机发送时 发送一个“E1”联络信号,2号机收到后回答一个 联络信号, 号机收到后回答一个 号机收到后回答一个“E2”应答信 发送一个 联络信号 应答信 表示同意接收。 号机收到应答信号“E2”后,开始发送 号,表示同意接收。当1号机收到应答信号 号机收到应答信号 后 数据,每发送一个数据字节都要计算“校验和 校验和”, 数据,每发送一个数据字节都要计算 校验和 ,假定数据块长 度为16个字节 起始地址为40H,一个数据块发送完毕后立即 个字节, 度为 个字节,起始地址为 , 发送“校验和 校验和”。 号机接收数据并转存到数据缓冲区 号机接收数据并转存到数据缓冲区, 发送 校验和 。2号机接收数据并转存到数据缓冲区,起始地 址也为40H,每接收到一个数据字节便计算一次 校验和 ,当 校验和”, 址也为 ,每接收到一个数据字节便计算一次“校验和 号机发来的“校验和 收到一个数据块后,再接收1号机发来的 校验和”,并将它与2 收到一个数据块后,再接收 号机发来的 校验和 ,并将它与 号机求出的校验和进行比较。若两者相等,说明接收正确, 号机求出的校验和进行比较。若两者相等,说明接收正确,2 号机回答00H;若两者不相等,说明接收不正确,2号机回答 号机回答 ;若两者不相等,说明接收不正确, 号机回答 0FFH,请求重发。1号机接到 号机接到00H后结束发送。若收到的答复 后结束发送。 ,请求重发。 号机接到 后结束发送 非零,则重新发送数据一次。双方约定采用串行口方式1进行 非零,则重新发送数据一次。双方约定采用串行口方式 进行 通信,一帧信息为10位 其中有1个起始位 个起始位、 个数据位和一个 通信,一帧信息为 位,其中有 个起始位、8个数据位和一个 停止位;波特率为2400波特,T1工作在定时器方式 ,振荡频 波特, 工作在定时器方式 工作在定时器方式2, 停止位;波特率为 波特 率选用11.0592MHZ,查表可得 率选用 ,查表可得TH1=TL1=0F4H,PCON寄存 , 寄存 器的SMOD位为 。 位为0。 器的 位为

发送程序清单如下: 发送程序清单如下: ASTART: ASTART:CLR EA TMOD, MOV TMOD,#20H TH1, MOV TH1,#0F4H TL1, MOV TL1,#0F4H PCON, MOV PCON,#00H SETB TR1 SCON, MOV SCON,#50H ALOOP1: SBUF, ALOOP1:MOV SBUF,#0E1H TI, JNB TI,$ CLR TI RI, JNB RI,$ CLR RI A, MOV A,SBUF A, XRL A,#0E2H JNZ ALOOP1 ALOOP2: R0, ALOOP2:MOV R0,#40H R7, MOV R7,#10H R6, MOV R6,#00H

;定时器1置为方式 2 定时器1 装载定时器初值,波特率2400 ;装载定时器初值,波特率2400

;启动定时器 设定串口方式1 ;设定串口方式1,且准备接收应答信号 ;发联络信号 ;等待一帧发送完毕 ;允许再发送 等待2 ;等待2号机的应答信号 ;允许再接收 号机应答后,读至A ;2号机应答后,读至A 判断2 ;判断2号机是否准备完毕 号机未准备好, ;2号机未准备好,继续联络 号机准备好, ;2号机准备好,设定数据块地址指针初值 ;设定数据块长度初值 ;清校验和单元

ALOOP3: ALOOP3:MOV MOV ADD MOV INC JNB CLR DJNZ MOV JNB CLR JNB CLR MOV JNZ RET

SBUF, SBUF,@R0 A, A,R6 A, A,@R0 R6, R6,A R0 TI, TI,$ TI R7, R7,ALOOP3 SBUF, SBUF,R6 TI, TI,$ TI RI, RI,$ RI A,SBUF A, ALOOP2

;发送一个数据字节 ;求校验和 ;保存校验和

;整个数据块是否发送完毕 ;发送校验和

;等待2号机的应答信号 等待2 ;2号机应答,读至A 号机应答,读至A 号机应答“错误 错误”, ;2号机应答 错误 ,转重新发送 号机应答“正确 正确”, ;2号机应答 正确 ,返回

接收程序清单如下: BSTART: BSTART:CLR MOV MOV MOV MOV SETB MOV BLOOP1: BLOOP1:JNB CLR MOV XRL JNZ MOV JNB CLR MOV MOV MOV EA TMOD, TMOD,#20H TH1, TH1,#0F4H TL1, TL1,#0F4H PCON, PCON,#00H TR1 SCON, SCON,#50H RI, RI,$ RI A, A,SBUF A, A,#0E1H BLOOP1 SBUF, SBUF,#0E2H TI, TI,$ TI R0, R0,#40H R7, R7,#10H R6, R6,#00H

;设定串口方式1,且准备接收 设定串口方式1 等待1 ;等待1号机的联络信号 ;收到1号机信号 收到1 判是否为1 ;判是否为1号机联络信号 不是1号机联络信号, ;不是1号机联络信号,再等待 号机联络信号, ;是1号机联络信号,发应答信号

;设定数据块地址指针初值 ;设定数据块长度初值 ;清校验和单元

BLOOP2:JNB RI,$ CLR RI MOV A,SBUF MOV @R0,A ;接收数据转储 INC R0 ADD A,R6 ;求校验和 MOV R6,A DJNZ R7,BLOOP2 ;判数据块是否接收完毕 JNB RI,$ ;完毕,接收1号机发来的校验和 CLR RI MOV A,SBUF XRL A,R6 ;比较校验和 JZ END1 ;校验和相等,跳至发正确标志 MOV SBUF,#0FFH ;校验和不相等,发错误标志 JNB TI,$ ;转重新接收 CLR TI END1:MOV SBUF,#00H RET

7.3.3 用串行口进行多机异步通信
1、多机通信原理 在多机通信时,TB8可置1或者清0,与SM2配合使用。 当SM2=1时,实现多机通信功能。若接收到的RB8=1, 接收内容进入SBUF,RI置1,向CPU发中断请求;若 RB8=0,RI不置1,即不向CPU发中断请求。当SM2=0 时,不判RB8的状态,均向CPU发中断请求。因此,在 SM2=1时,TB8/RB8可作为地址/数据标志位。根据这一 配置方式,可构成主从式多机通信系统。所谓主从 式,即在多台单片机中,有一台是主机,其余的为从 机,如图7.10所示。

多机通信
硬件连接 主从系统 在实际系统中,常采用RS-485标准进行数据传输。 在实际系统中,常采用 标准进行数据传输。 标准进行数据传输

通信协议
所有从机的SM2置1,以接收地址帧 置 , 所有从机的 主机发地址帧 所有从机收到地址帧后,将收到地址与本机地址比较: 所有从机收到地址帧后,将收到地址与本机地址比较: 相符的从机, 相符的从机,使SM2置0(以接收随后的数据帧), 置 (以接收随后的数据帧), 并把本机地址发回主机作为应答 不符的从机,保持SM2=1,对主机随后发来的数据帧 不符的从机,保持 , 不予理睬。 不予理睬。 从机发送数据结束后,要发送一帧校验和,并置第9 从机发送数据结束后,要发送一帧校验和,并置第 位(TB8)为1,作为从机数据传送结束的标志。 ) ,作为从机数据传送结束的标志。

主机接收数据时先判断数据接收标志( ),若 主机接收数据时先判断数据接收标志(RB8),若 ), RB8=1,表示数据传送结束,并比较此帧校验和,若 ,表示数据传送结束,并比较此帧校验和, 正确则回送正确信号00H,此信号命令该从机复位 正确则回送正确信号 , 即重新等待地址帧);若校验和出错, );若校验和出错 (即重新等待地址帧);若校验和出错,则发送 0FFH,命令该从机重发数据。若接收帧的 ,命令该从机重发数据。若接收帧的RB8=0, , 则存数据到缓冲区,并准备接收下帧信息。 则存数据到缓冲区,并准备接收下帧信息。 主机收到从机应答地址后,确认地址是否相符, 主机收到从机应答地址后,确认地址是否相符,如 果地址不符,发复位信号(数据帧中TB8=1);如果 );如果 果地址不符,发复位信号(数据帧中 ); 地址相符,则清TB8,开始发送数据。 地址相符,则清 ,开始发送数据。 ?从机收到复位命令后回到监听地址状态(SM2=1)。 从机收到复位命令后回到监听地址状态( 从机收到复位命令后回到监听地址状态 )。 否则开始接收数据和命令。 否则开始接收数据和命令。

应用程序
主机发地址联络信号: 主机发地址联络信号:00H,01H,02H ,… …(即从机设备地址), , , (即从机设备地址), FFH为命令各从机复位,即恢复 为命令各从机复位, 为命令各从机复位 即恢复SM2=1。 。 主机命令编码为:01H,主机命令从机接收数据;02H,主机命令从机发 主机命令编码为: ,主机命令从机接收数据; , 送数据。其它都按02H对待。 送数据。其它都按 对待。 对待

RRDY=1:表示从机准备好接收。 :表示从机准备好接收。 TRDY=1:表示从机准备好发送。 :表示从机准备好发送。 ERR=1: 表示从机接收的命令是非法的。 : 表示从机接收的命令是非法的。 程序分为主机程序和从机程序。约定一次传递数据为16 程序分为主机程序和从机程序。约定一次传递数据为 个字节, 地址的从机为例。 个字节,以01H地址的从机为例。 地址的从机为例

主机程序清单: 主机程序清单: 设从机地址号存于40H单元,命令存于41H单元。 40H单元 41H单元 设从机地址号存于40H单元,命令存于41H单元。 MAIN: TMOD, T1方式 方式2 MAIN:MOV TMOD,#20H ;T1方式2 TH1, 初始化波特率9600 MOV TH1,#0FDH ;初始化波特率9600 TL1, MOV TL1,#0FDH PCON, MOV PCON,#00H SETB TR1 SCON, 串口方式3 多机, MOV SCON,#0F0H ;串口方式3,多机,准备接收应答 LOOP1: LOOP1:SETB TB8 SBUF, MOV SBUF,40H ;发送预通信从机地址 TI, JNB TI,$ CLR TI RI, JNB RI,$ ;等待从机对联络应答 CLR RI A, 接收应答,读至A MOV A,SBUF ;接收应答,读至A A, XRL A,40H ;判应答的地址是否正确 JZ AD_OK

AD_ERR: AD_ERR:MOV JNB CLR SJMP AD_OK: AD_OK:CLR MOV JNB CLR JNB CLR MOV XRL JNZ SETB SJMP

SBUF, 应答错误,发命令FFH SBUF,#0FFH ;应答错误,发命令FFH TI, TI,$ TI LOOP1 ;返回重新发送联络信号 TB8 ;应答正确 SBUF, SBUF,41H ;发送命令字 TI, TI,$ TI RI, RI,$ ;等待从机对命令应答 RI A, 接收应答,读至A A,SBUF ;接收应答,读至A A, A,#80H ;判断应答是否正确 CO_OK TB8 ;错误处理 AD_ERR

CO_OK: CO_OK:MOV XRL JZ MOV XRL JZ LJMP RE_DATA: RE_DATA:MOV MOV MOV

A, A,SBUF A, A,#01H SE_DATA A, A,SBUF A, A,#02H RE_DATA SE_DATA R6, R6,#00H R0, R0,#30H R7, R7,#10H

;应答正确,判是发送还是接收 应答正确, ;从机准备好接收,可以发送 从机准备好接收,

;从机准备好发送,可以接收 从机准备好发送, ;清校验和接收16个字节数据 清校验和接收16个字节数据 16

LOOP2: LOOP2:JNB CLR MOV MOV INC ADD MOV DJNZ JNB CLR MOV XRL JZ MOV JNB CLR LJMP

RI, RI,$ RI A, A,SBUF @R0, @R0,A R0 A, A,R6 R6, R6,A R7, R7,LOOP2 RI, RI,$ RI A, A,SBUF A, A,R6 XYOK SBUF, SBUF,#0FFH TI, TI,$ TI RE_DATA

;接收校验和并判断 ;校验正确 ;校验错误

XYOK :MOV JNB CLR SETB LJMP SE_DATA: SE_DATA:MOV MOV MOV LOOP3 :MOV MOV JNB CLR INC ADD MOV DJNZ

SBUF, 校验和正确, SBUF,#00H ;校验和正确,发00H TI, TI,$ TI TB8 ;置地址标志 RETEND R6, 发送16 16个字节数据 R6,#00H ;发送16个字节数据 R0, R0,#30H R7, R7,#10H A, A,@R0 SBUF,A SBUF, TI, TI,$ TI R0 A, A,R6 R6, R6,A R7, R7,LOOP3

MOV MOV JNB CLR JNB CLR MOV XRL JZ SJMP RET_END: RET_END:RET

A, A,R6 SBUF, SBUF,A ;发校验和 TI, TI,$ TI RI,$ RI, RI A, A,SBUF A, A,#00H RET_END ;从机接收正确 SE_DATA ;从机接收不正确,重新发送 从机接收不正确,

从机程序清单: 从机程序清单: 设本机号存于40H单元,41H单元存放 发送”命令 42H单元存放 接收” 40H单元 单元存放“发送 命令, 单元存放“接收 设本机号存于40H单元,41H单元存放 发送 命令,42H单元存放 接收 命令。 命令。 MAIN: TMOD, MAIN:MOV TMOD,#20H ;初始化串行口 TH1, MOV TH1,#0FDH MOV TL1,#0FDH TL1, PCON, MOV PCON,#00H SETB TR1 SCON, MOV SCON,#0F0H LOOP1: LOOP1:SETB EA ;开中断 SETB ES SETB RRDY ;发送与接收准备就绪 SETB TRDY SJMP LOOP1

SERVE: SERVE:PUSH PUSH CLR CLR MOV XRL JZ LJMP SER_OK: SER_OK:CLR MOV JNB CLR JNB CLR JB MOV XRL JZ MOV XRL JZ SJMP

PSW ACC ES RI A, A,SBUF A, A,40H SER_OK ENDI SM2 SBUF, SBUF,40H TI, TI,$ TI RI,$ RI, RI RB8, RB8,ENDII A, A,SBUF A, A,41H SERISE A, A,SBUF A, A,42H SERIRE FFML

;中断服务程序

;判断是否本机地址 ;非本机地址,继续监听 非本机地址, 是本机地址, ;是本机地址,取消监听状态 ;本机地址发回

;是复位命令,恢复监听 是复位命令, 不是复位命令,判是“发送 还是“接收 发送”还是 接收” ;不是复位命令,判是 发送 还是 接收 发送”命令 ;收到“发送 命令,发送处理 收到 发送 命令,

接收”命令 ;收到“接收 命令,接收处理 收到 接收 命令, 非法命令, ;非法命令,转非法处理

SERISE: SERISE:JB MOV SJMP SEND: SEND:MOV WAIT01: WAIT01:JNB CLR JNB CLR JB LCALL LJMP FFML: FFML:MOV JNB CLR LJMP SERIRE: SERIRE:JB MOV SJMP

TRDY, TRDY,SEND SBUF, SBUF,#00H WAIT01 SBUF, SBUF,#02H TI, TI,$ TI RI, RI,$ RI RB8 ,ENDII SE_DATA END SBUF, SBUF,#80H TI, TI,$ TI ENDII RRDY ,RECE SBUF, SBUF,#00H WAIT02

;从机发送是否准备好

发送准备好” ;返回“发送准备好 返回 发送准备好

;主机接收是否准备就绪 ;发送数据 ;发非法命令,恢复监听 发非法命令,

;从机接收是否准备好

RECE: RECE:MOV WEIT02: WEIT02:JNB CLR JNB CLR JB LCALL LJMP ENDII: ENDII:SETB ENDI: ENDI:SETB END: END:POP POP RETI

SBUF, 返回“接收准备好 接收准备好” SBUF,#01H ;返回 接收准备好 TI, TI,$ TI RI, RI,$ RI RB8, RB8,ENDII ;主机发送是否就绪 RE_DATA ;接收数据 END SM2 ES ACC PSW

SE_DATA: SE_DATA:CLR TRDY R6, MOV R6,#00H R0, MOV R0,#30H R7, MOV R7,#10H LOOP2: A, LOOP2:MOV A,@R0 SBUF, MOV SBUF,A TI, JNB TI,$ CLR TI INC R0 A, ADD A,R6 R6, MOV R6,A R7, DJNZ R7,LOOP2 A, MOV A,R6 SBUF, MOV SBUF,A TI, JNB TI,$ CLR TI RI, JNB RI,$ CLR RI A, MOV A,SBUF A, XRL A,#00H JZ SEND_OK SJMP SE_DATA

;发送数据块子程序

;数据块发送完毕? 数据块发送完毕?

;发送校验和

;判发送是否正确 ;发送错误,重发 发送错误,

SEND_OK: SEND_OK:SETB SETB RET RE_DATA: RE_DATA:CLR MOV MOV MOV

SM2 ES

;发送正确,继续监听 发送正确,

RRDY ;接收数据块子程序 R6, R6,#00H R0, R0,#30H R7, R7,#10H

LOOP3: LOOP3:JNB CLR MOV MOV INC ADD MOV DJNZ JNB CLR MOV XRL JZ MOV JNB CLR

RI, RI,$ RI A, A,SBUF @R0, @R0,A R0 A, A,R6 R6, R6,A R7, R7,LOOP3 RI, RI,$ RI A, A,SBUF A, A,R6 RECE_OK SBUF, SBUF,#0FFH TI, TI,$ TI

;接收数据块完毕? 接收数据块完毕? ;接收校验和

;判断校验和是否正确 ;校验和错误,发FFH 校验和错误,

LJMP RE_DATA

;重新接收

RECE_OK: RECE_OK:MOV MOV JNB CLR SETB SETB RET

A, A,#00H SBUF, SBUF,A TI, TI,$ TI SM2 ES

;校验和正确,发00H 校验和正确,

;继续监听

1.4 本章小结
单片机的串行接口是一个全双工串行通信接口, 单片机的串行接口是一个全双工串行通信接口,从本章的 实例中可以看出,它既可以作UART(通用异步机接收和发送 实例中可以看出,它既可以作 ( 器)用,也可以作同步移位寄存器用。同时应用串行接口可以 也可以作同步移位寄存器用。 实现单片机系统之间点对点的单机通信、 实现单片机系统之间点对点的单机通信、多机通信和单片机与 系统机的单机或多机通信。 系统机的单机或多机通信。由于串行通信只用一根数据线传送 数据的位信号,就算加上几条通信控制线, 数据的位信号,就算加上几条通信控制线,也用不了很多电缆 因此,串行通信适合远距离数据传送。 线。因此,串行通信适合远距离数据传送。

思考题与习题
1. 2. 3. 4. 5. 6. 7. 8. 串行口有几种工作方式?有几种帧格式?各工作方式的波特率如何确定? 串行口有几种工作方式?有几种帧格式?各工作方式的波特率如何确定? 串行口控制寄存器SCON中SM2的含义是什么?它主要在什么方式下使用? 的含义是什么? 串行口控制寄存器 中 的含义是什么 它主要在什么方式下使用? 设当单片机晶振频率fosc为6MHz和12MHz时,定时器 处于工作方式 , 处于工作方式2, 设当单片机晶振频率 为 和 时 定时器1处于工作方式 PCON=00H,分别求在两种频率下单片机处于串行方式 ,波特率为 ,分别求在两种频率下单片机处于串行方式1, 1200bps时,T1的定时初值。 的定时初值。 时 的定时初值 用定时器T1作波特率发生器 并把T1设置成工作方式 作波特率发生器, 设置成工作方式2, 用定时器 作波特率发生器,并把 设置成工作方式 ,系统时钟频率为 12MHz,求可能产生的最高和最低波特率? ,求可能产生的最高和最低波特率? 以串行口按工作方式1进行串行数据通信 假定波特率为1200bps,以中断方 进行串行数据通信。 以串行口按工作方式 进行串行数据通信。假定波特率为 , 式传送数据。请编写全双工通信程序。 式传送数据。请编写全双工通信程序。 设fosc=11.0592MHz,试编写一段程序,其功能为对串行口初始化,使之工 = ,试编写一段程序,其功能为对串行口初始化, 作于方式1,波特率为1200bps;并用查询串行口状态的方法,读出接收缓冲 作于方式 ,波特率为 ;并用查询串行口状态的方法, 器的数据并回送到发送缓冲器。 器的数据并回送到发送缓冲器。 以串行口按工作方式3进行串行数据通信 假定波特率为1200bps,第九数据 进行串行数据通信。 以串行口按工作方式 进行串行数据通信。假定波特率为 , 位作奇偶校验位,以中断方式传送数据。请编写通信程序。 位作奇偶校验位,以中断方式传送数据。请编写通信程序。 设计一个单片机的双机通信系统,并编写通信程序。将甲机内部 设计一个单片机的双机通信系统,并编写通信程序。 RAM30H~3FH存储区的数据块通过串行口传送到乙机内部 存储区的数据块通过串行口传送到乙机内部RAM 40H~4FH存 存储区的数据块通过串行口传送到乙机内部 存 储区中去。 储区中去。


相关文章:
深刻理解UART
深刻理解UART_计算机硬件及网络_IT/计算机_专业资料。UART 异步串行UART 异步...通信协议(通信规程):是指通信双方约定的一些规则。在使用异步串口传送一个 字符...
六、通用异步串行口(UART)
六、通用异步串行口(UART)_计算机硬件及网络_IT/计算机_专业资料。通用异步串行...掌握异步串行通信协议; 2. 掌握 2812 异步收发器模块的应用。 二、实验设备 1...
uart协议标准
该文件简要分析了UART协议,以及具体的物理层协议RS232和RS485的关系,还简要介绍了DB-9标准接口在RS485和RS232中的具体接法。Uart 协议 协议,也就是异步串行通信...
SPI、I2C、UART三种串行总线协议的区别
SPI、I2C、UART三种串行总线协议的区别_工学_高等教育...必须经过 UART 整理才能进行异步传输,其过程为:CPU ...i2c总线协议(中文版pdf) 38页 1下载券 SPI协议 15...
UART异步串口
MSP430 程序库 二>UART 异步串口 程序库<二串行通信接口是处理器与其他设备...第七讲-异步串行口UART 7页 免费 异步串行UART协议详解 中... 56页 2下载...
通用异步串行口(UART)实验
掌握异步串行通信协议; 2. 掌握 2812 异步收发器模块的应用。 通用异步串行口(UART)实验 二、 实验设备 1. 一台装有 CCS 软件的计算机; 2. DSP 试验箱的 ...
UART以及其他接口协议
UART以及其他接口协议_信息与通信_工程科技_专业资料。UART 以及其他接口协议 2007-06-26 16:42 由于在消费类电子产品、计算机 外设、汽车和工业应用中增加了 嵌入...
SPI、I2C、UART三种串行总线的原理、区别及应用
三线制,网上可找到其通信协议和用法的 3 根线实现数据双向传输 串行外围接口 Serial peripheral interface UART:通用异步收发器 UART 是用于控制计算机与串行设备的...
SPI、I2C、UART串行总线协议
SPI、I2C、UART串行总线协议_理学_高等教育_教育专区。SPI、I2C、UART串行总线协议...i2c总线协议(中文版pdf) 38页 1下载券 异步串行UART协议详解 中... 56页 2...
SPI、I2C、UART三种串行总线协议的区别
SPI、I2C、UART 三种串行总线协议的区别第一个区别当然是名字: SPI(Serial ...通用异步收发器) 第二,区别在电气信号线上: SPI 总线由三条信号线组成:串行...
更多相关标签:
uart串行通信详解 | uart 并行 串行 | 异步串行通信 | 同步串行和异步串行 | 异步串行 | ios异步串行队列 | 异步串行通信协议 | 同步异步 串行并行 |