📄 main.#3
字号:
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 + -