1/95
增强型8051单片机实用开发技术
第8章 串行通信
通信的有关概念
STC12C5A60S2单片机的串行接口
STC12C5A60S2单片机的SPI接口
2/95
增强型8051单片机实用开发技术
通信的有关概念
实际应用中,计算机的CPU与外部设备之间常常要进
行信息的交换,计算机之间也需要交换信息,所有这些
信息的交换均称为“通信”。
3/95
增强型8051单片机实用开发技术
并行通信与串行通信并行通信与串行通信
通信的基本方式可分为并行通信和串行通信两种。
并行通信,是指数据的各位同时进行传送的方式。其特
点是传输速度快,但当距离较远,位数又多时导致了通
信线路复杂且成本高。串行通信,是指数据一位一位的
顺序传送的通信方式。其特点是通信线路简单,只要一
对传输线就可以实现通信,从而大大的降低了成本,特
别适用于远距离通信,但传送速度慢。
4/95
增强型8051单片机实用开发技术
.按照串行数据的同步方式分类按照串行数据的同步方式分类
按照串行数据的同步方式,串行通信本身又分为异步传送和同步传送两种
基本方式。
(1)异步传送
在异步传送中,每一个字符要用起始位和停止位作为字符开始和结束
的标志,它是以字符为单位一个个的发送和接收的。
异步传送时,每个字符的组成格式如下:首先是一个起始位表示字符
的开始;后面紧跟着的是字符的数据字,数据字可以是5,6,7或8位数据,
在数据字中可根据需要加入奇偶校验位;最后是停止位,其长度可以是一
位,一位半或两位。所以,串行传送的数据字节加上成帧信号起始位和停
止位就形成一个字符串行传送的帧。起始位用逻辑“0”低电平表示,停
止位用逻辑“1”高电平表示。图(a)所示为数据字为7位的ASCII码,第
8位是奇偶校验位。加上起始位、停止位,一个字符由10位组成。这样形
成帧信号后,字符便可以一个接一个的传送了。
在异步传送中,字符间隔不固定,在停止位后可以加空闲位,空闲位
用高电平表示,用于等待发送。这样,接收和发送可以随时的或间断的进
行,而不受时间的限制。图(b)为有空闲位的情况。
串行通信的分类串行通信的分类
5/95
增强型8051单片机实用开发技术
6/95
增强型8051单片机实用开发技术
(2)同步传送
所谓同步传送就是去掉异步传送时每个字符的起始位和停止位的
成帧标志信号,仅在数据块开始处用同步字符来指示。如下图所示。
同步传送的有效数据位传送速率高于异步传送,可达50千波特。其缺
点是硬件设备较为复杂,因为它要求要有时钟来实现发送端和接收端
之间的严格同步,而且对时钟脉冲信号的相位一致性还要求非常严格,
为此通常还要采用“锁相器”等措施来保证。
在异步数据传送中,CPU与外设之间事先必须约好两项事宜:
第一、字符格式。双方要约好字符的编码形式、奇偶校验形式、以
及起始位和停止位的规定。
第二、波特率(Baud rate)。波特率是衡量数据传送速率的指标,
它要求发送站和接收站都要以相同的数据传送速率工作。
7/95
增强型8051单片机实用开发技术
2.按照数据的传送方向分类
1)点对点传输
一般情况下,串行数据传送是在两个通信端之间进行的。其数据
传送的方式有如图所示的几种情况。
图(a)为单工通信方式。A端为发送站,B端为接收站,数据仅能
从A站发至B站。
图(b)为半双工通信方式。数据可以从A发送到B,也可以由B发送
到A。不过同一时间只能作一个方向的传送,其传送方式由收发控制开
关K来控制。
图(c)为全双工通信方式。每个站(A、B)既可同时发送,又可
同时接收。
8/95
增强型8051单片机实用开发技术
2)主从多终端通信方式
A站可以向多个终端(B、C、D…)发出信息。在A站允许的条件
下,可以控制管理B、C、D…等站在不同的时间向A站发出信息。根据
数据传送的方向又可分为多终端半双工通信和多终端全双工通信。这
种多终端通信方式常用于主――从计算机系统通信中。
9/95
增强型8051单片机实用开发技术
通用的异步接收器/发送器UART
在串行传送中,数据是一位一位按顺序进行的,而计算机内部的
数据是并行的。因此当计算机向外发送数据时,必须将并行的数据转
换为串行的数据再行传送。反之,又必须将串行数据转换为并行数据
输入计算机中。上述并→串或串→并的转换既可以用通用的异步接收
器/发送器实现。
通用的异步接收器/发送器,简称UART(Universal Asynchronous
Receiver/Transmitter),是串行接口的核心部件,其结构如图所示,
它既能发送,由并行→串行输出;又能接收,由串行→并行输入。对
每一方来说都是一个双缓冲器结构。当UART接收数据时,串行数据先
经RXD端(Receiver Data)进入移位寄存器,再经移位寄存器输出并
行数据到缓冲器,最后通过数据总线送到CPU;当UART发送信息时,先
由CPU经数据总线将并行数据送给缓冲器,再由并行缓冲器送给一位寄
存器,最后逐位由TXD(Transmitter Data)端输出。所有这些工作都
是在时钟信号和其他控制信号作用下完成的。
10/95
增强型8051单片机实用开发技术
11/95
增强型8051单片机实用开发技术
STC12C5A60S2单片机的串行口单片机的串行口
STC12C5A60S2单片机具有2个采用UART工作方式
的全双工串行通信接口(串口1和串口2)。每个串口由2个
数据缓冲器、1个移位寄存器、1个串行控制寄存器和一个
波特率发生器等组成。每个串口的数据缓冲器由串行接收
缓冲器和发送缓冲器构成,它们在物理上是独立的,既可
以接收数据也可以发送数据,还可以同时发送和接收数据。
接收缓冲器只能读出,不能写入,而发送缓冲器则只能写
入,不能读出。它们共用一个地址号。STC12C5A60S2的
串行口既可以用于串行异步通信,也可以构成同步移位寄
存器。如果在串行口的输入/输出引脚上加上电平转换器,
可以方便地构成标准的RS-232接口。串口1与传统8051单片
机的串口完全兼容。串口2的结构、工作原理与串口1类似。
12/95
增强型8051单片机实用开发技术
串行接口的寄存器串行接口的寄存器
与串行接口1相关的寄存器有SCON、PCON、AUXR、SBUF、TMOD、
TL1、TH1、TCON、IE、IP、IPH、SADEN和SADDR。
与串行接口2相关的寄存器有:S2CON、S2BUF、BRT、AUXR、IE2、
IP2、IPH2和AUXR1。
D7 D 6 D 5 D 4 D 3 D 2 D 1 D 0
SM
0
/FE SM
1
SM
2
REN TB
8
RB
8
TI RI
SM0/FE:PCON寄存器中的SMOD0位为1时,该位用于帧错误检
测,当检测到一个无效停止位时,通过UART接收器设置该位。它必须由
软件清零。PCON寄存器中的SMOD0为0时,该位和SM1一起指定串行通
信的工作方式
1. 串口1控制寄存器SCON
SCON(地址为98H,复位值为00H)用于确定串行通道的操
作方式和控制串行通道的某些功能。也可用于发送和接收第九个数
据位(TB8、RB8),并设有接收和发送中断标志(RI及TI)位。
SCON各位的意义如下:
13/95
增强型8051单片机实用开发技术
SM
0
/FE SM
1
方式 说明 波特率
0 0 0 移位寄存器工作方式 f
OSC
/12
0 1 1 8位数据位的UART工作方式 可变
1 0 2 9位数据位的UART工作方式 f
OSC
/64,f
OSC
/32
1 1 3 9位数据位的UART工作方式 可变
SM2:在方式2和方式3时,如SM2=1,只有在接收数据第9位为1时才
能激发中断标志(RI=1)。在方式1时,如SM2=1,则只有在接收到有
效停止位时才能激发中断标志(RI=1)。在方式0时,SM2应为0。
REN:允许串行I/O口接收控制位。用软件置REN=1时为允许接收状
态,可启动串行口的接收器RXD,开始接收数据。用软件复位
(REN=0)时,为禁止接收状态。
TB8:在方式2和方式3时,它是要发生的第九个数据位,按需要由软
件进行置位或清零。例如可用作数据的奇偶校验位,或在多机通信中表
示是地址帧/数据帧标志位(TB8=1/0)。
RB8:在方式2和方式3时,它是接收到的第九位数据,作为奇偶位或
地址帧/数据帧标志位。在方式1时,若SM2=0,则RB8是接收到的停止
位,在方式0时,不使用RB8。
14/95
增强型8051单片机实用开发技术
TI:发生中断标志位。在方式0时,当串行发送数据字第八位结束时,
由内部硬件置位(TI=1),向CPU申请发生中断。CPU响应中断后,必须用软
件清零,取消此中断标志。在其他方式时,它在停止位开始发送时由硬件置
位。同样,必须用软件使其复位。
RI:接收中断标志位。在方式0时,串行接收到第八位结束时由内部硬
件置位。在其他方式中,它在接收到停止位的中间时刻由硬件置位,也必须
用软件来复位。
当一帧数据发送完成时,发送中断标志TI被置位,接着发生串口中断,
进入串口中断服务程序。但CPU事先并不能分辨是TI还是RI的中断请求,
因此,必须在中断服务程序中用位测试指令加以判别。两个中断标志位TI及
RI均不能自动复位,必须在中断服务程序中使用清中断标志位指令,撤销
中断请求状态,否则原先的中断标志位状态又将表示有中断请求。
15/95
增强型8051单片机实用开发技术
2. 串口2控制寄存器S2CON
寄存器S2CON(地址为9AH,复位值为00H)用于确定串口2的操
作方式和控制串口2的某些功能,也可用于发送和接收第9个数据位
(S2TB8、S2RB8),并设有接收和发送中断标志(S2RI及S2TI)位。
S2CON各位的意义如下:
位号 D7 D 6 D 5 D 4 D 3 D 2 D 1 D 0
位名称 S2SM0 S2SM1 S2SM2 S2REN S2TB8 S2RB8 S2TI S2RI
寄存器S2CON的各个位与寄存器SCON的各个位含义和功能都类似,
读者可以进行对比学习,在此,不再赘述。
16/95
增强型8051单片机实用开发技术
3. 掉电控制寄存器PCON
PCON(地址为87H,复位值为30H)中的SMOD用于设置方式1、方式
2和方式3的波特率是否加倍。各位的定义如下:
位号 D7 D6 D5 D4 D3 D2 D1 D0
位名称 SMOD SMOD0 LVDF POF GF1 GF0 PD IDL
其中,与串行通信相关的位是SMOD和SMOD0。
SMOD:串行口波特率系数控制位。复位时,SMOD=0。
1:使方式1、方式2和方式3的波特率加倍。
0:各工作方式的波特率不加倍。
SMOD0:帧错误检测有效控制。复位时,SMOD0=0。
1:SCON寄存器中的SM0/FE位用于FE(帧错误检测)功能。
0:SCON寄存器中的SM0/FE位用于SM0功能,和SM1一起指定
串行通信的工作方式。
17/95
增强型8051单片机实用开发技术
4.辅助寄存器AUXR
辅助寄存器AUXR(地址为8EH,复位值为00H)各位的定义如下:
T0x12和T1x12用于设置定时器0和定时器1的速度。详见“第8
章 定时/计数器与可编程计数器阵列”一章。EXTRAM用于设置是否允许
使用内部扩展的1024字节扩展RAM。
1)UART_M0x6:串行口模式0的通信速度设置位。
0:UART串口模式0的速度是传统12T的8051速度,12分频。
1:UART串口模式0的速度是传统12T的8051的6倍,2分频。
2)BRTR:独立波特率发生器运行控制位。
0:不允许独立波特率发生器运行。
1:允许独立波特率发生器运行。
3)S2SMOD:UART2的波特率加倍控制位。
0:UART2的波特率不加倍。
1:UART2的波特率加倍。
位号 D7 D6 D5 D4 D3 D2 D1 D0
位名称 T0x12 T1x12 UART_M0x6 BRTR S2SMOD BRTx12 EXTRAM S1BRS
18/95
增强型8051单片机实用开发技术
4)BRTx12:独立波特率发生器计数控制位。
0:独立波特率发生器每12个时钟计数一次。
1:独立波特率发生器每1个时钟计数一次。
5)S1BRS:串口1波特率发生器选择位。
0:选择定时器1作为串口1波特率发生器。
1:选择独立波特率发生器作为串口1的波特率发生器,此时定时
器1得到释放,可以作为独立定时器使用。
★ 注意:对于具有串口2的STC12C5A60S2单片机,串口2只能使用独
立波特率发生器作为波特率发生器,不能够选择定时器1作为波特率发生
器;串口1可以选择定时器1作为波特率发生器,也可以选择独立波特率
发生器作为波特率发生器。
19/95
增强型8051单片机实用开发技术
5.独立波特率发生器寄存器BRT
独立波特率发生器寄存器BRT(地址为9CH,复位值为00H)用于
保存重装时间常数。
6.从机地址控制寄存器
为了方便多机通信,STC12C5A60S2单片机设置了从机地址控制寄存器
SADEN和SADDR。其中,SADEN是从机地址掩模寄存器(地址为B9H,复
位值为00H),SADDR是从机地址寄存器(地址为A9H,复位值为00H)。
7.数据缓冲器
数据缓冲器用于保存要发送的数据或者从串口接收到的数据。串口1的数
据缓冲器是SBUF,串口2的数据缓冲器是S2BUF。
对于串口1,当一个字符接收完毕,移位寄存器中的数据字节装入串行接
收数据缓冲器SBUF中,其第9位则装入SCON寄存器的RB8位。如果SM2使得
已接收的数据无效,则RB8位和SBUF缓冲器中的内容不变。
对于串口2,当一个字符接收完毕,移位寄存器中的数据字节装入串行接
收数据缓冲器S2BUF中,其第9位则装入S2CON寄存器的S2RB8位。如果
S2SM2使得已接收的数据无效,则S2RB8位和S2BUF缓冲器中的内容不变。
无论对于串口1还是串口2,发送缓冲器只能写入,不能读出;接收缓冲器
只能读出,不能写入。因此,串口1的两个缓冲器共用一个地址号(99H),
串口2的两个缓冲器共用一个地址号(9BH)。
20/95
增强型8051单片机实用开发技术
(4)串行收发寄存器 SBUF(字节地址99H,没有位寻址)
在所有的串行方式中,在写SBUF信号的控制下,将其数据装入移
位寄存器,前面8位为数据字节,其最低位就是移位寄存器的移位输出
位。根据不同的工作方式会将“1”或TB
8
的值装入移位寄存器的第九位,
并进行发送。
当一个字符接收完毕,移位寄存器中的数据字节装入串行接收数
据缓冲器SBUF中,其第九位则装入SCON寄存器的RB8位。如果SM2使得
已接收的数据无效,则RB
8
位和SBUF缓冲器中的内容不变。
发送缓冲器只能写入不能读出,而接收缓冲器只能读出,不能写
入。因而两个缓冲器可共有一个地址号(99H)。
21/95
增强型8051单片机实用开发技术
串行接口的四种工作方式串行接口的四种工作方式
1.方式0-移位寄存器方式。
(1)串口1的工作方式0
串行口输出端可直接与移位寄存器相连,也可用作扩展I/O口或外接同步输入
输出设备。
发送过程:当CPU将数据写入到发送缓冲区SBUF时,串行口即把8位数据以
Fosc/12的波特率由RXD引脚输出,同时由TXD引脚输出同步脉冲。字符发送完
毕,置中断标志TI为1。
接收过程:控制字除方式0外,还应置允许接收控制位REN=1。清除RI中断
标志。接收器启动后RXD为数据输入端,TXD为同步信号输出端。接收器以
Fosc/12波特率采样RXD引脚输入的数据信息。当接收完8位数据时又重新置
RI=1。
方式0工作时,必须使SCON控制字的SM2位(多机通信控制位)为0。由于
波特率固定,无须用定时器提供。但以中断方式传送数据时,CPU响应中断并
不会自动清除TI、RI标志,所以在中断服务程序中必须由指令清0。例如CLR
TI及CLR RI指令。
(2)串口2的工作方式0
串行数据通过RXD2/(RXD2/)接收和发送,
TXD2/(TXD2/)输出同步移位时钟,发送接收的是8位数据,低位在
先,波特率固定在Fosc/12。
22/95
增强型8051单片机实用开发技术
方式0工作
方式波形图
23/95
增强型8051单片机实用开发技术
2.其他方式-UART方式
(1)串口1的UART方式
发送过程:CPU执行数据写入发送缓冲区SBUF的指令即可启动发送(如
MOV SBUF,A)。串行口内自动将发送缓冲区中内容送入发送移位寄存器。发
送移位寄存器先发一个起始位,接着按程序设定每个字符的代码,先低位后
高位。数据字加上奇偶校验位或可控位(方式2,3中即为程序设定的TB
8
位
的值),再发停止位,从而完成一帧的发送。串行数据均由TXD端输出,发
送完毕将中断标志位置1,以供查询及向CPU申请中断之用。
接收过程:接收数据均由RXD输入,串行口以所选定的波特率的16倍速
率采样RXD端状态。当采样的RXD端电平由1到0的跳变时,就启动接收器。串
行口按程序审定的格式接收一帧代码,并把此码的数据位拼成并行码送入接
收缓冲寄存器中(在方式1时,把停止位:方式2、3时把程控的第九位数据
都送入RB8),等待CPU取走。为保证可靠无误,对每一数据位要进行连续3
次采样,接收的值取3次采样中至少相同的二次的值。接收完毕,置接收中
断标志RI=1。CPU的响应中断后必须在中断服务程序中使RI清零。
24/95
增强型8051单片机实用开发技术
方式1工作方式波形图
25/95
增强型8051单片机实用开发技术
方式2、3工作方式波形图
26/95
增强型8051单片机实用开发技术
方式1与方式2、3的区别之一是:方式1其数据字是8位异步通信
接口,串行口发送/接收收共10位信息,第0位为起始位“0”,1—8
位是数据位,最后是停止位“1”;方式2、3其数据字为9位的异步
通信接口。1位起始位“0”,8位数据位,第9位是可程控位“1”或
“0”,最后是停止位“1”,共有11位信息。
方式1与方式2、3的区别之二是:方式1、3的波特率是可变的,
其波特率取决于定时器1的溢出率和特殊功能寄存器PCON中的SMOD位
的值,即
工作方式1、3的波特率=2SMOD×(定时器1的溢出率)/32
而工作方式2的波特率=2SMOD×(振荡器频率)/64
显然,方式2的波特率变化范围比方式1、3小,这也是方式2和
方式3的唯一区别。
TB8可用于多机通信或作为奇偶校验位使用。若以TB8位作为奇
偶校验位,处理方法为数据写入SBUF之前,先将数据的奇偶位写入
TB8(设工作寄存器区2的R0作为发送数据区地址指针)。
27/95
增强型8051单片机实用开发技术
RIPTI: PUSH PSW ;保护现场
PUSH ACC
SETB
CLR
CLR TI ;发送中断标志TI清零
MOV A,@R0 ;取数据
MOV C,P
MOV TB8,C
MOV SBUF,A ;数据写入到发送缓冲器,启动发送器
INC R0 ;数据指针加1
POP ACC
POP PSW ;恢复现场
RETI
28/95
增强型8051单片机实用开发技术
对输入方式而言,除选不同的方式控制外,均应使
REN=1,允许串行接收。只有在最后的移位脉冲产生并同时
满足下列二个条件时,才会产生接收数据装入SBUF和RB8及
置位RI的信号:
对方式1 对方式2、3
1)RI=0 1)RI=0
2)SM2=0或接收到的停止位=1 2)SM2=0或接收到的第
九个数据=1
如果不满足上述条件,接收到的信号将不可避免的丢
失。由此可见,中断标志必须由用户在中断服务程序中设
置清“0”指令。否则,将有可能产生另一次中断而造成混
乱并影响后序数据的接收。
29/95
增强型8051单片机实用开发技术
(2)串口2的UART方式
1)模式1:10位数据通过TXD2/(TXD2/)
发送,通过RXD2/(RXD2/)接收。一帧数据包含一
个起始位(0),8个数据位和一个停止位(1)。接收时,停止
位进入特殊功能寄存器S2CON的S2RB8位。波特率由独立
波特率发生器BRT的溢出率决定。
2)模式2:11位数据通过TXD2/(TXD2/)
发送,通过RXD2/(RXD2/)接收。一帧数据包
含一个起始位(0),8个数据位,一个可编程的第9位和一个
停止位(1)。发送时,第9位数据由特殊功能寄存器S2CON
的S2TB8位确定;接收时,第9位数据进入特殊功能寄存
器S2CON的S2RB8位。波特率为:Fosc/32或者Fosc/64。
3)模式3:波特率的确定方法与模式1相同,数据的
传输模式和模式2相同。
30/95
增强型8051单片机实用开发技术
多处理机通信多处理机通信
下面以使用串口1为例说明多机通信的过程。
串行口控制寄存器SCON中的SM2位为方式2和方式3工作时进行
多机通信的控制位。这种多机通信方式一般为一台主机:多
台从机系统;主机发送信息可被各从机接收,而从机只能对
主机发送信息。而从机间互相不能直接通信。
31/95
增强型8051单片机实用开发技术
多机系统中使用两类信息,一类是地址信息,用于选择从机;另
一类是要传送的数据信息。在通信中使用第9位区分两类信息。
地址帧:第9位为1
数据帧:第9位为0
从机系统由初始化程序(或相关处理程序)将串行口置成工作方
式2或3,SM2=1,REN=1,处于接收状态。当主机和某一从机通信时,
主机应先发出地址帧确定某从机的地址,接着才能送数据或命令。当
各从机接收到主机发出的地址帧信息后,由于第9数据位为“1”,可
激发中断标志RI=1,分别中断CPU。各CPU响应中断后均进入中断服务
程序,在服务程序中把主机送来的地址号与本从机的地址号相比较,
若地址相等,则使本机之SM2置“0”,为接收主机接着送来的数据帧
作准备。而地址号不符的其他从机仍然维持SM2=1状态,对主机以后
发出的数据帧信息不予理睬,不激发中断标志RI=0,直到与主机发出
的地址信息相符后,才可接收以后的数据信息。从而实现了主从一对
一通信(点――点通信)。在多机通信时,SM2控制位起着极为重要
的作用。
32/95
增强型8051单片机实用开发技术
方式0:
串口1:波特率为振荡频率的1/12或1/2(由UART_M0x6决定)。
串口2:波特率为振荡频率的1/12,忽略波特率发生器。
方式2:
波特率是可编程设定的,有两种波特率可选择,它取决于电源控制寄存器PCON中
SMOD位的值,当SMOD=0时,为振荡频率的1/64;当SMOD=1时,为振荡频率的1/32。
工作于方式1和3时:波特率是可变的。
对于串口1,可以通过编程改变定时器1的溢出率或者独立波特率发生器的溢出率
来确定波特率。对于串口2,只能通过编程改变独立波特率发生器的溢出率来确定波特
率。
波特率= ×(定时器1的溢出率或独立波特率发生器的溢出率 )
定时器1作为波特率发生器应用时,最典型的用法是定时器1工作在自动再装入时
间常数的定时方式2(即定时器的方式控制寄存器TMOD的高四位为0010B状态。定时器
的控制寄存器TCON的(TR1)=1启动定时器1,禁止定时器中断)。这时溢出率
取决于TH1中的自动重新再装入值。定时器1的溢出率可由下式算出:
溢出率=
其中,12T模式时,n=1;1T模式时,n=0。将此值代入求波特率的算式,可求得
串行口的波特率=
波特率的设定波特率的设定
33/95
增强型8051单片机实用开发技术
当使用独立波特率发生器BRT时,独立波特率发生器的溢出
率为:
独立波特率发生器的溢出率=Fosc/[12n×(256 –BRT)]
其中,BRT为BRT寄存器的值。对于独立波特率发生器BRT
,1T模式是指BRTx12=1,12T模式是指BRTx12=0。12T模式时,
n=1;1T模式时,n=0。此时,串行口的波特率计算公式为:
串行口的波特率=
由于串口2只能使用独立波特率发生器,因此,在使用串口2
时,应特别注意波特率的设置方法。
34/95
增强型8051单片机实用开发技术
SMOD = 0时,自动重装时间常数RELOAD的计算方法:
(1)计算RELOAD
1)12T模式的计算公式:RELOAD = 256 - INT(fosc/Baud0/32/12 + )
2)1T模式的计算公式:RELOAD = 256 - INT(fosc/Baud0/32 + )
式中,INT( )表示取整运算即舍去小数,在式中加 可以达到四舍五入的目的。fosc为晶振频率;
Baud0为标准波特率。
(2)计算用RELOAD产生的波特率
1)12T模式:Baud = fosc/(256 - RELOAD)/32/12
2)1T模式:Baud = fosc/(256 - RELOAD)/32
(3)计算误差率
error = (Baud - Baud0)/Baud0 * 100%
(4)如果误差率> %,则需要更换波特率或者更换晶体频率, 重复步骤 1)- 4)。
例如:设fosc = ,Baud0 = 57600,则12T模式时,
RELOAD = 256 - INT( 22118400/57600/32/12 + ) = 255 = 0FFH
Baud = 22118400/(256-255)/32/12 = 57600 误差等于零。
又如,设fosc = ,Baud0 = 57600,则12T 模式时,
RELOAD = 256 - INT( 18432000/57600/32/12 + ) = 0FFH
Baud = 18432000/(256-255)/32/12 = 48000
误差:error = (48000 - 57600)/57600 * 100% = %
误差很大,需要更换波特率或者更换晶体频率。
在实际设计时,为了保证通信的可靠性,应尽量保证设计后的误差为0。
常用波特率与系统时钟及定时器1的重装时间常数等设置关系 请参考表8-4。
35/95
增强型8051单片机实用开发技术
串行接口通信应用举例串行接口通信应用举例
1、串口1的编程要点
(1)设置串口的工作模式
设置SCON寄存器的内容。若要串口接收,需将其中的REN位置1。
(2)设置正确的波特率
1)使用定时器1作为波特率发生器时,需要设置定时器1的工作方式和时
间常数(设定TMOD和TH1、TL1寄存器的内容);启动定时器1(置位
TR1)。
2)使用独立波特率发生器时,需要设置独立波特率发生器寄存器和相应
的位,包括:独立波特率发生器寄存器BRT,BRTx12位,SMOD位。启动
BRT(置位BRTR),BRT开始计数。
(3)设置串口的中断优先级(设置PS和PSH,也可以不设置,取默认值),设
置相应的中断控制位(ES和EA)。
(4)如要串口1发送,将数据送入SBUF。
(5)编制串行中断服务程序,在中断服务程序中要有清除中断标志指令(将TI
和RI清零)。
36/95
增强型8051单片机实用开发技术
2、串口2的编程要点
(1)设置串口2的工作模式
设置S2CON寄存器中的S2SM0和S2SM1两位。如要串口2接收,将
S2REN置1。
(2)设置串口2的波特率相应的寄存器和位,包括:独立波特率
发生器寄存器BRT、BRTx12和S2SMOD位。启动BRT(置位
BRTR),BRT开始计数。
(3)设置串口2的中断优先级(设置PS2和PS2H,也可以不设置,
取默认值),设置打开相应的中断控制位(ES2和EA)。
(4)如要串口2发送,将数据送入S2BUF。
(5)编制串行中断服务程序,在中断服务程序中要设置清除中断
标志指令(分别是接收完成标志S2RI和发送完成标志S2TI)。
37/95
增强型8051单片机实用开发技术
例8-1 设有甲、乙两台单片机,编出两台单片机间实现
如下串行通信功能的程序。
甲机发送:将首址为ADDRT的128个字节的数据块
顺序向乙机发送;
乙机接收:将接收的128个字节的数据,顺序存放
在以首址为ADDRR的数据缓冲区中。
编制该类程序的要点是,选定正确的控制字,以
保证接口功能的初始化;选择合适的波特率,这主要
是选择定时器1的方式和时间常数的确定;最后还应注
意是在串行中断服务程序中要设置清除中断标志指令,
否则将产生另一个中断。
38/95
增强型8051单片机实用开发技术
甲机发送程序流程图
39/95
增强型8051单片机实用开发技术
汇编语言发送程序如下:
$include () ;包含STC12C5A60S2单片机寄存器定义文件
ORG 0000H
LJMP MAINT ;跳至主程序入口
ORG 0023H
LJMP INTSE1 ;转至串行中断服务程序
ORG 0100H
MAINT: MOV SP,#60H ;设置堆栈指针
MOV SCON,#01000000B ;置串行口工作方式1
MOV TMOD,#20H ;定时器1为工作方式2
MOV TH1,#0FDH ;产生9600bps的时间常数
MOV TL1,#0FDH
SETB TR1 ;启动定时器1
SETB ES ;串行口开中断
SETB EA ;开中断
MOV DPTR,#ADDRT ;ADDRT是首址,可以使用EQU定义
MOV R0,#00H ;传送字节数初值
MOVX A,@DPTR ;取第一个发送字节
MOV SBUF,A ;启动串行口发送
SJMP $ ;等待中断
;中断服务程序
INTSE1: CLR TI ;将中断标志清零
CJNE R0,#7FH,LOOPT ;判断128B是否发送完,若没完,则转LOOPT
CLR ES ;全部发送完毕,禁止串行口中断
LJMP ENDT ;转中断返回
LOOPT: INC R0 ;修改字节数指针
INC DPTR ;修改地址指针
MOVX A,@DPTR ;取发送数据
MOV SBUF,A ;启动串行口
ENDT: RETI ;中断返回
END
40/95
增强型8051单片机实用开发技术
对应的C语言程序如下:
#include “” //包含STC12C5A60S2单片机寄存器定义文件
unsigned char xdata ADDRT[128]; //在外部RAM区定义128个单元
unsigned char num=0; //声明计数变量
unsigned char *psend; //指向发送数据区的指针
void main (void) //主程序
{
SCON=0x40; //置串行口工作方式1
TMOD=0x20; //定时器1为工作方式2
TH1=0xFD; //产生9600bps的时间常数
TL1=0xFD;
TR1=1; //启动定时器1
ES=1; //串行口开中断
EA=1; //开中断
psend=ADDRT; //设置发送数据缓冲区指针
SBUF=*psend; //发送第一个数据
while(1); //等待中断
}
void UART_ISR(void) interrupt 4 //中断号4是串行中断
{
TI = 0; //清发送中断标志
num++; //修改计数变量值
if(num==0x7F) ES=0; //判断是否发送完,若已完,则关中断
else //否则,修改指针,发送下一个数据
{
psend++;
SBUF=*psend;
}
}
41/95
增强型8051单片机实用开发技术
乙机接收数据流程图
42/95
增强型8051单片机实用开发技术
接收程序如下(汇编语言): 对应的C语言程序请思考
$include () ;包含STC12C5A60S2单片机寄存器定义文件
ORG 0000H
LJMP MAINR ;转主程序
ORG 0023H
LJMP INTSE2 ;转串行口中断服务程序
ORG 0100H
MAINR: MOV SP,#60H ;设置堆栈指针
MOV SCON,#01010000B ;置串行口工作方式1,允许接收
MOV TMOD,#20H ;定时器1为工作方式2
MOV TH1,#0FDH ;产生9600bps的时间常数
MOV TL1,#0FDH
SETB TR1 ;启动定时器1
SETB ES ;串行口开中断
SETB EA ;开中断
MOV DPTR,#ADDRR ;数据缓冲区首址送DPTR
MOV R0,#00H ;置传送字节数初值
SJMP $ ;等待中断
;中断服务程序
INTSE2: CLR RI ;清接收中断标志
MOV A,SBUF ;取接收的数据
MOVX @DPTR,A ;接收的数据送缓冲区
CJNE R0,#7FH,LOOPR ;判别接收完没有。若没有,转LOOPR继续接收
CLR ES ;若接收完,则关串行口中断
LJMP ENDR
LOOPR: INC R0 ;修改计数指针
INC DPTR ;修改地址指针
ENDR: RETI ;中断返回
END
43/95
增强型8051单片机实用开发技术
例8-2 设有甲、乙两台单片机,编写程序,使用调
用子程序的方法进行串行通信。
甲机(发送机);从内部RAM单元20H~25H中
取出6个ASCII码数据,在最高位加上奇偶校验位
后由串行口发送。采用8位异步通信,波特率为
1200bps,(假设系统时钟为)。
乙机(接收机):把接收到的ASCII码数据,
先进行奇偶校验,若校验正确,将数据依次存放
在内部RAM区20H~25H单元中。若校验出错,则将
出错信息“0FFH”存入相应的单元。
44/95
增强型8051单片机实用开发技术
调用子程序的查询方式串行通信流程图
45/95
增强型8051单片机实用开发技术
甲机的汇编语言程序如下:
$include () ;包含STC12C5A60S2单片机寄存器定义文件
ORG 0000H ;主程序入口
LJMP MAINT
ORG 0030H
MAINT: MOV SP,#60H
MOV TMOD,#20H ;置定时器1为工作方式2
MOV TH1,#0E8H ;置波特率时间常数
MOV TL1,#0E8H
MOV SCON,#40H ;置串行口为工作方式1
SETB TR1 ;启动定时器1工作
MOV R0,#20H ;数据首地址送R0
MOV R7,#06H ;传送字节数送R7
LOOPT: MOV A,@R0 ;取一个待传送的数据字节
LCALL DATAOUT ;调用串行可发送子程序
INC R0 ;修改地址指针
DJNZ R7,LOOPT ;若没有全部发送完毕,则转LOOPT继续发送
SJMP $
DATAOUT: ;串行口发送子程序
MOV C,P ;设置奇偶校验位(补奇)
CPL C
MOV ,C
MOV SBUF,A ;启动串行口发送数据
JNB TI,$ ;等待数据字节发送完毕
CLR TI ;清发送标志TI,为下一数据字节串行发送作准备
RET
END
46/95
增强型8051单片机实用开发技术
对应的C语言程序如下:
#include “” //包含STC12C5A60S2单片机寄存器定义文件
unsigned char data ADDRT[6] _at_ 0x20; //在内部RAM区定义6个单元
void main (void) //主程序
{
unsigned char i;
TMOD=0x20; //置定时器1为工作方式2
TH1=0xe8; //置波特率时间常数
TL1=0xe8;
SCON=0x40; //置串行口为工作方式1
TR1=1; //启动定时器1工作
for(i=0;i<6;i++)
UART_SEND(ADDRT[i]); //发送一个数据
while(1); //发送完毕,循环等待
}
void UART_SEND(unsigned char senddata) //串行口发送子程序
{
bit tmpbit;
ACC=senddata;
tmpbit=P; //设置奇偶校验位(补奇)
tmpbit=!tmpbit;
if (tmpbit) senddata=senddata|0x80;
else senddata=senddata&0x7f;
SBUF=senddata; //启动串行口发送数据
while(TI==0); //等待数据字节发送完毕
TI=0; //清发送标志TI,为下一数据字节串行发送作准备
}
47/95
增强型8051单片机实用开发技术$include () ;包含STC12C5A60S2单片机寄存器定义文件
ORG 0000H ;主程序入口地址
LJMP MAINR
ORG 0030H
MAINR: MOV SP,#60H
MOV TMOD,#20H ;置定时器1为工作方式2
MOV TH1,#0E8H ;置波特率时间常数
MOV TL1,#0E8H
MOV SCON,#52H ;置串行口为工作方式1,并使REN=1
SETB TR1 ;启动定时器1
MOV R0,#20H ;存放数据首地址送R0
MOV R7,#06H ;存放数据字节数送R7
LOOP: LCALL DATAIN ;调用接收子程序
JC ERROR ;若C=1,则出错,转出错处理程序
MOV @R0,A ;将接收的数据送指定RAM单元中
LJMP LOOPC
ERROR: MOV @R0,#0FFH ;将出错字符”0FFH”送指定RAM单元
LOOPC: INC R0 ;修改地址指针
DJNZ R7,LOOP ;若没全部接收完毕,则继续接收数据;否则顺序进行
SJMP $
;串行口接收子程序
DATAIN: JNB RI,$ ;等待一个数据字节接收完毕
CLR RI ;接收完毕,清标志RI,为接收下一个数据字节作准备
MOV A,SBUF ;接收到的数据字节送A
MOV C,P ;检查奇偶校验位
CPL C
ANL A,#7FH ;消去奇校验位
RET ;子程序返回
END
乙机汇编语言程序
48/95
增强型8051单片机实用开发技术
【【例例8-38-3】】 多机通信编程举例多机通信编程举例
现用简单实例说明多机串行通信中从机的基本工作过程。而实际应用
中还需要考虑通信的规范协议。有些协议很复杂,在此不加以考虑。假设
系统晶振频率为。
编程实现如下功能:
主机:先向从机发送一帧地址信息,然后再向从机发送10个数据信息。
从机:接收主机发来的地址帧信息,并与本机的地址号相比较,若不
符合,仍保持SM2=1不变;若相等,则使SM2清零,准备接收后续的数据信
息,直至接收完10个数据信息。
49/95
增强型8051单片机实用开发技术
a) 主机程序流程图 b) 从机程序流程图
50/95
增强型8051单片机实用开发技术
主机程序:
$include () ;包含STC12C5A60S2单片机寄存器定义文件
ADDRT EQU 0000H
SLAVE EQU 5 ;从机地址号
ORG 0000H
LJMP MAINT ;主程序入口地址
ORG 0023H
LJMP INTST ;串行口中断入口地址
ORG 0100H
MAINT: MOV SP,#60H
MOV SCON,#0C0H ;串行口方式3
MOV TMOD,#20H ;置T1工作方式2
MOV TH1,#0FAH ;置4800波特率
MOV TL1,#0FAH ;相应的时间常数
MOV DPTR,#ADDRT ;置数据地址指针
MOV R0,#00H ;发送数据字节计数清零
MOV R2,#SLAVE ;从机地址号→R2
SETB TR1 ;启动T1
SETB ES ;串行口开中断
SETB EA ;CPU开中断
SETB TB8 ;置位TB8,作为地址帧信息特征
MOV A,R2 ;发送地址帧信息
MOV SBUF,A
SJMP $ ;等待中断
51/95
增强型8051单片机实用开发技术
;串行口中断服务程序:
INTST: CLR TI ;清发送中断标志
CLR TB8 ;清TB8位,为发送数据帧信息作准备
MOVX A,@DPTR ;发送一个数据字节
MOV SBUF,A
INC DPTR ;修改指针
INC R0
CJNE R0,#0AH,LOOPT ;判数据字节是否发送完
CLR ES
LOOPT: RETI
END
52/95
增强型8051单片机实用开发技术
对应的C语言版程序如下:
#include “” //包含STC12C5A60S2单片机寄存器定义文件
unsigned char xdata ADDRT[10]; //保存数据的外部RAM单元
unsigned char SLAVE; //保存从机地址号的变量
unsigned char num=0, *mypdata;
void main (void)
{
SCON=0xC0;
TMOD=0x20;
TH1=0xFA;
TL1=0xFA;
mypdata=ADDRT;
SLAVE=5; //定义从机地址,在此假设从机地
址为5
TR1=1;
ES=1;
EA=1;
TB8=1;
SBUF=SLAVE; //发送从机地址
while(1); //等待中断
}
53/95
增强型8051单片机实用开发技术
void Serial_ISR(void) interrupt 4
{
TI=0;
TB8=0;
SBUF=*mypdata; //发送数据
mypdata++; //修改指针
num++;
if(num==0x0a) ES=0;
}
54/95
增强型8051单片机实用开发技术
从机程序如下:
$include () ;包含STC12C5A60S2单片机寄存器定义文件
ADDRR EQU 0000H
SLAVE EQU 5 ;从机地址号
ORG 0000H
LJMP MAINR ;从机主程序入口地址
ORG 0023H
LJMP INTSR ;串行口中断入口地址
ORG 0100H
MAINR: MOV SP,#60H
MOV SCON,#0F0H ;串行口方式3,SM2=1,REN=1,接收状态
MOV TMOD,#20H ;置T1为工作方式2
MOV TH1,#0FAH ;置4800波特率
MOV TL1,#0FAH ;相应的时间常数
MOV DPTR,#ADDRR ;置数据地址指针
MOV R0,#0AH ;置接收数据字节数指针
SETB TR1 ;启动T1
SETB ES ;串行口开中断
SETB EA ;CPU开中断
SJMP $ ;等待中断
55/95
增强型8051单片机实用开发技术
INTSR: CLR RI ;清接收中断标志
MOV A,SBUF ;取接收信息
MOV C,RB8 ;取RB8(信息特征位)→C
JNC LOOPR1 ;RB8=0为数据帧信息,转LOOPR1
XRL A,#SLAVE ;RB8=1为地址帧信息,与本机地址号SLAVE相比较
JZ LOOPR2 ;地址相等,则转LOOPR2
LJMP ENDR ;地址不相等,则转中断返回ENDR
LOOPR2:CLR SM2 ;清SM2,为后面接收数据帧信息作准备
LJMP ENDR ;中断返回
LOOPR1:MOVX @DPTR,A ;接收的数据→数据缓冲区
INC DPTR ;修改地址指针
DJNZ R0,ENDR ;数据字节没全部接收完,则转LOOPR2
SETB SM2 ;全部接收完,置SM2=1
ENDR: RETI ;中断返回
END
56/95
增强型8051单片机实用开发技术
对应的C语言版程序如下:
#include “” //包含STC12C5A60S2单片机寄存器定义文件
unsigned char xdata ADDRR[10];
unsigned char SLAVE,num=0x0a,rdata,*mypdata;
void main (void)
{
SCON=0xF0;
TMOD=0x20;
TH1=0xFA;
TL1=0xFA;
mypdata=ADDRR;
SLAVE=5; //设定从机地址
TR1=1;
ES=1;
EA=1;
while(1); //等待中断
}
57/95
增强型8051单片机实用开发技术
void Serial_ISR(void) interrupt 4
{
RI=0;
rdata=SBUF; //将接收缓冲区的数据保存到rdata变量中
if(RB8) //RB8=1说明收到的信息是地址
{
if(rdata==SLAVE) //如果地址相等,则SM2=0
SM2=0;
}
else //接收到的信息是数据
{
*mypdata=rdata;
mypdata++;
num--;
if(num==0x00)//所有数据接收完毕,令SM2=1
//为下一次接收地址信息作准备
SM2=1;
}
}
58/95
增强型8051单片机实用开发技术
【例8-4】串口1使用独立波特率发生器作串行通信的实例。
#include “” //包含STC12C5A60S2寄存器定义文件
#include “”
#define RELOAD_COUNT 0xfb //Fosc=,12T,SMOD=0,9600bps
sbit MCU_Start_Led = P1^4;
unsigned char array[9]={0,2,4,6,8,10,12,14,16};
void UART_send(unsigned char i);
void delay(void);
void display_MCU_Start_Led(void);
void main(void)
{
unsigned char i;
//串口初始化
SCON = 0x50; //0101,0000 8位可变波特率,无奇偶校验位
BRT = RELOAD_COUNT;
AUXR = 0x11; // BRTR = 1,启动独立波特率发生器
// S1BRS = 1,串口1选择独立波特率发生器作为波特率发生器
59/95
增强型8051单片机实用开发技术
ES = 1; //允许串口中断
EA = 1; //开总中断
display_MCU_Start_Led(); //点亮发光二极管表示单片机开始工作
UART_send(0x34); //串口发送数据表示单片机串口正常工作
UART_send(0xa7); //串口发送数据表示单片机串口正常工作
for(i = 0;i<9;i++)
UART_send(array[i]);
while(1);
}
void UART_send(unsigned char i)
{
ES = 0; //关串口中断
TI = 0; //清零串口发送完成中断请求标志
SBUF = i;
while(TI ==0); //等待发送完成
TI = 0; //清零串口发送完成中断请求标志
ES = 1; //允许串口中断
}
60/95
增强型8051单片机实用开发技术
void delay(void)
{
unsigned int g,j;
for(j=0;j<5;j++)
{
for(g=0;g<50000;g++)
{
_nop_();
_nop_();
_nop_();
}
}
}
61/95
增强型8051单片机实用开发技术
void display_MCU_Start_Led(void)
{
unsigned char i;
for(i=0;i<5;i++)
{
MCU_Start_Led = 0; //点亮MCU开始工作指示灯
delay();
MCU_Start_Led = 1; //熄灭MCU开始工作指示灯
delay();
}
}
62/95
增强型8051单片机实用开发技术
void UART_Receive(void) interrupt 4
{
unsigned char k;
if(RI==1)
{
RI=0;
k=SBUF;
UART_send(k+1);
}
else
TI=0;
}
63/95
增强型8051单片机实用开发技术
计算机与单片机之间的计算机与单片机之间的串行通信串行通信
在以计算机为控制中心的数据采集与自动控制系统中,
通常需要用单片机采集数据,然后用异步串行通信方式
传给计算机;要完成的控制命令由计算机通过串行通信
方式传给单片机,由单片机进行控制。
计算机和单片机之间的串行通信一般采用RS-232、
RS-422或RS-485总线标准接口,也有采用非标准的20mA
电流环的。这里介绍最常用的RS-232接口串行通信的设
计方法。
RS-232是早期为公用电话网络数据通信而制定的标
准,其逻辑电平与TTL/CMOS电平完全不同。逻辑“0”规
定为+5~+15V之间,逻辑“1”规定为-5~-15V之间。由
于RS-232发送和接收之间有公共地,传输采用非平衡模
式,因此共模噪声会耦合到信号系统中,标准中建议的
最大通信距离为15m。下面通过一个简单实例,介绍计算
机与单片机进行RS232通信的硬件接口设计和软件设计。
64/95
增强型8051单片机实用开发技术
【例8-5】计算机向单片机发送一个数据,单片机
接收到数据后,将接收到的数据回发给计算机。
假设单片机的系统时钟为,通信参数
为“9600,n,8,1”(这是常见的通信参数表
示方法,即波特率为9600bps,8个数据位,1个
停止位,没有奇偶校验)。在计算机上显示从单
片机发送过来的数据。可以使用该方法测试硬件
电路的连接情况。
65/95
增强型8051单片机实用开发技术
1.硬件接口设计
从硬件上讲,计算机的串行口是RS-232电平的,而单片
机的串口是TTL电平的。因此,要实现单片机与计算机之间
的串行通信,必须通过电路实现TTL电平和RS-232电平的转
换。常用的电平转换集成电路是MAX232或者与它兼容转换芯
片,它包含两路驱动器和接收器。
单片机与计算机进行串行通信的硬件连接,最简单的方
法是采用三线制连接方式,也就是说,计算机的9针串口只
连接其中的3根线:第5脚的GND、第2脚的RXD、第3脚的TXD。
电路如教材图1-7。
66/95
增强型8051单片机实用开发技术
67/95
增强型8051单片机实用开发技术
利用STC2C5A60S2单片机的串口2和上位计算机通信。
汇编语言程序(系统晶振为,波特率为9600bit/s):
$INCLUDE () ;包含STC12C5A60S2单片机寄存器定义文件
BITTEST DATA 20H
S2TIbit BIT 01H
S2RIbit BIT 00H
ORG 0000H
LJMP MAIN
ORG 0043H
LJMP UART2_ISR
ORG 0100H
MAIN: MOV SP,#60H ;设置堆栈
MOV S2CON,#50H;01010000 8位可变波特率,无奇偶校验位,允许接收
MOV BRT,#0FDH
MOV AUXR,#11H ;BRTR = 1(启动BRT), S1BRS = 1
MOV IE2, #01H ;允许串口2中断,ES2=1
SETB EA
SJMP $
68/95
增强型8051单片机实用开发技术
UART2_ISR:
MOV BITTEST,S2CON ;将S2CON保存到20H单元以便位寻址
JBC S2RIbit,RDATA ;若是接收中断,则将S2RI清零
CLR S2TIbit ;否则就是发送中断,将S2TI清零
LJMP RETURN
RDATA:MOV A,S2BUF ;读取收到的数据
CPL A
MOV S2BUF ,A ;将收到的数据发送回去
RETURN:
MOV S2CON,BITTEST ;该语句可以起到中断标志清零的作用
RETI
END
69/95
增强型8051单片机实用开发技术
对应的C语言程序如下:
#include “” //包含STC12C5A60S2单片机寄存器定义文件
char bdata bittest; //为了保存中断标志
sbit TIbit=bittest ^1; //第1位
sbit RIbit=bittest ^0; //第0位
void main(void)
{
S2CON=0x50;
BRT=0xFD;
AUXR=0x11;
IE2=0x01;
EA=1;
while(1);
}
70/95
增强型8051单片机实用开发技术
void UART2_ISR(void) interrupt 8
{
unsigned char tmpdata;
bittest=S2CON;
if (RIbit)
{
RIbit = 0;
tmpdata=S2BUF;
S2BUF=~tmpdata;
}
else
TIbit=0;
S2CON=bittest; //清零中断标志
}
71/95
增强型8051单片机实用开发技术
串行外设接口(串行外设接口(SPISPI))的结构的结构
1.SPI简介
串行外设接口(Serial Peripheral Interface,简称SPI)实际上
是一种串行总线接口标准,SPI方式可允许同时同步接收和传送8位
数据,是一种全双工串行总线。其速度比UART串行接口要快。SPI
支持在同一总线上将多个从机连接到一个主机。同一总线上也可以
有多个主机,当两个或多个主机试图同时进行数据传输时,需要进
行碰撞检测。
STC12C5A60S2单片机集成了SPI接口,它是一个全双工高速
同步通信接口,既可以和其他微处理器通信,也可以与具有SPI兼
容接口的器件,如存储器、A/D转换器、D/A转换器、LED或LCD
驱动器等进行同步通信。SPI也可以在一个多主机系统中负责内部
处理器之间的通信。SPI接口有两种操作模式:主模式和从模式。
在主模式中支持高达3Mbit/s的速率(工作频率为12MHz时,如果
CPU主频采用20MHz到36MHz,则可更高);从模式时速度无法太
快,速度在fosc/8以内较好。此外,SPI接口还具有传输完成标志和
写冲突标志保护功能。
STC12C5A60S2单片机的SPI接口
72/95
增强型8051单片机实用开发技术
2. SPI接口的结构
73/95
增强型8051单片机实用开发技术
SPI的数据通信
1、SPI接口信号
SPI接口由MISO(与共用)、MOSI(与共用)、SCLK(与)和/SS(与
共用)4根信号线构成。
MOSI(Master Out Slave In,主出从入):主出从入是主器件的输出和从器件的输入,
用于主器件到从器件的串行数据传输。根据SPI规范,多个从机共享一根MOSI信号线。在时
钟边界的前半周期,主机将数据放在MOSI信号线上,从机在该边界处获取该数据。
MISO(Master In Slave Out,主入从出):从器件的输出和主器件的输入。用于实现从
器件到主器件的数据传输。SPI规范中,一个主机可连接多个从机,因此,主机的MISO信号
线会连接到多个从机上,或者说,多个从机共享一根MISO信号线。当主机与一个从机通信
时,其他从机应将其MISO引脚驱动置为高阻状态。
SCLK(SPI Clock,串行时钟信号):串行时钟信号是主器件的输出和从器件的输入,
用于同步主器件和从器件之间在MOSI和MISO线上的串行数据传输。当主器件启动一次数据
传输时,自动产生8个SCK时钟周期信号给从机。在SCK的每个跳变处(上升沿或下降沿)移
出一位数据。所以,一次数据传输可以传输一个字节的数据。
/SS(Slave Select,从机选择信号):这是一个输入信号。主器件用它来选择处于从模式
的SPI模块。主模式和从模式下,/SS的使用方法不同。在主模式下,SPI接口只能有一个主机,
不存在主机选择问题。在该模式下/SS不是必须的。主模式下通常将主机的/SS引脚通过10kΩ
的电阻上拉高电平。每一个从机的/SS接主机的I/O口,由主机控制电平高低,以便主机选择
从机。在从模式下,不论发送还是接收,/SS信号必须有效。因此在一次数据传输开始之前必
须将/SS拉为低电平。SPI主机可以使用I/O口选择一个SPI器件作为当前的从机。
74/95
增强型8051单片机实用开发技术
2、SPI接口的数据通信方式
(1)单主机-单从机方式
(2)双器件方式
75/95
增强型8051单片机实用开发技术
(3)单主机-多从机方式
76/95
增强型8051单片机实用开发技术
3.SPI接口的数据通信过程
作为从机时,若CPHA=0,SSIG必须为0,/SS引脚必须取反并且在每个
连续的串行字节之间重新设置为高电平。如果SPDAT寄存器在有效(低电平)
时执行写操作,那么将导致一个写冲突错误,WCOL标志被置1。CPHA=0且
SSIG=0时的操作未定义。
当CPHA=1时,SSIG可以为1或0。如果SSIG=0,/SS引脚可在连续传输之
间保持低有效(即一直为低电平)。当系统中只有一个SPI主机和一个SPI从机
时,这是首选配置。
在SPI通信中,传输总是由主机启动的。如果SPI使能(SPEN=1),主机
对SPI 数据寄存器的写操作将启动SPI时钟发生器和数据的传输。在数据写入
SPDAT之后的半个到一个SPI位时间后,数据将出现在MOSI引脚。
需要注意的是,主机可以通过将对应器件的/SS引脚驱动为低电平实现与
之通信。写入主机SPDAT寄存器的数据从MOSI引脚移出发送到从机的MOSI 引
脚。同时从机SPDAT寄存器的数据从MISO引脚移出发送到主机的MISO引脚。
传输完一个字节后,SPI 时钟发生器停止,传输完成标志(SPIF)置位并
产生一个中断(如果SPI中断使能)。主机和从机CPU的两个移位寄存器可以看
作是一个16位循环移位寄存器。当数据从主机移位传送到从机的同时,数据也
以相反的方向移入。这意味着在一个移位周期中,主机和从机的数据相互交换。
77/95
增强型8051单片机实用开发技术
4.通过/SS 改变模式
如果SPEN=1,SSIG=0且MSTR=1,SPI使能为主机模式。 /SS引脚可配置为输入或准双
向模式。这种情况下,另外一个主机可将该引脚驱动为低电平,从而将该器件选择为SPI从机并
向其发送数据。
为了避免争夺总线,SPI系统执行以下动作:
(1)MSTR清零并且CPU变成从机。这样SPI就变成从机。MOSI和SCLK强制变为输入
模式,而MISO则变为输出模式。
(2)SPSTAT的SPIF标志位置位。如果SPI中断已被使能,则产生SPI中断。
用户程序必须一直对MSTR位进行检测,如果该位被一个从机选择清零而用户想继续将
SPI作为主机,就必须重新置位MSTR,否则将进入从机模式。
5.SPI中断
如果允许SPI中断,发生SPI中断时,CPU就会跳转到中断服务程序的入口地址004BH
处执行中断服务程序。注意,在中断服务程序中,必须把SPI中断请求标志清零。
6.写冲突
SPI在发送时为单缓冲,在接收时为双缓冲。这样在前一次发送尚未完成之前,不能将
新的数据写入移位寄存器。当发送过程中对数据寄存器进行写操作时,WCOL位将置位以指示
数据冲突。在这种情况下,当前发送的数据继续发送,而新写入的数据将丢失。
当对主机或从机进行写冲突检测时,主机发生写冲突的情况是很罕见的,因为主机拥
有数据传输的完全控制权。但从机有可能发生写冲突,因为当主机启动传输时,从机无法进行
控制。
接收数据时,接收到的数据传送到一个并行读数据缓冲区,这样将释放移位寄存器以
进行下一个数据的接收。但必须在下个字符完全移入之前从数据寄存器中读出接收到的数据,
否则,前一个接收数据将丢失。
WCOL可通过软件向其写入“1”清零。
78/95
增强型8051单片机实用开发技术
7.数据格式
不同的时钟相位位CPHA,主机和从机对应的数据格式如图8-20~
图8-23所示。
SPI接口的时钟信号线SCLK有Idle和Active两种状态:Idle状态是
指在不进行数据传输的时候(或数据传输完成后)SCLK所处的状态;
Active是与Idle相对的一种状态。
时钟相位位(CPHA)允许用户设置采样和改变数据的时钟边沿。
时钟极性位CPOL允许用户设置时钟极性。
如果CPOL=0,Idle状态=低电平,Active状态=高电平。
如果CPOL=1,Idle状态=高电平,Active状态=低电平。
主机总是在SCLK=Idle状态时,将下一位要发送的数据置于数据线
MOSI上。
从Idle状态到Active状态的转变,称为SCLK前沿。
从Active状态到Idle状态的转变,称为SCLK后沿。
一对SCLK前沿和后沿构成一个SCLK时钟周期,一个SCLK时钟周
期传输一位数据。
79/95
增强型8051单片机实用开发技术
7.数据格式
图8-20 CPHA=0时SPI从机传输格式
80/95
增强型8051单片机实用开发技术
7.数据格式
图8-21 CPHA=1时SPI从机传输格式
81/95
增强型8051单片机实用开发技术
7.数据格式
图8-22 CPHA=0时SPI主机传输格式
82/95
增强型8051单片机实用开发技术
7.数据格式
图8-23 CPHA=1时SPI主机传输格式
8.SPI时钟预分频器选择
SPI时钟预分频器选择是通过SPCTL寄存器中的SPR1-SPR0位实现的。详见特
殊功能寄存器SPCTL的介绍。
83/95
增强型8051单片机实用开发技术
SPI接口的应用举例接口的应用举例
1.SPI相关的特殊功能寄存器
(1)SPI控制寄存器(SPCTL) (地址为CEH,复位值为00H)
1)位7:SSIG,/SS忽略控制位。
1:由MSTR位确定器件为主机还是从机。
0:由/SS脚用于确定器件为主机还是从机。/SS脚可作为I/O口使用。
2)位6:SPEN,SPI使能位。
1:SPI使能。
0:SPI被禁止,所有SPI管脚都作为I/O口使用。
3)位5:DORD,设定数据发送和接收的位顺序。
1:数据字的最低位(LSB)最先传送;
0:数据字的最高位(MSB)最先传送。
4)位4:MSTR,SPI主/从模式选择位。具体选择方法,参见表9-4(SPI主/从模式选择表)。
5)位3:CPOL,SPI时钟极性。
1:SPI空闲时SCLK=1。SCLK的前时钟沿为下降沿而后沿为上升沿。
0:SPI空闲时SCLK=0。SCLK的前时钟沿为上升沿而后沿为下降沿。
6)位2:CPHA,SPI时钟相位选择控制。
1:数据在SCLK的前时钟沿驱动到SPI口线,SPI模块在后时钟沿采样。
0:数据在/SS为低(SSIG=00)时驱动到SPI口线,在SCLK的后时钟沿被改变,并在前时钟
沿被采样。(注:SSIG=1时的操作未定义)
7)位1:SPR1,与SPR0联合构成SPI时钟速率选择控制位。
8)位0:SPR0,与SPR1联合构成SPI时钟速率选择控制位。SPI时钟选择如表9-5所示(见教材)。
位号 D7 D6 D5 D4 D3 D2 D1 D0
位名称 SSIG SPEN DORD MSTR CPOL CPHA SPR1 SPR0
84/95
增强型8051单片机实用开发技术
1)位7:SPIF,SPI传输完成标志。
当一次传输完成时,SPIF被置位。此时,如果SPI中断被打开(即
ESPI()=1,EA()=1),将产生中断。当SPI处于主模式且SSIG=0时,如
果/SS为输入并被驱动为低电平,SPIF也将置位,表示“模式改变”。
SPIF标志通过软件向其写入“1”而清零。
2)位6:WCOL,SPI写冲突标志。
当一个数据还在传输时,又向数据寄存器SPDAT写入数据,WCOL将被
置位。
WCOL 标志通过软件向其写入“1”而清零。
3)位5-位0:保留。
(2)SPI状态寄存器SPSTAT(地址为CDH,复位值为00XXXXXXB)
位号 D7 D6 D5 D4 D3 D2 D1 D0
位名称 SPIF WCOL - - - - - -
(3)SPI数据寄存器(SPDAT)(地址为CFH,复位值为00H)
位号 D7 D6 D5 D4 D3 D2 D1 D0
位名称 MSB LSB
位7-位0:保存SPI通信数据字节。其中,MSB为最高位,LSB为最低位。
85/95
增强型8051单片机实用开发技术
2.编程实例
SPI接口的使用主要涉及到SPI接口的初始化和SPI中断服务程序的编
写。
SPI接口的初始化包括以下几个方面:
(1)通过SPI控制寄存器SPCTL设置:/SS引脚的控制、SPI使能、数
据传送的位顺序、设置为主机或从机、SPI时钟极性、SPI时钟相位、SPI
时钟选择。具体内容请参见SPI控制寄存器SPCTL介绍。
(2)清零寄存器SPSTAT中的标志位SPIF和WCOL(向这两个标志
位写“1”即可清零)。
(3)开放SPI中断(IE2中的ESPI=1,IE2寄存器不能位寻址,可以
使用“或”指令 )。
(4)开放总中断(IE中的EA=1)。
86/95
增强型8051单片机实用开发技术
【例8-6】 单主机-单从机通信方式应用举例。
计算机向主单片机发送一串数据,主单片机的RS-232串口每收到一个
字节就立刻将收到的字节通过SPI口发送到从单片机中,与此同时主单片
机收到从单片机发回的一个字节,主单片机把收到的这个字节通过 RS-232
口发送到计算机。可以使用串口助手观察结果。
从单片机的SPI 口收到数据后,把收到的数据放到自己的SPDAT寄存
器中,当下一次主单片机发送一个字节时把数据发回到主单片机。
晶振频率fosc=,计算机RS232串口波特率设置为57600bps。
87/95
增强型8051单片机实用开发技术
解:经计算,当解:经计算,当fosc==,,PCON7=0PCON7=0(波特率不加倍),波特率为(波特率不加倍),波特率为57600bps57600bps时的重装时间常数为时的重装时间常数为F6HF6H。。
在主机的主程序中,使用查询的方法查询在主机的主程序中,使用查询的方法查询UARTUART口是否接收到数据。口是否接收到数据。
汇编语言程序如下:汇编语言程序如下:
$include () ;$include () ;包含包含STC12C5A60S2STC12C5A60S2寄存器定义文件寄存器定义文件
;;定义功能常量定义功能常量,,用于控制汇编程序是主机程序还是从机程序用于控制汇编程序是主机程序还是从机程序
;MASTER EQU 1 ;;MASTER EQU 1 ;汇编后的程序代码下载到主单片机中汇编后的程序代码下载到主单片机中
MASTER EQU 0 ;MASTER EQU 0 ;汇编后的程序代码下载到从单片机中汇编后的程序代码下载到从单片机中
;;定义变量定义变量
Flags EQU 20HFlags EQU 20H
SPI_Receive EQU ;SPI SPI_Receive EQU ;SPI 端口收到数据标志位端口收到数据标志位
SPI_buffer EQU 30H ;SPI_buffer EQU 30H ;该变量用于保存该变量用于保存 SPI SPI 端口收到的数据端口收到的数据
ORG 0000H ORG 0000H
LJMP MAIN LJMP MAIN
ORG 004BH ;SPI ORG 004BH ;SPI中断服务程序入口中断服务程序入口
LJMP SPI_ISRLJMP SPI_ISR
ORG 0060H ORG 0060H
MAIN:MAIN:
MOV SP, #70H ; MOV SP, #70H ;设置堆栈指针设置堆栈指针
IF MASTER==1 ;IF MASTER==1 ;从机不需要从机不需要UARTUART通信通信,,不需要初始化不需要初始化
;;初始化串口初始化串口
MOV SCON, #50H ;0101,0000 8MOV SCON, #50H ;0101,0000 8位可变波特率位可变波特率, , 无奇偶校验无奇偶校验
MOV TMOD, #21H ;MOV TMOD, #21H ;定时器定时器T1T1为自动重装模式为自动重装模式
MOV TH1, #0F6HMOV TH1, #0F6H
MOV TL1, #0F6H MOV TL1, #0F6H
ORL AUXR,#01000000B ;T1 ORL AUXR,#01000000B ;T1以以1T1T的速度计数,是普通的速度计数,是普通80518051的的1212倍,即波特率倍,即波特率 = 4800*12=57600 = 4800*12=57600
SETB TR1 ; SETB TR1 ;启动定时器启动定时器11
88/95
增强型8051单片机实用开发技术
; ;初始化初始化SPISPI
MOV SPCTL,#11111100B ;0FCH, MOV SPCTL,#11111100B ;0FCH, 忽略脚忽略脚, , 设为主机设为主机
;SSIG=1: ;SSIG=1: 忽略脚忽略脚;SPEN=1;SPEN=1:允许:允许SPISPI工作工作
;DORD=1;DORD=1:先传送低位:先传送低位LSB;MSTR=1LSB;MSTR=1:设为主机:设为主机
;CPOL=1;CPOL=1::SPISPI空闲时空闲时SCLK=1SCLK=1,前跳变沿是下降沿,后跳变沿是上升沿,前跳变沿是下降沿,后跳变沿是上升沿
;CPHA=1;CPHA=1:数据由:数据由SCLKSCLK前跳变沿驱动到前跳变沿驱动到SPISPI口线,口线,SPISPI模块在后跳变沿采样模块在后跳变沿采样
;SPR1;SPR1,,SPR0=00SPR0=00:主模式时:主模式时SPISPI时钟源选择为时钟源选择为fosc/4fosc/4
ELSEELSE
MOV SPCTL, #11101100B ;0ECH, MOV SPCTL, #11101100B ;0ECH, 忽略脚忽略脚, , 设为从机设为从机
;SSIG=1: ;SSIG=1: 忽略脚忽略脚;SPEN=1;SPEN=1:允许:允许SPISPI工作工作
;DORD=1;DORD=1:先传送低位:先传送低位LSB;MSTR=0LSB;MSTR=0:设为从机:设为从机
;CPOL=1;CPOL=1::SPISPI空闲时空闲时SCLK=1SCLK=1,前跳变沿是下降沿,后跳变沿是上升沿,前跳变沿是下降沿,后跳变沿是上升沿
;CPHA=1;CPHA=1:数据由:数据由SCLKSCLK前跳变沿驱动到前跳变沿驱动到SPISPI口线,口线,SPISPI模块在后跳变沿采样模块在后跳变沿采样
;SPR1;SPR1,,SPR0=00SPR0=00:主模式时:主模式时SPISPI时钟源选择为时钟源选择为fosc/4fosc/4
ENDIFENDIF
MOV SPSTAT,#11000000B ; MOV SPSTAT,#11000000B ;清零标志位清零标志位SPIFSPIF和和WCOL WCOL
ORL IE2, #00000010B ;ESPI()=1, ORL IE2, #00000010B ;ESPI()=1,允许允许SPIFSPIF产生中断产生中断
MOV Flags, #0 ;MOV Flags, #0 ;清标志字清标志字
SETB EA ;SETB EA ;开总中断开总中断
;-----------------;-----------------主循环主循环----------------------------------------------------------------
IF MASTER==1IF MASTER==1
Check_RS232:Check_RS232:
JNB RI, Check_SPI ; JNB RI, Check_SPI ;判判RS-232 RS-232 串口中收到数据否串口中收到数据否
MOV A, SBUF ;MOV A, SBUF ;读取读取RS-232RS-232串口中收到的数据送累加器串口中收到的数据送累加器AA
CLR RI CLR RI
89/95
增强型8051单片机实用开发技术
; ;将累加器将累加器AA中的数据发送到从机中的数据发送到从机SPISPI
ANL IE2, #0FDH ;ESPI()=0, ANL IE2, #0FDH ;ESPI()=0,禁止禁止SPIFSPIF产生中断产生中断
MOV SPDAT, A ;SPI MOV SPDAT, A ;SPI 发送数据发送数据
SPI_Wait: SPI_Wait:
MOV A, SPSTAT ; MOV A, SPSTAT ;等待等待 SPIF=1 SPIF=1 即等待即等待 SPI SPI 发送完毕发送完毕
ANL A, #80HANL A, #80H
JZ SPI_Wait JZ SPI_Wait
ORL IE2, #00000010B ;ESPI()=1, ORL IE2, #00000010B ;ESPI()=1,允许允许SPIFSPIF产生中断产生中断
LJMP Check_RS232 LJMP Check_RS232
Check_SPI: Check_SPI:
JNB SPI_Receive, Check_RS232 ; JNB SPI_Receive, Check_RS232 ;判收到从判收到从SPISPI发回数据否发回数据否
MOV A, SPI_buffer ;MOV A, SPI_buffer ;将从机将从机SPISPI发回的数据送到累加器发回的数据送到累加器AA
CLR SPI_Receive ; CLR SPI_Receive ;清零主单片机清零主单片机SPISPI端口收到数据标志位端口收到数据标志位
;;将接收到的数据从将接收到的数据从RS232RS232串口发送到计算机串口发送到计算机
CLR TI ;CLR TI ;清零串口发送中断标志清零串口发送中断标志
MOV SBUF, A MOV SBUF, A
RS232_Wait:RS232_Wait:
JNB TI, RS232_Wait ; JNB TI, RS232_Wait ;等待发送完毕等待发送完毕
CLR TI ;CLR TI ;清零串口发送中断标志清零串口发送中断标志
LJMP Check_RS232LJMP Check_RS232
ELSEELSE
Check_SPI: Check_SPI:
JNB SPI_Receive, Check_SPI ; JNB SPI_Receive, Check_SPI ;判收是否收到主机判收是否收到主机SPISPI发来的数据发来的数据
MOV A, SPI_buffer ;MOV A, SPI_buffer ;读取主单片机读取主单片机SPISPI端口发的数据端口发的数据
CLR SPI_Receive ;CLR SPI_Receive ;清清0 0 从单片机从单片机SPISPI端口收到数据标志位端口收到数据标志位
MOV SPDAT, A ;MOV SPDAT, A ;将收到数据送将收到数据送SPDAT, SPDAT, 准备下一次通信时发回准备下一次通信时发回
LJMP Check_SPILJMP Check_SPI
ENDIFENDIF
90/95
增强型8051单片机实用开发技术
;----------------- SPI;----------------- SPI中断服务程序中断服务程序----------------------------------------------------------
SPI_ISR:SPI_ISR:
MOV SPSTAT, #11000000B ; MOV SPSTAT, #11000000B ;清零标志位清零标志位SPIFSPIF和和WCOLWCOL(注意:写(注意:写11清零)清零)
MOV A, SPDAT ;MOV A, SPDAT ;保存收到的数据保存收到的数据
MOV SPI_buffer, AMOV SPI_buffer, A
SETB SPI_Receive ; SETB SPI_Receive ;设置设置SPISPI端口收到数据标志端口收到数据标志
RETI RETI
;----------------------------------------------------------- ;-----------------------------------------------------------
ENDEND
91/95
增强型8051单片机实用开发技术
CC语言程序如下:语言程序如下:
#include “” //#include “” //包含包含STC12C5A60S2STC12C5A60S2寄存器定义文件寄存器定义文件
#define MASTER 1#define MASTER 1 // //作为从机程序时作为从机程序时,,将该行注释掉将该行注释掉
bit SPI_Receive; //SPI bit SPI_Receive; //SPI 端口收到数据标志位端口收到数据标志位
unsigned char idata SPI_buffer _at_ 0x30; //unsigned char idata SPI_buffer _at_ 0x30; //保存保存SPISPI端口收到的数据端口收到的数据
void main(void)void main(void)
{{
unsigned char tmpdata,SPI_status; unsigned char tmpdata,SPI_status;
#ifdef MASTER#ifdef MASTER
// //初始化串口初始化串口
SCON=0x50; //0101,0000 8SCON=0x50; //0101,0000 8位可变波特率位可变波特率, , 无奇偶校验无奇偶校验
TMOD=0x21; //TMOD=0x21; //定时器定时器T1T1为自动重装模式为自动重装模式
TH1=0xf6;TH1=0xf6;
TL1=0xf6; TL1=0xf6;
AUXR= AUXR|0x40; //T1 AUXR= AUXR|0x40; //T1以以1T1T的速度计数的速度计数
TR1=1; //TR1=1; //启动定时器启动定时器1 1
// //初始化初始化SPISPI
SPCTL=0xfc; // SPCTL=0xfc; //详细注释与汇编语言相同详细注释与汇编语言相同
#else#else
92/95
增强型8051单片机实用开发技术
SPCTL=0xec; // SPCTL=0xec; //详细注释与汇编语言相同详细注释与汇编语言相同
#endif#endif
SPSTAT=0xc0; // SPSTAT=0xc0; //清零标志位清零标志位SPIFSPIF和和WCOL WCOL
IE2=IE2|0x02; //ESPI()=1, IE2=IE2|0x02; //ESPI()=1,允许允许SPIFSPIF产生中断产生中断
SPI_Receive=0; //SPI_Receive=0; //清标志字清标志字
EA=1; //EA=1; //开总中断开总中断
while(1) //while(1) //主循环主循环
{{
#ifdef MASTER#ifdef MASTER
if(RI) // if(RI) //判判RS232 RS232 串口中收到数据否串口中收到数据否
{{
tmpdata=SBUF; // tmpdata=SBUF; //读取读取RS232RS232串口中收到的数据串口中收到的数据
RI=0;RI=0;
// //将数据发送到从机将数据发送到从机SPISPI
IE2&=0xfd; // ESPI()=0, IE2&=0xfd; // ESPI()=0,禁止禁止SPIFSPIF产生中断产生中断
SPDAT=tmpdata; //SPI SPDAT=tmpdata; //SPI 发送数据发送数据
SPI_status=0;SPI_status=0;
while(SPI_status==0) while(SPI_status==0)
{ {
93/95
增强型8051单片机实用开发技术
SPI_status=SPSTAT; // SPI_status=SPSTAT; //等待等待SPIF=1SPIF=1即等待即等待SPISPI发送完毕发送完毕
SPI_status=SPI_status&0x80;SPI_status=SPI_status&0x80;
} }
IE2|=0x02; //ESPI()=1, IE2|=0x02; //ESPI()=1,允许允许SPIFSPIF产生中断产生中断
continue;continue;
} }
if (SPI_Receive) // if (SPI_Receive) //判收到从判收到从SPISPI发回数据否发回数据否
{{
SPI_Receive=0; // SPI_Receive=0; //清零主单片机清零主单片机SPISPI端口收到数据标志位端口收到数据标志位
TI=0; //TI=0; //清零串口发送中断标志清零串口发送中断标志
SBUF=SPI_buffer;//SBUF=SPI_buffer;//将接收到的数据从将接收到的数据从RS232RS232发送到计算机发送到计算机
while(TI==0);//while(TI==0);//等待发送完毕等待发送完毕
TI=0; //TI=0; //清零串口发送中断标志清零串口发送中断标志
}}
#else#else
if (SPI_Receive) // if (SPI_Receive) //判收是否收到主机判收是否收到主机SPISPI发来的数据发来的数据
{{
SPI_Receive=0; // SPI_Receive=0; //清零主单片机清零主单片机SPISPI端口收到数据标志位端口收到数据标志位
94/95
增强型8051单片机实用开发技术
SPDAT=SPI_buffer; // SPDAT=SPI_buffer; //将收到数据送将收到数据送SPDAT,SPDAT,准备下一次通信时发回准备下一次通信时发回
}}
#endif#endif
} }
}}
void SPI_ISR(void) interrupt 9void SPI_ISR(void) interrupt 9
{{
SPSTAT=0xc0; // SPSTAT=0xc0; //清零标志位清零标志位SPIFSPIF和和WCOLWCOL
SPI_buffer=SPDAT; // SPI_buffer=SPDAT; //保存收到的数据保存收到的数据
SPI_Receive=1; //SPI_Receive=1; //设置设置SPISPI端口收到数据标志端口收到数据标志
}}
【例8-7】 单主机-多从机通信方式应用举例。(见教材)
【例8-8】 双器件通信方式应用举例。(见教材)
【例8-9】使用SPI接口连接LCD或LED显示器件。(通过实验学习)
95/95
增强型8051单片机实用开发技术
思考题
1. 通信的基本方式有哪几种?各有什么特点?
2. 简述典型异步通信的格式。
3. 什么是波特率?如何计算和设置串行通信的波特率?
4. 简述STC12C5A60S2单片机串行口的工作方式。
5. 串口1控制器SCON中TB8、RB8起什么作用?在什么方式下使用?
6. 设置串口1工作于方式3,波特率为9600bps,系统主频为,允
许接收数据,串行口开中断,试编写初始化程序实现上述要求。若将串行
口改为方式1,应如何修改初始化程序?
7. 简述STC12C5A60S2单片机SPI口的特点。
8. 编写例8-7对应的C语言程序。
9. 编写例8-8对应的C语言程序。