串口通信论文报告

串口通信论文报告
串口通信论文报告

串口通信课程总结

题目:温度实时监控系统

目录

绪论 (2)

1.1 研究课题的目的及意义 (2)

1.2国内外现状 (2)

1.3本设计的目标 (3)

2 开发工具介绍 (4)

2.1 keil简介 (4)

2.2 C++ Build简介 (4)

3 下位机设计 (5)

3.1 下位机的系统设计 (5)

3.2 下位机的程序设计 (5)

3.3 DS18B20模块设计 (6)

3.5 串口模块设计 (9)

4 上位机设计 (12)

4.1 上位机系统简介 (12)

4.2 温度显示部分 (12)

4.3 数据库存储部分 (13)

4.4 温度曲线部分 (14)

5 调试过程 (15)

5.1 下位机调试 (15)

5.2上位机调试 (15)

6 系统总结 (17)

【参考文献】 (18)

绪论

1.1 研究课题的目的及意义

实时测量温度是在当今的自动化控制领域尤为重要,比如电机运行时温度的升高会直接影响其寿命和可靠性;液体混合加热时,温度过低过高都有可能液体混合的效果。所以,实时温度监控就像人的一双眼睛,把无形的温度,转换成我们可见的信号。通过这个系统,我们就能轻松地管理好温度并对其做出相应的判断。

最传统的实时监控温度系统是由温度计直接完成。随着科技的发展,电子温度计取代了传统的温度计,由MCU控制温度芯片,加上显示部件,就构成了第二代温度监控系统。随着PC的普及,以及远程监控的优越性,第三代温度监控系统应运而生。第三代温度监控系统是由MCU控制温度传感器,将采集到的温度数据实时传送到上位机,并在上位机上将接收到的数据进行分析处理,最终讲结果返还,同时还可以通过上位机直接去操作实物,从而达到了非接触式的效果,这大大地提高了效率,同时稳定性和可靠性也相应有个提高。

那么,对于我们来说,实时温度监控系统的设计是让我们掌握并巩固所学的知识,提高自己动手能力的一个重要的途径。通过对它的设计,我们可以掌握实时温度监控系统的精髓从而使能力得到很大的提高,这样就有利于我们今后自身的发展。

1.2国内外现状

目前计算机硬件技术朝着巨型化、微型化和单片化三个方向发展,单片机代表着计算机技术的一个发展方向,先后经历了4位机、8位机、16位机、32位机和64位机等几个发展阶段。

虽然单片机经过几个阶段的发展,但从实际情况来看,并没有出现像微机处理那样推陈出新、更新换代的局面,这也是单片机发展的一大特点。4位、8位、16位、32位都存在于市场中,各有应用领域。不过,各类单片机为适应市场需

求,都要求在原来的基础上采用新技术、提高性能,推出新产品。下图是电子工程师对单片机选型的市场调查,从中可以看到,8位单片机仍然是市场的主流产品,但32位单片机发展很迅速。

从单片机30多年的发展例程可以看到,单片机技术的发展以微处理器技术及超大规模集成电路技术的发展为新导,体系上,由SCM过渡到MCU,最后向SOC 方向发展。同时,单片机速度越来越快,工作电压和功耗降低,引入了低噪声和高可靠的技术,并由原来的一次性写入,变成了可多次编程以及在线仿真等等。

1.3本设计的目标

(1)掌握PCF8563、DS18B20以及串口中断、定时器等模块知识,深化C语言语法,进一步熟悉单片机编程方法。

(2)掌握C++Build的常规使用,并会简单的开发。

(3)掌握利用ACCESS建立数据库并会SQL的一般查询。

(4)实现上下位机的基本通信。

2 开发工具介绍

2.1 keil简介

Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部分组合在一起。运行Keil软件需要WIN98、NT、WIN2000、WINXP等操作系统。如果你使用C语言编程,那么Keil几乎就是你的不二之选,即使不使用C语言而仅用汇编语言编程,其方便易用的集成环境、强大的软件仿真调试工具也会令你事半功倍。

2.2 C++ Build简介

C++ Builder是由Borland公司推出的一款可视化集成开发工具。C++ Builder具有快速的可视化开发环境:只要简单地把控件(Component)拖到窗体(Form)上,定义一下它的属性,设置一下它的外观,就可以快速地建立应用程序界面;C++ Builder内置了100多个完全封装了Windows公用特性且具有完全可扩展性(包括全面支持ActiveX控件)的可重用控件;C++ Builder具有一个专业C++开发环境所能提供的全部功能:快速、高效、灵活的编译器优化,逐步连接,CPU透视,命令行工具等。它实现了可视化的编程环境和功能强大的编程语言(C++)的完美结合。

C++ Builder优化的32位原码(Native Code)编译器建立在Borland公司久经考验的编译技术基础之上,提供了高度安全性、可靠性、快速性的编译优化方法,完全编译出原始机器码而非中间码,软件执行速度大大提高。在编译和连接过程中,C++ Builder自动忽略未被修改的原代码和没有使用的函数,从而大大提高了编译和连接速度。C++ Builder的CPU透视工具包括五个独立的小面板,可以对正在运行程序从内部进行深层次的了解。

3 下位机设计

3.1 下位机的系统设计

该温度实时监控系统组成的基本硬件模块主要有5V电源、DS18B20温度传感器、PCF8563时钟芯片、串口、STC89C52以及数码管组成。这些模块都是比较基础。以下是下位机系统框图:

由于时间有限,这次没有做板,这次所用的是一块以前电装实习焊的开发板,它集成了以上用到的所有模块。

3.2 下位机的程序设计

一般的单片机程序设计,都是先把小模块程序调试成功,然后进行封装,最后再把各个已封装好的小模块进行组合,在主函数中直接调用并综合运用。本次的设计思路就是这样。其流程如下图所示

3.3 DS18B20模块设计

DS18B20只有三个管脚,是典型的一线总线封装。所以它的原理图也很简单,一根电源线和一根底线再加上一根数据线。下图3.3.1图是它的原理图:

开始

初始化

8563写时间

8563读时间

温度数据处理

温度显示

0.1S定时器

发送数据到上位机串口中断

读写18B20,需要很严格的时序控制。以下是18B20

的读写控制时序图:

18B20读一个字节的时序图

读写18B20,就是根据它的时序图,定义变量,然后拉高拉低,控制延时时间就可以了。事实上,大部分芯片都是通过看它的时序图来编写程序的,所以学会看时序图,也是编程的一门必修课。一个封装好的18B20模块,应该包括下面几个部分:

18B20初始化读一个字节子程序写一个字节子程序

18B20读取温度

3.4 PCF8563模块设计

PCF8563是低功耗的CMOS实时时钟/日历芯片,它提供一个可编程时钟输出,一个中断输出和掉电检测器,所有的地址和数据通过I2C总线接口串行传递,是很典型的I2C总线芯片。

PCF8563是DIP8封装,它的引脚图以及引脚说明如下图:

根据它的引脚图,很容易就可以画出它的原理图,一下是它的原理图:

以下是PCF8563的各种工作时序图:

I2C总线的起动和停止条件

PCF8563读一个字节程序

PCF8563写一个字节程序

读写一个I2C程序,要注意的是时序的延时时间要精确,不能超过范围,以及SCL和SDA的先后顺序要清楚。写它的程序时,先根据时序图写出读写一个字节以及初始化等最小模块,然后通过这些最小模块,编写读写日期等操作,最后将它们封装成一个PCF8563.c 文件,这样不仅方便别人看我们的程序,也非常方便去调试程序。一下是PCF8563程序的模块框图:

初始化PCF8563 读一个字节写一个字节

PCF8563读日期PCF8563写日期

3.5 串口模块设计

串口通信主要分成串行通信和并行通信,该系统用到的是串行通信。串行通信传输的速率虽然小于并行通信,但是可以节省很多IO口,这对于单片机等IO 资源较少的MCU来说,是非常重要的。串行口的控制可由其内部的控制寄存器

SCON来设定,它可以设定工作方式、接收发送控制以及设置状态标志,下图是控制寄存器:

如上图,SM0、SM1是串口工作方式选择位,通过它们的不同组合,可形成4中不同的工作方式,如下图:

SM2:多机通信控制位,只在工作方式2和工作方式3使用。

REN:允许串行接收控制位,当REN=1时允许接收。

TB8:发送数据D8位,在方式2和方式3时,TB8为所要发送的第9位数据。在多机通信中,以TB8位的状态表示主机发送的是地址还是数据:TB8=0为数据,TB8=1为地址。

RB8:接收数据D8位,在方式2和方式3时,接收到的第9位数据可作为奇偶校验位或地址帧或数据帧的标志。在方式1时,若SM2=0,则RB8是接收到的停止位。在方式0时,不使用RB8位。

TI:发送中断标志位,在方式0时,当发送数据第8位结束后,或在其它方式发送停止位后,由内部硬件使TI置位,向CPU请求中断。CPU在响应中断后,必须用软件清0。

RI:接收中断标志位,在方式0时,当接收数据的第8位结束后,或在其它方式接收到停止位的的中间由内部硬件使RI置位,向CPU请求中断。同样,也必须在CPU响应中断后,必须用软件清0。

串口通信,就是根据上面几个参数,控制串口的工作状态。先让串口初始化,关闭串口,接着把所要写的数据放入SBUF当中,然后开启中断,这样就可以向

上位机发送数据。同样道理,定义一个数组变量,把SBUF的内容写到变量当中,也可以接收到上位机发来的数据。

一个完整的串口封装,它的程序框图应该包括下面几项:

使用51单片机,通常我们用的串口是RS232,它是由MAX232芯片和9针的串口加上合适的电容电阻组成,它的硬件原理图如下图:

串口初始化发送一个字节程序接收一个字节程序

发送一个字符串程序接收一个字符串程序

4 上位机设计

4.1 上位机系统简介

本次上位机是实现温度的实时显示,以及查询历史温度,并且用曲线去显示温度的变化趋势。所以,该系统主要分为三大部分:温度显示部分、数据库存储部分、温度曲线部分。下图是完成后的整个上位机截图:

该系统由于下位机没有时间的校正,与北京时间存在一定的差别,所以时间的显示时,直接获取电脑的时间。当然,在数据库进行数据存储时,还是用下位机传送的时间数据。由于查询数据库时,不能同时又进行数据库的存储,所以在上位机上添加了“返回实时接收”的功能。该系统上下位机的串口通信协议为:FF FA TempH TempL yea mon day hou min sec 。

4.2 温度显示部分

温度显示是该系统最为直观也是首要完成的任务,因为它能直观地实时显示

出温度。由4.1节最后的上下位机通信协议我们可以很清楚的知道:要能显示数据,首先是能接收到下位机传送上来的数据。所以在接收温度和时间等数据时,首先要根据通信协议,判断接收到的字符串的前两个数是不是FF、FA,如果是,则开始接收数据,接收到的数据将在接收数据的Memo里显示,如右下图:下位机传送上来的是十六进制数,我们要

先把接收到的数据进行十进制转换,然后再转

换成字符串,之后截取数组的长度,把温度的

数据加上温度符号发送到相应的位置进行显

示。到此位置,温度显示部分就完成了。

4.3 数据库存储部分

数据库存储是该系统比较重要的一部分,也是上位机的难点之一。由于时间仓促,这次数据库只是拿老师课件里的数据库改了一下,功能还没有很完善,查询数据库的范围很小。数据库部分需要掌握的知识,主要有利用Access创建数据库,添加系统所需要的ID,然后在上位机C++Build的窗体中添加ADOConnection、ADOQuery和DataSource三个控件,并新建一个DBGrid用来显示数据库的内容。下图是用Access建好的数据库:

由于数据库不能同时进行查询和添加数据两个操作,所以在查询的时候要暂

停对数据库的写操作,当查询完推出数据库以后,如果要继续记录数据,要点击DBGrid旁边的“返回实时接收按钮”。如果要查询某一时间段温度的数据,在右边的提示框里面写入相应的正确格式的时间。如:要查询“2012年4月”的数据,只需在提示框里面输入“2012年4月”等字样。如果要查询更小范围的数据,比如查询2012年4月24号11点17分,在提示框里面输入“2012年4月24日11:17”即可。

4.4 温度曲线部分

该系统描绘温度曲线有实时温度曲线和历史温度曲线两部分。实时温度曲线实时描绘当前的温度变化,而历史温度曲线更直观地分析以往温度数据。温度曲线是每变化0.1℃时变化一个最小坐标,所以在平常温度变化范围较小的时候我们看到的是一条近似的直线。

温度曲线用到的控件是Win32里面的Image 控件。使用该控件时,可用C++语言对其进行颜色、坐标等设置。在该控件上面,添加了ScrollBar1和ScrollBar2,分别用来改变位置和调整图像大小。我们根据接收到的数据,将画图坐标进行设置:X坐标对应的是时间的刻度,Y坐标对应的是温度,这样就可以描出点来,Image可以将这些点进行整合成曲线并显示出来,从而达到描绘温度曲线的功能。

5 调试过程

5.1 下位机调试

本次下位机不算复杂,PCF8563和DS18B20以前都用过,本来打算用液晶LCD1602作为显示输出装置,但是由于开发板上没有给液晶预留接口,使用起来不方便,加上上位机输出比较直观,所以下位机只用开发板上的4个一位数码管显示温度。

这次下位机程序,主要的故障是串口部分,以往都是简单的串口发送接收,对这一块没有深入了解。由于是先做下位机,所以只是拿单片机串口调试小助手来调试下位机。在输出时间温度都已经正常的基础上,怎么协调地把时间和温度发送到上位机,思路不是很明白。我原来只是想到要建一个数组,然后把温度和时间依次写到数组里面,然后把数组依次写到SBUF里面,加上相应的定时器定时读取时间和温度,通过中断把它们发送到上位机。可是在调试过程中,我并没有发现自己想要的效果,串口调试小助手接收到的是一串乱码。为了缩减检查范围,把原来的时间写到数组的数据全部注解掉了,只留下温度,用同样的方法去调试,结果很明显:还是一串乱码。怀疑是进制转换出了差错,于是我连温度都不要了,直接把一个已知的数据(0XFF)装到SBUF里面,验证十六进制输出是否正常,得到的结果不正常。于是又把0XFF改成1,验证十进制是否正常,结果还是不正常。我就怪了,这样的话,就不是进制转换的问题了。感觉没有什么思路了,随便在1后面加上0X30,奇怪,这次发送到上位机的正确了。我突然醒悟,不是进制问题,是没有把字符转换成ASCII码!后来,我发现,其实装入SBUF的默认是16进制,即使不加0X30,在串口调试小助手里面选择以HEX形式接收,依然可以接收到正常的16进制数。有了这个基础上,再加上一定的协议,下位机算是完成了。

5.2上位机调试

本次上位机调试花了很长一段时间,其实纠结的问题最大的还不是程序。而

是软件的安装和串口控件的安装。很早就写好了下位机并在串口调试助手调试成功,等待在做好上位机的时候再次进行调试。后来在同学的帮助下才成功解决这两个问题。该系统上位机的左上角发送和接受部分,就是为了方便上位机。下位机发送的数据将在“接收”的Memo以16进制的方式显示出来。刚开始,我的上位机并没有想到用这个模块,在调试温度显示时要时常打开串口调试小助手,非常麻烦,于是添加了这个部分,这样就可以避免了调试时要时常切换窗口而导致不必要的麻烦。到此,我们就可以进行温度显示以及数据库显示等部分的代码的编写了。如果代码编写完后温度显示部分出问题,而“接收”的Memo显示出来的16进制正常,则说明是温度显示的代码编写出问题而不是串口接收出问题,同样道理,数据库也可以用此方法进行调试。

数据库的调试花费的时间最多,参照老师的课件,做一个数据库,然后连接到上位机,可是就是写不进数据,仔细检查每一步后,最后发现字符长度除了问题。该系统的数据库查询可以精确到秒,查询起来比较方便。

温度曲线画图部分,刚做好的时候感觉变化范围比较小,就是一条近似的直线一样,本来想改大一点刻度,但是后来想想,如果改大刻度,虽然是可以比较直观地看到温度的变化,但是在温度变化范围比较大的时候就不能显示一个完整的曲线了。所以,权衡利弊,还是取消了改大刻度的决定。温度曲线显示的形式,我采用了从右边开始显示,然后左移的方式,这样可以实时的显示温度的变化趋势,不用刷新曲线。

6 系统总结

通过本次温度实时监控设计的学习与实践,使自己的专业知识得到了强化,最重要的加强了自己的学习能力。以往学习了单片机,都是那么零零碎碎,也没什么时间总结,到了大三,一心迷于FPGA,单片机又落下了不少。这次设计,让我重拾单片机,在以前不懂的方面,比如串口,有了比较深的了解,同时对于芯片的使用,对时序图的工作步骤,又了进一步的了解。在上位机方面,从零基础,到自己做出一个简陋的上位机,已经算是一个比较艰辛的过程了。但是也深深的体会了一个道理:只要不放弃,终究就会成功。这次设计分为上下位机两个部分,当然也要分头工作。

(1)下位机其实就是单片机程序设计,在以前做的实验的基础上,加上了串口程序。这次下位机编程,主要是查阅了西安电子科技大学出版社出版的李建忠主编的《单片机原理与应用》,把之前的知识也顺便复习了一遍。

(2)上位机采用的是C++Build开发工具,以前没学过上位机制作,这次是零基础学习上位机,对我来说意义也很重大。因为我知道,在如今的电子世界,已经很少单纯的硬件了,一个好的系统,一般都是软件和硬件共同搭建出来的。这次的上位机制作,当然很大一部分是通过老师上课的案例,加上相应的显示,同时经过简单的上位机美化,就成了上位机了。

【参考文献】

[1] 李建忠. 单片机原理及应用(第二版) 陕西:西安电子科技大学出版社,2008.2

[2] 同志工作室. C++Build数据库开发实例北京:人民邮电出版社,2001.1

[3] 杨素行. 模拟电子技术基础简明教程(第三版)北京:高等教育出版社2006.5

[4] 李伟明等. C++从入门到精通北京:清华大学出版社,2010

[5] 冯万利. 数据库原理及应用实验与课程设计指导北京:清华大学出版社,2010

[6] 陈涛. 单片机应用及C51程序设计(第2版) 北京:机械工业出版社,2011

相关主题
相关文档
最新文档