📄 znjh.c~
字号:
//FloatToStr(outHumiValue[SamplePos],tmpstr);
strcat(str,tmpstr);
strcatf(str,"\r");
put_buf(str);
//proc_send();
}
}
#asm("wdr") //复位看门狗
if ( recvtime == 0 ) {
if ( nSecondCount>recvtime_timer+30 ) {
recvtime_timer = nSecondCount;
sprintf(str,"%d\r",COM_AdjustClock);
put_buf(str);
//proc_send();
}
} else {
if ( nSecondCount>recvtime_timer+24*3600 ) {
recvtime_timer = nSecondCount;
sprintf(str,"%d\r",COM_AdjustClock);
put_buf(str);
//proc_send();
}
}
#asm("wdr") //复位看门狗
if ( nSeFlag == 1 ) {
nSeFlag = 0;
runled_opr(runstatus);
runstatus=~runstatus;
}
#asm("wdr") //复位看门狗
QueryEtr186(); //2005.5.8
#asm("wdr") //复位看门狗
ProcessComLed(); //串口信息点灯
#asm("wdr") //复位看门狗
}
}
////////////////////////////////////////////////////////////////////////////////////
unsigned char p1[6];
//unsigned char p2[6];
//unsigned int p1[6];
//unsigned int p2[6];
#define __inter_sensor_port PORTA.7 //室内,SENSOR B
#define __inter_sensor_ddr DDRA.7
#define __inter_sensor_pin PINA.7
#define __outer_sensor_port PORTA.6 //室外,SENSOR A
#define __outer_sensor_ddr DDRA.6
#define __outer_sensor_pin PINA.6
unsigned char reset(unsigned char flag);
/*
void CalcTemp(float *s_wd,float *s_sd,float *s_mt,float *s_ms)
{
float wd,sd,mt,ms;
if (p1[0]==0xff) { //ERROR," 2438 Sensor !"
wd=0; sd=0; mt=0;ms=0;
} else {
if (p1[1]>=0x80) wd=-((~p1[1])+((~p1[0])+1)*0.00390625); //算温度
else wd=p1[1]+p1[0]*0.00390625;
//mt=p1[3]*256+p1[2];
mt=p1[3];
mt*=256;
mt+=p1[2];//
//ms=p1[5]*256+p1[4];
ms=p1[5];
ms*=256;
ms+=p1[4];
//if ( mt != 0 )
// sd=(ms-0.157*mt)/(0.00616*mt); //湿度
if ( mt != 0 )
//sd=(ms/mt-0.157)/0.00616;
sd = (ms/mt-0.16)/0.0062;
else sd = 0;
if (sd>=100) {sd=99.9;}
if (sd<0) {sd=0;}
if (wd>100) {wd=99;}
if (wd<-99) {wd=-9;}
}
*s_wd=wd;*s_sd=sd;*s_mt=mt;*s_ms=ms;
}
*/
unsigned char logocount=0;
float T_inValue[5];
float T_outValue[5];
float H_inValue[5];
float H_outValue[5];
float T_inAvr[6];
float T_outAvr[6];
float H_inAvr[6];
float H_outAvr[6];
unsigned short nNum=0;
unsigned char errnum = 0;
unsigned long nAlarmCount=0;
unsigned char testnum=0;
void ReadSensor(void)
{
float wd,sd,mt,ms,sd_1;
float out_wd,out_sd,out_mt,out_ms,out_sd_1;
//unsigned char pos1,pos2,pos3;
//int a,b,c,d;
unsigned char p0[6];
unsigned short h0,h1;
float fmin,fmax,fsum;
int i,j,imax,imin;
h0 = nNum/5;
h1 = nNum%5;
//SamplePos = ( SamplePos+1)%3;
/*
if ( get2438(INTER) != 1 ) {
if ( !(errflag==1 && errno==ERROR_SENSOR) || (nSecondCount>nAlarmCount+240) ) {
nAlarmCount = nSecondCount;
sprintf(tmpstr,"indoor's sensor error");
SendAlarm(ERROR_SENSOR,SERIOUS_ALARM,tmpstr);
}
errflag = 1;
errno = ERROR_SENSOR;
//inTempValue[SamplePos] = 255;
//inHumiValue[SamplePos] = 255;
T_inValue[h1] = 255;
H_inValue[h1] = 255;
} else {
CalcTemp(&wd,&sd,&mt,&ms);
//温度补偿
sd_1=sd/1.0546-0.0216*wd;
//inTempValue[SamplePos] = wd;
//inHumiValue[SamplePos] = sd_1;//sd;
T_inValue[h1] = wd;
H_inValue[h1] = sd_1;
for (i=0;i<6;i++) p0[i]=p1[i];
if ( errno == ERROR_SENSOR ) errflag = 0;
}
*/
if ( ReadADCTempHumi(&wd,&sd_1) != 0 ) {
if ( !(errflag==1 && errno==ERROR_SENSOR) || (nSecondCount>nAlarmCount+240) ) {
nAlarmCount = nSecondCount;
sprintf(tmpstr,"indoor's sensor error");
SendAlarm(ERROR_SENSOR,SERIOUS_ALARM,tmpstr);
}
errflag = 1;
errno = ERROR_SENSOR;
//inTempValue[SamplePos] = 255;
//inHumiValue[SamplePos] = 255;
T_inValue[h1] = 255;
H_inValue[h1] = 255;
} else {
//inTempValue[SamplePos] = wd;
//inHumiValue[SamplePos] = sd_1;
T_inValue[h1] = wd;
H_inValue[h1] = sd_1;
for (i=0;i<6;i++) p0[i]=p1[i];
if ( errno == ERROR_SENSOR ) errflag = 0;
}
#asm("wdr") //复位看门狗
DisplayTemp(wd,sd_1,INTER);
//DisplayTemp(out_wd,out_sd_1,OUTER);
//GetTempState(str);
//lcd_str(2,str);
//GetHumiState(str);
#asm("wdr") //复位看门狗
sprintf(str,"%02d ",nNum);
FloatToStr(T_in,tmpstr);
strcat(str,tmpstr);
//strcatf(str," ");
//FloatToStr(T_out,tmpstr);
//strcat(str,tmpstr);
lcd_str(3,str);
#asm("wdr") //复位看门狗
if ( T_inValue[h1]>=254 ) {
nNum = h0*5;
errnum++;
if ( errnum>=2 ) {
errnum = 0;
nNum = 0;
}
return;
}
if ( h1 > 0 ) {
if ( T_inValue[h1]<T_inValue[h1-1]-5 || T_inValue[h1]>T_inValue[h1-1]+5) {
nNum = h0*5;
errnum++;
if ( errnum>=2 ) {
errnum = 0;
nNum = 0;
}
return;
}
/*
if ( H_inValue[h1]<H_inValue[h1-1]-5 || H_inValue[h1]>H_inValue[h1-1]+5) {
nNum = h0*5;
errnum++;
if ( errnum>=2 ) {
errnum = 0;
nNum = 0;
}
return;
}*/
}
///////////////////////////
/*
//发到串口
sprintf(str,"*###1234567890abcdefghhijkllmonopererewrwe"); //####
FloatToStr(T_in,tmpstr);
strcat(str,tmpstr);
strcatf(str,"+");
FloatToStr(H_in,tmpstr);
strcat(str,tmpstr);
put_buf(str);
//发到串口
*/
////////////////////////////
errnum = 0;
nNum++;
if ( nNum%5 == 0 ) {
T_inAvr[h0] = 0;
T_outAvr[h0] = 0;
H_inAvr[h0] = 0;
H_outAvr[h0] = 0;
for(j=0;j<5;j++) {
T_inAvr[h0] += T_inValue[j];
T_outAvr[h0] += T_outValue[j];
H_inAvr[h0] += H_inValue[j];
H_outAvr[h0] += H_outValue[j];
}
T_inAvr[h0] /= 5;
T_outAvr[h0] /= 5;
H_inAvr[h0] /= 5;
H_outAvr[h0] /= 5;
}
if ( nNum < 30 ) return;
nNum = 0;
#asm("wdr") //复位看门狗
//找最小,找最大
fmin = T_inAvr[0];
fmax = T_inAvr[0];
imin = 0;
imax = 0;
for (i=1;i<6;i++) {
if ( fmin > T_inAvr[i] ) {
fmin = T_inAvr[i];
imin = i;
}
else if ( fmax < T_inAvr[i] ) {
fmax = T_inAvr[i];
imax = i;
}
}
fsum = 0;
if ( imin==imax ) {
if ( imin == 0 ) imax = 1;
else imax = 0;
}
for (i=0;i<6;i++) {
if ( i != imin && i != imax ) fsum += T_inAvr[i];
}
fsum /= 4;
T_in = fsum;
fmin = H_inAvr[0];
fmax = H_inAvr[0];
imin = 0;
imax = 0;
for (i=1;i<6;i++) {
if ( fmin > H_inAvr[i] ) {
fmin = H_inAvr[i];
imin = i;
}
else if ( fmax < H_inAvr[i] ) {
fmax = H_inAvr[i];
imax = i;
}
}
fsum = 0;
if ( imin==imax ) {
if ( imin == 0 ) imax = 1;
else imax = 0;
}
for (i=0;i<6;i++) {
if ( i != imin && i != imax ) fsum += H_inAvr[i];
}
fsum /= 4;
H_in = fsum;
#asm("wdr") //复位看门狗
//发到串口
sprintf(str,"####"); //####
FloatToStr(T_in,tmpstr);
strcat(str,tmpstr);
strcatf(str,"+");
FloatToStr(H_in,tmpstr);
strcat(str,tmpstr);
put_buf(str);
//发到串口
testnum++;
if ( testnum >= 10 ) testnum = 0;
//超过告警值告警
if ( T_in > sysprm.nTemp ) {
if ( !(errflag==1 && errno==ERROR_LETDOWN_BAD) || (nSecondCount>nAlarmCount+500) ) {
nAlarmCount = nSecondCount;
sprintf(tmpstr,"temperature is too high");
SendAlarm(ERROR_LETDOWN_BAD,SERIOUS_ALARM,tmpstr);
}
errflag = 1;
errno = ERROR_LETDOWN_BAD;
}
#asm("wdr") //复位看门狗
}
/*
void reset2(unsigned char flag) //复位传感器,形成复位脉冲,拉低至少480us,放高,延时15-60us后,从设备拉低60~240us应答
{
if ( flag == INTER ) {
__inter_sensor_ddr = OUT;
__inter_sensor_port = 0; //低电平
delay_us(550);
__inter_sensor_port = 1; //上拉电阻
__inter_sensor_ddr = IN;
} else {
__outer_sensor_ddr = OUT;
__outer_sensor_port = 0; //低电平
delay_us(550);
__outer_sensor_port = 1; //上拉电阻
__outer_sensor_ddr = IN;
}
delay_us(15);
}
unsigned char reset(unsigned char flag)
{
unsigned long count;
reset2(flag);
count = 0;
if ( flag == INTER ) {
while ( __inter_sensor_pin ) {
delay_us(2);
count++;
if ( count >= 160 ) break;
}
} else {
while ( __outer_sensor_pin ) {
delay_us(2);
count++;
if ( count >= 160 ) break;
}
}
if ( count >= 160 ) {
return 0;
} else {
return 1;
}
}
bit b1,b2,b3;
unsigned char tmrbit(unsigned char flag) //读取传感器一位, 拉低,发送方将在1~15us内返回数据,数据最多保持45us.
{
int i;
if ( flag == INTER ) {
__inter_sensor_ddr = OUT;
__inter_sensor_port = 0; //低电平
delay_us(3);
__inter_sensor_ddr = IN;
__inter_sensor_port = 1;
delay_us(2);
b1 = __inter_sensor_pin; //读数据
delay_us(2);
b2 = __inter_sensor_pin; //读数据
for(i=0;i<10;i++) {
delay_us(2);
b3 = __inter_sensor_pin; //读数据
if ( b1==b2 && b2==b3 ) {
delay_us(120);
return b1;
}
b1=b2;
b2=b3;
}
delay_us(120);
return b2;
} else {
__outer_sensor_ddr = OUT;
__outer_sensor_port = 0; //低电平
delay_us(3);
__outer_sensor_ddr = IN;
__outer_sensor_port = 1;
delay_us(2);
b1 = __outer_sensor_pin; //读数据
delay_us(2);
b2 = __outer_sensor_pin; //读数据
for(i=0;i<10;i++) {
delay_us(2);
b3 = __outer_sensor_pin; //读数据
if ( b1==b2 && b2==b3 ) {
delay_us(120);
return b1;
}
b1=b2;
b2=b3;
}
delay_us(120);
return b2;
}
//delay_us(100);
//if ( bitdat == 0 ) return 0;
//else return 1;
}
unsigned char tmrbyte(unsigned char flag) //读取传感器一个字节
{
unsigned char i,j,dat;
dat=0;
SREG &= 0x7f; //关中断
for(i=1;i<=8;i++) {
j=tmrbit(flag);dat=(j<<7)|(dat>>1);
}
SREG |= 0x80; //开中断
return(dat);
}
bit wrbit;
void tmwbyte(unsigned char dat,unsigned char flag) //发送一个字节到传感器
{
unsigned char j;
SREG &= 0x7f; //关中断
for(j=1;j<=8;j++)
{
wrbit=dat&0x01;
dat=dat>>1;
if ( flag == INTER ) {
if(wrbit==1){ //发送 '1'
__inter_sensor_ddr = OUT;
__inter_sensor_port = 0;
delay_us(6);
__inter_sensor_ddr = IN;
__inter_sensor_port = 1;
delay_us(120);
}
else{ //发送'0'
__inter_sensor_ddr = OUT;
__inter_sensor_port = 0;
delay_us(90);
__inter_sensor_port = 1;
delay_us(5);
}
} else {
if(wrbit==1){ //发送 '1'
__outer_sensor_ddr = OUT;
__outer_sensor_port = 0;
delay_us(6);
__outer_sensor_ddr = IN;
__outer_sensor_port = 1;
delay_us(120);
}
else{ //发送'0'
__outer_sensor_ddr = OUT;
__outer_sensor_port = 0;
delay_us(90);
__outer_sensor_ddr = IN;
__outer_sensor_port = 1;
delay_us(5);
}
}
}
SREG |= 0x80; //开中断
}
unsigned char get2438(unsigned char flag) //取内部温湿度传感器值函数
{
unsigned char i;
unsigned char ret,jj;
//EA=0;
i = 0;
for(ret=0,jj=0;ret==0&&jj<10;jj++) ret=reset(flag); //复位
if ( ret == 0 ) return -1;
//watchdog();
//dlmsed(1); //延时1ms
delay_ms(1);
tmwbyte(0xcc,flag); //发送0xcc ,跳跃ROM,使用该命令可直接访问总线上的从机设备
tmwbyte(0x4e,flag); //写高速暂存存储器,第0页
tmwbyte(0x00,flag); //第0页
tmwbyte(0x08,flag); // 第一个字节,指示转换VDD电压
for(ret=0,jj=0;ret==0&&jj<10;jj++) ret=reset(flag); //复位
if ( ret == 0 ) return -1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -