stc90c51单片机开发板和sht11温湿度传感器连接测量温湿度的具体程序

stc90c51单片机开发板和sht11温湿度传感器连接测量温湿度的具体程序,第1张

#include<reg52.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=zx>0x--)

for(y=100y>0y--)

}

/***********************************

温湿度初始化(准备传送数据)函数

***********************************/

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=0n<8n++)

{

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=0i<1500i++)

{

saomiao1()

}

delay(500)

}

}

给你一个DS18B20的温度采集程序!

//ICC-AVR application builder : 2009-10-25 10:43:39

// Target : M16

// Crystal: 16.000Mhz

#include <iom16v.h>

#include <macros.h>

#define uint unsigned int

#define uchar unsigned char

#include "xianshi.c"

#include "delay.h"

#define CLR_DIR_1WIRE DDRD&=~BIT(4)//只要修改这里的参数就可以了

#define SET_DIR_1WIRE DDRD|=BIT(4) //里面什么都不用该!

#define CLR_OP_1WIRE PORTD&=~BIT(4)

#define SET_OP_1WIRE PORTD|=BIT(4)

#define CHECK_IP_1WIRE (PIND&0x10)//检测

unsigned char wmh,wml

void init_1820()

{

SET_DIR_1WIRE //设置PD4 为输出

SET_OP_1WIRE

CLR_OP_1WIRE

delay_nus(480) //480us以上

SET_OP_1WIRE

CLR_DIR_1WIRE

delay_nus(20) //15~60us

while(CHECK_IP_1WIRE)

SET_DIR_1WIRE

SET_OP_1WIRE

delay_nus(140) //60~240us

}

void write_1820(unsigned char x)

{

unsigned char m

for(m=0m<乎敏8m++)

{

CLR_OP_1WIRE

if(x&(1<<m))//写数巧森据了,先写低位的!

SET_OP_1WIRE

else

{CLR_OP_1WIRE}

delay_nus(40) //15~60us

SET_OP_1WIRE

}

SET_OP_1WIRE

}

unsigned char read_1820()

{

unsigned char temp,k,n

temp=0

for(n=0n<8n++)

{

CLR_OP_1WIRE

SET_OP_1WIRE

CLR_DIR_1WIRE

k=(CHECK_IP_1WIRE) //读数据,从低位开始

if(k)

temp|=(1<<n)

else

temp&=~(1<<n)

delay_nus(50)//60~120us

SET_DIR_1WIRE

}

return (temp)

}

unsigned int gettemp() //岁宽枝读取温度值

{

unsigned char temh,teml,wm0,wm1,wm2,wm3

init_1820() //复位18b20

write_1820(0xcc) // 发出转换命令

write_1820(0x44)

// delay_nms(800) //不延时也好使,不知道怎么回事!

init_1820()

write_1820(0xcc) //发出读命令

write_1820(0xbe)

teml=read_1820() //读数据

temh=read_1820()

wm0=teml>>4 //只要高8位的低四位和低8位的高四位,温度范围0~99啦!

wm1=temh<<4

wm2=wm1+wm0 //16进制转10进制

return wm2

}

void main()

{

uint tem,ad[4],i

port_init()

while(1)

{

tem = gettemp()

for(i=0i<4i++)

{

ad[3-i]=tem%10

tem=tem/10

}

for(i=0i<4i++)

{

show1(ad[i],i)

delay(5)

}

}

}

显示函数:

#include <iom16v.h>

#include <macros.h>

#define uint unsigned int

#define uchar unsigned char

#pragma data:code

const uint tab1[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,

0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0x00}//共阳数码管代码表

const uint tab2[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,

0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0X00}//共阴数码管代码表

void port_init(void)

{

DDRA = 0xFF

DDRB = 0xFF

DDRC = 0xFF

DDRD = 0x00

}

void delay(uint ms)

{

uint i,j

for(i=0i<msi++)

{

for(j=0j<1141j++)

}

}

void show1(uchar j,uchar k)//显示函数

{

PORTB = ~BIT(k)

PORTA = tab2[j]

delay(1)

}

void show(uint ada)

{

uint i,ad[4]

for(i=0i<4i++)

{

ad[3-i]=ada%10

ada = ada/10

}

while(1)

{

for(i=0i<4i++)

{

show1((ad[i]),i)

delay(100)

}

}

}

程序我都调试过的,都是好的,有不会再问我。可以给分了吗?嘿嘿


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12328637.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存