?? mcuunit.c
字號:
/********************************************************************************************************
** 平面度測試儀
**
** 版權所有 (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 + -