DHT11传感器STC12单片机程序.docx

上传人:b****6 文档编号:16332604 上传时间:2023-07-12 格式:DOCX 页数:12 大小:16.52KB
下载 相关 举报
DHT11传感器STC12单片机程序.docx_第1页
第1页 / 共12页
DHT11传感器STC12单片机程序.docx_第2页
第2页 / 共12页
DHT11传感器STC12单片机程序.docx_第3页
第3页 / 共12页
DHT11传感器STC12单片机程序.docx_第4页
第4页 / 共12页
DHT11传感器STC12单片机程序.docx_第5页
第5页 / 共12页
DHT11传感器STC12单片机程序.docx_第6页
第6页 / 共12页
DHT11传感器STC12单片机程序.docx_第7页
第7页 / 共12页
DHT11传感器STC12单片机程序.docx_第8页
第8页 / 共12页
DHT11传感器STC12单片机程序.docx_第9页
第9页 / 共12页
DHT11传感器STC12单片机程序.docx_第10页
第10页 / 共12页
DHT11传感器STC12单片机程序.docx_第11页
第11页 / 共12页
DHT11传感器STC12单片机程序.docx_第12页
第12页 / 共12页
亲,该文档总共12页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

DHT11传感器STC12单片机程序.docx

《DHT11传感器STC12单片机程序.docx》由会员分享,可在线阅读,更多相关《DHT11传感器STC12单片机程序.docx(12页珍藏版)》请在冰点文库上搜索。

DHT11传感器STC12单片机程序.docx

DHT11传感器STC12单片机程序

DHT11传感器STC12单片机程序

#include

#include<12864.h>

#include

sbitDHT=P0^0;//管脚定义,DHT11总线输入输出;

uchardata_byte;

ucharTem_Z,Tem_X,Hum_Z,Hum_X,Check;

voidLCD_Display();//声明LCD_Display液晶显示函数;

voidRec_DHT();//声明Rec_DHT,DHT11接收数据函数;

voidreceive();

//主函数

voidmain()

{

lcd_init();

while

(1)

{

Rec_DHT();

LCD_Display();

delayms(1000);

}

}

//延时函数,//延时ms

voiddelays()//@12.000MHz

{

uchari,j,k;

i=1;

j=234;

k=113;

do

{

do

{

while(--k);

}while(--j);

}while(--i);

}

 

//延时ius

voiddelay10us()

{

uchari;

for(i=0;i<6;i++)

{

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

}

}

/********主机发出开始信号*******/

voidDHT11_Start()

{

DHT=1;

delay10us();

DHT=0;

delays();//保持电平时间大于18ms,延时20ms

DHT=1;

delay10us();//延迟等待20-40us,延时20us

delay10us();

delay10us();

delay10us();

DHT=1;//拉高等待DHT11响应

}

//DHT11接收一个字节数据

ucharreceive_data()

{

uchari,temp,count;

data_byte=0;

for(i=0;i<8;i++)

{

count=2;

while((!

DHT)&&count++);//等待50us低电平结束

delay10us();//等待40us高电平,后判断电平高低,高:

DHT为1,低:

DHT为0

delay10us();

delay10us();

delay10us();

temp=0;

if(DHT==1)temp=1;//DHT为高:

1,位为1

count=2;

while((DHT)&&count++);//等待DHT高电平结束

if(count==1)break;//DHT为低:

0,位为0

data_byte<<=1;//字节左移

data_byte|=temp;

}

returndata_byte;//返回读取值

}

//DHT11接收数据

voidRec_DHT()

{

ucharflag;

ucharT_H,T_L,H_H,H_L,check,num_check;//定义采集参数中间变量

DHT11_Start();//主机发出开始信号

if(!

DHT)//等待从机响应信号输出低电平

{

flag=2;

while((!

DHT)&&flag++);//判断从机是否发出80us的低电平响应信号是否结束

flag=2;

while(DHT&&flag++);//判断从机是否发出80us的高电平,若发出则开始采集数据

H_H=receive_data();//采集湿度整数部分

H_L=receive_data();//采集湿度小数部分

T_H=receive_data();//采集温度整数部分

T_L=receive_data();//采集温度小数部分

check=receive_data();//采集校验位

DHT=1;

num_check=H_H+H_L+T_H+T_L;

//if(num_check=check)//进行校核

//{

Hum_Z=H_H;

Hum_X=H_L;

Tem_Z=T_H;

Tem_X=T_L;

//}

}

}

 

/**********12864液晶显示*********/

voidLCD_Display()

{

//液晶显示第一行:

温度显示;

lcd_pos(1,1);

write_data('T');

write_data('e');

write_data('m');

write_data('p');

write_data(':

');

write_data(Tem_Z/10+0x30);//输出温度的十位

write_data(Tem_Z%10+0x30);//输出温度的个位

write_data('.');

write_data(Tem_X/10+0x30);//输出温度的分位

write_data(Tem_X%10+0x30);//输出温度的十分位

write_data(0x27);//输出℃

write_data(0x43);

//液晶第二行:

温度提示;

lcd_pos(2,4);

if(Tem_Z>35)write("注意防署");

elseif(Tem_Z<15)write("注意防寒");

elsewrite("温度适宜");

//液晶第三行:

湿度显示;

lcd_pos(3,1);

write_data('H');

write_data('u');

write_data('m');

write_data(':

');

write_data(Hum_Z/10+0x30);//输出湿度的十位

write_data(Hum_Z%10+0x30);//输出湿度的个位

write_data('.');

write_data(Hum_X/10+0x30);//输出湿度的分位

write_data(Hum_X%10+0x30);//输出湿度的十分位

write_data('%');

//液晶第四行:

湿度提示;

lcd_pos(4,4);

if(Hum_Z>70)write("注意除湿");

elseif(Hum_Z<40)write("注意除燥");

elsewrite("湿度适宜");

}

 

//12864程序

#defineucharunsignedchar//宏定义

#defineuintunsignedint

//定义12864串口模式的引脚

sbitcs=P1^5;//片选,高电平有效

sbitsid=P1^6;//串行数据输入端

sbitsclk=P1^7;//串行同步时钟

sbitpsb=P0^7;//串并口选择位,H=并口;L=串口

sbitrst=P0^6;//复位信号,低电平有效

//延时函数,延时xms

voiddelayms(uintxms)

{

uinti;

ucharj;

for(i=xms;i>0;i--)//单片机晶振频率为12MHZ;

for(j=120;j>0;j--){;}//单片机12倍速度运行

}

//12864写命令

voidwrite_com(ucharcom)

{

uchari;

uchari_data;

i_data=0xf8;//11111000-写指令0

cs=1;

sclk=0;

for(i=0;i<8;i++)

{

sid=(bit)(i_data&0x80);

sclk=0;

sclk=1;

i_data=i_data<<1;

}

i_data=com;

i_data&=0xf0;

for(i=0;i<8;i++)

{

sid=(bit)(i_data&0x80);

sclk=0;

sclk=1;

i_data=i_data<<1;

}

i_data=com;

i_data=i_data<<4;

for(i=0;i<8;i++)

{

sid=(bit)(i_data&0x80);

sclk=0;

sclk=1;

i_data=i_data<<1;

}

cs=0;

delayms(10);

}

//12864写数据

voidwrite_data(uchardate)

{

uchari;

uchari_data;

i_data=0xfa;//写数据

cs=1;

for(i=0;i<8;i++)

{

sid=(bit)(i_data&0x80);

sclk=0;

sclk=1;

i_data=i_data<<1;

}

i_data=date;

i_data&=0xf0;

for(i=0;i<8;i++)

{

sid=(bit)(i_data&0x80);

sclk=0;

sclk=1;

i_data=i_data<<1;

}

i_data=date;

i_data=i_data<<4;

for(i=0;i<8;i++)

{

sid=(bit)(i_data&0x80);

sclk=0;

sclk=1;

i_data=i_data<<1;

}

cs=0;

delayms(10);

}

//lcd12864初始化

voidlcd_init()

{

psb=0;//液晶屏为串行数据传输模式

rst=0;//复位

delayms

(2);

rst=1;

delayms

(2);

write_com(0x30);//基本指令,扩充指令为34H

delayms(4);

write_com(0x02);//清除ddram

delayms(4);

write_com(0x0c);//显示开,关光标

delayms(4);

write_com(0x01);//清屏

delayms(4);

}

 

//设定显示位置,x、y为12864轴坐标,x:

1-4;y:

1-16;

voidlcd_pos(ucharx,uchary)

{

ucharpos;

if(x==1)x=0x80;//x为第几行1-4;

elseif(x==2)x=0x90;

elseif(x==3)x=0x88;

elseif(x==4)x=0x98;

pos=x+y-1;

write_com(pos);

}

 

//指定位置显示任意文字、字符

voidwrite(uchar*str)

{

uchari=0;

while(str[i]!

='\0')

{

write_data(str[i++]);

}

}

/*

//写数据时,要清除前面的显示,否则显示会覆盖在前面显示上

//清屏

voidclean()

{

write_com(0x30);

write_com(0x01);//清屏

}*/

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 工作范文 > 行政公文

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2