您好,欢迎来到华佗健康网。
搜索
您的当前位置:首页基于嵌入式的温度传感器的设计

基于嵌入式的温度传感器的设计

来源:华佗健康网


目录

第一章 系统概要.......................................................................................................... 1

1.1 系统背景.......................................................................................................... 1 1.2 系统功能框图.................................................................................................. 1 第二章 系统硬件设计.................................................................................................. 2

2.1 系统原理图...................................................................................................... 2 2.2 单片机(MCU)模块 .................................................................................... 2

2.2.1 MC908GP32单片机性能概述 .............................................................. 2 2.2.2 内部结构简图与引脚功能.................................................................... 3 2.2.3 GP32最小系统 ...................................................................................... 5 2.3 传感器模块...................................................................................................... 6 2.4 信号放大模块.................................................................................................. 7 2.5 A/D转换模块 ................................................................................................... 7

2.5.1 进行A/D转换的基本问题 ................................................................... 7 2.5.2 A/D转换模块的基本编程方法 ............................................................. 8 2.5.3 A/D芯片TCL23概述 ....................................................................... 8 2.6 串行通信模块................................................................................................ 11

2.6.1 串行通信常用概念.............................................................................. 11 2.6.2 RS-232C总线标准 ............................................................................... 12

第三章 系统软件设计................................................................................................ 13

3.1 MCU方(C)程序 ........................................................................................ 13

3.1.1 A/D转换子程序 ................................................................................... 14 3.1.2 串行通信子程序.................................................................................. 17 3.2 PC方(VB)程序 ......................................................................................... 19 3.3 PC方界面 ....................................................................................................... 23 第四章 系统测试........................................................................................................ 24 第五章 总结展望........................................................................................................ 24

5.1 总结................................................................................................................ 24 5.2 展望................................................................................................................ 25 参考文献...................................................................................................................... 25

第一章 系统概要

1.1 系统背景

温度是日常生活、工业、医学、环境保护、化工等领域遇到的一个物理量。温度测量的基本方法是使用温度计直接读取。最常见的测量温度的工具是各种各样的温度计,它们常常以刻读的形式表示温度的高低,人们必须通过读取刻度的多少来测量温度。由于单片机在检测和控制系统中得到广泛的应用,利用单片机和温度传感器构成的电子式智能温度计就可以直接测量温度,得到温度的数字值并显示出来,既简单方便,又直观准确。

本次课程设计的目的是以MC908GP32单片机为核心设计出一个路温度测量系统。设计将温度传感器采样得到的模拟信号转换成数字信号,通过串口在PC的界面显示出来。本次课程设计用温度传感器将被测温度转换为电量,经过放大滤波电路处理后,由模数转换器将模拟量转换为数字量,再与单片机相连,通过可编程键盘显示接口芯片实现温度限值的设定。.被测量经过温度传感器转换为电量,再放大后送给A/D转换器。电量经过A/D转换为二进制数值,单片机根据设计目的完成相应的软件处理。处理完毕后,送键盘显示处理芯片,然后再由数码管显示。

这是一种低成本的利用单片机I/O口实现的温度检测电路, 该电路非常简单, 易于实现, 并且适用于几乎所有类型的单片机。

1.2 系统功能框图

数据采集与传输系统一般由信号调理电路,多路开关,采样保持电路,A/D,单片机,电平转换接口,接收端(单片机、PC或其它设备)组成。

LED被测物理量传感器预处理ADC输入接口电平转换接口MCUPC键盘

A/D转换模块即模/数转换模块,功能是将电压信号转换为对应的数字信号。实际应用中,这个电压信号可能由温度,湿度,压力等实际物理量经过传感器和相应的交换电路转换而来。经过A/D转换后,MCU就可以处理这些物理量。

第二章 系统硬件设计

2.1 系统原理图

整个系统软件设计分为两个部分,作为主控的PC端的软件设计及作为数据采集器的单片机终端节点的软件设计。系统采用模块化编程,将各部分功能分别实现,主要的功能子程序有:数据采集、标度变换、数制转换、数值显示、发送、接收和部分中断子程序。

图2.1 系统原理图

2.2 单片机(MCU)模块

2.2.1 MC908GP32单片机性能概述

MC908GP系列单片机是HC80系列单片机大家族中具有通用性的一族,MC908GP32是MC908GP系列中的一个型号,MC908GP32单片机具有3种封装形式,分别为40脚、42脚、44脚。MC908GP32单片机的主要特点如下:

(1)512B片内RAM;32KB片内Flash程序存储器,具有在线编程能力和保密功

能。

(2)时钟发生器模块,具有PLL电路,可产生各种工作频率;内部总线频率最高可达8MHz。

(3)增强的HC50 CPU结构,16种寻址方式(比HC50多8种),16位变址寄存器和堆栈指针,存储器至存储器数据传送,快速8*8指令,扩展的循环控制功能,BCD功能。

(4)33根通用I/O脚,包括26根多功能I/O脚和5或7根专用I/O脚;PTA、PTC和PTD的输入口有可选择的上拉电阻;PTC0~PTC4有25mA吸流和放流能力,其他口有15mA吸流和放流能力(总体驱动电流应小于150mA);所有口有最高5mA输入电流保护功能。

(5) 增强型串行通信口SCI;串行外围接口SPI;两个16位双通道定时器接口模 块(TIM1和TIM2),每个通道可选择为输入捕捉、输出比较和PWM,其时钟可分别选为内部时钟的1、2、4、8、16、32和的分频值;带时钟预分频的定时基模块有8种周期性实时中断(1、4、16、256、512、1024、2048和4096Hz),可在STOP方式时使用外部32KHz晶振周期性唤醒 CPU;8位键盘唤醒口。 (6)系统保护特性:计算机工作正常(COP)复位;低电压检测复位,可选为3V或5V操作;非法指令码检测复位;非法地址检测复位。 (7)具有PDIP40、SDIP42和QFP44封装形式。 (8)优化用于控制应用;优化支持C语言。

2.2.2 内部结构简图与引脚功能 1. 内部结构简图(44引脚)

单片机(以下简称GP32单片机)的三种封装形式只是引脚数量和形式有所区别,其它方面是一致的。图中I/O口是按 44引脚的GP32给出的,对于42引脚的GP32单片机则没有PTC5、PTC6两个引脚,对于40引脚的GP32单片机则没有PTC5、PTC6及 PTD6/T2CH0、PTD7/T2CH1四个引脚。 从内部结构简图可以看出,GP32内部有以下主要部分:CPU08、存储器、定时器接口模块、定时基模块、看门狗模块、通用I/O接口、串行通信接口 SCI、串行外设接口SPI、断点模块、A/D转换模块、键盘中断模块、时

钟发生模块及锁相环电路、低电压禁止模块、复位与中断模块、监控模块MON和系统设置模块。

2. GP32单片机的引脚功能

40引脚的MC908GP32单片机的引脚图,引脚功能分类简介如下: (1) 电源类引脚

VDD、VSS(20脚、19脚):电源供给端。

VDDAD /VREFH、VSSAD /VREFL(31脚、32脚):内部A/D转换器的电源供给及参考电压输入端。

VDDA、VSSA(1脚、2脚):时钟发生器模块(CGM)的电源供给端。 (2) 控制类引脚

T脚):外部低有效复位输入或输出脚,有内部上拉电阻。 RS(6

IR(14Q脚):外部中断输入脚,有内部上拉电阻。 (3) I/O类引脚

PTA7/KBD7~PTA0/KBD0(40~33脚):8位通用双向I/O口,每个可编程为键盘输入脚。

PTB7/AD7~PTB0/AD0(30~23脚):8位通用双向I/O口,也可作为8路8

位A/D转换输入脚。

PTC4~PTC0(11~7脚):5位通用双向I/O口。

PTD5/T1CH1~PTD0/ SS(22、21、18~15脚):6种特殊功能、双向I/O口,其中T1CH1、T1CH0用于定时器模块(TIM1)。SPSCK、MOSI、MISO、SS 用于串行外围接口(SPI)。

PTE0/TxD、PTE1/RxD(12脚、13脚):2位双向I/O口或串行通讯口。 (4) 其它

CGMXFC(3脚):CGM的外部滤波电容连接脚。 OSC1、OSC2(5脚~4脚):片内振荡器引脚。

2.2.3 GP32最小系统

最小系统图是能够保证单片机正常工作的最小模块,它使用了最少的器件,芯片,并组合了温度测量的一些必备组件,如蜂鸣器,电阻,二极管,电容等。各部件相互配合,共同完成了温度测量系统全部工作。

GP32最小系统

1.电源供给与滤波

GP32芯片的20、19脚(VDD、VSS)为芯片的电源输入端,1、2脚(VDDA、VSSA)为内部PLL模块的电源供给。接在电源与地之间的0.1µF电容为滤波电容。PLL电路目的在于由频率小的外部晶振产生较大频率的内部总线时钟,提高芯片的抗干扰性。由于这部分内容涉及的编程内容很少,但原理较难理解,

所以放入第14章介绍。这里只要知道GP32内有PLL电路就可以了,而且GP32内的PLL电路模块需要外接电源。在MCU的第3脚,接有内部PLL模块的外部滤波电路。滤波电路的作用主要是增强电路工作稳定性。 2.晶振电路

接MCU第4、5脚(OSC2、OSC1)之间的电路为晶振电路,这里选用的晶振频率为f=32.768KHz。通过内部PLL电路模块,可获得小于等于8MHz的内部总线频率。电路及其元件参数是由GP32参考手册确定的。实际开发中,嵌入式应用工程师往往根据参考手册提供的电路及参数,通过自己的实践,构筑MCU的外围支撑电路,而不深究其工作原理。 3.复位电路

接在MCU第6脚( )的电路为芯片硬件复位电路。正常工作时该脚通过10K电阻接到电源正极(这里设为5V电源供电),所以应为高电平。若按下复位按钮RST,则第6脚通过51Ω接地,为低电平,芯片复位。

2.3 传感器模块

温度传感器采用的是NS公司生产的LM35,它具有很高的工作精度和较宽的线性工作范围,该器件输出电压与摄氏温度线性成比例。LM35与用开尔文标准的线性温度传感器相比更有优越之处,LM35无需外部校准或微调,可以提供±1/4℃的常用的室温精度。 •工作电压:直流4~30V; •工作电流:小于133μA •输出电压:+6V~-1.0V •输出阻抗:1mA负载时0.1Ω; •精度:0.5℃精度(在+25℃时); •漏泄电流:小于60μA; •比例因数:线性+10.0mV/℃; •非线性值:±1/4℃;

•校准方式:直接用摄氏温度校准; •使用温度范围:-55~+150℃额定范围。

基于LM35开发的温控系统,工作稳定可靠,具有体积小、灵敏度高、响应时间短、抗干扰能力强等特点。LM35的输出电压与摄氏温度的线形关系可用下面公式表示,0℃时输出为0 V,每升高1℃,输出电压增加10 mV。其电源供应模式有单电源与正负双电源两种。正负双电源的供电模式可提供负温度的测量,单电源模式在25℃下电流约为50 mA,非常省电。

2.4 信号放大模块

由于温度传感器LM35输出的电压范围为0~0.99 V,虽然该电压范围在A/D转换器的输入允许电压范围内,但该电压信号较弱,如果不进行放大直接进行A/D转换则会导致转换成的数字量太小、精度低。系统中选用通用型放大器μA741对LM35输出的电压信号进行幅度放大,还可对其进行阻抗匹配、波形变换、噪声抑制等处理。系统采取同相输入,电压放大倍数为5倍,电路图如图所示:

信号放大电路图

2.5 A/D转换模块

2.5.1 进行A/D转换的基本问题

A/D转换模块(Analog To Digital Convert Module),即模/数转换模块,是将电压信号转换为对应的数字信号。这个电压量是由压力传感器把压力转换过来,传到MCU处理。

(1)采样精度:是指数字量变化一个最小量时模拟信号的变化量,即通常所说的采样位数。

(2)采样速率:是指完成一次A/D采样所要花费的时间。

(3)滤波:为了使采样的数据更准确,对采样的数据进行筛选去掉误差较大的毛刺。通常采用中值滤波和均值滤波来提高采样精度。中值滤波是取3次采样的中间值,均值滤波是取多次采样的算术平均值。

(4)物理量回归:把A/D采样值与实际物理量对应起来。

2.5.2 A/D转换模块的基本编程方法

(1)A/D转换初始化:对ADCLK写入控制字节,决定时钟输入源是内部总线还是外部晶振,决定分频系数等。

(2)启动A/D转换:对ADSCR写入控制字节,选取要转换的通道、决定转换结束数据获取的方式、设置是连续转换还是一次转换等。

(3)获A/D转换结果:若是中断方式,在A/D中断程序中取得,若是查询方式,通过ADSCR的第7位(COCO位)取得,当COCO=1时可从ADR中取数。

2.5.3 A/D芯片TCL23概述 一、引脚:

TLC23为20脚DIP封装,引脚图如下图所示。

2.5.3.1 TLC23引脚图

TLC23具有4线制串行接口,分别为片选端(CS),串行时钟输入端(I/O CLOCK),串行数据输入端(DATA IN)和串行数据输出端(DATA OUT)。它可以直接与SPI器件进行连接,不需要其他外部逻辑。同时,它还在高达4MHz的串行速率下与主机进行通信。

TLC23除了具有高速的转换速度外,片内还集成了14路多路开关。其中n路为外部模拟量输入,3路为片内自测电压输入。在转换结束后,EOC引脚变为高电平,转换过程中由片内时钟系统提供时钟,无需外部时钟。在AD转换器空闲期间,可以通过编程方式进入断电模式,此时器件耗电只有25pA。

A/D芯片TLC23是一种12位开关电容逐次逼近式模数转换器,带有SPI(Serial Peripheral Inter-face)接口。它消除了以往许多AD芯片并行输出、连线复杂的缺点,并在AD转换结果串行输出的同时,可以串行输入下次AD转换位的控制字。TLC23的管脚如图所示。它有三个输入控制端:片选(cs)、 I/O时钟(I/Oclock)以及数据输入端(Data Input),同时还可以通过一个串行的三态输出端与主处理器及其外围串行口进行通讯,以输出转换结果。除了高速的转换功能和通用的控制能力外, TLC23的片内还具有14通道多路器,可以选择11个模拟输入通道(AIN0~AIN10)或3个内部自测电压(self-test)中的一个。转换结束时,EOC输出端变高,指示转换完成。 二、控制字:

TLC23的工作过程如下:首先在8、12或16时钟周期里向片内控制寄存器写入8位的控制字,控制字中的2位决定时钟长度,在最后一个时钟周期的下降沿启动AD转换过程,经过一段转换时间,在随后的8、12或16个时钟周期里,从DATA OUT脚读出数据。控制字的定义见下表:

控制字的前四位(D7-D4)代表11个模拟通道的地址;当其为1100-1110时,选择片内检测电压;当其为1111时,为软件选择的断电模式,此时,AD转换器的工作电流只有25uA。控制字的第3位和第4位(D3一D2)决定输出数据的长度,01表示输出数据长度为8位;11表示输出数据长度为16位;X1表示输出数据长度为12位,X可以为1或0。制字的第2位(D1)决定输出数据的格式,0表示高位在前,1表示低位在前。控制字的第1位(D0)决定转换结果输出的格式。当其为0时,为无极性输出(无符号二进制数),即模拟电压为Vnef+,时,转换的结果为0FFFH;模拟电压为Vnef-时,转换的结果为0000H。其为1时,为有极性输出(有符号二进制数),即模拟电压高于(Vnef+-Vnef-)/2时符号位为0;模拟电压低于(Vnef+-Vnef-)/2时符号位为1;模拟电压为Vnef+时,转换的结果为03FFH;模拟电压为Vnef-时,转换的结果为0800H。模拟电压为(Vnef+-Vnef-)/2时,转换的结果为0000H。 三、工作时序 :

以MSB为前导, 用CS进行12个时钟传送的工作时序如下图所示。

1.上电时,EOC=“1”,CS=“1”

2.使CS下降,前次转换结果的MSB即A11位数据输出到Dout供读数。

3.将输入控制字的MSB位即C7送到Din,在CS之后tsu>=1.425us后,使CLK 上升,将Din上的数据移入输入寄存器。

4.CLK下降,转换结果的A10位输出到Dout供读数。

5.在第4个CLK下降时,由前4个CLK上升沿移入寄存器的四位通道地址被译码, 相应模入通道接通,其模入电压开始时对内部开关电容充电。

6.第8个CLK上升时,将Din脚的输入控制字C0位移入输入寄存器后,Din脚即无效。

7.第11个CLK下降,上次AD结果的最低位A0输出到Dout供读数。至此,I/O数据已全部完成,但为实现12位同步,仍用第12个CLK脉冲,且在其第12个CLK

下降时,模入通道断开,EOC下降,本周期设置的AD转换开始,此时使CS上升。 8.经过时间tconv<=10us,转换完毕,EOC上升。

9.使CS下降,转换结果的MSB位B11输出到Dout供读数。

10.将新周期的输入控制字的MSB位D7送到Din,在CS下降之处,tSU时间处由CLK上升将Din数据移入输入寄存器。 11.CLK下降,将AD结果的B10位输出到Dout。 上电时,第一周期读取的Dout数据无效,应舍去。

2.6 串行通信模块

2.6.1 串行通信常用概念 (1)异步串行通信的格式

SCI通常采用NRZ数据格式,即:standard non-return-zero mark/space data format,译为:“标准不归零传号/空号数据格式”。“不归零”的最初含义是:用正、负电平表示二进制值,不使用零电平。“mark/space”即“传号/空号”分别是表示两种状态的物理名称,逻辑名称记为“1/0”。下图给出了 8位数据、无校验情况的传送格式。

(2)串行通信的波特率

波特率:每秒内传送的位数。

波特率单位是位/秒,记为bps。通常情况下,波特率的单位可以省略。通常使用的波特率有300、600、900、1200、1800、2400、4800、9600、19200、38400。 (3)奇偶校验

字符奇偶校验检查称为垂直冗余检查,它是每个字符增加一个额外位使字符中“1”的个数为奇数或偶数。奇校验:如果字符数据位中“1”的数目是偶数,校验位应为“1”,如果“1”的数目是奇数,校验位应为“0”。偶校验:如果字符数据位中“1”的数目是偶数,则校验位应为“0”,如果是奇数则为“1”。 (4)串行通信的传输方式

单工:数据传送是单向的,一端为发送端,另一端为接收端。这种传输方式中,除了地线之外,只要一根数据线就可以了。有线广播就是单工的。全双工:数据传送是双向的,且可以同时接收与发送数据。这种传输方式中,除了地线之外,需要两根数据线,站在任何一端的角度看,一根为发送线,另一根为接收线。一般情况下,MCU的异步串行通信接口均是全双工的。半双工:数据传送也是双向的,但是在这种传输方式中,除了地线之外,一般只有一根数据线。任何一个时刻,只能由一方发送数据,另一方接收数据,不能同时收发。 2.6.2 RS-232C总线标准

MCU引脚一般输入/输出使用TTL电平,而TTL电平的“1”和“0”的特征电压分别为2.4V和0.4V,适用于板内数据传输。为了使信号传输得更远,美国电子工业协会EIA制订了串行物理接口标准RS-232C。RS-232C采用负逻辑,-3V~-15V为逻辑“1”,+3V~+15V为逻辑“0”。RS-232C最大的传输距离是30m,通信速率一般低于20Kbps。RS-232接口,简称“串口”,它主要用于连接具有同样接口的室内设备。目前几乎所有计算机上的串行口都是9芯接口。右图给出了9芯串行接口的排列位置,相应引脚含义见表。

引脚号 1 2 3 4 5 6 7 8 9 功能 接收线信号检测(载波检测DCD) 接收数据线(RxD) 发送数据线(TxD) 数据终端准备就绪(DTR) 信号地(SG) 数据通信设备准备就绪(DSR) 请求发送(RTS) 清除发送 振铃指示 表1 芯串行接口引脚含义表

图2.6(a) 芯串行接口排列图 图2.6(b) MAX232芯片引脚图 在MCU中,若用RS-232C总线进行串行通信,则需要外接电路实现电平转换。在发送端需要用驱动电路将TTL电平转换成RS-232C电平,在接收端需要用接收电路将RS-232C电平转换成TTL电平。电平转换器不仅可以由晶体管分立元件构

成,也可以直接使用集成电路。该系统使用MAX232芯片,该芯片使用单一+5V电源供电实现电平转换。图给出了MAX232的引脚。 MAX232芯片引脚含义说明如下: • VCC(16脚):正电源端,一般接+5V • GND(15脚):地

• VS+(2脚):VS+=2VCC-1.5V • VS-(6脚):VS-=-2VCC-1.5V

• C2+、C2-(4、5脚):一般接1μF的电解电容 • C1+、C1-(1、3脚):一般接1μF的电解电容

输入输出引脚分两组,基本含义见表2。在实际使用时,若只需要一路SCI,可以使用起中的任何一组。 组TTL电别 平引脚 1 11 12 2 10 9 方向 典型接口 输入 输出 输入 输出 接MCU的TxD 接MCU的RxD 接MCU的TxD 接MCU的RxD RS-232电平引脚 13 14 8 7 方向 典型接口 输入 输出 输入 输出 连接到接口与其他设备通过RS-232相接 连接到接口与其他设备通过RS-232相接 表2 MAX232芯片I/O引脚分类与基本接法

第三章 系统软件设计

3.1 MCU方(C)程序

软件设计包括MCU的程序设计和PC机端的软件设计。MCU的所有程序文件如下表所示。

文件类型 头文件 文件名 GP32C. h EnDisInt.h Type.h Includes.h AD.h\" SCI.h Setup.c SCI.c AD.c 功能简介 GP32 MCU映像寄存名定义头文件 开放或禁止MCU各模块中断头文件 类型别名定义头文件 总头文件 A/D转换头文件 串行通信头文件 芯片初始化文件 串口通信文件 A/D转换文件 C语言 子函数文件

C语言主函数 3.1.1 A/D转换子程序

Main.c 主函数文件 1. A/D转换有关头文件ADC.h

//[ADC.h]A/D转换头文件--------------------------------------------- #include \"GP32C.h\" //GP32 MCU映像寄存器名定义 #include \"Type.h\" //类型别名定义 #define COCOBit 7

void ADCinit(void); //A/D转换初始化 INT8U ADCvalue(INT8U channel); //1路A/D转换函数

INT8U ADCmid(INT8U channel); //1路A/D转换函数(中值滤波) INT8U ADCave(INT8U channel, INT8U n); //1路A/D转换函数(均值滤波) 2. A/D转换有关C语言子函数AD.C

/*- ADsub.c-------------------------------------------* *文件描述:本文件包含了A/D转换的3个子函数,分别为: *(1)advalue:获取1路A/D转换结果 * unsigned char advalue(unsigned char channel) *(2)admid:获取中值滤波后的A/D转换结果 * unsigned char admid(unsigned char channel) *(3)adave:获取均值滤波后的A/D转换结果 * unsigned char adave(unsigned char n, * unsigned char channel) //[以下为子程序源代码] //[包含头文件] #include \"GP32C.H\"

#define COCOBit 7 //转换完成标志位

/*advalue:1路A/D转换函数-------------------------------* *功能:获取通道channel的A/D转换结果 *参数:channel=通道号 *返回:该通道的A/D转换结果 *-----------------------------------------------------*/

unsigned char advalue(unsigned char channel) { //选取通道号ADCH4-ADCH0=00000-00111 unsigned char tmp; channel&=0b00011111; tmp=ADSCR&0b11100000; tmp=tmp|channel;

ADSCR=tmp; //取A/D转换结果 while(1)

if((ADSCR&(1</*admid:1路A/D转换函数(中值滤波)-----------------------* *功能:获取通道channel中值滤波后的A/D转换结果 *参数:channel=通道号 *返回:该通道中值滤波后的A/D转换结果 *-----------------------------------------------------*/ unsigned char admid(unsigned char channel) { unsigned char i,j,k,tmp; //取三次A/D转换结果 i=advalue(channel); j=advalue(channel); k=advalue(channel);

//从三次A/D转换结果中取中值 if (i>j)

{ tmp=i; i=j; j=tmp; } if (k>=j) tmp=j; else

if (k>=i) tmp=k; else tmp=i; return tmp; }

/*adave:1路A/D转换函数(均值滤波)-----------------------* *功能:对通道channel的A/D转换结果求n次平均值 *参数:n=平均次数,channel=通道号 *返回:该通道均值滤波后的A/D转换结果 *-----------------------------------------------------*/ unsigned char adave(unsigned char n,unsigned char channel) { //求n次A/D转换的平均值 unsigned char i; unsigned int j; j=0;

for (i=0;ireturn (unsigned char)j; }

3. A/D转换08C测试主程序 //总头文件

#include \"Includes.h\" //主程序 void main(void)

{ DisableMCUint(); //禁止总中断 //1. 芯片初始化 MCUinit(); //2. 模块初始化

SCIinit(); //(1) 串行口初始化

ADCinit(); //(2) A/D转换初始化 while (1)

{ //在通道0做A/D转换,200次中值滤波,串口发送均值滤波结果 SCIsend1(ADCave(0, 200)); } }

3.1.2 串行通信子程序

串行通信驱动文件包括SCI初始化、接收1字节、发送1字节、接收n字节和发送n字

//[SCI.c]串行通信---------------------------------------------------*

//硬件连接: //MCU的串口与PC方的串口相连 //------------------------------------------------------------------* #include \"SCI.h\"

//SCIinit:串行口初始化----------------------------------------*

//功能:对串行口进行初始化,默认为允许SCI,正常码输出,8位数据,无校验 //允许发送器,允许接收器.查询方式收发,波特率为9600(设fBUS= 2.4576MHz) //------------------------------------------------------------* void SCIinit(void) {

//1.总线频率fBUS = 2.4576MHz,定义波特率Bt = 9600 SCBR = 0b00000010;

//2.设置允许SCI,正常码输出,8位数据,无校验 SCC1 = 0b01000000;

//3.设置允许发送,允许接收,查询方式收发 SCC2 = 0b00001100; }

//SCIsend1:串行发送1个字节--------------------------------------* //功能:串行发送1个字节

//---------------------------------------------------------------* void SCIsend1(INT8U o) {

//判断ReStatusR的第SendTestBit位是否为1,是1可以发送 while (1)

if ((ReSendStatusR & (1<ReSendDataR = o; break; }

}

//SCIsendN:串行发送N个字节-----------------------------------* //功能:发送数组中的N个字节数据 //-----------------------------------------------------------* void SCIsendN(INT8U n, INT8U ch[]) {

int i;

for(i=0; i//SCIre1:串行收一个字节数据----------------------------------------*

//功能:从串行口接收1个字节的数据 //------------------------------------------------------------------* INT8U SCIre1(INT8U *p) {

INT16U k; INT8U i;

//ReStatusR第ReTestBit位为1表示可接收数据 for(k=0; k < 0xfbbb; k++)

if ((ReSendStatusR & (1<i = ReSendDataR; *p = 0x00; break; }

//接受失败

if (k >= 0xfbbb) {

i = 0xff; *p = 0x01; }

return i; }

//SCIreN:HC08串行接收N个字节---------------------------------------* //功能:接收N个字节数据,并存放在ch数组中 //------------------------------------------------------------------* INT8U SCIreN(INT8U n, INT8U ch[]) { int m;

INT8U fp; m = 0;

while (m < n)

{ch[m] = SCIre1(&fp); if (fp == 1)

{ return 1;} m++;}

return 0; }

3.2 PC方(VB)程序

Option Explicit Dim i%

Dim ww() As Byte

Dim buf(0 To 1000) As String Dim x!(51)

Dim sx As Integer Dim xx As Integer

Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Dim bc As Long Dim cc As Integer

Private Sub Form_Load()

If MSComm1.PortOpen = True Then MSComm1.PortOpen = False End If

MSComm1.Settings = \"9600,n,8,1\" MSComm1.CommPort = 1

MSComm1.InputMode = comInputModeText MSComm1.InputLen = 0 MSComm1.RThreshold = 0 MSComm1.InBufferCount = 0 MSComm1.RThreshold = 1 xx = 0

Set cn = New ADODB.Connection Set rs = New ADODB.Recordset

cn.Provider = \"Microsoft.Jet.OLEDB.4.0\" cn.Open App.Path + \"\\wddj.mdb\"

rs.Open \"wddjb\ rs.AddNew

Text1.Text = \"\" Text2.Text = \"\" i = 0 bc = 1 End Sub

Private Sub Form_Unload(Cancel As Integer) If MSComm1.PortOpen = True Then MSComm1.PortOpen = False End If

End Sub

Private Sub Label4_Click() Text1.Text = \"\" graph1.Cls buf(1) = 0

buf(2) = 0 buf(3) = 0 buf(4) = 0 buf(5) = 0 buf(6) = 0 buf(7) = 0 buf(8) = 0 buf(9) = 0 buf(10) = 0 buf(11) = 0 buf(12) = 0 buf(13) = 0 buf(14) = 0 buf(15) = 0 buf(16) = 0 buf(17) = 0 buf(18) = 0 buf(19) = 0 buf(20) = 0 buf(21) = 0 buf(22) = 0 buf(23) = 0 buf(24) = 0 buf(25) = 0 buf(26) = 0 buf(27) = 0 buf(28) = 0 buf(29) = 0 buf(30) = 0 buf(31) = 0 buf(32) = 0 buf(33) = 0 buf(34) = 0

Timer1.Enabled = False: Timer2.Enabled = False: Shape1.Visible = True: Shape2.Visible = True i = 0

graph1.Scale (-100, 100)-(100, -100) graph1.CurrentX = -95 graph1.CurrentY = 0

graph1.Line (-95, 100)-(-95, -100), RGB(255, 255, 255) graph1.Line (100, 0)-(-100, 0), RGB(255, 255, 255) End Sub

Private Sub Label5_Click() End

End Sub

Private Sub ll_Click() Form2.Show End Sub

Private Sub MSComm1_OnComm() Dim u As Integer

Select Case MSComm1.CommEvent Case comEvCD Case comEvCTS Case comEvDSR Case comEvRing Case comEvReceive ww = MSComm1.Input buf(i) = ww(u) Text1.Text = buf(i)

If Text1.Text > sx Then Timer1.Enabled = True: Timer2.Enabled = False: Shape1.Visible = True: Shape2.Visible = True: Shape2.BackColor = &H808080

If Text1.Text < xx Then Timer2.Enabled = True: Timer1.Enabled = False: Shape1.Visible = True: Shape2.Visible = True If Text1.Text <= sx And Text1.Text >= xx Then Timer1.Enabled = False: Timer2.Enabled = False: Shape1.Visible = True: Shape2.Visible = True

x(i) = i * 5 If i = 0 Then

graph1.Line (-95, 0)-((x(i) - 90), buf(i)), RGB(255, 255, 255) Else

graph1.Line ((x(i - 1) - 90), buf(i - 1))-((x(i) - 90), buf(i)), RGB(255, 255, 255) End If i = i + 1

If i = 35 Then i = 0

buf(1) = 0 buf(2) = 0 buf(3) = 0 buf(4) = 0 buf(5) = 0 buf(6) = 0

buf(7) = 0 buf(8) = 0 buf(9) = 0 buf(10) = 0 buf(11) = 0 buf(12) = 0 buf(13) = 0 buf(14) = 0 buf(15) = 0 buf(16) = 0 buf(17) = 0 buf(18) = 0 buf(19) = 0 buf(20) = 0 buf(21) = 0 buf(22) = 0 buf(23) = 0 buf(24) = 0 buf(25) = 0 buf(26) = 0 buf(27) = 0 buf(28) = 0 buf(29) = 0 buf(30) = 0 buf(31) = 0 buf(32) = 0 buf(33) = 0 buf(34) = 0 graph1.Cls End If

Text2.Text = Now If bc = 1 Then

rs!cysj = Text2.Text rs!caz = Text1.Text rs.Update: bc = bc + 1 Else

rs.AddNew

rs!cysj = Text2.Text rs!caz = Text1.Text rs.Update End If

End Select End Sub

Private Sub sxwd_Click()

Dim bbb As Integer Dim str_xx As String

str_xx = InputBox(\"请设置上限报警温度\上限报警温度\If Len(str_xx) > 0 Then sx = Int(str_xx)

If MSComm1.PortOpen = True Then MSComm1.PortOpen = False MSComm1.PortOpen = True Else

MSComm1.PortOpen = True End If Else

bbb = MsgBox(\"报警温度没有设置,将不能采集数据!\提示\") End If End Sub

Private Sub Timer1_Timer()

Shape1.Visible = Not Shape1.Visible Beep End Sub

Private Sub Timer2_Timer()

Shape2.Visible = Not Shape2.Visible Beep End Sub

Private Sub Timer3_Timer()

graph1.Scale (-100, 100)-(100, -100) graph1.CurrentX = -95

graph1.CurrentY = 0

graph1.Line (-95, 100)-(-95, -100), RGB(255, 255, 255) graph1.Line (100, 0)-(-100, 0), RGB(255, 255, 255) End Su

3.3 PC方界面

第四章 系统测试

传统的温度测量系统中,一般选用模拟式传感器,其特点是输出为模拟量,因此在测量中必须经过AD转换才能成为计算机处理的数字量。本系统由温度传感器通过AD转换器及FPGA传输到上位机,最终输出模拟温度数值。

A/D转换器应是一种低噪声高精度模数转换器,适用于低频测量应用的完整模拟前端,可以直接接在传感器上,简化系统设计,降低整体成本.应用中需要重点注意内部缓冲器、数字滤波器、校准模式三个方面的使用,能大幅度提高测量精度。

第五章 总结展望

5.1 总结

在电子技术应用领域中,单片机的应用愈来愈多地应用到各行各业。要开发单片机的应用,不但要掌握单片机硬件和软件方面的知识,而且还要深入了解各应用系统的专业知识,只有将这两方面的知识融会贯通和有机结合,才能设计出优良的应用系统。学习单片机这门课程,要掌握单片机指令系统中汇编语言各种基本语句的意义及汇编语言程序设计的基本知识和方法,以及单片机与其他设备相连接的输入输出中断等接口技术。使我从硬件软件的结合上理论联系实际,提高动手能力,从而全面掌握单片机的应用。

在这次课程设计中,我认识到我有很多不足得地方。首先,以前汇编学的不是很扎实,所以一些汇编程序不是很容易理解,看起来更费力。其次,现在普遍的动手能力不足,拿到了题目往往不知道向什么方向去做。后来我通过老师的指导以及同学的讨论下,在克服了重重的困难后,终于基本调试成功了此次课程设计所要求做的温度传感器。通过这次的课程设计,我认识到学好计算机要重视实践操作,对知识的学习,不能浅尝辄止,要深入去学习,去了解,这样才会有所收获。有许多东西,许多事,不是想像中的那么容易,不去实践,永远也不会有提高不仅仅是学习单片机原理,还是其它的课程,以及其它的计算机方面的知识都要重在实践,不能只是学习重视书本上的理论知识,所以日后在学习过程中,

我会更加注视实践操作,使自己更好地学好计算机这门课程。

5.2 展望

在温度传感器多个领域的研究中,很多内容没有得到统一的结论,这还需要在以后的研究中进一步探讨。嵌入式系统中不可避免地受到外界因素的影响,使测量结果与实际有偏差。如何减少干扰是工作中需要解决的问题。温度测量系统要求其输出的温度值有一定的精确性,本系统试图找到一种精确方法解决这个问题,但仍然显得很是不足。具体表现在输出数值精度不高,一般系统可可以精确到0.01,但此系统到不到此要求。另外,系统可靠性也是对本系统的一大考验,本系统在此方面还有待提高。还有一点就是对模数转换的要求,要求模数转换精确。目前,国内对温度传感器的研究由于技术水平滞后于发达国家和实验设备的,其探索的深度和广度还不够,有待于进一步研究探索。

参考文献

[1]王宜怀 刘晓升 嵌入式技术基础与实践【M】 清华大学出版社 2009 [2]邵贝贝 单片机嵌入式应用在线开发方法【N】 清华大学出版社 2004 [3]陈长顺 嵌入式基础【M】 北京航空航天大学出版社 2009

[4] 周六顺 基于VB编程的微机温度采集系统设计 化工设计通讯 2002 [5] ADAM采集模块使用手册 研华科技股份有限公司 [6]马文华 嵌入式系统设计与开发 科学出版社 2006

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo0.com 版权所有 湘ICP备2023021991号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务