参考程序
} /**************************************** 函数功能:测量、状态显示 入口参数:无 *****************************************/ void ShowLcd1602() { LcdShowStr(0,0,"PV:"); ShowNum(0,3,TestVal);//显示实测值 LcdShowStr(0,6,"%RH"); LcdShowStr(0,10,"State:");
LcdShowStr(1,0,"SV:"); ShowNum(1,3,SetVal);//显示设定值 LcdShowStr(1,6,"%RH"); if(staSystem==E_AUTO)LcdShowStr(1,10," Auto "); elseif(staSystem==E_MANUAL) LcdShowStr(1,10,"Manual"); } /********************************************** 函数功能:读取当前的ADC 转换值 入口参数:chn,AD通道号0-3 **********************************************/ unsigned char GetADCValue(unsigned charchn) { ucharval; I2CStart(); if(!I2CWrite(0x48<<1)) // 寻址PCF8591 PCF8591,如未应答,则停止操作并返回,00 { I2CStop(); return0; } I2CWrite(0x40|chn);// 写入控制字节,选择转换通道 I2CStart(); I2CWrite((0x48<<1)|0x01);// 寻址PCF8591 PCF8591,指定后续为读操作 I2CReadACK();// 先空读一个字节,提供采样转换时间 val= I2CReadNAK(); // 读取刚刚转换完的值 I2CStop(); returnval; } /**************************************** 函数功能:按升序排列数组元素 入口参数:数组及数组长度 *****************************************/ void SortArray(unsigned char a[],unsignedchar a_len) { unsignedchar i,temp; for(i=1;i<a_len;i++) { if(a[i-1]>a[i]) { temp=a[i-1]; a[i-1]=a[i]; a[i]=temp; i=0; } } } /**************************************** 函数功能:中值滤波,线性转换后,获得土 壤湿度0-100% 入口参数:无 *****************************************/ void Humidity() { unsigned char i, tmp; unsigned char adBuf[N]; for(i=0;i<N;i++)adBuf[i]=GetADCValue(1);//读取湿度 SortArray(adBuf,sizeof(adBuf)); tmp=adBuf[N/2]; tmp=GetADCValue(3); TestVal=100-100.*tmp/255; } /**************************************** 函数功能:配置定时器0,定时时间 壤湿度0-100 入口参数:ms,定时时间(毫秒) ****************************************/ void ConfigTimer0(unsigned int ms) { unsigned long tmp; tmp = 11059200 /12; // 定时器计数频率 tmp = (tmp * ms) /1000; // 计算所需的计数值 tmp = 65536 - tmp; // 计算定时器重载值 tmp = tmp + 12; // 修正中断响应延时造成的误差 T0RH = (unsigned char)(tmp >> 8); // 定时器重载值拆分为高低字节 T0RL = (unsigned char)tmp; TMOD &= 0xF0; // 清零T0 的控制位 TMOD |= 0x01; // 配置T0 为模式11 TH0 = T0RH; // 加载T0 重载值 TL0 = T0RL; ET0 = 1; // 使能T0 中断 TR0 = 1; // 启动T0 } /**************************************** 函数功能:延时函数 入口参数:t,延时约t毫秒 ****************************************/ //---------延时---------------- void delayms(uint t) { uchari; while(t--) for(i=0;i<123;i++); } /**************************************** 函数功能:T0 中断服务函数 入口参数:无 ****************************************/ void InterruptTimer0() interrupt 1 { static unsigned char tmrms=0; static unsigned char tmr=0;
TH0 = T0RH; // 定时器重新加载重载值 TL0 = T0RL;
tmrms++; tmr=(tmr+1)%100; if(staSystem==E_ALARM) //故障液晶报警显示 { if(tmr<50)LcdShowStr(1,11, "ALARM "); elseLcdShowStr(1,11, " ");
if(tmrms>=50) // 定时0.5s { tmrms=0; ALARM_LED=!ALARM_LED; if(cnt>0){cnt--;BUZZER=!BUZZER;} else{BUZZER=OFF;} } } else { ALARM_LED=OFF; BUZZER=OFF; } } /*************************************** Lcd1602.h ***************************************/ #ifndef _LCD1602_H #define _LCD1602_H
#ifndef _LCD1602_C
|
Powered by Discuz! X3.4
© 2001-2023 Discuz! Team.