华北水利水电大学毕业设计
附录Ⅱ 汇编源程序
/*头文件*/
#include
#define yh 0x80 //LCD第一行的初始位置 #define er 0x80+0x40 //LCD第二行初始位置 sbit DHT=P1^2; //温湿度传感器数据线 sbit set_key=P1^5; //“设置”键 K1 sbit add_key=P1^6; //“加”键 K2 sbit cut_key=P1^7; // “减”键 K3 sbit mode_key=P1^4; // “模式”键 K3 sbit key=P1^3; // “报警”键 K3 sbit speak=P3^7; // 蜂鸣器 sbit led=P3^6; // led sbit rs=P1^0; sbit en=P1^1; unsigned char shiZ,check; uchar temp,a;
uchar code tab1[]={\ %\显示的固定字符 uchar code tab2[]={\ %\显示的固定字符 uchar set_deta=60; uchar set_deta1=40; uchar XX[2]; uchar tate[2];
uchar read_data[5]; uchar flog4;
void delay_10us() { uchar i; i--;i--;i--;i--;i--;i--; }
void delay_1ms(uint xms)//延时函数,有参函数 { uint x,y; for(x=xms;x>0;x--) for(y=124;y>0;y--); }
//****液晶写入指令函数****// void write_1602com(uchar com)
{
39
华北水利水电大学毕业设计
rs=0;//数据/指令选择置为指令 P0=com;//送入数据 delay_1ms(1); en=1;//拉高使能端,为制造有效的下降沿做准备 delay_1ms(1); en=0;//en由高变低,产生下降沿,液晶执行命令 }
//***液晶写入数据函数****// void write_1602dat(uchar dat) { rs=1;//数据/指令选择置为数据 P0=dat;//送入数据 delay_1ms(1); en=1; //en置高电平,为制造下降沿做准备 delay_1ms(1); en=0; //en由高变低,产生下降沿,液晶执行命令 }
//***液晶初始化函数****// void lcd_init() { write_1602com(0x38);//设置液晶工作模式,意思:16*2行显示,5*7点阵,8位数据 write_1602com(0x0c);//开显示不显示光标 write_1602com(0x06);//整屏不移动,光标自动右移 write_1602com(0x01);//清显示 write_1602com(er+0); for(a=0;a<7;a++) { write_1602dat(tab2[a]); } write_1602com(yh+0); for(a=0;a<5;a++) { write_1602dat(tab1[a]); } }
/*****************温湿度传感器DHT11 读一个字节函数******************/ uchar read_byte() { uchar value,i; for(i=0;i<8;i++) //一个字节有八位 所以用for循环 { value=value<<1; //从字节高位开始读 需要移位 while(DHT==0);
40
华北水利水电大学毕业设计
delay_10us(); delay_10us(); delay_10us(); if(DHT) //判断读到是“1”还是“0” { value=value|0x01; //如果是“1” value的值就要加一 while(DHT!=0) //等待这一位数据结束 因为70us的高电平表示“1” { // DHT=1; } } } return value; //返回读到的这一字节数据 }
/*****************温湿度传感器DHT11 读数据函数******************/ /**一个完整的数据一共是五个字节******************/ void read_value() { uchar i; DHT=0; delay_1ms(20); DHT=1; delay_10us(); delay_10us(); delay_10us(); delay_10us(); if(DHT==0) { while(DHT!=1); DHT=1; while(DHT==1); for(i=0;i<5;i++) { read_data[i]=read_byte();//将读到的五个字节数据放到数组read_data【5】中 } } }
/**********处理读到的温湿度数据******************/ void pro_value() { read_value(); temp=read_data[0]+read_data[1]+read_data[2]+read_data[3]; if(read_data[4]==temp) //检测读到的数据是否正确 {
41
华北水利水电大学毕业设计
shiZ=read_data[0]; //湿度整数部分 } tate[0]=shiZ/10; //将湿度的整数部分的十位和个位分开 tate[1]=shiZ; write_1602com(yh+2); for(a=0;a<2;a++) { write_1602dat(tate[a]+0x30); } }
void pros_data() { XX[0]=set_deta/10; XX[1]=set_deta; write_1602com(er+4); for(a=0;a<2;a++) { write_1602dat(XX[a]+0x30); } }
void display1() //设置显示 {
pros_data(); }
void display2() //设置显示 {
write_1602com(er+4); write_1602dat(set_deta1/10+0x30); write_1602com(er+5); write_1602dat(set_deta1+0x30); }
void key_caa() { if(set_key==0) { delay_1ms(5); if(set_key==0) { flog4=!flog4; while(set_key==0); } } if(flog4==1)
42
华北水利水电大学毕业设计
{ if(add_key==0) { delay_1ms(5); if(add_key==0) { set_deta=set_deta+1; while(add_key==0); if(set_deta>99) { set_deta=99; } } } if(cut_key==0) { delay_1ms(5); if(cut_key==0) { set_deta=set_deta-1; while(cut_key==0); if(set_deta<=0) { set_deta=0; } } } display1(); } }
void baojing() { if(key==0) { delay_1ms(5); if(key==0) { speak=0; led=1; while(key==0); } } else
43