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

📄 mcuunit.c

📁 一个完整的个人产品开发源代码,包括对单片机STC12C5410的编程(含内部AD采样、自创的内部Flash编程源码等)、LCD1602的驱动编程等。
💻 C
📖 第 1 页 / 共 4 页
字号:
** 其它说明:要显示的数据及其符号(正或负)存放在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 + -