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; //溫濕度傳感器數(shù)據(jù)線
- 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)//延時函數(shù),有參函數(shù)
- {
- uint x,y;
- for(x=xms;x>0;x--)
- for(y=124;y>0;y--);
- }
- //****液晶寫入指令函數(shù)****//
- void write_1602com(uchar com)
- {
- rs=0;//數(shù)據(jù)/指令選擇置為指令
- P0=com;//送入數(shù)據(jù)
- delay_1ms(1);
- en=1;//拉高使能端,為制造有效的下降沿做準備
- delay_1ms(1);
- en=0;//en由高變低,產生下降沿,液晶執(zhí)行命令
- }
- //***液晶寫入數(shù)據(jù)函數(shù)****//
- void write_1602dat(uchar dat)
- {
- rs=1;//數(shù)據(jù)/指令選擇置為數(shù)據(jù)
- P0=dat;//送入數(shù)據(jù)
- delay_1ms(1);
- en=1; //en置高電平,為制造下降沿做準備
- delay_1ms(1);
- en=0; //en由高變低,產生下降沿,液晶執(zhí)行命令
- }
- //***液晶初始化函數(shù)****//
- void lcd_init()
- {
- write_1602com(0x38);//設置液晶工作模式,意思:16*2行顯示,5*7點陣,8位數(shù)據(jù)
- 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 讀一個字節(jié)函數(shù)******************/
- uchar read_byte()
- {
- uchar value,i;
- for(i=0;i<8;i++) //一個字節(jié)有八位 所以用for循環(huán)
- {
- value=value<<1; //從字節(jié)高位開始讀 需要移位
- while(DHT==0);
- delay_10us();
- delay_10us();
- delay_10us();
- if(DHT) //判斷讀到是“1”還是“0”
- {
- value=value|0x01; //如果是“1” value的值就要加一
- while(DHT!=0) //等待這一位數(shù)據(jù)結束 因為70us的高電平表示“1”
- { //
- DHT=1;
- }
- }
- }
- return value; //返回讀到的這一字節(jié)數(shù)據(jù)
- }
- /*****************溫濕度傳感器DHT11 讀數(shù)據(jù)函數(shù)******************/
- /**一個完整的數(shù)據(jù)一共是五個字節(jié)******************/
- 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();//將讀到的五個字節(jié)數(shù)據(jù)放到數(shù)組read_data【5】中
- }
- }
- }
- /**********處理讀到的溫濕度數(shù)據(jù)******************/
- void pro_value()
- {
- read_value();
- temp=read_data[0]+read_data[1]+read_data[2]+read_data[3];
- if(read_data[4]==temp) //檢測讀到的數(shù)據(jù)是否正確
- {
- shiZ=read_data[0]; //濕度整數(shù)部分
- wenZ=read_data[2]; // 溫度整數(shù)部分
- }
- tate[0]=wenZ/10; //將溫濕度的整數(shù)部分的十位和個位分開
- tate[1]=wenZ%10; //分開后的數(shù)據(jù)存放在數(shù)組tate【4】中 以供lcd顯示
- tate[2]=shiZ/10;
- tate[3]=shiZ%10;
- }
- /********** 報警處理函數(shù)******************/
- void baojing()
- {
- if((set_data[2]<shiZ)||(set_data[3]>shiZ)) //判斷是否有報警 如果有就進入函數(shù) 然后再判斷具體是哪個值報警
- {
- 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 //沒有報警情況的出現(xiàn)
- {
- speak=1; //蜂鳴器不響
- JK1=1;
- JK2=1; //
- JK3=1;
- JK4=1;
- }
-
- }
- /**********顯示函數(shù)******************/
- 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();
- }
- }
- /**********主函數(shù)******************/
- void main()
- {
- lcd_init();
- pros_Sdata();
- while(1)
- {
- key();
- if(flog4==0)
- {
- pro_value();
- display2();
- baojing();
- }
- }
- }
復制代碼
所有資料51hei提供下載:
基于AT89S52的盆栽助長器的設計.zip
(6.53 MB, 下載次數(shù): 106)
2020-6-26 18:17 上傳
點擊文件名下載附件
|