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

📄 jf_p1._c

📁 一款完整的家用电器程序,具有控制商用机的功能,应用广泛,有一定的参考价值
💻 _C
📖 第 1 页 / 共 2 页
字号:
		NOP();	    
	  }
  	else fun_read_temp(); //等待测试完成,读取数据
}
  

void fun_read_temp(void) //等待测试完成,读取SHT1的温度数据
{
  	unsigned int i;
  	unsigned char temp_h; //读SHT的数值高8位
  	unsigned char temp_l; //读SHT的数值低8位
  	unsigned char temp_crc; //读SHT的CRC
  	unsigned char crc8_cal; //计算的SHT的CRC
    	PORTD &=~b_rt1_sck; //sck=0
  //20070706  	DDRA &=~b_rt1_data; //DATA置1为输入口
	delay_tt(5000);  //延时100ms,如SHT未测试完成一直为高,则等待,实际85ms
	fun_1232_wdt();  //1232的看门狗翻转时钟脉冲
	WDR();
	delay_tt(5000);  //延时100ms,如SHT未测试完成一直为高,则等待
	fun_1232_wdt();  //1232的看门狗翻转时钟脉冲
	WDR(); 
	for (i=0; i<5000; i++)	//20071010
	  {
		if ((PINC &b_rt1_data)==0)  //SHT有应答时读数据,否则一直等待
		  {
			NOP();
			temp_h =s_read_byte(ACK);	//读MSB数据,应答为0
		 //20070706   temp_l =s_read_byte(noACK); //读LSB数据,应答为1中止通讯,不读校验码
			temp_l =s_read_byte(ACK); //读LSB数据,应答为0读校验码
			temp_crc =read_crc_byte(); //从SHT读1个字节的CRC校验码,无应答
		  	crc8_cal =CRC8_shf15_TAB[MEASURE_TEMP];	//sht_command
		  	crc8_cal ^=temp_h;
		  	crc8_cal =CRC8_shf15_TAB[crc8_cal];//temp_h
		  	crc8_cal ^=temp_l;
		  	crc8_cal =CRC8_shf15_TAB[crc8_cal];//temp_l
		    if (temp_crc ==crc8_cal)	//校验码相等时则计算,否则错误
		      {
			    t_value =calc_sth15_t(temp_h,temp_l);  //计算t1温度值
			//20080226	t_value10=t_value*10+th_value_modify;	//补偿后的的温度值*10=t_value*10+th_value_modify
				NOP();
				fun_measure_humid(); //测量湿度程序
			  }
			else
			  {//校验码不等时则错误
	  			NOP();
			  }
				break;
		  }	//if ((PINA &b_rt1_data)==0) 
		else  //if ((PINA &b_rt1_data)==1) 
		  {
			NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();
		  	NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();
		  	NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();
		  	NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();
		  	NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();
		  	NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();
		  	fun_1232_wdt(); WDR();	//1232的看门狗翻转时钟脉冲20071010增加
			}
	  }	//for (i=0; i<11000; i++) 
	
  }

void fun_measure_humid(void) //测量湿度程序
{
	unsigned char error=0;
	unsigned int i;
	s_transstart();	//起始步
	s_write_byte(MEASURE_HUMID);//写入SHT湿度测量命令
	if (PINC &b_rt1_data)	//无应答error=1;
	  {
		PORTD &=~b_rt1_sck; //sck=0
		DDRC |=b_rt1_data; //DATA置1为输出口
		delay_tt(20);	//延时0.4ms
		s_connectionreset();  //连续发9个脉冲让SHT复位
		s_write_byte(RESET);  //向SHT发复位命令
		NOP();
	  }
  	else fun_read_humid(); //等待测试完成,读取数据
}  

void fun_read_humid(void) //等待测试完成,读取SHT1湿度数据
{
    	unsigned int i;
    	unsigned char rh_h; //读SHT1的湿度数值高8位
  		unsigned char rh_l; //读SHT1的湿度数值低8位
  		unsigned char temp_crc; //读SHT的CRC
    	unsigned char crc8_cal; //计算的SHT的CRC
    	PORTD &=~b_rt1_sck; //sck=0
  //20070706  	DDRA &=~b_rt1_data; //DATA置1为输入口
	delay_tt(3000);  //延时60ms,如SHT未测试完成一直为高,则等待
	fun_1232_wdt();  //1232的看门狗翻转时钟脉冲
	WDR();
//20070706 	for (i=0; i<5000; i++) //360ms内等待SHT的应答
	for (i=0; i<2000; i++) //20071010
	{
	//20070706	WDR();
	  if ((PINC &b_rt1_data)==0) 
		{//PINA &b_rt1_data)==0
		NOP();
		rh_h =s_read_byte(ACK); //读MSB数据,应答为0
		//20070706	  rh_l =s_read_byte(noACK); //读LSB数据,应答为1中止通讯,不读校验码
		rh_l =s_read_byte(ACK); //读LSB数据,应答为1中止通讯,不读校验码
		temp_crc =read_crc_byte(); //从SHT读1个字节的CRC校验码,无应答
	  	crc8_cal =CRC8_shf15_TAB[MEASURE_HUMID];	//sht_command
	  	crc8_cal ^=rh_h;
	  	crc8_cal =CRC8_shf15_TAB[crc8_cal];//temp_h
	  	crc8_cal ^=rh_l;
	  	crc8_cal =CRC8_shf15_TAB[crc8_cal];//temp_l
	  	if (temp_crc ==crc8_cal)	//校验码相等时则计算,否则错误
		   {
			NOP();
			sht_noread_time=0;	//20080222改为未读到SHT的计时
			t_value10=t_value*10+th_value_modify;	//20080226补偿后的的温度值*10=t_value*10+th_value_modify
			rh_value=calc_sth15_rh(rh_h,rh_l,t_value); //根据读入的湿度值计算湿度1
	 		rh_value +=rh_value_modify;	//补偿后的的湿度值200706
	 		fun_rht_compare();  //在范围内则比较温度湿度是否低于前20秒
	 		NOP();
	 		if (b_fault_sht_times<6)fault_state2 &=~b_fault_sht;	//在正确读到SHT时如故障次数<3则清除b_fault_sht
	 		
	 	   }
	 	else
			{//校验码不等时则退出
				NOP();
	  			NOP();
			 break;
			  }
		}
		else
		  {//PINA &b_rt1_data)==1时等待
			NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();
		  	NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();
		  	NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();
		  	NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();
		  	NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();
			fun_1232_wdt(); WDR();	//1232的看门狗翻转时钟脉冲20071010增加
			}
	}	//for (i=0; i<5000; i++) end
	
  }

float calc_sth15_t(unsigned char temp_h1,unsigned char temp_l1)  //计算温度值
{
  unsigned int temp;
  float t;
//	temp=temp_h1 *256+temp_l1;  //读入温度字节
temp=(temp_h1 <<8)+temp_l1;  //读入温度字节
	t =temp* 0.01-40; //计算得到的温度值
	return t;
}

 
unsigned char calc_sth15_rh(unsigned char rh_h1,unsigned char rh_l1,float t) //根据读入的湿度值计算湿度
{
	float C1=-4.0;
 	float C2=0.0405;
  	float C3=-0.0000028;
  	float T1=0.01;
  	float T2=0.00008;
  	float rh_cal,rh_lin;
  	unsigned char temp;
  	unsigned int rh;
	rh=(rh_h1 <<8)+rh_l1;  //读入湿度字节rh=rh_h1 *256+rh_l1;
	rh_lin =C3*rh*rh+C2*rh +C1; //根据读入的湿度值计算湿度
	rh_cal =(t-25) * (T1+T2*rh)+rh_lin; //对湿度进行温度补偿
	if (rh_cal>100) rh_cal=100;
	return (int)rh_cal;
}
  
void delay_tt(unsigned int tt) //延时tt次20us
  {
  	unsigned int i;
  	for(i=0; i<=tt; i++) 
 	{
  	NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();
  	NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();
  	NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();
  	NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();
  	NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();
  	NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();
  	NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();
  	NOP();NOP();NOP();NOP();
  	}
  }  
  
void delay_20us(void) //延时20us
  {
  	NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();
  	NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();
  	NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();
  	NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();
  	NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();
  	NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();
  	NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();
  	NOP();NOP();NOP();NOP();
  }

void fun_measure_temp_start(void) //启动测量温度程序
{
	s_transstart();	//起始步
	s_write_byte(MEASURE_TEMP);//写入SHT温度测量命令
	if (PINC &b_rt1_data)	//无应答error=1;
	 {
	 	PORTD &=~b_rt1_sck; //sck=0
		DDRC |=b_rt1_data; //DATA置1为输出口
		delay_tt(20);	//延时0.4ms
		s_connectionreset();  //连续发9个脉冲让SHT复位
		s_write_byte(RESET);  //向SHT发复位命令
		if (PINC &b_rt1_data)	//error=1;
		  {
		    s_connectionreset();  //连续发9个脉冲让SHT复位
		    auto_state |=b_sht_noACK;	//SHT无应答
		  }
		else  
		  { //复位后有应答则再次写入测量温度命令,需等待11MS后
		  	delay_tt(600);	//延时11ms
			s_transstart();	//起始步
			s_write_byte(MEASURE_TEMP);//写入SHT温度测量命令
			if (PINC &b_rt1_data)	//无应答error=1;
			  {
				s_connectionreset();  //连续发9个脉冲让SHT复位
		   		auto_state |=b_sht_noACK;	//SHT无应答
	 		  }
	 		else	//温度测量命令应答
	 		  {
				PORTD &=~b_rt1_sck; //sck=0
		  		DDRC &=~b_rt1_data; //DATA置1为输入口
				auto_state |=b_sht_temp_measure;	//置温度测试标志
				sht_measure_time=0;	//清0SHT1测量的等待应答时间秒
			  }
		 }
	}
	else 
	{	//温度测量命令应答时置温度测试标志
		PORTD &=~b_rt1_sck; //sck=0
 		DDRC &=~b_rt1_data; //DATA置1为输入口
		auto_state |=b_sht_temp_measure;	//置温度测试标志
		sht_measure_time=0;	//清0SHT1测量的等待应答时间秒
	}	
}			

void fun_measure_humid_start(void) //启动测量湿度程序
{
	s_transstart();	//起始步
	s_write_byte(MEASURE_HUMID);//写入SHT湿度测量命令
	if (PINC &b_rt1_data)	//无应答error=1;
	 {
	 	PORTD &=~b_rt1_sck; //sck=0
		DDRC |=b_rt1_data; //DATA置1为输出口
		delay_tt(20);	//延时0.4ms
		s_connectionreset();  //连续发9个脉冲让SHT复位
		s_write_byte(RESET);  //向SHT发复位命令
		if (PINC &b_rt1_data)	//error=1;
		  {
		    s_connectionreset();  //连续发9个脉冲让SHT复位
		    auto_state |=b_sht_noACK;	//SHT无应答
		  }
		else  
		  { //复位后有应答则再次写入测量湿度命令,需等待11MS后
		  	delay_tt(600);	//延时11ms
			s_transstart();	//起始步
			s_write_byte(MEASURE_HUMID);//写入SHT湿度测量命令
			if (PINC &b_rt1_data)	//无应答error=1;
			  {
				s_connectionreset();  //连续发9个脉冲让SHT复位
		   		auto_state |=b_sht_noACK;	//SHT无应答
	 		  }
	 		else	//湿度测量命令应答
	 		  {
				PORTD &=~b_rt1_sck; //sck=0
		  		DDRC &=~b_rt1_data; //DATA置1为输入口
				auto_state |=b_sht_humid_measure;	//置湿度测试标志
				sht_measure_time=0;	//清0SHT1测量的等待应答时间秒
			  }
		 }
	}
	else 
	{	//湿度测量命令应答时置湿度测试标志
		PORTD &=~b_rt1_sck; //sck=0
 		DDRC &=~b_rt1_data; //DATA置1为输入口
		auto_state |=b_sht_humid_measure;	//置湿度测试标志
		sht_measure_time=0;	//清0SHT1测量的等待应答时间秒
	}	
}	
  
 //从SHT读1个字节的CRC校验码,无应答
unsigned char read_crc_byte(void) //从SHT读1个字节的CRC校验码,无应答
{
  unsigned char i,val=0;
  unsigned char	temp;
  DDRC &=~b_rt1_data;	//DATA置0为输入口
 NOP(); NOP(); NOP(); NOP(); 
  NOP(); NOP(); NOP();	
  temp=1;	//初始化	
  for (i=0;i<8;i++)	//从最低位开始取数据,8次读入最高位,读入DATA线上数据后,置SCK脉冲输出
    {
    	PORTD |=b_rt1_sck;  //sck=1
    delay_20us();
    if (PINC &b_rt1_data) val|=temp; //读入数据为1时,字节该位置1
    PORTD &=~b_rt1_sck;  //sck=0
    delay_20us();
    temp=temp<<1;	//
    }
  DDRA |=b_rt1_data;	//DATA置1为输出口
  NOP(); NOP(); NOP(); NOP(); 
 PORTC |=b_rt1_data; //应答1结束通讯
  NOP(); NOP(); NOP(); NOP();NOP(); NOP(); 
  PORTD |=b_rt1_sck;  //sck=1
  delay_20us();
  PORTD &=~b_rt1_sck;  //sck=0
  delay_20us();
  PORTC |=b_rt1_data;  //data=1
  delay_20us();
  return val;  //返回读入值
}

//从SHT读1个字节
unsigned char s_read_byte(unsigned char ack) //读字节
{
  unsigned char i,val=0;
  DDRC &=~b_rt1_data;	//DATA置0为输入口
 NOP(); NOP(); NOP(); NOP(); 
  NOP(); NOP(); NOP();		
 for (i=0;i<8;i++)	//从最高位开始取数据,左移8次,读入DATA线上数据后,置SCK脉冲输出
    {
    	PORTD |=b_rt1_sck;  //sck=1
    	val=val<<1;	//
    delay_20us();
    if (PINC &b_rt1_data) val++; //读入数据为1时,字节该位置1
    PORTD &=~b_rt1_sck;  //sck=0
    delay_20us();
    }
  DDRC |=b_rt1_data;	//DATA置1为输出口
  NOP(); NOP(); NOP(); NOP(); 
  if (ack) PORTC |=b_rt1_data; //应答1继续通讯
  else PORTC &=~b_rt1_data; //应答0结束通讯
  NOP(); NOP(); NOP(); NOP();NOP(); NOP(); 
  PORTD |=b_rt1_sck;  //sck=1
  delay_20us();
  PORTD &=~b_rt1_sck;  //sck=0
  delay_20us();
  PORTC |=b_rt1_data;  //data=1
  delay_20us();
  return val;  //返回读入值
}		

				

⌨️ 快捷键说明

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