基于51单片机的智能窗户设计 下载本文

附(二):PCB板

24

附(三):程序

#include #include

#define uint unsigned int #define uchar unsigned char sbit BEEP=P3^4; uint tnum=0;

uchar num[10]=\

/*************************************************/ //DHT11温度传感器程序模块

/*************************************************/ sbit TRH=P1^4;//温湿度传感器DHT11数据接入 uint TH_data,TL_data,RH_data,RL_data,CK_data; uint TH_temp,TL_temp,RH_temp,RL_temp,CK_temp; uint com_data,untemp,temp;

uint respond,WEN,SHI; // 温度、湿度、?

/*************************************************/ //5us级延时程序

/*************************************************/ void delay_us() {

_nop_();_nop_();_nop_();_nop_();_nop_(); }

void delay_ms(unsigned x ) {

unsigned char i; while(x--) {

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

_nop_(); _nop_(); _nop_(); _nop_(); } } }

/************************************************/ //收发信号检测,数据读取????????

/*************************************************/ char receive() {

uint i;

com_data=0;

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

25

respond=2; //?

while((!TRH)&&respond++); //没数据接入就延时 delay_us(); delay_us(); delay_us();

if(TRH) //有数据接入 {

temp=1; respond=2;

while((TRH)&&respond++); } else temp=0;

com_data<<=1;

com_data|=temp; }

return(com_data); }

/********************************************/ //湿度读取子程序

//温度高8位== TL_data //温度低8位== TH_data //湿度高8位== RH_data //湿度低8位== RH_data //校验 8位 == CK_data

//调用的程序有 delay_ms();, Delay_5us();,RECEIVE(); /*******************************************/ void read_TRH() {

//主机拉低18ms TRH=0;

delay_ms(18); TRH=1;

//DATA总线由上拉电阻拉高 主机延时20us delay_us(); delay_us(); delay_us(); delay_us();

//主机设为输入 判断从机响应信号 TRH=1;

//判断DHT11是否有低电平响应信号 如不响应则跳出,响应则向下运行 if(!TRH) {

respond=2;

//判断DHT11发出 80us 的低电平响应信号是否结束 while((!TRH)&& respond++);

26

respond=2;

//判断从机是否发出 80us 的高电平,如发出则进入数据接收状态 while(TRH && respond++); //数据接收状态 RH_temp = receive(); RL_temp = receive(); TH_temp = receive(); TL_temp = receive(); CK_temp = receive(); TRH=1; //数据校验

untemp=(RH_temp+RL_temp+TH_temp+TL_temp); if(untemp==CK_temp) {

RH_data = RH_temp; RL_data = RL_temp; TH_data = TH_temp; TL_data = TL_temp; CK_data = CK_temp; }

WEN=TH_data; SHI=RH_data; } }

/*************************************************/ //LCD12864液晶显示程序模块

/*************************************************/ sbit RS=P2^0; sbit RW=P2^1; sbit E=P2^2;

#define LCD_DATA P0 /*----写命令到 LCD---*/

void LCD_WriteCom(unsigned char command) {

RS=0; RW=0;

// delay_ms(1); E=1;

LCD_DATA=command;

delay_ms(1);//////////////////// 在数据写入的时候加入适当的延时 E=0;

// delay_ms(1); }

/*----写数据到 LCD---*/

void LCD_WriteDat(unsigned char date) {

27