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

📄 main.#3

📁 一个采用C8051F020芯片实现的流量计控制系统源代码
💻 #3
📖 第 1 页 / 共 5 页
字号:
            gnTxdBuf1[5] = gnPressGet / 256;// 准备发送测试压力的高8位字节
            gnTxdBuf1[6] = gnLeakGet % 256; // 准备发送气体流量的低8位字节
            gnTxdBuf1[7] = gnLeakGet / 256;	// 准备发送气体流量的高8位字节
            gnTxdID1 = 0;
            gnTxdNums1 = 7;                 // 指示要向触摸屏发送的数据个数为8个(含帧头,因下面将先发送一个字节,故为7)
			SBUF1 = gnTxdBuf1[0];           // 开始发送数据至触摸屏
			break;
		  case 0x02:                        // 接收设定参数及系数命令(0xFF,0xFF,0x00,0x02,Data,共44个字节,数据按先低后高的顺序发送)
            if (gnRxdID1 == 42)             // 检查数据是否接收完毕(包括两个命令字节)
			{
              EA = FALSE;
              gnPressSet = gnRxdBuf1[3]*256 + gnRxdBuf1[2];     // 预设测试压力值(单位:0.1KPa)
			  gnPressMax = gnRxdBuf1[5]*256 + gnRxdBuf1[4];     // 允许的最高压力值(单位:0.1KPa)
			  gnPressMin = gnRxdBuf1[7]*256 + gnRxdBuf1[6];     // 允许的最低压力值(单位:0.1KPa)
			  gnLeakMax  = gnRxdBuf1[9]*256 + gnRxdBuf1[8];     // 允许的最高流量值(单位:0.01L/min)
			  gnLeakMin  = gnRxdBuf1[11]*256 + gnRxdBuf1[10];   // 允许的最低流量值(单位:0.01L/min)
			  gnFillTime = gnRxdBuf1[13]*256 + gnRxdBuf1[12];   // 充气时间(单位:0.1S)
			  gnTestTime = gnRxdBuf1[15]*256 + gnRxdBuf1[14];   // 测试时间(单位:0.1S)
			  // 由于流量测量的最小值为0,因此其下限始终为0,尽管触摸屏传了值(即gnRxdBuf0[17]*256 + gnRxdBuf0[16]),
              // 但该值始终为0,因此这里并不读取它
			  gnLeakAreaMax[0]  = gnRxdBuf1[19]*256 + gnRxdBuf1[18];  // 流量校线阶段1对应的最大流量
              gnLeakAreaCoef[0] = gnRxdBuf1[21]*256 + gnRxdBuf1[20];  // 流量校线阶段1对应的流量修正系数
			  gnLeakAreaMax[1]  = gnRxdBuf1[23]*256 + gnRxdBuf1[22];  // 流量校线阶段2对应的最大流量
              gnLeakAreaCoef[1] = gnRxdBuf1[25]*256 + gnRxdBuf1[24];  // 流量校线阶段2对应的流量修正系数
			  gnLeakAreaMax[2]  = gnRxdBuf1[27]*256 + gnRxdBuf1[26];  // 流量校线阶段3对应的最大流量
              gnLeakAreaCoef[2] = gnRxdBuf1[29]*256 + gnRxdBuf1[28];  // 流量校线阶段3对应的流量修正系数
			  gnLeakAreaMax[3]  = gnRxdBuf1[31]*256 + gnRxdBuf1[30];  // 流量校线阶段4对应的最大流量
              gnLeakAreaCoef[3] = gnRxdBuf1[33]*256 + gnRxdBuf1[32];  // 流量校线阶段4应的流量修正系数
			  gnLeakAreaMax[4]  = gnRxdBuf1[35]*256 + gnRxdBuf1[34];  // 流量校线阶段5对应的最大流量
              gnLeakAreaCoef[4] = gnRxdBuf1[37]*256 + gnRxdBuf1[36];  // 流量校线阶段5对应的流量修正系数
			  gnLeakAreaMax[5]  = gnRxdBuf1[39]*256 + gnRxdBuf1[38];  // 流量校线阶段6对应的最大流量
              gnLeakAreaCoef[5] = gnRxdBuf1[41]*256 + gnRxdBuf1[40];  // 流量校线阶段6对应的流量修正系数
              EA = TRUE;
              SetRxd1OK();                  // 重新初始化同步字节检测标志及串口接收缓冲区索引
			}
		    break;
        }        
	  }
	}
    else                                    // 同步字节还未接收完毕,继续检测
	{
      if (SBUF1 == 0xFF)                    // 如果是同步字节,则设置相应的同步字节接收到标志
      {
	    if (gbSyncOneOK1)
		  gbSyncTwoOK1 = TRUE;
		else
		  gbSyncOneOK1 = TRUE;
	  }
      else                                  // 接收到的字节既非同步字节又非正常的测量数据,舍弃重来。
		SetRxd1OK();                        // 重新初始化同步字节检测标志及串口接收缓冲区索引
	}
  }
  else                                      // 数据发送中断
  {
    SCON1 &= ~0x02;                         // 清除数据发送中断标志
    if (gnTxdID1 < gnTxdNums1)              // 将发送缓冲区中的gnTxdNums0个数据发送至触摸屏
	{
	  gnTxdID1++;
	  SBUF1 = gnTxdBuf1[gnTxdID1];
    }
  }
}

// ------------------------------------------------------------------------------------------------------
/********************************************************************************************************
** 函数名称: DeviceInit
** 功能描述: 片上系统外围设备初始化子程序。
** 输  入: 无
** 输  出: 无
** 全局变量: 略
** 全局常量:略
** 调用模块:略
** 其它说明:外部系统时钟启动过程建议为:
**           1)允许外部振荡器;
**           2)等待至少1ms;
**           3)查询XTLVLD是否由“0”=>“1”;
**           4)将系统时钟切换到外部振荡器。
**
** 设 计 者:罗建                                                                日  期:2007年12月09日
** 版    本:V1.00,原始版本
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void DeviceInit(void)
{
  INT16U i;                                 // 延时计数器

  // 系统时钟初始化
  OSCXCN = 0x67;                            // 启动外部22.1184MHz晶体振荡器
  for (i=0;i<3000;i++);                     // 等待XTLVLD消隐期(>1ms)
  while ((OSCXCN & 0x80) == 0);             // 等待外部晶振稳定
  OSCICN = 0x08;                            // 选择外部振荡器作为系统时钟SYSCLK,同时禁止时钟丢失检测功能

  // 数字量输入输出端口初始化
  P0MDOUT = 0x11;                           // TX0、TX1作为推挽方式
  P1MDOUT = 0x00;                           // (默认为漏极开路方式)
  P2MDOUT = 0x00;                           // (默认为漏极开路方式)
  XBR0 = XBR0_UART0EN + XBR0_SMB0EN;        // 允许UART0、SMBus
  XBR1 = XBR1_NONE;                         // 不允许任何外部设备
  XBR2 = XBR2_XBARE + XBR2_UART1E;          // 允许交叉开关、弱上位(默认)和UART1

  // ADC和DAC(取默认值)转换初始化
  AMX0CF = 0x00;                            // 配置AIN00-AIN07均为单端输入方式(默认)
  AMX0SL = 0x00;                            // 选择AIN00通道进行AD转换(默认)
  ADC0CF = 0x50;                            // ADC0转换时钟为2MHz,PGA增益为1
  ADC0CN = 0x84;                            // 允许ADC0,正常跟踪模式,Timer3溢出启动ADC0转换,ADC0数据右对齐
  DAC0   = 0x0000;                          // 默认DAC0输出为0
  DAC0CN = 0x80;                            // 允许DAC0输出,写DAC0H时DAC0更新输出,DAC0H3-0保存高4位,DAC0L7-0保存低8位(默认)

  // ADC和DAC参考电压初始化
  REF0CN = 0x03;                            // ADC0电压基准取至VREF0,禁止温度传感器,内部偏压发生器和基准电压缓冲器打开

  // 串口UART0和UART1初始化
  SCON0     = 0x50;                         // UART0(接流量计)为8位可变波特率模式,允许接收
  SCON1     = 0x50;                         // UART1(接计算机)为8位可变波特率模式,允许接收

  // SMBus初始化
  SMB0CN    = 0x44;                         // 允许SMBUS, 应答返回AA(低电平)
  SMB0CR    = 0x94;                         // SMBus速率=100kHz,系统时钟为22.1184MHZ

  // 定时器初始化
  CKCON     = 0x30;                         // TIMER1、TIMER2时钟源为SYSCLK,TIMER4、TIMER0时钟源为SYSCLK/12
  TMOD      = 0x21;                         // TIMER1为8位自动重装载模式,TIMER0为16位定时器方式
  TH1       = 0xDC;                         // TIMER1作为UART0和UART1的波特率发生器,波特率均为19200bps
  TCON      = 0x40;                         // 允许TIMER1定时
  RCAP2H    = 0x53;                         // TIMER2自动重装载值(定时2ms,初值=65536-22118400*0.002=21299=0x5333)
  RCAP2L    = 0x33;
  TH2       = 0x53;                         // TIMER2计数寄存器初值(定时2ms)
  TL2       = 0x33;
  T2CON     = 0x04;                         // TIMER2作为2ms定时器,16位自动重装载模式,允许定时
  TMR3RLL   = 0x9A;                         // TIMER3自动重装载值(定时1ms)
  TMR3RLH   = 0xA9;
  TMR3L     = 0x9A;                         // TIMER3计数寄存器初值(定时1ms)
  TMR3H     = 0xA9;
  TMR3CN    = 0x06;                         // TIMER3作为1ms定时器,控制ADC,使用SYSCLK,允许定时

  // 中断初始化
  EIE1      = 0x02;                         // 允许SMBus中断
  EIE2      = 0x42;                         // 允许UART1和ADC0中断
  IE        = 0xB0;                         // 允许TIMER2、UART0中断,开总中断
  EA = 0;
}

// ------------------------------------------------------------------------------------------------------
/********************************************************************************************************
** 函数名称: SysInit
** 功能描述: ADC0转换结束中断服务程序。
** 输  入: 无
** 输  出: 无
** 全局变量: 略
** 全局常量:略
** 调用模块:略
** 设 计 者:罗建                                                                日  期:2007年12月09日
** 版    本:V1.00,原始版本
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void SysInit(void)
{
  gbCanGetKey  = TRUE;
  gnTxdBuf0[0] = 0xFF;
  gnTxdBuf0[1] = 0xFF;
  gnCntAdjust  = ADJUST_WAIT;
  // 从EEPROM中读取全部参数并存于单片机内存中

}

// ------------------------------------------------------------------------------------------------------
/********************************************************************************************************
** 函数名称: SetRxd0OK和SetRxd1OK
** 功能描述: UART0或UART1数据接收完毕,重新初始化同步字节检测标志及接收缓冲区索引。
** 输  入: 无
** 输  出: 无
** 全局变量: 略
** 全局常量:无
** 调用模块: 无
** 设 计 者:罗建                                                                日  期:2007年12月09日
** 版    本:V1.00,原始版本
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void SetRxd0OK(void)
{
  gbSyncOneOK0 = FALSE;
  gbSyncTwoOK0 = FALSE;
  gnRxdID0 = 0;
}

void SetRxd1OK(void)
{
  gbSyncOneOK1 = FALSE;
  gbSyncTwoOK1 = FALSE;
  gnRxdID1 = 0;
}

// ------------------------------------------------------------------------------------------------------
/********************************************************************************************************
** 函数名称: AdjustPress
** 功能描述: 判断当前测试压力值是否超过设定范围,是则调节。
** 输  入: 无
** 输  出: 无
** 全局变量: 略
** 全局常量:无
** 调用模块: 无
** 设 计 者:罗建                                                                日  期:2007年12月09日
** 版    本:V1.00,原始版本
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void AdjustPress(void)
{
  INT16 nErr;

  // 仅当进入测试画面后才进行压力调节
  if (gnCntAdjust-- != 0)
    return;
  gnCntAdjust = ADJUST_WAIT;

  // 调节比例阀的输出,使其等于用户设定值
  nErr = gnPressSet - gnPressGet;           // 计算设定值与实测值之间的差值
  if ((nErr > -20) && (nErr < 20))          // 误差在+2.0/-2.0KPa之间时不再调节
    return;
  gnPressOut = gnPressOut + nErr;
  DAC0L = gnPressOut % 256;                 // 最后将输出值通过DAC0输出给压力调节阀
  DAC0H = gnPressOut / 256;
}

// ------------------------------------------------------------------------------------------------------
/********************************************************************************************************
** 函数名称: DoneTest
** 功能描述: 执行充气和测试操作。
** 输  入: 无
** 输  出: 无
** 全局变量: 略
** 全局常量:无
** 调用模块: 无
** 设 计 者:罗建                                                                日  期:2007年12月09日
** 版    本:V1.00,原始版本
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void DoneTest(void)
{

⌨️ 快捷键说明

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