📄 jf_p1._c
字号:
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 + -