与电脑通信的温湿度传感器c程序.docx

上传人:b****7 文档编号:15764403 上传时间:2023-07-07 格式:DOCX 页数:9 大小:15.92KB
下载 相关 举报
与电脑通信的温湿度传感器c程序.docx_第1页
第1页 / 共9页
与电脑通信的温湿度传感器c程序.docx_第2页
第2页 / 共9页
与电脑通信的温湿度传感器c程序.docx_第3页
第3页 / 共9页
与电脑通信的温湿度传感器c程序.docx_第4页
第4页 / 共9页
与电脑通信的温湿度传感器c程序.docx_第5页
第5页 / 共9页
与电脑通信的温湿度传感器c程序.docx_第6页
第6页 / 共9页
与电脑通信的温湿度传感器c程序.docx_第7页
第7页 / 共9页
与电脑通信的温湿度传感器c程序.docx_第8页
第8页 / 共9页
与电脑通信的温湿度传感器c程序.docx_第9页
第9页 / 共9页
亲,该文档总共9页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

与电脑通信的温湿度传感器c程序.docx

《与电脑通信的温湿度传感器c程序.docx》由会员分享,可在线阅读,更多相关《与电脑通信的温湿度传感器c程序.docx(9页珍藏版)》请在冰点文库上搜索。

与电脑通信的温湿度传感器c程序.docx

与电脑通信的温湿度传感器c程序

#include

#include

#include

typedefunsignedcharuchar;

typedefunsignedintuint;

voidunit();

voiddelay2ms(uintM);

voiddelay2xus(ucharm);

ucharread_onebyte();

voidRead();

voidwrite_com(ucharcom);

voidwrite_data(ucharD);

voidLCD1602_unit();//初始化lcd1602

voidLCD1602_display();

voiduart_unit();

voidsent_byte();

ucharDATA[5];

sbitled=P0^3;

sbitled3=P0^0;

ucharD=1;

sbitDQ=P2^7;

sbitlcd_rs=P3^3;

sbitlcd_rw=P3^4;

sbitlcd_en=P3^5;

ucharRH_H,RH_L,T_H,T_L,CHECK;

floatRH,T;

/*---------------------微秒延时函数--------------------------------------*/

voiddelay2xus(ucharm)

{while(--m);

}

/*--------------------毫秒延时函数---------------------------------------*/

voiddelay2ms(uintM)

{

uinti,j,k;

for(k=0;k

{for(i=0;i<9;i++)

{for(j=0;j<32;j++);

}

}

}

/*--------------------------DHT11初始化函数---------------------------*/

voidunit()

{led3=1;

led3=0;DQ=1;

DQ=0;

delay2ms(12);

DQ=1;

delay2xus(12);//检测DHT11响应信号是否开始

while(DQ);//DQ=1时跳过

while(!

DQ);//检测DHT11响应信号是否结束

while(DQ);

led3=1;//检测DHT11的发送bite开始信号是否开始

}

/*---------------------读一个字节函数-----------------------------------*/

ucharread_onebyte()

{uchari;

ucharflag;

ucharbyte=0x00;

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

{while(DQ);

byte=byte<<=1;

while(!

DQ);//检测数据信号,即高电平

delay2xus(17);//区分开1信号和0信号

if(DQ)

flag=1;

else

flag=0;

byte=byte|flag;//若DQ是高电平,就是1信号,是低电平就是0信号

}

returnbyte;//返回8位数据

}

/*-------------------------------读DHT11数据函数------------------------------*/

voidRead()

{

ucharj,total;

//检测数据是否正确指示灯

for(j=0;j<5;j++)

{led=0;

DATA[j]=read_onebyte();}//按协议顺序,DATA[0]为湿整,DATA[1]为湿小,DATA[2]为温整,DATA[3]为温小

RH_H=DATA[0];

RH_L=DATA[1];

T_H=DATA[2];

T_L=DATA[3];

CHECK=DATA[4];

total=RH_H+RH_L+T_H+T_L;

if(CHECK==total);//检测数据是否正确

else

led=1;//检测数据是否正确指数灯

}

/*------------------------------LCD写指令函数--------------------------------------------*/

voidwrite_com(ucharcom)

{

lcd_rs=0;//声明是指令

P1=com;

delay2ms(5);

lcd_en=1;//下降沿有效

delay2ms(5);

lcd_en=0;

}

/*---------------------------------LCD写数据函数---------------------------------------*/

voidwrite_data(ucharD)

{

lcd_rs=1;//声明是数据

P1=D;

delay2ms(5);

lcd_en=1;//下降沿有效

delay2ms(5);

lcd_en=0;

}

/*---------------------------------LCD1602初始化函数----------------------------------*/

voidLCD1602_unit()

{lcd_rw=0;

write_com(0x80);

write_com(0x06);//声明是写操作

//清屏

//光标右移,字符不动

write_com(0x0f);//开显示,有光标,光标不闪烁

write_com(0x38);//设置16*2显示,5*7点阵,8位数据接口

}

/*-------------------------------------LCD1602显示函数-------------------------------------*/

voidLCD1602_display()

{

ucharwho[2];

uchari;

ucharstr1[11];//暂存相对湿度字符

ucharstr2[11];//暂存温度字符

LCD1602_unit();

write_com(0x80);//光标在第一行第一位

who[0]=0xdf;

who[1]='c';

RH=RH_H+RH_L*0.001;//相对湿度数据

T=T_H+T_L*0.001;

//温度数据

sprintf(str1,"RH:

%7.3f%%",RH);//转化为字符串

sprintf(str2,"T:

%7.3f%s",T,who);

for(i=0;i<11;i++)//在第一行显示相对湿度数据

{write_data(str1[i]);

}

write_com(0xc0);//光标在第二行第一位

for(i=0;i<11;i++)//在第二行显示温度数据

{

write_data(str2[i]);

}

}

/*----------------------------------串行异步通信初始化函数与------------------------------*/voiduart_unit()

{

TMOD|=0x20;

PCON=0x00;

SCON=0x50;//启动timer1,mode2,8bit自动重装

//波特率正常,即SMOD=0

//串口模式1,8bitUART,REN=1,SM0=0;SM1=1

TH1=0xf3;//自动重装,波特率为2400,晶振12MHZ

TL1=0xf3;

TR1=1;//打开总xx

ES=1;//打开timer1

EA=1;//打开串行xx

}

/*------------------------------------串行发送数据函数-----------------------------------*/

voidsent_byte()

{ucharc;

ucharsent[2];

sent[0]=2;//准备接收信号

sent[1]=RH;

sent[2]=3;

sent[3]=T;

sent[4]=0;

for(c=0;c<5;c++)

{SBUF=sent[c];

while(!

TI);

TI=0;

delay2ms(25);//xx补偿

}

}

/*------------------------------------------------------------------------

主函数

------------------------------------------------------------*/

voidmain()

{D=1;

while

(1)//主循环,等待上位机给启动信号

{

while(!

D);//检测上位机命令

RI=0;

TI=0;

delay2ms(100);//当电脑传给T=1时,可跳出循环,开始新一轮的测量数据,并发送上一次测量数据T=0;while(!

T);

unit();

Read();//读并整理出相对湿度值和温度值

LCD1602_unit();//初始化lcd1602

LCD1602_display();//显示

uart_unit();

sent_byte();

//运行一次后停止

}

}

/*-----------------------中断服务函数-------------------------------*/

voiduart()interrupt4//串行中断号为4

{

if(RI==1)

D=SBUF;//将T置1或0

RI=0;

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

当前位置:首页 > 高中教育 > 其它课程

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

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