pic单片机应用系统开发典型实例〉〉有差不多的例子,不过 是数码显示,不是液晶显示。液晶程序上网上找就行啊,上有很多程序,或许有现成的。
#includereg52.h
#define uchar unsigned char
#define uint unsigned int
uint hum,temp,i; //定义湿度、温度(全局)
uchar hum_h,hum_l,temp_h,temp_l,check,cnt=0; //湿度高、低8位,温度高、低8位,校验位
uchar bai,shi,ge,bai1,shi1,ge1; //数码管 ,cnt=0
uchar code table[]={0xfb,0xfd,0xfe};//位选数组
uchar code table1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //无小数点
uchar code table2[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; //有小数点
sbit dht=P2^4;
/******************************
邮保╱s级)函数
******************************/
void delay_us(uint i)
{
while(i--);
}
/******************************
延时(ms级)函数
******************************/
void delay(uint z)
{
uint x,y;
for (x=z;x0;x--)
for(y=100;y0;y--);
}
/***********************************
温湿度初始化(准备传送数据)函数
***********************************/
void dht_init()
{
dht=0;
delay_us(50); //拉低延时500微秒,发送开始信号
dht=1; //释放总线,延时30微秒
delay_us(4);
while(!dht); //拉低等待
while(dht); // 拉高等待,即将传送数据
}
/************************************
读取字节函数
************************************/
uchar read_byte()
{
uchar n,byte=0,dat;
for(n=0;n8;n++)
{
while(!dht);
delay_us(4); //理论上28us延时70us,此处写2--6都可以
dat=0;
if(dht)
dat=1;
while(dht);
byte=1;
byte|=dat;
}
return byte;
}
/********************************
读40位数据函数
********************************/
void read_hum_temp()
{
dht_init();
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()
{
uchar a;
a=hum_h+hum_l+temp_h+temp_l;
if(a==check)
{
hum=temp=0;
hum=((hum|hum_h)8)|hum_l;
temp=((temp|temp_h)8)|temp_l;
bai=temp/100;
shi=temp%100/10;
ge=temp%10;
bai1=hum/100;
shi1=hum%100/10;
ge1=hum%10;
}
else bai=shi=ge=bai1=shi1=ge1=0;
}
void saomiao1()//温度
{
P2=table[0];
P0=table1[ge];
delay(1);
P0=0X00;
P2=table[1];
P0=table2[shi];
delay(1);
P0=0X00;
P2=table[2];
P0=table1[bai];
delay(1);
P0=0X00;
}
void saomiao2()//湿度
{
P2=table[0];
P0=table1[ge1];
delay(1);
P2=table[1];
P0=table2[shi1];
delay(1);
P2=table[2];
P0=table1[bai1];
delay(1);
}
//===================================================
void main()
{
delay(200);
while(1)
{
read_hum_temp();
zhuanhuan();
for(i=0;i1500;i++)
{
saomiao1() ;
}
delay(500);
}
}
单片机的程序不是并行的.
每个检测都是分先后次序进行的.
/********************************************************************
*
文件名
:
温度采集DS18B20.c
*
描述
:
该文件实现了用温度传感器件DS18B20对温度的采集,并在数码管上显示出来。
*
创建人
:
东流,2009年4月10日
*
版本号
:
2.0
***********************************************************************/
#includereg52.h
#define
uchar
unsigned
char
#define
uint
unsigned
int
#define
jump_ROM
0xCC
#define
start
0x44
#define
read_EEROM
0xBE
sbit
DQ
=
P2^3;
//DS18B20数据口
unsigned
char
TMPH,TMPL;
uchar
code
table[10]
=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
/********************************************************************
*
名称
:
delay()
*
功能
:
延时,延时时间大概为140US。
*
输入
:
无
*
输出
:
无
***********************************************************************/
void
delay_1()
{
int
i,j;
for(i=0;
i=10;
i++)
for(j=0;
j=2;
j++)
;
}
/********************************************************************
*
名称
:
delay()
*
功能
:
延时函数
*
输入
:
无
*
输出
:
无
***********************************************************************/
void
delay(uint
N)
{
int
i;
for(i=0;
iN;
i++)
;
}
/********************************************************************
*
名称
:
Delay_1ms()
*
功能
:
延时子程序,延时时间为
1ms
*
x
*
输入
:
x
(延时一毫秒的个数)
*
输出
:
无
***********************************************************************/
void
Delay_1ms(uint
i)//1ms延时
{
uchar
x,j;
for(j=0;ji;j++)
for(x=0;x=148;x++);
}
/********************************************************************
*
名称
:
Reset()
*
功能
:
复位DS18B20
*
输入
:
无
*
输出
:
无
***********************************************************************/
uchar
Reset(void)
{
uchar
deceive_ready;
DQ
=
0;
delay(29);
DQ
=
1;
delay(3);
deceive_ready
=
DQ;
delay(25);
return(deceive_ready);
}
/********************************************************************
*
名称
:
read_bit()
*
功能
:
从DS18B20读一个位值
*
输入
:
无
*
输出
:
从DS18B20读出的一个位值
***********************************************************************/
uchar
read_bit(void)
{
uchar
i;
DQ
=
0;
DQ
=
1;
for(i=0;
i3;
i++);
return(DQ);
}
/********************************************************************
*
名称
:
write_bit()
*
功能
:
向DS18B20写一位
*
输入
:
bitval(要对DS18B20写入的位值)
*
输出
:
无
***********************************************************************/
void
write_bit(uchar
bitval)
{
DQ=0;if(bitval==1)
DQ=1;
delay(5);
DQ=1;
}
/********************************************************************
*
名称
:
read_byte()
*
功能
:
从DS18B20读一个字节
*
输入
:
无
*
输出
:
从DS18B20读到的值
***********************************************************************/
uchar
read_byte(void)
{
uchar
i,m,receive_data;
m
=
1;
receive_data
=
0;
for(i=0;
i8;
i++)
{
if(read_bit())
{
receive_data
=
receive_data
+
(m
i);
}
delay(6);
}
return(receive_data);
}
/********************************************************************
*
名称
:
write_byte()
*
功能
:
向DS18B20写一个字节
*
输入
:
val(要对DS18B20写入的命令值)
*
输出
:
无
***********************************************************************/
void
write_byte(uchar
val)
{
uchar
i,temp;
for(i=0;
i8;
i++)
{
temp
=
val
i;
temp
=
temp
0x01;
write_bit(temp);
delay(5);
}
}
/********************************************************************
*
名称
:
Main()
*
功能
:
主函数
*
输入
:
无
*
输出
:
无
***********************************************************************/
void
main()
{
float
tt;
uint
temp;
P2
=
0x00;
while(1)
{
Reset();
write_byte(jump_ROM);
write_byte(start);
Reset();
write_byte(jump_ROM);
write_byte(read_EEROM);
TMPL
=
read_byte();
TMPH
=
read_byte();
temp
=
TMPL
/
16
+
TMPH
*
16;
P0
=
table[temp/10%10];
P2
=
6;
Delay_1ms(5);
P0
=
table[temp%10];
P2
=
7;
Delay_1ms(5);
}
}
51单片机温湿度检测的介绍就聊到这里吧,感谢您花时间阅读,谢谢。
本文标签:51单片机温湿度检测