摘 要: 设计了基于PC与STC12C单片机串口通信的温度采集系统。STC12C单片机作为下位机,利用数字温度传感器DS18B20采集现场温度,同时通过串口RS232将温度值上传给PC,PC实时显示温度和变化曲线。实际运行表明,系统运行可靠,界面清楚直观,功能达到设计要求。
关键词: 串口通信; STC12C单片机; 温度传感器DS18B20; MSComm控件
PC与单片机组成上下位机,上位机通过串行接口获取下位机采集的现场数据,这是一种重要的测控形式,它易于实现远程采集和多通道采集。上下位机形式的采集系统既可以发挥单片机抗干扰性好、可扩充、易面向现场等优点,又能充分利用PC在数据处理和交互方面的巨大优势[1]。
本文设计了PC与STC12C5A60S2单片机(简称STC12C单片机)组成的单通道温度采集系统,单片机实时采集温度,PC利用串口通信获得温度值并实时显示。
1 系统硬件设计
系统主要由PC和单片机系统组成,PC为普通计算机;单片机系统包括STC12C单片机、数字测温电路、时钟电路、液晶显示电路、串口电路和键盘电路,如图1所示。
PC利用通信接口获得现场温度,处理后实时显示;单片机系统通过测温电路采集现场温度并上传给PC,同时利用液晶显示电路和时钟电路显示温度和时间;键盘电路用于设定温度上限和时间。
1.1 STC12C单片机
STC12C单片机是单时钟周期8051单片机,它具有高速、低功耗及超强抗干扰等优点,指令完全兼容8051单片机,但速度是后者的8~12倍;它内置60 KB的Flash程序存储器,集成1 280 B数据存储器,有2个16位定时器/计数器,内置2个全双工异步串口(UART)用于串行通信[2-3]。图2为STC12C单片机最小系统结构图。 1.2 数字测温电路/时钟电路
数字测温电路选用DS18B20作为温度传感器,如图3所示。DS18B20具有以下特点使其得到广泛应用[4]:(1)它是数字温度传感器,直接输出数字量;(2)它的测温范围广, 为-55°C~+125°C,且分辨率和精度高,最高分辨率可达12 bit,精度为±0.5°C; (3)它是可编程芯片,可由程序直接读出温度值;(4)它是单总线接口,仅需一条输入输出线(DQ)就能与单片机进行接口通信。
时钟电路由数字时钟芯片DS1302组成,如图4所示。它是一种高性能、低功耗、采用三线接口的实时时钟芯片,可输出设定的时间和日期[5]。
1.3 液晶显示电路
单片机系统的显示器选用液晶显示器LCD12864,它内置ST7920控制芯片,带有中文字库。LCD12864由DDRAM(显示数据RAM)、CGROM(字型产生ROM)、CGRAM(自定义字型产生RAM)和GDRAM(绘图RAM)等组成[6]。DDRAM和GDRAM是本系统所用到的模块。
DDRAM提供64×2个位元组的空间,最多可控制4行16字(64个字)的中文字型显示,当写入显示数据RAM时,可分别显示CGROM与CGRAM的字型;此模块可显示HCGROM(半角)、CGRAM及CGROM 3种中文字型。液晶显示器屏幕坐标(AC地址)与DDRAM地址的对应关系如表1所示。GDRAM提供64×32 B的空间,实际可控制128×64点阵的二维绘图缓冲空间。GDRAM的二维地址与液晶屏幕坐标的对应关系如图5所示。
1.4 串口通信电路
串口通信电路由MAX232及周边元件组成,如图6所示。 MAX232的功能是将PC的RS232串口信号电平(-10 V,+10 V)转换为满足单片机要求的TTL信号电平(0,+5 V)。它具有以下特性[7]:(1)符合所有RS232C技术标准;(2)只需单一电源供电(+5 V);(3)功耗低、典型供电电流为5 mA;(4)片载电荷泵,具有升压、电压极性反转能力;(5)内置2个RS232驱动器/接收器。
2 系统软件设计
系统软件由PC程序和单片机程序构成。PC程序采用VC++编程,主要由串口通信和界面处理两个模块组成,通过串口通信获取单片机上传的数据,将其转换为十进制并进行显示,同时绘制出曲线。单片机程序以C51编程,主要由数据采集、数据发送和显示三部分组成,实现采集数据、上传数据和显示温度的功能。
2.1 PC程序设计
2.1.1 串行通信程序
串行通信程序主要由串口消息处理/数据接收函数(OnSerialComm())、串口参数设置函数(OnSerialSet())组成。
(1)串口消息处理/数据接收函数负责响应数据缓冲区中有字符的消息,读取缓冲区数据,转换数据格式,引起重绘调用绘图函数。数据缓冲区中有字符的消息由MSComm控件提供的方法产生[8]。OnSerialComm()调用了以下函数:
①GetCommEvent(),判断接收缓冲区内是否有数据的消息函数;②GetInput(),读缓冲区数据函数;②GetOneDimSize(),获得有效数据长度函数;④GetElement(),转换数据类型函数;⑤Format(),字符格式化函数;⑥Invalidate(),引起重绘调用绘图函数;⑦UpdateData(),更新编辑框函数。
(2)串口参数设置函数用于设置串口参数、打开串口、设置缓冲区参数。OnSerialSet()调用了以下函数:
①SetCommPort(),选择串口号函数;②SetPortOpen(),打开串口函数;③SetSettings(),设置串口参数函数;④SetInputMode(),设置输入模式函数;⑤SetRThreshold(),设置接收缓冲区接收多少个字符就能调用OnSerialComm()的函数;⑥SetInputLen(),设置当前接收区数据长度函数;⑦GetInput(),预读缓冲区函数。
2.1.2 绘图程序
绘图程序由画背景(坐标轴、坐标刻度、文字等)函数(DrawBkGrd())和实时绘图函数(DrawCurve())组成。它们都调用了以下函数:
(1)CreateFont(),设定字体函数;(2)SelectObject(),选定绘图对象到设备描述表函数;(3)MoveTo(),移动到当前坐标函数;(4)Linto(),画线函数;(5)TextOut(),输出文字函数。
2.2 单片机程序设计
单片机程序主要由初始化函数(InitMcuSys())、读取温度/时钟函数(ReadDigData())、串口通信函数(UartMcuData())组成。
(1) InitMcuSys()调用以下函数:
①TimerInit(),设定T0/T1的工作方式、初始值以及串口工作方式和波特率参数函数;②Ds18b20Init()/Ds1302Init(),初始化温度传感器和时钟芯片函数;③LcdBaseInit (),初始化液晶显示器函数。
(2) ReadDigData()调用以下函数:
①Read18b20Data(),读取温度函数;②Read1302Data(),
读取时间函数;③DataToByte(),数据格式转化函数。
3 实验及结论
系统实验结果如图7和图8所示。
图7和图8是人为改变环境温度后的实际运行结果。图7设置为显示1 000个温度采样点,采样时间为1次/s,图中比较完整地反映了这个时间段的温度变化;图8设置为显示60个温度采样点,采样时间也是1次/s,可见相对于PC,单片机反映温度变化的时间非常短。实际运行表明,整个电路简单实用,系统运行稳定、可靠;测试精度、串行通信、界面显示等功能均达到了设计要求。
参考文献
[1] 张毅刚,彭喜元.单片机原理与应用设计[M].北京:电子工业出版社,2010.
[2] 王鑫,崔忠林,刘建. 基于STC12C5A16S2的温度采集系统的设计[J]. 微型机与应用,2012,31(20):24-29.
[3] 陈桂友.增强型8051单片机实用开发技术[M]. 北京:北京航空航天大学出版社,2010.
[4] 李雪峰. 分布式温度采集网络在恒温控制中的应用[J].微型机与应用,2013,32(15):69-75.
[5] 黄明强.DS1302在单片机系统中的应用[J].保定师范专科学校学报,2004,17(2):30-33.
[6] 田开坤.基于LCD12864显示器的数字示波器设计[J].电子制作,2011(5):30-37.
[7] Max232 互动百科[EB/OL].(2013-02-28)[2014-03-29].http://www.baike.com/wiki/max232.
[8] 王英杰,林怡青,彭美春,等.基于VC++6.0的PC机和单片机串口通信[J].电脑应用技术,2006(60):36-40.