版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、/头文件#include <STC12C5A60S2.h>#include <intrins.h>#include <key.h> #include <adc0804.h> #include <lcd1602.h> #include <DHT11.h> #define uchar unsigned char #define uint unsigned intuint HIGH,LOW;uchar flag=0;uchar dj_flag=0;uchar countt;char level=0;uint HHH=0;sbit
2、 beep=P23;uchar counter1=0;uchar counter11=1;uchar num11=0;int W=40;int S=80;int G=200;void key() if(K1=0) /K1 menu counter11+; if(counter11>3) counter11=0; while(K1=0); if(counter11=0) lcd_xy_puts(4,0," ");lcd_xy_puts(10,0," ");lcd_xy_puts(5,1," ");if(K3=0) flag=0;l
3、cd_init(); if(counter11=1)/设置W值 lcd_xy_puts(4,0,"<");lcd_xy_puts(10,0," ");lcd_xy_puts(5,1," "); if(K2=0) /K2 + W=W+1; if(W>99)W=99; while(K2=0); if(K3=0) /K3 - W=W-1; if(W<1)W=0; while(K3=0); if(counter11=2)/设置S值 lcd_xy_puts(4,0," ");lcd_xy_puts(10,0
4、,"<");lcd_xy_puts(5,1," "); if(K2=0) /K2 + S=S+1; if(S>99)S=99; while(K2=0); if(K3=0) /K3 - S=S-1; if(S<1)S=0; while(K3=0); if(counter11=3)/设置H值 lcd_xy_puts(4,0," ");lcd_xy_puts(10,0," ");lcd_xy_puts(5,1,"<"); if(K2=0) /K2 + G=G+10; if(G&
5、gt;990)G=990; while(K2=0); if(K3=0) /K3 - G=G-10; if(G<10)G=0; while(K3=0); uchar i,j;uint dianya1,dianya2,dianya3;void main(void) K1=K2=K3=1; lcd_init(); dj_flag=10; counter11=0; W=30;S=50;G=200; JDQ1=JDQ2=1; while(1) /温度检测处理与显示 dianya1 = DHT11_Tem(); dianya1=dianya1%100; lcd_xy_puts(0,0,"W
6、D:"); lcd_goto_xy(3,0);lcd_number(dianya1%100/10); lcd_number(dianya1%10); /湿度数据读取与转换 dianya2 = DHT11_Hum(); dianya2=dianya2%100; lcd_xy_puts(8,0,"SD:"); lcd_goto_xy(11,0);lcd_number(dianya2%100/10); lcd_number(dianya2%10); /光线数据读取与转换 ad0804(); dianya3=(num*jizhun/256)*100; /123 lcd_x
7、y_puts(0,1,"GX:"); lcd_goto_xy(3,1);lcd_number(dianya3%1000/100); lcd_number(dianya3%100/10); lcd_number(dianya3%10); if(K1=0) flag+;if(flag>1) flag=0;/lcd_init(); while(K1=0); if(flag=1) lcd_init(); while(flag=1) lcd_xy_puts(0,0,"W-");lcd_goto_xy(2,0);lcd_number(W/10); lcd_nu
8、mber(W%10);lcd_xy_puts(6,0,"S-");lcd_goto_xy(8,0);lcd_number(S/10); lcd_number(S%10);lcd_xy_puts(0,1,"G-");lcd_goto_xy(2,1);lcd_number(G%1000/100);lcd_number(G%100/10); lcd_number(G%10); key(); if(dianya1>W) beep=LED1=JDQ1=0;LED2=LED3=1; else if(dianya2>S) beep=LED2=JDQ1=0;
9、LED1=LED3=1; else if(dianya3>G) beep=JDQ2=LED3=0;LED2=LED1=1; else beep=LED1=LED2=LED3=JDQ2=JDQ1=1; Key:#ifndef _key_H_#define _key_H_#define uchar unsigned char#define uint unsigned intsbit K1=P33;sbit K2=P34;sbit K3=P35;sbit LED1=P22;sbit LED2=P21;sbit LED3=P20;sbit JDQ1=P37;/温度 湿度sbit JDQ2=P24
10、;/光线void delay1(uint a)/数码管显示部分延时函数 unsigned int i; while( -a != 0) for(i = 0; i < 200; i+); /一个 ; 表示空语句,CPU空转。 /i 从0加到125,CPU大概就耗时1毫秒 #endifDHT11:#ifndef _DHT11_H_ #define_DHT11_H_ #define uchar unsigned char #define uint unsigned int /*/ /* 引 脚 定 义 */ /*/ sbit DHT = P36; /管脚定义,DHT11总线输入输出; /*/
11、/* 变 量 定 义 */ /*/ uchar RH,RL,TH,TL; uchar data_byte; uchar Tem_Z,Tem_X,Hum_Z,Hum_X,Check; uint DHT11_num=0; void delays19ms()/12.000MHz unsigned char i, j, k; i = 1; j = 222; k = 197; do do while (-k); while (-j); while (-i); /延时ius void delay10us() unsigned char i; i = 27; while (-i); /*主机发出开始信号*/
12、 void DHT11_Start() DHT=1; delay10us(); DHT=0; delays19ms(); /保持电平时间大于18ms,延时20ms DHT=1; delay10us(); /延迟等待20-40us,延时20us delay10us(); delay10us(); delay10us(); DHT=1; /拉高等待DHT11响应 /DHT11接收一个字节数据 uchar receive_data() uchar i,temp,count; data_byte=0; for(i=0;i<8;i+) count=2; while(!DHT)&&c
13、ount+); /等待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; return data_byte; /返回读取值 /D
14、HT11接收数据 void Rec_DHT()/声明Rec_DHT,DHT11接收数据函数 uchar flag; uchar T_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=
15、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; unsigned char DHT11_Hum()/返回湿度整数 unsigned
16、 char Get_back_num; Rec_DHT(); Get_back_num = Hum_Z ; return Get_back_num; unsigned char DHT11_Tem()/返回温度整数 unsigned char Get_back_num; Rec_DHT(); Get_back_num = Tem_Z ; return Get_back_num; #endifLCD1602:#ifndef _lcd1602_H_ #define_lcd1602_H_ #include <intrins.h>#define uchar unsigned char #d
17、efine uint unsigned intsbit rs= P25;sbit rw = P26;sbit ep = P27;code uchar LCDnumber="0123456789"/* - 函数名称:delayus(); - 功能描述:延时1us左右 - 隶属模块:延时公共函数模块 - 函数属性:外部,用户可调用 - 参数说明:uint a为1us的多少倍设置参数 - 返回说明:无 */void delayus(uint a) /延时1us左右uchar b;for(;a>0;a-)for(b=12;b>0;b-);bit lcd_bz()bit
18、result;rs = 0;rw = 1;ep = 1;delayus(20);result = (bit)(P0 & 0x80);ep = 0;return result;void lcd_wcmd(unsigned char cmd)while(lcd_bz();/判断LCD是否忙碌rs = 0;rw = 0;ep = 0;delayus(20);P0 = cmd;delayus(20);ep = 1;delayus(20);ep = 0;void lcd_wdat(unsigned char dat)while(lcd_bz();/判断LCD是否忙碌rs = 1;rw = 0;e
19、p = 0;delayus(20);P0 = dat;delayus(20);ep = 1;delayus(20);ep = 0;/ 设置显示位置(即写入显示地址),x,y均从0开始 4行液晶显示 void lcd_goto_xy(unsigned char x, unsigned char y) unsigned char p; / p为字符显示位置,即DDRAM中的地址 if (y=0) p = 0x00 + x; / (0,0)显示位置为0x00 if (y=1) p=0x40+x; / (0,1)显示位置为0x40 if (y=2) p=0x10+x; / (0,2)显示位置为0x10
20、 if (y=3) p = 0x50 + x; / (0,3)显示位置为0x50 lcd_wcmd(p + 0x80); / 写入显示地址时DB7须为高电平,加0x80 void lcd_putc(unsigned char c) / 写字符(传入的参数实际为所需显示字符的地址,即液晶字符产生器中字符的地址) rw = 0; / RW置0,状态为写 rs = 1; / RS置1,写入数据 lcd_wdat(c); void lcd_puts(unsigned char *s) / 写字符串函数 while(*s) lcd_wdat(*s); s+; /* 函数名称: display_char*
21、 入口参数:x(unsigned char型),y(unsigned char型),dat(unsigned char型)* 出口参数:无* 功能描述: 在具体位置显示单个字符,x是列号,y是行号*/void lcd_xy_putc(unsigned char x,unsigned char y,unsigned char dat) lcd_goto_xy(x,y); lcd_wdat(dat);/* 函数名称: display_string* 入口参数:x(unsigned char型),y(unsigned char型),s(指针型)* 出口参数:无* 功能描述: 在具体位置显示字符串,以
22、/0结束,x是列号,y是行号*/void lcd_xy_puts(unsigned char x,unsigned char y,unsigned char *s) lcd_goto_xy(x,y); while(*s) lcd_wdat(*s); s+; void lcd_number(unsigned char a) /变量数字显示 rw = 0; / RW置0,状态为写 rs = 1; / RS置1,写入数据 lcd_wdat(LCDnumbera); void lcd_init()lcd_wcmd(0x38);delayus(5);lcd_wcmd(0x0c);delayus(5);lcd_wcmd(0x06);delayus(5);lcd_wcmd(0x01);delayus(5); #endifADC0804:#ifn
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论