新手上路
- 积分
- 31
- 金钱
- 31
- 注册时间
- 2014-12-3
- 在线时间
- 0 小时
|
5金钱
这是我自己写的,芯片采用stc12c5a60s2。最大的问题就是不能实时显示温湿度,单片机掉电后无法保存。
/*--------------------延时(10us级)------------------*/
void delay_us(uint i)
{
while(i--);
}
/*--------------------延时(ms级)------------------*/
void delay(uint z)
{
uint i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
/*--------------温湿度初始化(准备传送数据)----------*/
void dht_init()
{
// delay(1000); //延时一会,避开不稳定区域
dht=0; //拉低延时800微秒,发送开始信号
delay(5);
dht=1; //释放总线,延时80微秒
delay_us(40);
while(!dht); //拉低等待
while(dht); //拉高等待,即将传送数据
}
uchar read_byte()
{
uchar n,byte=0,dat;
for(n=0;n<8;n++)
{
while(!dht);
delay_us(40); //理论上28us<延时<70us,此处写2--6都可以
dat=0;
if(dht)
dat=1;
while(dht);
byte<<=1;
byte|=dat;
//byte=(byte<<=1)|dat; //0
}
return byte;
}
/*----------------------读40位数据---------------------*/
void read_hum_temp()
{
hum_h=read_byte(); //读湿度
hum_l=read_byte();
temp_h=read_byte(); //读温度
temp_l=read_byte();
check=read_byte(); //读校验
while(!dht); //等待低电平结束
dht=1; //最后拉高总线
}
void zhuanhuan() //提取各位数字
{ uint hum,temp;
uchar a;
a=hum_h+hum_l+temp_h+temp_l;
if(a==check)
{
hum=temp=0; //hum湿度 temp温度 全局
hum=((hum|hum_h)<<8)|hum_l;
temp=((temp|temp_h)<<8)|temp_l;
bai3=hum/100;
shi3=hum%100/10;
ge3=hum%100%10;
bai4=temp/100;
shi4=temp%100/10;
ge4=temp%100%10;
}
else bai3=shi3=ge3=bai4=shi4=ge4=1;
}
|
|