📄 mcuunit.c
字号:
** 其它说明:要显示的数据及其符号(正或负)存放在gnDisData结构的数组中。
**
** 作 者: 罗建
** 日 期: 2007年09月20日
**-------------------------------------------------------------------------------------------------------
** 修 改 人: 罗建
** 日 期: 2007年10月29日
** 变 化:将原第四个显示值由通道平均值改为了通道最大值。
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void DisLCD(void)
{
INT8U i;
// 转换测试数据及其平均值到LCD显示缓冲区中
for (i=0;i<3;i++)
{
gnDisData[i] = gnADData[i].Word - gnBaseVal[i].Word;
DataToLCDBuf(gnDisData[i], i);
}
// 2007.10.29,将原通道平均值改为了通道最大值
gnDisData[3] = gnDisData[0];
if (gnDisData[3] < gnDisData[1])
gnDisData[3] = gnDisData[1];
if (gnDisData[3] < gnDisData[2])
gnDisData[3] = gnDisData[2];
// gnDisData[3] = (gnDisData[0] + gnDisData[1] + gnDisData[2]) / 3;
/////////////
DataToLCDBuf(gnDisData[3], 3);
DisplayListChar(0x00, 0, 8, gnLcdBuf[0]);// 显示通道1的测试数据
DisplayListChar(0x08, 0, 8, gnLcdBuf[1]);// 显示通道2的测试数据
DisplayListChar(0x00, 1, 8, gnLcdBuf[2]);// 显示通道3的测试数据
DisplayListChar(0x08, 1, 8, gnLcdBuf[3]);// 显示通道平均值
gbClring = FALSE;
gbDisInfo = FALSE;
}
// ------------------------------------------------------------------------------------------------------
/********************************************************************************************************
** 函数名称: ClrLCD
** 功能描述: 清除LCD显示内容(显示0.00mm)。
** 输 入: 无
** 输 出: 无
** 全局变量: gbClring>>>>>>>>>>>指示当前是否正处于清除LCD显示状态,0~否,1~是;
** gbDisInfo>>>>>>>>>>指示当前是否正在显示INFO字符信息,0~否,1~是;
** gnDisData[]>>>>>>>>存放要在LCD上显示及要发送给PC的前三个测量通道及其平均值的测量数据;
** gnLcdBuf[]>>>>>>>>>代表四组LCD显示缓冲区内容(如:2.35mm)。
** 全局常量:无
** 调用模块: DataToLCDBuf()>>>>>把一个整型数据按个、十、百进行分解,再转换为对应数字的ASCII码存放到LCD显
** 示缓冲区中;
** DisplayListChar()>>在LCD显示屏的指定位置处显示一串字符。
** 其它说明:无
**
** 作 者: 罗建
** 日 期: 2007年09月20日
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void ClrLCD(void)
{
INT8U i;
for (i=0;i<4;i++)
{
gnDisData[i] = 0;
DataToLCDBuf(gnDisData[i], i);
}
DisplayListChar(0x00, 0, 8, gnLcdBuf[0]);// 显示通道1的测试数据
DisplayListChar(0x08, 0, 8, gnLcdBuf[1]);// 显示通道2的测试数据
DisplayListChar(0x00, 1, 8, gnLcdBuf[2]);// 显示通道3的测试数据
DisplayListChar(0x08, 1, 8, gnLcdBuf[3]);// 显示通道平均值
gbClring = TRUE;
gbDisInfo = FALSE;
}
// ------------------------------------------------------------------------------------------------------
/********************************************************************************************************
** 函数名称: DoneKey
** 功能描述: 检查是否有按键,如有则进行处理。
** 输 入: 无
** 输 出: 无
** 全局变量: gbTimeOver>>>>>>>>>指示规定的定时间隔时间时否到,0~未到,1~已到;
** gbDoKeep>>>>>>>>>>>指示是否保持当前显示值不变,0~否,1~是;
** gbDoTest>>>>>>>>>>>指示是否开始测试,0~否,1~是;
** gnKeyCnt>>>>>>>>>>>按键检测间隔计数器。
** 全局常量:无
** 调用模块: 无
** 其它说明:按键检测间隔为250ms,有抖动消除功能。
**
** 作 者: 罗建
** 日 期: 2007年07月29日
**-------------------------------------------------------------------------------------------------------
** 修 改 人: 罗建
** 日 期: 2007年09月20日(增加对功能键的处理代码,包括测量、清零和校准)
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void DoneKey(void)
{
INT8U i;
gnKeyCnt--;
if (gnKeyCnt == 2) // 消除抖动(20ms延时)
P1 |= 0xC0;
else if (gnKeyCnt == 0) // 开始检测按键
{
gnKeyCnt = KEY_WAIT; // 准备下一次键检测延时
if ((SW_CLR == 0) && (SW_TEST == 0)) // 检查用户是否需要进行校准
{
if (gbDisInfo)
return;
if (!gbBaseWait) // 如果同时按下清零键和测试键,则准备采集数据
{
gbBaseWait = TRUE; // 开始计时
gnBaseCnt = BASE_WAIT; // 计时2秒钟
DisplayListChar(0x00, 0, 16, INFO[0]); // 显示"Ready to adjust,"
DisplayListChar(0x00, 1, 16, INFO[1]); // 显示" Waiting... "
}
else // 如果同时按下清零键和测试键并保持2秒,则采集一次数据,
{ // 并作为基准数据存储在EEPROM中。
gnBaseCnt--; // 计数
if (gnBaseCnt == 0) // 2秒计时到则保存数据
{
gbBaseWait = FALSE;
DoneADC(); // 采集一次数据
for (i=0;i<3;i++) // 保存基准数据至内存和EEPROM中
gnBaseVal[i].Word = gnADData[i].Word;
SaveBase();
DisplayListChar(0x00, 0, 16, INFO[2]); // 显示" Adjust OK! "
DisplayListChar(0x00, 1, 16, INFO[3]); // 显示"Press CLEAR key."
gbDisInfo = TRUE;
gbClring = FALSE;
DelayXMS(1000);
}
}
}
else // 只有一个键按下
{
if (gbBaseWait || (SW_CLR == 0)) // 清零键按下或取消了校准
{
gbBaseWait = FALSE; // 取消校准
ClrLCD(); // LCD显示为零
}
else if (SW_TEST == 0)
{
if (gbClring) // 检查数据是否已清除,是则采集一次数据并显示
{
DoneADC();
DisLCD();
}
}
}
}
}
// ------------------------------------------------------------------------------------------------------
/********************************************************************************************************
** 函数名称: T0_ISR
** 功能描述: T0定时器中断服务程序(默认为10ms)。
** 输 入: 无
** 输 出: 无
** 全局变量: gbTimeOver>>指示规定的定时间隔时间时否到,0~未到,1~已到。
** 全局常量:无
** 调用模块: 无
** 其它说明:本模块实现了T0定时精度的两重补偿。
** 1)第一重补偿是将上一次因中断响应延时造成多计的一部分脉冲数(存于T0中)加在下一次T0定时初值中
** ,使定时器少计数T0个脉冲。
** 2)第二重补偿是考虑到晶振的振荡精度不足,于是加了一个补偿值T0_COMP(可正可负),具体值需实验
** 确定,且不同的晶振和单片机都有可能不同。如果对精度要求不高,可以将T0_COMP设置为0,即不补偿。
** 如果单片机计时变慢,则T0_COMP取值为正,否则为负。T0_COMP的简单确定方法如下:
** 每T0_TIMER定时间隔内补偿(T0_COMP*12*TSYS)秒,假设单片机设置的充气时间为t1,用计数器计下实际的
** 充气时间t2,为了对Δt=t2-t1进行补偿,有Δt=t1*1000/T0_TIMER * (T0_COMP*12*TSYS),则补偿量为
** T0_COMP = Δt * T0_TIMER / t1 / 12000 / TSYS
** = Δt * T0_TIMER * FSYS / t1 / 12000
** = (t2 - t1) * T0_TIMER * FSYS / t1 / 12000
** 比如:设t1=10s, 测得t2=11.321s, 则
** T0_COMP = (11.321 - 10) * 10 * 22118400 / 10 / 12000
** = 2435
** 又比如:设t1=20s,测得t2=19.992s,则
** T0_COMP = (19.992 - 20) * 10 * 22118400 / 20 / 12000
** = -7
**
** 作 者: 罗建
** 日 期: 2006年09月22日
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void T0_ISR(void) interrupt 1
{
TWordType T0Word;
TR0 = EA = FALSE;
T0Word.Word = T0_CONST + T0_COMP + TL0;
T0Word.Byte[0] = T0Word.Byte[0] + TH0;
TH0 = T0Word.Byte[0];
TL0 = T0Word.Byte[1];
EA = TR0 = TRUE;
gbTimeOver = TRUE;
}
// ------------------------------------------------------------------------------------------------------
/********************************************************************************************************
** 函数名称: SER_ISR
** 功能描述: 串行接口中断服务程序(主要针对数据发送)。
** 输 入: 无
** 输 出: 无
** 全局变量: gbIsTxHeadOK>>>>>>>指示是否已将帧头全部发送至上位机,0~否,1~是;
** gbIsTxDataOK>>>>>>>指示是否已将帧数据全部发送至上位机,0~否,1~是;
** gnTxBuf>>>>>>>>>>>>串行接口发送缓冲区(不含帧头及校验和)。
** 全局常量:无
** 调用模块: 无
** 其它说明:
**
** 作 者: 罗建
** 日 期: 2007年07月29日
**-------------------------------------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -