i++; //i 自加 1 }
注意:using 工作组可以忽略不写,而寄存器工作组有 4 组(0 - 3)。 默认使用寄存器工作组 0。 即 void Timer0IRQ(void) interrupt 1 { }
1.4串口通信
1.4.1串口基本概念
RS232是目前最常用的一种串行通讯接口。它是在1970年由美国电子工业协会(EIA)联合贝尔系统、调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准。它的全名是“数据终端设备(DTE)”和“数据通讯设备(DCE)之间串行二进制数据交换接口技术标准”。传统的RS232接口标准有22根线,采用标准25芯D型插头座。后来的PC上使用简化了的9芯D型插座,25芯插头座已很少采用。现在的台式电脑一般有一个串行口:COM1,从设备管理器的端口列表中就可以看到。硬件表现为计算机后面的9针D形接口,由于其形状和针脚数量的原因,其接头又被称为DB9接头。现在有很多手机数据线或者物流接收器都采用COM口与计算机相连,很多投影机,液晶电视等设备都具有了此接口,厂家也常常会提供控制协议,便于在控制方面实现编程受控,现在越来越多的智能会议室和家居建设都采用了中央控制设备对多种受控设备的串口控制方式。
图1.2 实际串口
图1.3电路图中的串口
目前较为常用的串口有9针串口(DB9)和25针串口(DB25),通信距离较近时(<12m),可以用电缆线直接连接标准RS232端口(RS422,RS485较远),若距离较远,需附加调制解调器(MODEM)。最为简单且常用的是三线制接法,即地、接收数据和发送数据(2、3、5)脚相连,如右图所示。
`
8
表1-7 串口信号引脚 RS232 9针串口 引脚 1 2 3 4 5 6 7 8 9 1.4.2串口通信原理
一条信息的各位数据被逐位顺序传送的通信方式成为串行通信。串行通信可以通过串口或74LS164移位锁存器。根据信息的传送方向,串行通信可以可以进一步划分为单工、半双工和全双工3种。信息只能单方向传送为单工;信息能双向传送但不能同时双向传送为半双工;信息能够同时双向传送则成为全双工。8051系列单片机有一个全双工串行口,全双工的串行通信只需要一根输出线和输入线,如图1.4。
单片机 RXD 功能 数据载波检测 接收数据 发送数据 数据终端准备 信号地 数据设备准备好 请求发送 清除发送 振铃指示 标志 DCD RXD TXD DTR GND DSR RTS CTS DELL 计算机 TXD 图1.4 单片机与PC串口通信原理图
串行通信又有异步通信和同步通信这两种方式。异步通信用起始位“0”表示字符的开始,然后从低位到高位逐位传送数据,最后用停止位“1”表示字符结束。一个字符又称作一帧信息,一帧信息包括1位起始位、8位数据位、1位停止位如图7-1-2,若数据位增加到第9位,在8051系列单片机中,第九位数据可以用作奇偶校验位,也可以用作地址/数据帧标志如图1.5,图1.6。
起始位 D0 (0) D1 D2 D3 D4 D5 D6 D7 停止位 (1) 图1.5 帧格式(无奇偶校验位)
起始位 D0 (0) D1 D2 D3 D4 D5 D6 D7 D8 停止位 (1)
图1.6 帧格式(有奇偶校验位)
`
9
8051系列单片机串行I/O接口的工作原理就是:当要发送数据时,单片机自动将SBUF内的8位并行数据转换为一定格式的串行数据,从TXD引脚按规定的波特率来输出;当要接收数据时,要监视RXD引脚,一旦出现起始位“0”,按规定的波特率将外围设备送来的一定格式的串行数据转换成8位并行数据,等待用户读取SBUF寄存器,若不及时读取,SBUF中的数据有可能被刷新。
8051系列单片机上有通用异步接收/发送器(UART,Universal Asynchronous Receiver/Transimitter)用于串行通信,发送时数据由TXD引脚输出,接收时数据从RXD引脚输入。有两个缓冲器(Serial Buffer),一个作发送缓冲器,另外一个作为接收缓冲器。UART是可编程的全双工(Full Duplex)的串行口。短距离的机间通信可以使用UART的TTL电平,使用驱动芯片(MAX232或1488/1489)可与通用微机进行通信。波特率时钟必须从内部定时器1或者定时器2来产生。若在应用中实现RS232所有的握手方式,则必须借助单片机其他引脚用软件来处理。 1.4.3串口相关寄存器
在串口初始化中涉及串口控制寄存器 SCON 和电源控制寄存器 PCON。 1) 串行口控制寄存器 SCON D7 SM0 D6 SM1 D5 SM2 D4 REN D3 TB8 D2 RB8 D1 TI D0 RI SM0、SM1:串口工作方式控制位
表1-8 串口工作方式 SM0 SM1 0 0 0 1 1 1 0 1 工作方式 0 1 2 3 数据位 同步移位寄存器 10 位异步收发 11 位异步收发 11 位异步收发 波特率 Fosc/12 由定时器控制 Fosc/32 或 Fosc/64 由定时器控制 ? SM2:多机通信控制位(方式2、3)
SM2=1:只有接收到第9位(RB8)为1,RI才置位 SM2=0:接收到单个字节,RI就置位
? REN:串口接收允许位REN=1:允许串口接收REN=0:禁止串口接收 ? TB8:方式2和方式3时,为发送的第9位数据,也可以做奇偶校验位。
RB8:方式2和方式3时,为接收到的第9位数据;方式1时,为接收到的停止位。
? TI:发送中断标志位,必须由软件清零。
RI:接收中断标志位,必须由软件清零。 `
10
2) 电源控制寄存器 PCON
表1-9 PCON控制位 D7 SMOD D6 -- D5 -- D4 -- D3 GF1 D2 GF0 D1 PD D0 IDL ? SMOD:串口波特率加倍位。
SMOD=1:方式 1 和方式 3 时,波特率=定时器 1 溢出率/16; 方式 2 波特率=Fosc/32
SMOD=0:方式 1 和方式 3 时,波特率=定时器 1 溢出率/32; 方式 2 波特率=Fosc/64 1.4.4串口工作方式
通过编程串口控制寄存器SCON,串口的工作方式可以有4中,分别是方式0(同步移位寄存器)、方式1(10位异步收发)、方式2(11位异步收发)、方式3(11位异步收发)。 1) 方式 0
方式0为移位寄存器输入/输出方式。串行数据通过RXD输入,TXD则用于输出移位时钟脉冲。
方式0时,收发的数据为8位,低位在前(LSB),高位在后(MSB)。波特率固定为当前单片机工作频率/12。发送是以写SBUF缓冲器的指令开始的,8位输出完毕后TI被置位(TI=1)。
方式0接收是在REN被编程为1且RI接收完成标志位为0满足时开始的。当接收的数据装载到SBUF缓冲器中,RI会被置位(RI=1)。
方式0为移位寄存器输入/输出方式,如果接上移位寄存器74LS164可以构成8位输出电路,不过这样做会浪费了串口真正的实质作用,因为移位方式同样可以用I/O来模拟实现的。 2) 方式 1
方式1是10位异步通信方式,有1位起始位“0”、8位数据位和1位停止位“1”。其中的起始位和停止位是自动插入的。
任何一条以SBUF为目的的寄存器的指令都启动一次发送,发送的条件是TI要为0,发送数据完毕后TI会被置位(TI=1)。
方式1接收的前提条件是SCON的REN被编程为1,同时以下两个条件都必须被满足,本次接收有效,将其装入SBUF和RB8位,否则放弃当前接收的数据。 3) 方式2、3
方式2和方式3这两种方式都是11位异步接收/发送方式。他们的操作过程都是完全一样的,所不同的是波特率而已。
方式3波特率同方式1(定时器1作为波特率时钟发生器)。 `
11
方式2和方式3的发送起始于任何一条SBUF数据装载指令。当第9位数据(TB8)输出之后,TI将被置位(TI=1)。
方式2和方式3的接收数据前提条件也是REN被编程为1。在第9位数据接收到后,如果下列条件同时满足,即RI=0且SM2=0或者接收到的第9位为1,则将已接受的数据装入SBUF缓冲器和RB8,并将RI置位(RI=1)否则接收数据无效。
8051串口的不同寻常的特征是包括第9位方式。它允许把在串口通信增加的第9位用于标志特殊字节的接收。用这种方式,一个单片机可以和大量的其他单片机对话而不打扰不寻址的单片机,这种多机通信方式必须工作在严格的主从方式,由软件进行分析。
` 12