孙卫喜
(渭南师范学院 网络安全与信息化学院,陕西 渭南 714099)
单片机在C语言串口通信中的应用解析
孙卫喜
(渭南师范学院 网络安全与信息化学院,陕西 渭南 714099)
在分析了单片机涵义和串口通信工作方式的基础上,结合前期采用汇编语言编写的单片机应用系统程序可读性差、可移植性不好,且程序编写周期长、调试比较困难等问题,文中倡导以C语言作为编写单片机应用系统的编程语言,从而使得单片机能巧妙利用C语言实现单片机之间的多机高效通信,充分展示出单片机使用寿命长、运行速度快、低噪音、技术可靠的特征。实验结果表明,单片机应用系统中使用C语言编写的程序可读性、可移植性、稳健性更强,能使串口通信更加高效、便捷、可靠。同时使得价格低、稳定性强、功能好、功耗小等这些单片机的特点得到更充分的发挥。
单片机;C语言应用;程序编写;串口通信
单片微型计算机(Single Chip Microcomputer)是单片机的简称,它将CPU(中央处理器)、串并行I/O接口电路、EPROM(可编程存储器)、ROM(只读存储器)、内外部系统总线、计数器/定时器等计算机的主要部件都集成到一块芯片中,特别适合控制系统的数据处理,因而也称为微控制器(Microcontroller),它是个完整的微型计算机[1]。随着技术的不断发展,单片机在结构上采用双CPU结构使运算速度及处理能力得以提高;在制造工艺上芯片朝着低功耗及高集成化方面迈进;增加浮点运算单元、PWM输出、通信控制器、PCA可编程计数器阵列等功能部件;新型串行总线结构的使用给扩充配置提供了便利。技术的不断更新使单片机在网络、数据处理、通信、工业控制等领域得到广泛应用。
单片机的发展历程可分为5个阶段。
(1)初期的4位微处理器Inter 4004(MCS-4)到Intel 8008 8位微处理器。
(2)低性能8位机,如MCS-48系列。此时的CPU、计数器、I/O接口均为8位,虽说此时的单片机系统简单、寻址范围不大、容量有限,但已基本具备了普通仪表、过程控制的需要。
(3)高性能带有串行口及多级中断处理系统,如MCS-51系列。此时的单片机在寻址范围、芯片容量、系统功能等方面都得到很大的提高,应用范围也在逐步扩大。
(4)16位单片机的使用使单片机芯片容量、运算速度、控制功能等大幅提高,如16位MCS-96系列。
(5)90年代后单片机朝着高集成化及低功耗等方向发展[2]。
目前市面上流行的单片机系列产品较多,主要生产厂家有:Intel、ADM、Philips等。单片机的应用可分为单机应用和多机应用。单机方面主要应用在测控系统(如普通的页面控制及顺序控制等)、智能仪表(如压力测量及仪表控制等)、机电一体化(如医疗器械及数控机床等)、智能接口(如数据大型采集及误差修正等)、智能民用产品(如家电及电子秤等)[3]。多机方面主要应用在功能集散系统(如计算机同时控制机床对刀系统及刀库管理等多个系统)、并行多机控制系统(如图像实时处理及并行数据采集等)、局部网络系统(如通信控制等)。
总之,随着单片机在功能方面的进一步增强,它将在机电一体化、工业控制等方面得到更广泛的应用,人们在日常生活中使用的手机、游戏机、鼠标、汽车配件及各种电子设备及机械产品中都能见到单片机的身影。特别是微控制技术(软件代替硬件的控制技术)的使用,即可用软件方法由单片机完成以前数字电路或模拟电路完成的很多功能,使控制系统传统的设计方法与设计思想得以改变。
(1)单片机设计采用总线结构内部布线很短,将各功能的部件都集成在一块芯片上,常数和程序指令等在ROM中固化,因而,体积小、性能稳定、抗干扰能力强。
(2)单片机指令丰富简单,CPU通过对多个I/O的逻辑操作、位操作等实现对设备的控制,特别适合工业控制[4]。
(3)单片机工作电流为μA级,工作电压在2.2V以下,因而功耗低、便于携带。
(4)单片机性能价格比极高,随着技术的发展及单片机寻址范围和ROM容量的扩大,再加之单片机开发周期短、硬件结构简单,使单片机在技术性能及产品价格上更具优势。
(5)对单片机系统通过编写不同的程序高效稳定地实现设备的不同功能特征,特别是用C语言编程的单片机系统程序可读性更强,易于理解,也有利于程序的移植。
(6)单片机提供了多个并串行I/O接口及用于扩展的三总线,使单片机极易组成不同类型的应用系统。
这里的通信即信息交换,是在计算机之间或计算机与外部设备间进行的。并行通信与串行通信是通信的两种基本方式。并行通信是利用多条数据线,每次同时并行传输多位数据,如打印机接口8条数据线同时传送数据一次传送一个字节。并行通信的优点是传输速度很快,缺点是成本高、通信线路比较复杂。串行通信的特征是数据一位跟着一位顺序传送,通信线路一对就可以,因而简单、成本低,多用于远距离通信,不足之处是速度慢。
串行通信与并行通信相比更适合较远距离的计算机之间或计算机与终端设备间的信息传输,它的应用范围更广。单片机的串行通信是通过内部的串口电路来实现的,异步传送与同步传送是串行通信的两种基本方式。异步传送方式是以一个起始位表示字符的开始用停止位结束字符,以单个字符为单位传送数据,在约定的波特率下发送端与接收端同步要求不很严格,只要频率误差在1/10内两端即能正常通信。同步通信时发送端与接收端在约定的波特率下,保持发送与接收数据的每一位同步,因此信息的传送位数不受限制,一次可以传送多个字节。同步通信的缺点是设备较复杂、成本高。相比之下,异步通信虽然在传输信息时因增加了附加信息而增大了传输的信息量,但这种信息传输方式易于实现且可靠,因而被广泛应用。
生产厂商生产的微处理器有可编程的输入输出通用接口,这些接口功能性很强,可以通过编写程序指挥其完成相应的功能。例如,Intel公司在80系列微处理器中使用的8250可编程串行接口使用方便且功能性强,被广泛使用[5]。MCS-51单片机系列产品有全双工串行可编程通信接口,初始化编程时使用PCON与SCON特殊寄存器对串口实行控制,由软件设置波特率,通过芯片内的计数器/定时器产生,采用8位、10位和11位三种帧格式,使用更方便。
3.1 串行接口的控制寄存器
SCON(Serial CONtrol register)与PCON(Power CO-Ntrol register)是串行接口两个有特殊功能的控制寄存器。SCON有位寻址功能,字节地址为98H,指示串口的状态,接收与发送串行通信的方式选择。PCON(功率控制寄存器)单元地址是87H,控制位有SMOD、SMOD0、LVDF、POF、GF1、GF0、PD、IDL等,在MCS-51系列中定时器2发生的波特率的倍率用SMOD控制[6-7],进入掉电模式是PD(Power Down),进入空闲模式是IDL(IDLe)。
3.2 串行接口工作方式
按SCON中的SMO与SM1不同选择将串行口工作方式分为四种。
(1)方式0。
图1、图2是串行接口方式0的发送接收时序图。该方式波特率是fosc/12,为同步移位寄存器工作方式。如图1所示,发送数据时引脚TXD输出同步脉冲,发送数据由引脚RXD串行发送SBUF中的数据。串行接口在数据到来时,将8位数据从RXD引脚以振荡频率(fosc)的1/12固定波特率由高位至低位依次输出,完成后终端标志TI置1,下次发送数据前将TI清0。如图2所示,接收数据时串行接口处于方式0输入且RI置0及REN置1,这时数据输入端是RXD同步信号,输出端是TXD,采样RXD引脚输入数据时接收器的波特率为fosc/12,完成8位数据接收后将中断标志RI置1,下次接收数据前将RI清0。同步位移寄存器方式是串行接口工作方式0采用的工作方式,即该工作方式输入输出采用的是8位移位寄存器,主要用于输入输出端口的扩展[8]。工作时SCON的SM2位应为0,用该方式完成8位数据的接收或发送后用硬件置RI或TI标志,由软件清除RI或TI。
图1 串行接口方式0的发送时序
图2 串行接口方式0的接收时序
(2)方式1。
图3、图4是串行接口方式1的发送接收时序图。该方式通信接口是波特率可变的8位异步UART接口。如图3所示,方式1发送数据时由TXD输出数据位,1帧10位信息发送时起始位占1位,接着是从低位至高位的8位数据位,最后是1位停止位。发送缓冲区SBUF接收到1条CPU的写入指令,执行发送过程,数据发送完成后将TI(中断标志)置1。波特率的确定在方式1传送中是由PCON(特殊功能寄存器)中SMOD的值和定时器TI的溢出率(定时器1秒的溢出次数)共同决定的,可以表示为:波特率=2SMOD/32×(定时器TI的溢出率)。通过编程可以设置波特率,1位程控位SMOD有1和0两种取值,SMOD值取1时的波特率为:1/16×(定时器TI的溢出率),SMOD值取0时的波特率为:1/32×(定时器TI的溢出率)。如图4所示,方式1接收数据时REN为1,串行口为方式1输入状态,采样RXD引脚状态是所选波特率的16倍速率,接收器是在采样从1至0的负跳变时启动,为确保接收信息准确性,接收值应为3次采样至少2次相同的值[9]。在检查到起始位有效时接收1帧的其他信息。同样1帧10位信息接收时起始位占1位,接着是从低位至高位的8位数据位,最后是1位停止位。方式1接收有效信息时RI为0且SM2为0或停止位为1,否则该组数据丢失,接收完1帧数据时RI要清0,重新检测RXD上1至0的负跳变。
图3 串行接口方式1的发送时序
图4 串行接口方式1的接收时序
(3)方式2。
图5、图6是串行接口方式2的发送接收时序图。该方式通信接口是9位UART接口。SMOD为1时波特率为fosc/32;SMOD为0时波特率为fosc/64。如图5所示,方式2TXD为发送数据输出端,1帧11位信息发送时起始位占1位,接着是从低位至高位的8位数据位,下来是可控位1位,最后是1位停止位,其中第9位是SCON中的TB8,可作数据的奇偶校验位或通信中数据及地址的标志位。SBUF接收到1条CPU的写入指令后执行发送过程,数据发送完成后将TI(中断标志)置1,向CPU再次申请中断,下1帧信息发送前TI需清0。如图6所示,方式2接收数据时REN为1,RXD为数据输入端,同样1帧11位信息接收时起始位占1位,接着是从低位至高位的8位数据位,下来是可控位1位,最后是1位停止位。方式2中接收器是在采样从1至0的负跳变且起始位有效后接收1帧数据,第9位数据接收后若RI为0并且SM2为0或接收到的第9位数据为1,则将接收到的第9位数据送入RB8,接收到的数据送入接收缓冲器(SBUF),再将RI置1。如果不满足上述条件则数据丢失。
图5 串行接口方式2的发送时序
图6 串行接口方式2的接收时序
(4)方式3。
方式3通信接口是波特率可变的9位异步串行口,除波特率为:(2SMOD/32)×(定时器TI的溢出率),可设置多种波特率外,其他同方式2。
程序实例如下[10-13]:
void Serial_Init(void)
{
TMOD=0x20; //方式2TI
PCON=0x00; //进入掉电模式SMOD=0,PCON=00H,PD=PCON.2=1
TL1=TH1=BAUD_9600; //BAUD:9600
SCON=0x50; //允许接收,REN=1,串行通信方式1
ET1=0; //不允许中断
TR1=1; //开启定时器1
IE=0; //关闭所有中断允许位
memset(&SerialBuf, 0x00, SERIAL_BUF_LEN); //初始化SerialBuf[SERIAL_BUF_LEN]
}
/******************************************************
***名称:SendByte()
***功能:串口发送一个字节
***输入:ucData
***返回:无
***说明:无
******************************************************/
void SendByte(unsigned char ucData)
{
SBUF=ucData;
while(!TI)
{
_CLRWDT_;
}
TI=0;
}
实验结果表明,使用C语言编写单片机的系统程序,能使系统程序变得更易于理解,可读性更强,也有利于程序的移植,同时程序的稳健性也较好。所以使用C语言编写的单片机系统程序在串口通信中更加实用、便捷、可靠。
[1] 胡汉才.单片机原理及其接口技术[M].北京:清华大学出版社,2004.
[2] 杨恢先.单片机原理及应用[M].长沙:国防科技大学出版社,2003.
[3] 陈丽芳.基于单片机的嵌入式系统开发[J].电子测试,2015(10):13-14.
[4] 王玉喜.浅析单片机在网络中的应用[J].黑龙江科技信息,2013(17):138-138.
[5] 洪 沙,阳翰凌.单片机多机通信中从机串口中断服务程序设计[J].微处理机,2008,29(6):153-155.
[6] 熊益铭.C语言在单片机串口通信中的应用[J].电子科技,2005(8):39-42.
[7] Dunkels A,Gronvall B,Voig T.Contiki-a lightweight and flexible operating system for tiny networked sensors[C]//Proceedings of the 29th annual IEEE international conference on local computer networks.Washington,DC,USA:IEEE Computer Society,2004:455-462.
[8] 朱振亚.8051单片机串口通信中的检错方法[J].科技创新导报,2011(23):76-77.
[9] Bhattii S,Carlson J,Dai H,et al.MANTIS OS:An embedded multithreaded operating system for wireless micro sensor platforms[J].Mobile Networks and Applications,2005,10(4):563-579.
[10] 黄晓峰.论单片机课程教学中C语言编程的规范性[J].科教导刊,2015(8):127-128.
[11] 余 勍,王 捷.浅谈C语言编程技巧在C语言学习中的应用[J].信息通信,2013(7):108-108.
[12] 顾泰龙,李远静.基于C语言的计算机软件编程实验研究[J].软件工程师,2013(8):39-41.
[13] Bait R,Bicket J C,Dantas D S,et al.On the need for system-level support for ad hoc and sensor networks[J].SIGOPS Oper,2002,36(2):1-5.
Analysis of Application of Single Chip Microcomputer in Serial Port Communication of C Language
SUN Wei-xi
(College of Network Security and Information Technology,Weinan Normal University,Weinan 714099,China)
After analyzing the meaning of Single Chip Microcomputer (SCM) and the manner of work in serial port communication,combined the problem of poor readability and portability,long programming cycle and difficult debugging for single chip application system written by assembly language,it advocates to C language as programming language to write single-chip microcomputer application system in this paper and makes SCM to realize the efficient connection in many SCMs by C language,which fully shows the characteristics of SCM,such as long service life,fast operation,low noise,and reliable technique.The experiment shows that the program which made in C language is better in readability,transportability and stability.It makes serial port communication more efficient,easy and reliable and the characteristics of SCM to get more sufficient play,including low prices,strong stability,good function,and low consumption and so on.
single chip microcomputer;application of C language;program writing;serial port communication
2015-09-27
2015-12-30
时间:2016-05-25
2012年陕西省科技计划项目(2012JM8048);陕西省渭南市科技创新扶持资金(2012KYJ-6)
孙卫喜(1965-),男,高级工程师,研究方向为网络安全、网络应用。
http://www.cnki.net/kcms/detail/61.1450.TP.20160525.1711.064.html
TP39
A
1673-629X(2016)07-0160-04
10.3969/j.issn.1673-629X.2016.07.034