⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mcuunit.c

📁 一个完整的个人产品开发源代码,包括对单片机STC12C5410的编程(含内部AD采样、自创的内部Flash编程源码等)、LCD1602的驱动编程等。
💻 C
📖 第 1 页 / 共 4 页
字号:
/********************************************************************************************************
**				                                 平面度测试仪
**
**                                          版权所有 (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  gnADData[3];                     /* 存放前三个测量通道的工程量结果 */

// ------------------------------------------------------------------------------------------------------
/* LOGO显示字符数组,在上电后显示3秒钟 */
INT8U code LOGO[][16] = {"   Welcome to   ",
                         "ChongQingHeCheng"};
/* 当用户执行或取消校准时显示的字符数组 */
INT8U code INFO[][16] = {"Ready to adjust,",
                         "   Waiting...   ",
                         "   Adjust OK!   ",
                         "Press CLEAR key."};

// ------------------------------------------------------------------------------------------------------
/********************************************************************************************************
** 函数名称: Delay1MS
** 功能描述: 延时1ms。
** 输  入: 无
** 输  出: 无
** 全局变量: 无
** 全局常量:无
** 调用模块: _nop_()>>>>>>>>>>>>空指令。
** 其它说明:无
**
** 作  者: 罗建
** 日  期: 2007年09月20日
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日  期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void Delay1MS(void)
{
  INT8U i=11;

  while (--i != 0)
  {
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
  }
}

// ------------------------------------------------------------------------------------------------------																										
/********************************************************************************************************
** 函数名称: DelayXMS
** 功能描述: 由软件实现的延时子程序,参数指定要延时的毫秒数。
** 输  入: nTime>>>>>>>>>>>>>>要延时的毫秒数。
** 输  出: 无
** 全局变量: 无
** 全局常量:无
** 调用模块: Delay1MS()>>>>>>>>>延时1ms子程序。
** 其它说明:无
**
** 作  者: 罗建
** 日  期: 2007年09月20日
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日  期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void DelayXMS(INT16U nTime)
{
  INT16U i;

  for (i=0;i<nTime;i++)
    Delay1MS();
}

// ------------------------------------------------------------------------------------------------------																										
/********************************************************************************************************
** 函数名称: DataToLCDBuf
** 功能描述: 把一个整型数据按个、十、百进行分解,再转换为对应数字的ASCII码存放到LCD显示缓冲区中。
** 输  入: nData>>>>>>>>>>>>>>要转换的16位整型数,这个数应该介于-999~999之间;
**           nBufID>>>>>>>>>>>>>指定转换后的数据存放在哪个显示缓冲区中,nBufID取值0~3。
** 输  出: 无
** 全局变量: gnLcdBuf[]>>>>>>>>>LCD显示缓冲区。
** 全局常量:无
** 调用模块: 无
** 其它说明:无
**
** 作  者: 罗建
** 日  期: 2007年07月03日
**-------------------------------------------------------------------------------------------------------
** 修 改 人: 罗建
** 日  期: 2007年07月29日(增加了千位数字的显示功能,满足了0~5V输入对应0~12.5mm显示的设计要求)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -