串口与单片机通信Word格式.docx
《串口与单片机通信Word格式.docx》由会员分享,可在线阅读,更多相关《串口与单片机通信Word格式.docx(10页珍藏版)》请在冰豆网上搜索。
各数据位同时传送,传送速度快、效率高,但有多少数据位就需多少根数据线,因此传送成本高,且只适用于近距离(相距数米)的通讯。
一条信息的各位数据被逐位按顺序传送的通讯方式称为串行通讯。
串行通讯的特点是:
数据按位顺序传送,最少仅需一根传输线即可完成,成本低但传送速度慢。
串行通讯的距离可以从几米到几千米。
根据信息的传送方向,串行通讯可以进一步分为单工、半双工和全双工三种。
信息只能单向传送为单工;
信息能双向传送但不能同时双向传送称为半双工;
信息能够同时双向传送则称为全双工。
串行通讯又分为异步通讯和同步通讯两种方式。
在单片机中,主要使用异步通讯方式。
SPCE061A单片机有一个全双工串行口。
全双工的串行通讯只需要一根输出线和一根输入线。
数据的输出又称发送数据(TXD),数据的输入又称接收数据(RXD)。
串行通讯中主要有两个技术问题,一个是数据传送、另一个是数据转换。
数据传送主要解决传送中的标准、格式及工作方式等问题。
数据转换是指数据的串并行转换。
具体说,在发送端,要把并行数据转换为串行数据;
而在接收端,却要把接收到的串行数据转换为并行数据。
异步通讯:
它用一个起始位表示字符的开始,用停止位表示字符的结束。
其
每帧的格式如下:
在一帧格式中,先是一个起始位0,然后是8个数据位,规定低位在前,高位在后,接下来是奇偶校验位(可以省略),最后是停止位1。
用这种格式表示字符,则字符可以一个接一个地传送。
在异步通讯中,CPU与外设之间必须有两项规定,即字符格式和波特率。
字符格式的规定是双方能够对0和1的串理解成同一种意义。
原则上字符格式可以由通讯的双方自由制定,但从通用、方便的角度出发,一般还是使用一些标准为好,如采用ASCII标准。
串行口控制寄存器SCON字节地址98H,可位寻址,格式如图1.2所示。
图1.2串行口寄存器scon格式
(1)SM0、SM1——串行口4种工作方式的选择位
表1.1串行口的4种工作方式
SM0
SM1
方式
功能说明
同步移位寄存器方式(用于扩展I/O口)
1
8位异步收发,波特率可变(由定时器控制)
2
9位异步收发,波特率为fosc/64或fosc/32
3
9位异步收发,波特率可变(由定时器控制)
(2)SM2——多机通信控制位
用于方式2或方式3中。
当串行口以方式2或方式3接收时,如果SM2=1,只有当接收到的第9位数据(RB8)为“1”时,才将接收到的前8位数据送入SBUF,并置“1”RI,产生中断请求;
当接收到的第9位数据(RB8)为“0”时,则将接收到的前8位数据丢弃。
如果SM2=0,则不论第9位数据是“1”还是“0”,都将前8位数据送入SBUF中,并置“1”RI,产生中断请求。
在方式1时,如果SM2=1,则只有收到停止位时才会激活RI。
在方式0时,SM2必须为0。
(3)REN——允许串行接收位
由软件置“1”或清“0”。
REN=1允许串行口接收数据。
REN=0禁止串行口接收数据。
(4)TB8——发送的第9位数据
方式2和3时,TB8是要发送的第9位数据,可作为奇偶校验位使用,也可作为地址帧或数据帧的标志。
TB8=1为地址帧,TB8=0为数据帧。
(5)RB8——接收到的第9位数据
方式2和3时,RB8存放接收到的第9位数据。
在方式1,如果SM2=0,RB8是接收到的停止位。
在方式0,不使用RB8。
(6)TI——发送中断标志位
方式0时,串行发送第8位数据结束时由硬件置“1”,其它工作方式,串行口发送停止位的开始时置“1”。
TI=1,表示一帧数据发送结束,可供软件查询,也可申请中断。
CPU响应中断后,向SBUF写入要发送的下一帧数据。
TI必须由软件清0。
(7)RI——接收中断标志位
方式0时,接收完第8位数据时,RI由硬件置1,其它工作方式,串行接收到停止位时,该位置“1”。
RI=1,表示一帧数据接收完毕,并申请中断,CPU从接收SBUF取走数据。
该位状态也可软件查询。
RI必须由软件清“0”。
1.3波特率选择
波特率(Boud
Rate)就是在串口通信中每秒能够发送的位数(bits/second)。
MSC-51串行端口在四种工作模式下有不同的波特率计算方法。
其中,模式0和模式2波特率计算很简单,模式1和模式3的波特率选择相同,故在此仅以工作模式1为例来说明串口通信波特率的选择。
在串行端口工作于模式1,其波特率将由计时/计数器1来产生,通常设置定时器工作于模式2(自动再加模式)。
在此模式下波特率计算公式为:
波特率=(1+SMOD)*晶振频率/(384*(256-TH1))
其中,SMOD——寄存器PCON的第7位,称为波特率倍增位;
TH1——定时器的重载值。
在选择波特率的时候需要考虑两点:
首先,系统需要的通信速率。
这要根据系统的运作特点,确定通信的频率范围。
然后考虑通信时钟误差。
使用同一晶振频率在选择不同的通信速率时通信时钟误差会有很大差别。
为了通信的稳定,我们应该尽量选择时钟误差最小的频率进行通信。
下面举例说明波特率选择过程:
假设系统要求的通信频率在20000bit/s以下,晶振频率为12MHz,设置SMOD=1(即波特率倍增)。
则
TH1=256-62500/波特率
根据波特率取值表,我们知道可以选取的波特率有:
1200,2400,4800,9600,19200。
列计数器重载值,通信误差如下表:
波特率
计数器重载值TH1
波特率误差
1200
204
0.16%
2400
230
4800
243
9600
249
6.99%
19200
253
8.51%
因此,在通信中,最好选用波特率为1200,2400,4800中的一个。
1.4通信协议的使用
通信协议是通信设备在通信前的约定。
单片机、计算机有了协议这种约定,通信双方才能明白对方的意图,以进行下一步动作。
假定我们需要在PC机与单片机之间进行通信,在双方程式设计过程中,有如下约定:
0xA1:
单片机读取P0端口数据,并将读取数据返回PC机;
0xA2:
单片机从PC机接收一段控制数据;
0xA3:
单片机操作成功信息。
在系统工作过程中,单片机接收到PC机数据信息后,便查找协议,完成相应的操作。
当单片机接收到0xA1时,读取P0端口数据,并将读取数据返回PC机;
当单片机接收到0xA2时,单片机等待从PC机接收一段控制数据;
当PC机接收到0xA3时,就表明单片机操作已经成功。
1.5串口通讯接口
常用PC机串行接口有3种:
PS/2接口用于连接键盘和鼠标;
RS232C串行接口一般用来实现PC机与较低速外部设备之间的远距离通信;
USB通用串行总线接口是现在比较流行的接口,它最大的好处在于能支持多达127个外设,外设可以独立供电。
PC机的3种串行接口都可以用于与外设之间的数据通信,PS/2接口由于是专用于键盘和鼠标,在PC机的编程处理上要麻烦一些,而且在多数情况下,其他外设还不能占用。
USB接口有着功能强大、传输速度高、连接外设数量多,可向外设提供电源等特点,其应用越来越广,但是与RS232C串行接口比较,USB接口的上位机(即PC机)程序的开发有着开发难度大、涉及知识面广、开发周期长等特点,同时在下位机(即单片机)硬件设计时必须选用带有USB接口的单片机或扩展专门的USB接口芯片,这必然会给下位机的软硬件系统设计增加难度并提高了软硬件成本。
所以,USB接口通常用于对传输速度要求高、传输功能复杂、或需上位机提供电源的外设和装置上。
整体原理图如图1.2串口通信原理图。
图1.2串口通信原理图
2程序下载
51单片机有一个全双工的串行通讯口,所以单片机和计算机之间可以方便地进行串口通讯。
进行串行通讯时要满足一定的条件,比如计算机的串口是RS232电平的,而单片机的串口是TTL电平的,两者之间必须有一个电平转换电路,我们采用了专用芯片MAX232进行转换,虽然也可以用几个三极管进行模拟转换,但是还是用专用芯片更简单可靠。
我们采用了三线制连接串口,也就是说和计算机的9针串口只连接其中的3根线:
第5脚的GND、第2脚的RXD、第3脚的TXD。
这是最简单的连接方法,但是对我们来说已经足够使用了,电路如下图所示,MAX232的第10脚和单片机的11脚连接,第9脚和单片机的10脚连接,第15脚和单片机的20脚连接。
如图2.1所示
图2.1ISP连接图
3软件实现
3.1单片机串行口的初始化
MCS-51单片机利用工作于方式2的定时器T1作为周波发生器。
当用9600bit/s,PCON的SMOD设为0,用12MHz晶振时定时器T1初值取为0FDH。
单片机串行口的初始化包括以下内容串行控制寄存器SCON的设置、定时器方式控制寄存器TMOD及T1的定时初值的设置、专用寄存器PCON的SMOD位的设置。
假定某系统选择方式1,SCON设置为50H,即选择串行方式1、10位UART,REN置为1允许接收。
这种情况下,该系统的单台下位机通信初始化程序描述如下
MOVPCON,#00H:
SMOD=0
MOVSCON,#50H:
通信方式1允许接收
MOVTMOD,#21H:
T1方式2T0方式1
MOVTL1,#0FDH:
设置9600bit/s
MOVTH1,#0FDH
上位机要同某台下位机通信时,先送出通信开始标志(本系统采用1BH,即“ESC”键的ASCII码),接着发送各下位机的地址信号,再送出本次要发送的数据个数的信息,最后是连续地发送出显示数据。
下位机采用查询的方式接收数据,当RI被激活时,读入数据,判断是否是1BH,如果是,则继续等待接收下一个数据,判断是否是在呼叫自己,若是,则往下接收第三个数,即本次要接收的数据个数,并按照其所给信息相应设定往下要连续接收的数据个数。
3.2上位机(PC)的串行通信实现方法
应用VisualC++开发串行通信目前通常有如下几种方法:
一是利用WindowsAPI通信函数:
二是利用VisualC++的标准通信函数_inp、_inpw、_inpd、_outp、_outpw、_outpd等直接对串口进行操作;
三是使用MicrosoftVisualC++的通信控件(MSComm)四是利用第三方编写的通信类。
以上几种方法中第一种使用面较广,但由于比较复杂,专业化程度较高,使用困难;
第二种需要了解硬件电路结构原理;
第三种方法看来较简单,只需要对串口进行简单配置,但是由于使用令人费解的VARIANT类,使用也不是很容易;
第四种方法是利用一个专门针对串行通信的CSerial类(这种类是由第三方提供),只要理解这种类的几个成员函数,就能方便的使用。
这里对使用的CSerial类进行一下简单的介绍。
CSerial是由MuMegaTechnologies公司提供的一个免费的VisualC++类,利用它可方便地实现串行通信。
以下为该类定义的说明部分:
classCSerial
{
public:
CSerial();
~CSerial();
BOOLOpen(intnPort=2,intnBaud=9600);
BOOLClose(void);
intReadData(void*,int);
intSendData(constchar*,int);
intReadDataWaiting(void);
BOOLIsOpened(void){return(m_bOpened);
}
protected:
BOOLWriteCommByte(unsignedchar);
HANDLEm_hIDComDev;
OVERLAPPEDm_OverlappedRead,m_OverlappedWrite;
BOOLm_bOpened;
}
下面是几个成员的说明
•CSerial:
:
Cserial是类构造函数,不带参数,负责初始化所有类成员变量;
•CSerial:
:
Open这个成员函数打开通信端口。
带两个参数,第一个是串口号,有效值是1到4,第二个参数是数据传输速率,返回一个布尔量;
Close函数关闭通信端口。
类析构函数调用这个函数,所以可不用显式调用这个函数;
SendData函数把数据从一个缓冲区写到串行端口。
它所带的第一个参数是缓冲区指针,其中包含要被发送的资料,这个函数返回已写到端口的实际字节数;
ReadDataWaiting函数返回等待在通信端口缓冲区中的数据,不带参数
ReadData函数从端口接收缓冲区读入数据。
第一个参数是void*缓冲区指针,资料将被放入该缓冲区;
第二个参数是个整数值,给出缓冲区的大小。
3.3异步串行通信的实现
上位机每个Command控件的通信程序流程图如图3.1所示。
图3.1上位机通信流程图
上位机通信程序完成的主要操作包括上位机向下位机发送通信开始标志“1BH”、欲呼叫下位机的联络地址、指令下位机接收数据个数的信息以及显示屏要显示的文字信息等。
每一台下位机的显示信息各用一个Command(命令)按钮控件发送。
各台下位机用查询方式接收数据。
由于单片机还要不断地以通信方式0向显示屏幕LED发送显示数据(用定时器T0中断来激活),需要占用RXD端口,因此平时单片机以方式1循环等待上位机的数据,T0中断后才改为方式0,这样可解决同时用到通信方式1和方式0引起的RXD端口冲突。
单台下位机的8031通信程序流程图如图3.2所示。
图3.2单台下位机通信程序流程图