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

📄 znjh.c~

📁 1.atmegal 16单片机程序。编译环境为codevisionAVR C, 1)单总线方式采集温湿度。 2)A/D转换 3)屏幕显示和LED灯闪烁。 4)按键控制
💻 C~
📖 第 1 页 / 共 4 页
字号:
				//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 + -