|
Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)
单片机源程序如下:
- /*头文件*/
- #include<reg52.h>
- #include <intrins.h>
- #define uint unsigned int
- #define uchar unsigned char
- #define yh 0x80 //LCD第一行的初始位置
- #define er 0x80+0x40 //LCD第二行初始位置
- sbit DHT=P1^7; //温湿度传感器数据线
- sbit set_key=P1^2; //“设置”键 K1
- sbit add_key=P1^3; //“加”键 K2
- sbit cut_key=P1^4; // “减”键 K3
- sbit rs=P1^0;
- sbit en=P1^1;
- sbit speak=P1^5; // 蜂鸣器
- sbit JK1=P2^3; //加温继电器
- sbit JK2=P2^2; //降温继电器
- sbit JK3=P2^1; //加湿继电器
- sbit JK4=P2^0; //降湿继电器
- unsigned char shiZ,wenZ,check;
- uchar flog4,temp,a;
- uchar code tab1[]={"T: -H: -L: "}; //测量值显示的固定字符
- uchar code tab2[]={"RH: -H: -L: "};//报警值显示的固定字符
- uchar set_data[4]={50,10,70,40}; //报警初始值的设定,分别是 温度上限 下限 湿度上限 下限
- uchar XX[8]={0,0,0,0,0,0,0,0};
- uchar tate[4];
- uchar read_data[5];
- 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)
- {
- 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(yh+0);//日历显示固定符号从第一行第1个位置之后开始显示
- for(a=0;a<14;a++)
- {
- write_1602dat(tab1[a]);//向液晶屏写日历显示的固定符号部分
- }
- write_1602com(er+0);//时间显示固定符号写入位置,从第2个位置后开始显示
- for(a=0;a<15;a++)
- {
- write_1602dat(tab2[a]);//写显示时间固定符号,两个冒号
- }
- }
- /*****************温湿度传感器DHT11 读一个字节函数******************/
- uchar read_byte()
- {
- uchar value,i;
- for(i=0;i<8;i++) //一个字节有八位 所以用for循环
- {
- value=value<<1; //从字节高位开始读 需要移位
- while(DHT==0);
- 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) //检测读到的数据是否正确
- {
- shiZ=read_data[0]; //湿度整数部分
- wenZ=read_data[2]; // 温度整数部分
- }
- tate[0]=wenZ/10; //将温湿度的整数部分的十位和个位分开
- tate[1]=wenZ%10; //分开后的数据存放在数组tate【4】中 以供lcd显示
- tate[2]=shiZ/10;
- tate[3]=shiZ%10;
- }
- /********** 报警处理函数******************/
- void baojing()
- {
- if((set_data[2]<shiZ)||(set_data[3]>shiZ)) //判断是否有报警 如果有就进入函数 然后再判断具体是哪个值报警
- {
- speak=0;
- // if(set_data[0]<wenZ) //如果温度超过上限 降温
- // {
- // JK2=0;
- // }
- // else
- // {
- // JK2=1;
- // }
- // if(set_data[1]>wenZ) //如果温度低于下限 升温
- // {
- // JK1=0;
- // }
- // else
- // {
- // JK1=1;
- // }
- if(set_data[2]<shiZ) //如果湿度超过上限 降湿
- {
- JK4=0;
- }
- else
- {
- JK4=1;
- }
- if(set_data[3]>shiZ) //如果湿度低于下限 加湿
- {
- JK3=0;
- }
- else
- {
- JK3=1;
- }
- }
- else //没有报警情况的出现
- {
- speak=1; //蜂鸣器不响
- JK1=1;
- JK2=1; //
- JK3=1;
- JK4=1;
- }
-
- }
- /**********显示函数******************/
- void display2() //测量显示
- {
- write_1602com(yh+2);
- for(a=0;a<2;a++)
- {
- write_1602dat(tate[a]+0x30);
- }
- write_1602com(er+3);
- for(a=2;a<4;a++)
- {
- write_1602dat(tate[a]+0x30);
- }
- }
- void pros_Sdata()//显示四个报警值
- {
- uchar i;
- for(i=0;i<4;i++)
- {
- XX[2*i]=set_data[i]/10;
- XX[2*i+1]=set_data[i]%10;
- }
- write_1602com(yh+7); //显示温度上限
- for(a=0;a<2;a++)
- {
- write_1602dat(XX[a]+0x30);
- }
- write_1602com(yh+12); //显示温度下限
- for(a=2;a<4;a++)
- {
- write_1602dat(XX[a]+0x30);
- }
- write_1602com(er+8); //显示湿度上限
- for(a=4;a<6;a++)
- {
- write_1602dat(XX[a]+0x30);
- }
- write_1602com(er+13); //显示湿度下限
- for(a=6;a<8;a++)
- {
- write_1602dat(XX[a]+0x30);
- }
- }
- void key()
- {
- if(set_key==0)
- {
- delay_1ms(5);
- if(set_key==0)
- {
- flog4=flog4+1;
- if(flog4>4)
- {
- flog4=0;
- }
- while(set_key==0);
- }
- }
- if(flog4==1) //修改温度上限
- {
- if(add_key==0)
- {
- delay_1ms(5);
- if(add_key==0)
- {
- set_data[0]=set_data[0]+1;
- while(add_key==0);
- if(set_data[0]>99)
- {
- set_data[0]=99;
- }
- }
- }
- if(cut_key==0)
- {
- delay_1ms(5);
- if(cut_key==0)
- {
- set_data[0]=set_data[0]-1;
- while(cut_key==0);
- if(set_data[0]<=0)
- {
- set_data[0]=0;
- }
- }
- }
- pros_Sdata();
- }
- if(flog4==2) //修改温度下限
- {
- if(add_key==0)
- {
- delay_1ms(5);
- if(add_key==0)
- {
- set_data[1]=set_data[1]+1;
- while(add_key==0);
- if(set_data[1]>99)
- {
- set_data[1]=99;
- }
- }
- }
- if(cut_key==0)
- {
- delay_1ms(5);
- if(cut_key==0)
- {
- set_data[1]=set_data[1]-1;
- while(cut_key==0);
- if(set_data[1]<=0)
- {
- set_data[1]=0;
- }
- }
- }
- pros_Sdata();
- }
- if(flog4==3) //修改湿度上限
- {
- if(add_key==0)
- {
- delay_1ms(5);
- if(add_key==0)
- {
- set_data[2]=set_data[2]+1;
- while(add_key==0);
- if(set_data[2]>99)
- {
- set_data[2]=99;
- }
- }
- }
- if(cut_key==0)
- {
- delay_1ms(5);
- if(cut_key==0)
- {
- set_data[2]=set_data[2]-1;
- while(cut_key==0);
- if(set_data[2]<=0)
- {
- set_data[2]=0;
- }
- }
- }
- pros_Sdata();
- }
- if(flog4==4)//修改湿度下限
- {
- if(add_key==0)
- {
- delay_1ms(5);
- if(add_key==0)
- {
- set_data[3]=set_data[3]+1;
- while(add_key==0);
- if(set_data[3]>99)
- {
- set_data[3]=99;
- }
- }
- }
- if(cut_key==0)
- {
- delay_1ms(5);
- if(cut_key==0)
- {
- set_data[3]=set_data[3]-1;
- while(cut_key==0);
- if(set_data[3]<=0)
- {
- set_data[3]=0;
- }
- }
- }
- pros_Sdata();
- }
- }
- /**********主函数******************/
- void main()
- {
- lcd_init();
- pros_Sdata();
- while(1)
- {
- key();
- if(flog4==0)
- {
- pro_value();
- display2();
- baojing();
- }
- }
- }
复制代码
所有资料51hei提供下载:
基于AT89S52的盆栽助长器的设计.zip
(6.53 MB, 下载次数: 101)
|
-
2.PNG
(13.16 KB, 下载次数: 105)
-
1.PNG
(31.08 KB, 下载次数: 103)
|