北华大学
智能仪器课程实习报告
设计题目:智能热电偶温度测试仪设计
班级 学号: 姓 名: 专 业 名 称:
2012年 月 日
第 1页
目 录
1概述 ......................................................................... 1
2方案论证 ..................................................................... 2
2.1设计指标 ............................................................... 2
2.2设计方案 ............................................................... 2
3MK4-PC智能仪器实验教学系统简介 ............................................... 3
3.1平台整体结构 ........................................................... 3
3.2平台的设计思路 ......................................................... 3
4硬件电路设计 ................................................................. 5
4.1硬件功能分析 ........................................................... 5
4.2各部分硬件设计 ......................................................... 8
4.3A/D转换器D/A转换器 ................................................... 10
4.4单片机模块 ............................................................ 11
5软件设计 .................................................................... 15
5.2软件功能需求分析 ...................................................... 15
5.1编程环境介绍 .......................................................... 15
5.3各部分软件设 .......................................................... 15
5.3.1主程序设计 ....................................................... 15
5.2.2A/D转换子程序设计 ................................................ 16
6系统调试 .................................................................... 18
7心得体会 .................................................................... 19
8附件 ........................................................................ 20
第 2页
1概述
温度是表征物体冷热程度的物理量,温度传感器是通过物体随温度变化而改变某种特性来间接测量的。不少材料、元件的特性都随温度的变化而变化,所以能作温度传感器的材料相当多。例如, 利用水银温度计、有机液体温度计、双金属温度计、液体压力温度计、铂电阻温度计、热敏电阻温度计、热电偶温度计、光学高温计、红外温度计、辐射温度计、比色温度计等等都可实现对温度的测量。进入21世纪后,智能温度传感器正朝着高精度、多功能、总线标准化、高可靠性及安全性、开发虚拟传感器和网络传感器、研制单片测温系统等高科技的方向迅速发展。
热电偶传感器是目前接触式测温中应用最广的热电式传感器,在工业用温度传感器中占有及其重要的地位。它结构简单、制造方便、测温范围宽(低至负180 ℃, 高至1800 ℃)、热惯性小、准确度高、输出信号便于远传。本文介绍一个基于热电偶的温度测试系统,本设计是以AT89C51单片机为核心,由AD590集成温度传感器测量冷端温度T0,由热电偶测量热端温度T。该热电偶采用K型热电偶(镍铬-镍硅热电偶)。使用+12V和+5V电源。采用4位共阴极LED显示。该热电偶测温仪的软件用C语言编写,采用模块化结构设计。考虑到实际中有时需要对测温的上下限值进行修改,或者是在测温之初检验该设备是否能够正常显示或运行,故在设计中可以根据需要加入键盘。在工业测量中,被测对象所处环境往往十分恶劣,常存在电场、磁场、噪声等干扰,使采样值偏离真实值。所以,在软件设计中,还需要一组滤波程序,对多次采样信号构成的数据系列进行平滑加工,以提高其有用信号在采样值中所占比例,减少乃至消除各种干扰及噪音,以保证系统工作的可靠性。本设计采用分段直线拟合方法,既节省大量存储器,又有很高的测量精度。
第 3页
2方案论证
2.1设计指标
测温范围:-20℃~+1200℃(热电偶) ;-20℃~+300℃(热电阻) 精度:0.1%
功能:液晶显示、超限报警、断线检测、与上位机通信、(做成防爆型或防火型测量仪表的考虑)
2.2设计方案
本设计的整体思路是:用热电偶测量热端的温度T,并进行I/V转换和线性放大,由另一个设备测量冷端温度T0并进行温度补偿,再进行I/V转换和线性放大。然后把从热端和冷端得到的信号分时进行A/D转换,再送到单片机进行运算处理,从而得到热电偶测到的实际温度值,最终在LED液晶显示屏上显示。
热电偶冷热端分测方案
本方案由AD590集成温度传感器测量冷端温度T0,由热电偶测量热端温度T。它们分别经过I/V转换和线性放大,分时进行A/D转换,转换后的数字信号送入AT89C51单片机,经单片机运算处理,转换成ROM地址,在通过二次查表法计算出实际温度值。此值送4位共阴极LED数码管显示。
冷端 AD590 冷端补偿电路模块 热端 热电偶 转换和放大电路模块 分时模数转换 LED显示模块 图2.1测温整体框图
单片机模块
该方案采用模块化设计把各个模块分离开,使得设计的测温系统适应性很强,可以随时改变各个模块的一些硬件的参数和各个结构而适应不同的复杂测温环境,并且测量的精度也比较高。因此设计采用了该方案。
第 4页
3MK4-PC智能仪器实验教学系统简介
智能仪器课程是一门综合性、实践性强的课程,涉及到基础理论及各种当代新技术的具体应用,要求学生不仅能够掌握书本上的理论知识,还要具有实践动手能力甚至系统开发能力。智能仪器实验平台就是为提高学生理解掌握知识、提高系统设计开发能力而设计的。智能仪器实验开发平台集中了单双极性输入通道、程控放大、模拟滤波、16位A/D转换及CPLD技术和单片机技术,并具有超过128KB的大存储空间,集中体现了智能仪器课程所涉及到的各种软硬件技术,非常适合大学本科生的学习以及在此基础上的进一步开发。
3.1
平台整体结构
智能仪器实验开发平台采用模块化设计,整个平台设有一个母板,该母板具有四个相同规格的扩展部分,每个扩展部分设四个插口,每个插口对应的分别为单片机的P0、P1、P2、P3口。设计时将单片机作为控制部分的核心,因此单片机板独立占用其中一个扩展,显示部分采用液晶模块完成,该部分还设有四个按键作为组合按键使用。第三个部分为基于CPLD的16位数据采集部分,设有两个独立输入通道,每个通道可设置为单极性输入或双极性输入,具有程控放大、模拟滤波等功能,CPLD控制A/D转换器完成数据的采集工作,数据采集的采样频率可设置为10KHz、20KHz … 500KHz,采样点数可以根据要求设置。平台的最后一个扩展部分为空,留给平台的使用者做扩展使用,根据要求自己独立设计该部分的电路。
3.2
平台的设计思路
智能仪器实验开发平台设计时考虑到本科学生的水平差异,可以使不同能力的学生都可以对其进行使用。对于能力相对较差的学生,实验平台设计了几个基本的演示程序,包括:信号源输出、放大、滤波、采集、键盘显示、串行通信等,通过串行口与计算机相连,计算机带有为学生提供的参数设置及数据显示面板,学生通过对参数设置,可以观察到不同的数据结果,提高学生对课程知识的理解能力。对于能力较好,但知识面相对单一的学生,可让其在了解接口定义的基础上单独设计CPLD程序或单片机程序,使其在该方面能力加强的同时又能增加对相关知识的了解。而对于成绩好、实践能力强的优秀学生,则该平台只是为其提供一个硬件基础,给其提供硬件接口后,可以根据自己需要任意发挥以实现自身需要的各种功能。
可完成以下实验:
1、模拟信号调理实验(有源滤波器的设计) 2、D/A转换实验
第 5页
3、A/D转换实验 4、键盘显示试验 5、数据处理算法实验
6、基于单片机的智能仪器综合设计实验 7、虚拟仪器设计实验
第 6页
4硬件电路设计
4.1硬件功能分析
智能仪器实验开发平台集中了单双极性输入通道、程控放大、模拟滤波、16位A/D转换及CPLD技术和单片机技术,并具有超过128KB的大存储空间,集中体现了智能仪器课程所涉及到的各种软硬件技术,非常适合大学本科生的学习以及在此基础上的进一步开发。
智能仪器实验开发平台采用模块化设计,整个平台设有一个母板,该母板具有四个相同规格的扩展部分,每个扩展部分设四个插口,每个插口对应的分别为单片机的P0、P1、P2、P3口,如图4.1所示。设计时将单片机作为控制部分的核心,因此单片机板独立占用其中一个扩展,显示部分采用液晶模块完成,该部分还设有四个按键作为组合按键使用。第三个部分为基于CPLD的16位数据采集部分,设有两个独立输入通道,每个通道可设置为单极性输入或双极性输入,具有程控放大、模拟滤波等功能,CPLD控制A/D转换器完成数据的采集工作,数据采集的采样频率可设置为10KHz、20KHz … 500KHz,采样点数可以根据要求设置。平台的最后一个扩展部分为空,留给平台的使用者做扩展使用,根据要求自己独立设计该部分的电路。
图4.1俯视尺寸规格图(单位:毫米)
除平台能够独立完成各项实验项目外,为实现对采集的数据进行图形化显示,该平台还可以通过标准的R-232接口与PC机连接,通过PC机的显示器将数据波形显示出来,同时还可以利用该串行接口对单片机进行仿真或传输控制参数使其工作在设定模式下。整个功能框图如图4.2所示。
第 7页
单片机模块SRAMSRAM信号输入信号调理信号输入AD7655CPLD单片机RS232PC 机信号源显示按键数据采集模块人机接口模块 图4.2框图
4.1.1CPU控制模块
该模块包括单片机、大容量RAM数据存储和RS-232串行数据通信接口。
整个实验平台以单片机SST89V564RD为控制处理核心。美国SST公司生产的SST89系列单片机是一款非常有特色的以8051内核为核心的新型8位单片机。它具有独特的FLASH技术和小扇区结构设计,其最大的特点是采用在应用可编程和在系统可编程技术,在不占用用户资源和无须改动硬件的情况下,可直接通过串口在系统仿真,在线实现远程升级,无须专用仿真器和编程器。SST89系列单片机还在其他功能上较之传统的51单片机有了长足的改进和进步,如片内含有大容量的RAM数据存储器,其独特的DPTR数据指针结构使得在进行查表寻址运算时更加方便。正是因为SST89系列单片机所具有的优点,而且价格低廉,因此在仿真器和下载仪中得到广泛的应用。根据本系统实际需要选用SST公司的3.3V供电的SST89V564RD 单片机。
为满足因高速采集和大量数据计算所需要的大容量存储器,该模块包含了一片存储容量为128KB的高速RAM存储器,单片机利用分页方式对其访问。另外,该模块上还包含了单片机对PC机通信的RS-232芯片。
第 8页
整个模块的结构如下图所示:
MAX232RAMSST89V564RD图4.3 CPU控制模块结构图
4.1.2基于CPLD的采集模块
该模块以CPLD为控制处理核心,利用CPLD的I/O与单片机的总线连接,通过单片机总线将控制字写入CPLD内部的存储器,而CPLD则通过读取存储器控制字的方式按单片机的要求工作。由于该方式使用非常灵活,如果CPLD不是挂接在单片机总线而是其它的控制总线,则只要控制字能够满足要求,该模块同样可以进行工作。CPLD根据控制字的要求可以控制该模块实现以下功能:输入信号的程控放大及滤波,数据采集频率及采集点数,实现对模块自带RAM的读写以及产生简单的信号源供测试使用。该模块共有两个输入通道和一个信号源输出通道。
整个模块的结构如下图示:
74HC573
程控放大A/D程控滤波程控放大程控滤波CPLD程控放大程控滤波RAM图4.4数据采集模块结构示意图
为提高实验平台的性能,本模块选用的A/D转换器为16位转换精度且其最大采样频
第 9页
率为500KHz,能够满足很多数据采集的需要。
4.1.3液晶显示模块
该模块包含一块字符型液晶屏、4个按键和8个显示状态信息的LED发光二极管。 平台独立运行时,利用字符型液晶模块显示按键控制信息和平台的部分运行结果,同时,LED二极管可以给出单片机P0口的状态。模块结构如下:
Jilin University74HC57374HC57374HC573图4.5 按键显示模块结构示意图
4.2各部分硬件设计
4.2.1冷端采集和补偿电路模块
冷端采集和补偿电路运用AD590温度传感器采集冷端温度,并连接补偿电路进行温度补偿,如图
第 10页
+12R511.2KR5010KR47W150K+5R48U2BA210KR4910KR44100K100K+5+12D1+6V3AD59054LF353R4910K54LF353U1BA2V031212-5-5
图4.6冷端采集和补偿电路
4.2.2热端放大电路模块
+12-INP+5R58R6010K100K4723U3A6MC33078R54100KR54100KR52+5100K72-12C40.1uFC3220W3AR56300K10K+127U1A6V13W2A100KR55100K4MC33078-5R55100KR53100KR57R5910k100K23U2A6MC33078+INP-54-12图4.7 热端放大调理电路
热电偶的热端放大电路如图3.2所示。热电偶的热端接入到INP口,然后进行一系列的调试放大。
本系统应用K型热电偶,导热系数测定过程中通常温度范围小于100℃,为保证测量精度,热电偶线性化软件我们每隔5℃分一段,并且精确到小数点后两位。硬件调理电路截取K型热电偶100℃的热电势4.095mv作为输入满量程,放大到5V,提供给AD转换器,要求调理电路放大倍数达1200多倍,为此我们选取高精度运算放大器MC33078,构
第 11页
成两级运算放大器,每级放大倍数小于40倍,。MC33078除了具有普通运算放大器的特点和应用范围外,还具有高增益、高共模抑制比、失调小和漂移低等特点,利用动态校零技术消除了CMOS器件固有的失调和漂移,所以常被应用于热电偶、电阻应变电桥、电荷传感器等测量微弱信号的电路中。
4.3A/D转换器 D/A转换器
A/D转换器的连接图如下:
图4.8A/D转换器的连接图
U20为AD780,它是基准电压芯片。A/D转换器是AD7655,它是一款16位的A/D,它的数据口D0-D7、控制端口BUSY、CNVST、IMPULSE、BYTESWAP连接至CPLD。单片机通过往CPLD写控制字来控制A/D的采样率。
D/A转换电路如下:
图4.9D/A转换电路
最右边的芯片是74HCT245,起电平转换作用。CS_DA接245的使能端,单片机P2.4、
P2.5、P2.6用来控制D/A芯片,数据是串行传输。U26是OP07运放,用来给D/A芯片DAC7811提供基准电压,Rpot6用来调节基准电压。DAC7811是12位D/A,电流输出型,U28运放把DAC7811输出的电流转换成电压,U29运放是为了产生双极性输出。如果使信
第 12页
号产生插座输出D/A转换器产生的电压信号,应使J3的1、5连接,J6的3、4连接。以数据采集板上方丝印层文字说明为准(D/A Uni)。
4.4单片机模块
单片机板位于底板右上方。机械图如下:
图4.10机械图
U1为本实验教学系统的处理器--SST89V564RD,它的I/O电平为3.3V。VCC为3.3V电源。
晶振和复位电路如下图:
图4.11晶振和复位电路
U2为74HC573,作用是为U3(RAM)锁存低八位地址。U1、U2、U3之间的连接如下:
第 13页
图4.12芯片连接图
IS63LV1024是RAM芯片。硬件连接是总线方式。编程时使用 XBYTE[0xXXXX] 指令进
行读写。
U5是74HC138,U6是74HC245,它们组成片选电路。原理图如下:
图4.13原理图
VCC为3.3V。单片机的P1.2、P1.3、P1.4是控制信号。CS_KBRD是获取键码时的片选信号,键盘接口具体介绍在本章第二节。CS_RAM是RAM存储器的片选信号。CS_USB是键盘接口板USB芯片PDIUSBD12的片选信号。CS_DISP是128*64中文液晶显示电路的片选信号。CS_DA是数据采集板上数模转换器的片选信号。其中显示电路和D/A转换器片选信号为5V电平,74HCT245作为电平转换。
第 14页
液晶显示控制电路原理图如下:
图4.14液晶显示控制电路原理
两片74HCT245作电平转换用,把单片机I/O口3.3V电平转换为5V电平。跳线J1可选择12864液晶显示模块为并行或串行数据传输,PSB为液晶显示模块的串并选择端口,系统默认为并行。Rpot1是液晶驱动电压调节电位器,Rpot2是液晶背光亮度调节电位器。CS_DISP连接到两片74HCT245的使能端。
单片机板上还有一个双向电平转换电路,电路图如下:
图4.15双向电平转换电路
电路功能是为单片机P1.6和P1.7提供双向电平转换。P1.6和P1.7为3.3V电平,VCC为3.3V。SDA和SCL为5V电平,它们连接到数据采集板的数字电位器X9241。两个小MOS管的型号为AO3400。
A/D转换器输出的为BCD码,2-1~2-8口不是总线式的。因此,单片机只能通过并行I/O接口或扩展I/O口与其相接。还可以通过单片机的P1口直接与其连接。
第 15页
+5R2R3R4R5R6R7R8R98*2kIC8V02627V12812345IN-0IN-1IN-2IN-3IN-4EOCIN-5IN-6IN-7ALE1612R12Kref(-)ref(+)ADC0809ENABLESTARTCLOCKADD-AADD-BADD-Cmsb2-12-22-32-42-52-62-7lsb2-821201918815141772524232296101234567813121514311918C10.1uFY16Mhz91716IC1P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7INT1/P3.3INT0/P3.2T1/P3.5T0/P3.4EA/VPX1X2RESETRD/P3.7WR/P3.61143276RXD/P3.0TXD/P3.1ALE/PPSEN10113029P0.0P0.1P0.2P0.3P0.4P0.5P0.6P0.7P2.0P2.1P2.2P2.3P2.4P2.5P2.6P2.739383736353433322122232425262728+5C20.1uFIC989C51CLK1CLK0118912MR2MR1MS2MS1Q3Q2Q1Q074LS90 图4.16A/D芯片与单片机连接图
EOC是A/D转换结束的输出标志信号。89C51读取A/D转换结果可以采用中断方式或查询方式。采用中断方式,EOC端与89C51外部输入端INTO或INT1相连,采用查询方式是EOC端可直接接入89C51的任一I/O口线。
第 16页
5软件设计
1、编程环境介绍
Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。Keil提供了包括C编译、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部分组合在一起。运行Keil软件需要WIN98、NT、WIN2000、WINXP等操作系统。
2、软件功能需求分析
P0口:
RAM芯片的第八位地址线(573锁存)、数据线,液晶显示的数据口(245缓冲),键盘键值获取(245缓冲),8个LED灯控制(573锁存),USB芯片PDIUSBD12的数据口(直连),CPLD直连(作为单片机和CPLD之间数据口和低八位地址线)。
P1口:
P1.0 RAM芯片的最高位地址线(直连)
P1.1 8个LED灯控制,直连573锁存器的锁存控制端 P1.2-P1.4 片选信号控制端,直连138译码器A、B、C P1.5 485总线芯片MAX3485的方向控制,直连
P1.6、P1.7 直连至两个小MOS管进行双向电平转换,转换后信号接数字电位器X9241 P2口:
P2.0-P2.7 直连至CPLD,作为单片机和CPLD之间高八位地址线 P2.0-P2.3 液晶显示的控制线(245缓冲) P2.4-P2.6 D/A转换器的控制线(245缓冲) P3口:
P3.0、P3.1 串口,连接至键盘接口板J1和J2
P3.2 直连至CPLD,作为CPLD发向单片机的中断信号线 P3.3 USB芯片的中断信号(直连)
P3.4 CPLD的片选信号,实际上与CS_CPLD相连,写程序片选CPLD时用P3.4,不用片选电路。
P3.5 键盘接口板上2051单片机向单片机板发送中断信号线,T1设置为计数器,使用溢出中断扩展外部中断
P3.6、P3.7 CPLD、USB芯片、RAM芯片的读写信号线
3、各部分软件设计 主程序
主程序设计当中,主程序开始,先进行初始化,接下来先后调用A/D转换子程序、线性化标度变换子程序。最后通过LED显示所测得温度值。主程序流程图如图
第 17页
开始 调A/D转换子程序 初始化调线性化标度变换子程序 送数据进缓冲单元,用于显示
送程序运行监测信号Y温度是否正常? N 结束图5.1主程序流程图 图3.1 主程序流程图
A/D
转换子程序
A/D转换子程序流程图如图4.2。在该子程序中,首先对ADC0809的采样进行A/D转换,之后判断A/D转换是否完成,如果没有完成,则返回A/D转换,直到转换完成后,再进行数字滤波。待数字滤波后,将码值NX送到单片机缓冲单元存储,等待下一步线性化子程序调用该码值。
第 18页
开始 转换启动A/D A/D完成?N Y 读A/D值 DX 数字滤波 送码值N X至缓冲单元存储 返回 图5.2 3.2 A/D
A/D转换子程序流程图转换子程序流程图
第 19页图
六、系统调试
本系统调试分为两个部分:硬件调试和软件调试。硬件调试对各个模块的功能进行调试,主要调试各模块能否实现指定的功能。软件调试用Keil C51软件编写上位机的程序,将编好的程序进行调试,运用Keil C51可以检查语法错误。对设计好的硬件电路还可以运用仿真软件进行仿真调试,并可以运用仿真软件和Keil C51进行联合仿真调试。
第 20页
七、心得体会
本次我们选作的课题是基于热电偶的温度测试仪设计,本次课程设计是一次比较正规且全面的训练。经过这次的课程设计,我们确实学到了很多知识,它涉及到硬件及软件方面的统一。使我们更加好的了解到学好专业知识的重要性,也真正的感受到了理论联系实际的重要性,既加强了我们动手能力也锻炼了我们思考并解决问题的能力。
在这次课程设计的整个过程中,我们做了一次全面、较规范的设计练习,全面地温习了以前所学过的知识,用理论联系实际并结合单片机原理课程和解决实际问题,巩固、加深和扩展了有关单片机设计方面的知识。尤其重要的是让我们养成了科学的习惯,在设计过程中一定要注意掌握设计进度,按预定计划完成阶段性的目标,在底图设计阶段,注意设计计算与结构设计画图交替进行,采用正确的设计方法。在整个设计过程中注意对设计资料和计算数据的保存和积累,保持记录的完整性。在课程设计的实践中进行了设计基本技能的训练,掌握了查阅和使用标准、规范、手册、图册、及相关技术资料的基本技能以及计算、数据处理等方面的能力。
通过对通用89C51单片机机处理器、常用元器件的设计,掌握了一般单片机设计的程序和方法,让我们对整个单片机程序的设计,C51语言有了一个比较深的理解。还有就是增强了自身的动手能力,把以前书本上讲的或是没有讲的,通过一次课程设计具体的实施,使自己真正得到锻炼,对于以后我们的发展与学习来说,都可以看作一笔不小的财富,前面还有很多需要我们去尝试。
做课程设计是为了让我们对平时学习的理论知识与实际操作相结合,在理论和实验教学基础上进一步巩固已学基本理论及应用知识并加以综合提高,学会将知识应用于实际的方法,提高分析和解决问题的能力。在做课程设计的过程中,我深深地感受到了自己所学到知识的有限,明白了只学好课本上的知识是不够的,要通过图书馆和互联网等各种渠道来扩充自己的知识。同时我认为我们的工作是一个团队的工作,团队需要个人,个人也离不开团队,只有在充分的分工合作中才可以事半功倍做到最好,所以必须发扬团结协作的精神。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。有了这次的设计经验,相信在以后的学习设计实践过程中,我们可以做到更好。最后,感谢老师对我们的指导和帮助。
第 21页
8附录:软件代码
串口通信文件 Serial.c: /*
* 单片机串口中断接收和查询发送程序 * 发送用中断没什么优势,因为是单片机主动
* 发起的,没实时要求 * *
****************************************
* 单片机接收协议:
* * :ccdddd$
*
* 数据格式为ASCII格式
*
* : 为包头指示
*
* cc 命令,如01,其ASCII为3031
*
* dd 传送的内容
*
* $ 包尾,结束
* * 没有校验
单片机发送协议: :cdddd...$
*
******************************************
*/
#include #include #include #include // 全局变量声明 #define adc_mcu_ctrl XBYTE [0x8007] unsigned char proc_flag; // 是否处理缓冲区中的数据 unsigned char serial_buf[BUF_LEN]; // 接收缓冲 unsigned char * p_buf; // 指示当前缓冲区位置 unsigned char start_flag; unsigned char DataProcStart;//标志位,表示上位机点了“开始采样” serial_isr() interrupt 4 { EA = 0; if (RI) { if (':' == SBUF) { // 开始接收 start_flag = 1; p_buf = serial_buf; *p_buf = SBUF; p_buf++; } else if((BUF_LEN > (p_buf - serial_buf)) &&start_flag) { *p_buf = SBUF; p_buf++; if ('$' == SBUF) { // 传送完一个完整包 start_flag = 0; proc_flag = 1; } } else { error(COMM_ERROR); } } RI = 0; TI = 0; // 不清零,则发送时一直中断 EA = 1; } // 定时器2做波特率发生器 voidserial_init(void) { 第22页 T2CON = 0x34; // @22.1184M, 38400b/s RCAP2H = 0xFF; RCAP2L = 0xEE; SCON = 0x50; // N, 8, 1 ES = 1; // 串行中断允许 EA = 1; start_flag = 0; proc_flag = 0; } // 获得包内容 unsigned char get_byte() { return (toint(serial_buf[3]) * 16 + toint(serial_buf[4])); } unsigned char get_word() { return (toint(serial_buf[3]) * 4096 + toint(serial_buf[4]) * 256 + toint(serial_buf[5]) * 16 + toint(serial_buf[6])); } // 分析命令 voidcmd_proc(void) { unsigned char cmd; proc_flag = 0; cmd = toint(serial_buf[1]) * 16 + toint(serial_buf[2]); switch(cmd) { case CMD_SMP_START: DataProcStart = 1; break; default: error(CMD_ERROR); // 无效命令 break; } } voidsend_data() { unsigned intadr; // 数据地址 chari; LedDisplay(0xf0); ES = 0; // 发送时串口中断关闭 TI = 0; SBUF = ':'; // 开始 while(0 == TI); TI = 0; SBUF = '1'; // 传送数据 while(0 == TI); TI = 0; SBUF = '_'; while(0 == TI); // 开始发送数据 page_reg = 0; page_ram = 0; Select(2); for (adr = 0x0000; adr< 2000; adr++) { // 传送点数 // checksum += *adr; //XWORD [adr] = adr; //XWORD [adr] = 0x7fff; sprintf(serial_buf, \"%04X_\传送一个字和分隔符 for ( i = 0; i< 5; i++) { TI = 0; SBUF = *(serial_buf + i); while(0 == TI); } } page_reg = 0; Select(2); // 发送校验 /* sprintf(hexStrBuf, \"%x\checksum); for ( i = 0; i< 4; i++) { TI = 0; SBUF = *(hexStrBuf + i); while(0 == TI); 第23页 [adr]); // } */ // 发送结束 TI = 0; SBUF = '$'; while( 0 == TI); // clear_display(); // printf(\"Trans END\"); // light(0xff); LedDisplay(0x0f); ES = 1; } serial.h: #ifndef __SERIAL_H__ #define __SERIAL_H__ // 缓冲区长度 #ifndef BUF_LEN #define BUF_LEN 6 #endif // 命令类别 #define CMD_CHA_GAIN 0x00 #define CMD_CHA_FILTER 0x01 #define CMD_SIG_FREQ 0x02 #define CMD_CH_SEL 0x03 #define CMD_ADR_SAVE 0x04 #define CMD_SMP_NUM 0x05 #define CMD_SMP_RATE 0x06 #define CMD_SMP_START 0x07 #define CMD_RST 0x08 #define CMD_CHB_GAIN 0x09 #define CMD_CHB_FILTER 0x0a #define CMD_TRANS 0x0b extern unsigned char proc_flag; // 是否 处理缓冲区中的数据 extern unsigned char DataProcStart; // 串口初始化 extern void serial_init(void); // 分析命令 extern void cmd_proc(void); extern void send_data(); #endif // serial.h 主函数: #include #include \"stdio.h\" #include \"daq.h\" #include \"x9241.h\" unsigned char code MainCap1[] = \"数据处理实验 \"; unsigned char code MainText1[] = \"正在等 待上位机 \"; unsigned char code MainText2[] = \"正在发送数据 \"; unsigned char code MainText3[] = \"发送完毕 \"; unsigned char code MainText4[] = \"温度过高 \"; unsigned char code MainText5[] = \"温度过低 \"; voidLcdDisp(char *Buff,char Row) { Select(0); delayms(1); TransferData(0x98,0); //Set Graphic Display RAM Address while(*Buff) { TransferData(*Buff++,1); } } void LcdDisp1(char *Bufff,charRoww) { Select(0); delayms(1); 第24页 TransferData(0x88,0); //Set Graphic for(i = 0;i < 16;i++) { Display RAM Address while(*Bufff) { TransferData(*Bufff++,1); } } main() { unsigned char i,a; unsignedintadr,j=0; charidata Buff[16]; charidataBufff[16]; static float idataVal,Adv; static float idata T; float k=0.397; unsigned char idataResA[4] = {10,50,10,50}; unsigned char idataResB[4] = {20,50,20,50}; CHADpotWW(ResA);//设置A 通道增益 CHBDpotWW(ResB);//设置B 通道增益 pg //系统初始化 AUXR = 0x03; // 关闭SST单片机内部RAM和ALE输出 Select(3); page_reg = 0; page_ram = 0; LedDisplay(0x00); //液晶显示初始化 Select(0); delayms(1); initinal(); //调用LCD 字库初始化程序 delay(100); //大于100uS的延时程序 //显示 数据处理实验 TransferData(0x80,0); //Set Graphic Display RAM Address a = MainCap1[i]; TransferData(a,1); } //显示 正在等待上位机 TransferData(0x90,0); //Set Graphic Display RAM Address for(i = 0;i < 16;i++) { a = MainText1[i]; TransferData(a,1); } //-------------------------------------------------------------------------------- - // AD采集程序 //--------------------------------------------------------------------------------- daq_init(); //adc 初始化 for(;;){ adc_start(); delayms(100); adc_end(); Val=daq_a(); //获得原始AD值 Adv = Val - 32768; Adv = Adv*5000 / 65535; Val = Adv * -1; Val = Val / 6;//A 通道放大倍数4,电平转换放大倍数0.5 T = 2.58*Val-258; //定标处理,获得外部信号的mV值。y=kx+b //热偶温度变换,线性 化处理。 //显示处理。 sprintf(Buff,\"%5.1f %d\ LcdDisp(Buff,0); sprintf(Bufff,\"%5.1f %d\ LcdDisp1(Bufff,0); if(T>100) { 第25页 TransferData(0x80,0); //Set { Graphic Display RAM Address for(i = 0;i < 16;i++) { a = MainText4[i]; TransferData(a,1); } } if(0 //Set Graphic Display RAM Address for(i = 0;i < 16;i++) { a = MainCap1[i]; TransferData(a,1); } } if(T<0) { TransferData(0x80,0); //Set Graphic Display RAM Address for(i = 0;i < 16;i++) { a = MainText5[i]; TransferData(a,1); } } //温度报警处理。包含显示报警信息。 // mainkey(); //键盘 处理,报警温度设定/补偿设置。 } //--------------------------------------------------------------------------------- //数字滤波函数 //限幅滤波(相连两个数据之差不超过一个经验值,若超过,前一个数据覆盖后一个数据) for(adr = 0;adr < 499;adr++) if(XBYTE[4*(adr+1)+1] > XBYTE[4*adr+1]) { if((XBYTE[4*(adr+1)+1] - XBYTE[4*adr+1])>10)//10是经验值 XBYTE[4*(adr+1)+1] = XBYTE[4*adr+1]; } else { if((XBYTE[4*adr+1] - XBYTE[4*(adr+1)+1])>10) XBYTE[4*(adr+1)+1] = XBYTE[4*adr+1]; } } //显示 正在发送数据 Select(0); delayms(1); TransferData(0x90,0); //Set Graphic Display RAM Address for(i = 0;i < 16;i++) { a = MainText2[i]; TransferData(a,1); } // 发送 RAM低2000地址数据至上位机 // send_data(); //显示 发送数据完毕 Select(0); delayms(1); TransferData(0x90,0); //Set Graphic Display RAM Address for(i = 0;i < 16;i++) { a = MainText3[i]; TransferData(a,1); } } 第26页 第27页 因篇幅问题不能全部显示,请点此查看更多更全内容