/********************************************************************************************************
** 平面度测试仪
**
** 版权所有 (c) 2007,罗建
** 保留所有权利
**
** V1.11
**
**
**-------------------------------------------------文件信息----------------------------------------------
**文 件 名: McuUnit.C
**创 建 人: 罗建
**最后修改日期: 2007年10月29日
**描 述: 源程序。
**其 它:MCU采用STC12C5408AD,外部晶振为11.0592MHz,采用OCM2X16A LCD显示屏显示测量数据,并通过RS-232
** 接口向上位机发送测量数据。
**
**-----------------------------------------------历史版本信息--------------------------------------------
** 创建人: 罗建
** 版 本: V1.00
** 日 期: 2007年06月29日
** 描 述: 原始版本
**
**-------------------------------------------------------------------------------------------------------
** 修改人: 罗建
** 版 本: V1.01
** 日 期: 2007年07月03日
** 描 述: 简化了RS-232通讯协议,简化了常数的定义方式。
**
**-------------------------------------------------------------------------------------------------------
** 修改人: 罗建
** 版 本: V1.02
** 日 期: 2007年07月29日
** 描 述: 对部分注释进行了调整,修改了数据发送的方式(采用中断方式发送),增加了按键检测功能,目前支持测
** 试保持和启动测试两个按键(低电平有效)。
**
**-------------------------------------------------------------------------------------------------------
** 修改人: 罗建
** 版 本: V1.1
** 日 期: 2007年09月20日
** 描 述: 本版相对于以前版本作了较大改变,主要修改了对于按键的处理、数据采集的时序、数据的显示方式以及向
** 上位机传送数据的格式等,增加了校准数据的获取功能。
**
**-------------------------------------------------------------------------------------------------------
** 修改人: 罗建
** 版 本: V1.11
** 日 期: 2007年10月29日
** 描 述: 本版根据用户要求,在上一版本基础上作了少量调整,主要反应在LCD显示的最后一个值,原来为前三个通道
** 的平均值,现改为前三个通道的最大值。
**
** 平面度测试仪的特点如下:
** 1)采用STC12C5408AD高速单片机(PDI-28和SOP-28)为MCU,可利用RS-232串行接口方便地编程和调试;
** 2)具有最多7个(本来是8个,其中一个用作基准电压测量)10位ADC输入通道,测量范围:0~5V;
** 3)具有最多4个(实际只使用2个)开关量输入通道;
** 4)具有最多2个(目前保留)开关量输出通道,也可作为输入使用;
** 5)用OCM2X16A LCD屏显示测量结果(包括三个基本测量通道及三个通道的平均值)。
** 说 明:1)系统按键功能如下:
** a)启动测试按键,对应于电路板上的KEY1,按下后首先检查当前LCD是否已经清零,若是则采集一次数据并
** 更新LCD屏;否则不响应。当系统校准后该键也不响应。
** b)显示清零按键,对应于电路板上的KEY2,按下后清除LCD的显示(全部显示为:0.00mm)。当系统校准后
** 必须用该键清除LCD显示内容(退出校准模式)。
** c)当同时按下测试键和清零键时,LCD将分别显示"Ready to adjust,"(上屏)和" Waiting... "(下
** 屏),此时,如果保持两键同时按下2秒以上,则LCD会分别显示" Adjust OK! "(上屏)和
** "Press CLEAR key."(下屏),再按一下清零键退出校准模式并清除LCD显示内容;如果有任一键或全部
** 键均弹起,则LCD显示内容将被清除。
** 2)系统上电后,将显示一LOGO字符串,然后进入清零状态,等待用户操作。此时,用户可以按一下测试键,
** 开始测试一下当前值,也可以同时按住测试键和清零键并保持2秒,系统将测试一次当前值,并将其作为校
** 准值存入STC12C5408AD芯片的EEPROM中,以备下次开机时使用(校准值是立即生效的)。
** 3)通讯协议(可配套“平面度测试仪上位监控软件 V1.0”使用)
** a)硬件接口:RS-232;
** b)波特率:14400bps;
** c)起始位:1位;
** d)数据位:8位;
** e)停止位:1位;
** f)奇偶校验:无;
** g)数据格式:接收到的帧数据包含三个测量通道的测量值及其平均值,每个值用无符号的16位整型数表示。
** 要计算这些值,可以按以下公式进行:
** Value1 = (MSB1 * 256 + LSB1) / 100.0,单位为:mm。
** 其中,MSB1的最高位D7表示正负符号位,0表示正数,1表示负数。
** 对于开关状态SW,用一个字节表示,每位分别表示一个开关(输入或输出)的状态,格式如下:
** D7 D6 D5 D4 D3 D2 D1 D0
** 输出备用 输出备用 OUT2 OUT1 KEY4 KEY3 清零键 测量键
** 其中,D7~D2目前未用,可作今后扩展。另外,输出OUT1和OUT2也可作输入用。各开关均有上拉电阻。
** h)帧格式:0xFF,0xFF,MSB1,LSB1,MSB2,LSB2,MSB3,LSB3,MSB4,LSB4,SW,CRC
** 一帧数据由三部分组成:开头部分是帧头,以两个连续的0xFF表示;中间部分依次是测量通道1、测量
** 通道2、测量通道3及三个通道的平均值和开关的状态,测量值和平均值分别由两个字节表示,先发高
** 字节,后发低字节;开关的状态SW由一个字节表示;最后部分是帧校验和,用一个字节表示。校验和的
** 计算方法如下:
** CRC = MSB1^LSB1^MSB2^LSB2^MSB3^LSB3^MSB4^LSB4^SW
** 即将中间部分的9个字节全部相或,其结果作为校验和。
** 说明:由于最大量程为5.00mm,为了采用整数来表示浮点数,将值扩大了100倍,相当于最大值为500,
** 即0x01F4,高低位字节均不可能包含0xFF。因此,帧头以两个0xFF表示,不会产生混淆。
**
**-----------------------------------------------当前版本修订--------------------------------------------
** 修改人: 罗建
** 版 本: V1.11
** 日 期: 2007年10月29日
** 描 述: 本版根据用户要求,在上一版本基础上作了少量调整,主要反应在LCD显示的最后一个值,原来为前三个通道
** 的平均值,现改为前三个通道的最大值。
**
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#include <Intrins.h>
#include <String.h>
#include "McuUnit.h"
#include "MiscUnit.h"
#include "LCD1602Drv.h"
#include "STC12C5410AD.h"
#include "STC12C5410AD_FlashIAP.h"
// ------------------------------------------------------------------------------------------------------
/* 定义位变量 */
bit gbClring; /* 指示当前是否正处于清除LCD显示状态,0~否,1~是 */
bit gbDisInfo; /* 指示当前是否正在显示INFO字符信息,0~否,1~是 */
bit gbBaseWait; /* 指示当前是否正在进行清除与测量两个按键同时按下检测,0~否,1~是 */
bit gbTimeOver; /* 指示规定的定时间隔时间时否到,0~未到,1~已到 */
bit gbIsTxHeadOK; /* 指示是否已将帧头全部发送至上位机,0~否,1~是 */
bit gbIsTxDataOK; /* 指示是否已将帧数据全部发送至上位机,0~否,1~是 */
bit gbIsTxBusyOK; /* 指示是否串口发送缓冲区处于忙状态,0~否,1~是 */
// ------------------------------------------------------------------------------------------------------
/* 定义字节变量 */
INT8U data gnCrc; /* 串行接口发送数据校验和 */
INT8U data gnTxCnt; /* 串行接口发送缓冲区指针 */
INT8U data gnKeyCnt; /* 按键检测间隔计数器 */
INT8U data gnBaseCnt; /* 清除与测量两个按键同时按下检测计数器 */
INT8U data gnTxBuf[9]; /* 串行接口发送缓冲区(不含帧头及校验和) */
INT8U data gnLcdBuf[4][8]; /* 代表四组LCD显示缓冲区内容(如:2.35mm) */
// ------------------------------------------------------------------------------------------------------
/* 定义字变量 */
INT16 data gnDisData[4]; /* 存放要在LCD上显示及要发送给PC的前三个测量通道及其平均值的测量数据 */
TWordType data gnBaseVal[3]; /* 存放前三个测量通道的基准测量值 */
TWordType data