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

  • 格式:doc
  • 大小:47.50 KB
  • 文档页数:6

#include

#include

#include

typedef unsigned char uchar;

typedef unsigned int uint;

void unit();

void delay2ms(uint M);

void delay2xus(uchar m);

uchar read_onebyte();

void Read();

void write_com(uchar com);

void write_data(uchar D);

void LCD1602_unit(); //初始化lcd1602

void LCD1602_display();

void uart_unit();

void sent_byte();

uchar DATA[5];

sbit led=P0^3;

sbit led3=P0^0;

uchar D=1;

sbit DQ=P2^7;

sbit lcd_rs=P3^3;

sbit lcd_rw=P3^4;

sbit lcd_en=P3^5;

uchar RH_H,RH_L,T_H,T_L,CHECK;

float RH,T;

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

void delay2xus(uchar m)

{while(--m);

}

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

void delay2ms(uint M)

{

uint i,j,k;

for(k=0;k

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

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

}

}

}

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

void unit()

{ 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开始信号是否开始

}

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

uchar read_onebyte()

{ uchar i;

uchar flag;

uchar byte=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信号

}

return byte; //返回8位数据

}

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

void Read()

{

uchar j,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写指令函数--------------------------------------------*/

void write_com(uchar com)

{

lcd_rs=0; //声明是指令

P1=com;

delay2ms(5);

lcd_en=1; //下降沿有效

delay2ms(5);

lcd_en=0;

}

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

void write_data(uchar D)

{

lcd_rs=1; //声明是数据

P1=D;

delay2ms(5);

lcd_en=1; //下降沿有效

delay2ms(5);

lcd_en=0;

}

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

void LCD1602_unit()

{ lcd_rw=0; //声明是写操作

write_com(0x80); //清屏

write_com(0x06); //光标右移,字符不动

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

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

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

void LCD1602_display()

{

uchar who[2];

uchar i;

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

uchar str2[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]);

}

}

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

void uart_unit()

{

TMOD|=0x20; //启动timer1,mode2,8bit自动重装

PCON=0x00; //波特率正常,即SMOD=0

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

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

TL1=0xf3;

TR1=1; //打开总中断

ES=1; //打开timer1

EA=1; //打开串行中断

}

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

void sent_byte() { uchar c;

uchar sent[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); //延时补偿

}

}

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

主函数

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

void main()

{ 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(); //显示