沈阳工业大学本科生毕业设计(论文)
else { CLRDATA();
}
delay_us(5); SETCLK(); cmd=cmd<<1; delay_us(5); // CLRCLK();
}
SETDATA();//释放总线
}
4.3.4 SHT11的应答信号 void SHT11_answer() /* sht11应答信号{ CLRCLK(); delay_us(5); SETCLK(); delay_us(5);
LPC_GPIO3->FIODIR&=input;
// LPC_GPIO3->FIOPIN=LPC_GPIO3->FIOPIN|0x02000000;
while(LPC_GPIO3->FIOPIN&0x02000000); CLRCLK(); delay_us(5); SETDATA();
}
void SHT11_DATA_READY() { LPC_GPIO3->FIODIR&=input; //select as intput
// LPC_GPIO3->FIOPIN=LPC_GPIO3->FIOPIN|0x02000000;
while(LPC_GPIO3->FIOPIN&0x02000000);
}
30
*/
沈阳工业大学本科生毕业设计(论文)
4.3.5 SHT11数据通信结束 void SHT11_end() { }
4.3.6 SHT11读取函数
DATA的三态门引脚用于数据的读取。DATA在SCK时钟的下降沿状态改变,并且仅在SCK时钟的上升沿有效。在数据传输期间,在SCK时钟处于高电平时,DATA必须保持稳定。避免信号冲突,微处理器应该讲DATA拉低。需要一个外接的上拉电阻(例如 10k?)把信号拉至高电平。上拉电阻通常包含在微处理器的I/O电路中。
unsigned char read_sht11(void) {
unsigned char j,temp=0,data=0; SETDATA(); for(j=0;j<8;j++) {
SETCLK(); data=data<<1;
delay_us(5);
LPC_GPIO3->FIODIR&=input;
SETDATA();
delay_us(5); delay_us(5); SETCLK(); CLRCLK(); delay_us(5);
//////////
/* sht11数据通信结束 */
LPC_GPIO3->FIOPIN=LPC_GPIO3->FIOPIN|0x02000000; temp=((LPC_GPIO3->FIOPIN&0x02000000)>>24); if(temp)
data=data|0x01; else
data=data&0xFE;
31
沈阳工业大学本科生毕业设计(论文)
}
}
CLRCLK(); delay_us(5);
SETDATA();
return(data);
4.3.7 SHT11寄存器设置函数 void SHT11_Write_Register() { }
START_SHT11(); write_sht11(0x06); SHT11_answer();
write_sht11(0x00); //12 and 14 bit temperrature SHT11_answer();
/* sht11寄存器设置函数 */
4.4 SHT11测量温湿度
在发布一组测量命令(0000 0101表示测湿度,0000 0011表示测温)后,控制器要等待测量结束。这个大致需要11/55/210ms分别对应8/12/14位测量。准确的时间随内部晶振的速度有±15%的变化。SHTxx通过拉DATA至低电平并进入空闲模式,来表示测量结束。控制器再次触发SCK之前必须等待“数据备妥”信号来读出数据。测量数据在读出前先被存储,这样控制器可以继续执行其他任务在需要时再读出数据。
接着传输出2个字节的测量数据和1个字节的CRC和校验。uC必须通过下拉DATA为低电平来确认每个字节。每个数据从最高有效位(MSB)开始,右值合法(例如:对于12位数据第5个SCK是最高有效位,而对于8位数据第一个字节是无意义的)。
用CRC数据的应答位表明通讯结束。如果不用CEC-8校验,控制器可能在测量数据LSB结束后通过保持应答位sck为高,来终止通讯。 在测量和通讯结束之后,设备自动进入休眠模式。 unsigned short SHT11_Measure(unsigned char command) {
32
沈阳工业大学本科生毕业设计(论文)
}
unsigned short dat_1=0;
unsigned char data_high,data_low,CRC; unsigned char val,tt,i; START_SHT11(); write_sht11(command); SHT11_answer(); SHT11_DATA_READY(); data_high=read_sht11(); MCU_answer(); data_low=read_sht11(); MCU_answer(); CRC=read_sht11(); SHT11_end();
dat_1=(dat_1|data_high); dat_1=(dat_1<<8)|data_low; val=CRC_Table[(command^0x00)]; val=CRC_Table[(val^data_high)]; val=CRC_Table[(val^data_low)]; for(i=0;i<8;i++) { } val=tt; if(val==CRC)
return(dat_1); else
return(2); tt=tt<<1; tt|=val&0x01; val=val>>1;
4.5测量结果处理以及报警
取10次平均值
33
沈阳工业大学本科生毕业设计(论文)
if(i==10) {
i=0; j=0;
//10次平均值
dis_flag=1; Temperature=0; Humidity=0;
for(temp=0;temp<10;temp++) { }
Temperature=Temperature/10; T[0] = ((int)(Temperature*100))/100;
//温度整数
Temperature+=TE[temp];
T[1] = ((int)(Temperature*100))0; //温度小数
if(T[0]>29) //达到或超过30度报警 { } else { }
for(temp=0;temp<10;temp++) { }
Humidity=Humidity/10;
H[0] = ((int)(Humidity*100))/100;
//湿度整数
Humidity+=HU[temp];
LPC_GPIO0->FIOSET |=0x03800000; LPC_GPIO0->FIOCLR |= 0x03800000;
H[1] = ((int)(Humidity*100))0; //湿度整数 }
4.6本章小结
系统的软件编写是本次设计中的一个很重要的组成部分。软件的编写同时也
34