單片機士壤濕度1602 自動澆花系統里面包含論文各種資料
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
單片機源程序如下:
- #include<reg51.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit ad_cs=P1^3; //ADC0832的控制位
- sbit ad_clk=P1^0;
- sbit ad_dat=P1^1;
- sbit lcd_rs=P3^0; //LCD1602的控制位
- sbit lcd_e=P3^1;
- sbit key1=P1^4; //獨立按鍵
- sbit key2=P3^2;
- sbit key3=P3^3;
- sbit relay=P1^6; //繼電器
- bit flag=1; //工作模式標志
- bit flag_motor=1; //手動模式下,抽水機開關標志
- bit flag_jia=0;
- bit flag_jian=0;
- uchar Hum_H=60; //自動模式下,濕度設定最大值
- uchar Hum_L=30; //自動模式下,濕度設定最小值
- uchar num=0;
- /********************延時函數1ms*****************
- void delay_ms(uint a)
- {
- uint i;
- while(a--)
- for(i=0;i<125;i++);
- }
- *************************************/
- /*******************延時函數50us******************/
- void delay_50us(uint a)
- {
- uint i;
- while(a--)
- for(i=0;i<19;i++);
- }
- /*************************************/
- /*******************ADC讀取******************/
- uchar read_ad(uchar channel)
- {
- uchar i;
- uchar dat1,dat2;
- ad_clk=0;
- ad_cs=0;
- ad_dat=1;
- ad_clk=1;
- ad_clk=0; //起始信號
- ad_dat=1;
- ad_clk=1;
- ad_clk=0; //選擇單通道模式
- ad_dat=channel;//0對應通道0,1對應通道1
- ad_clk=1;
- ad_clk=0;
- ad_dat=1;
- for(i=0;i<8;++i)
- {
- ad_clk=1;
- ad_clk=0;
- dat1=dat1<<1;
- if(ad_dat)
- dat1|=0x01;
-
- }
- for(i=0;i<8;i++)
- {
- dat2=dat2>>1;
- if(ad_dat)
- dat2|=0x80;
-
- ad_clk=1;
- ad_clk=0;
- }
- ad_cs=1;
- return (dat1==dat2)?dat1:0;
-
- }
- /*************************************/
- /*******************LCD1602初始化******************/
- void write_com(uchar com) //寫指令
- {
- lcd_e=0;
- lcd_rs=0;
- P0=com;
- delay_50us(10);
- lcd_e=1;
- delay_50us(10);
- lcd_e=0;
- }
- void write_data(uchar dat) //寫數據
- {
- lcd_e=0;
- lcd_rs=1;
- P0=dat;
- delay_50us(10);
- lcd_e=1;
- delay_50us(10);
- lcd_e=0;
- }
- void init_lcd1602() //lcd 初始化
- {
- delay_50us(300);
- write_com(0x38);
- delay_50us(100);
- write_com(0x38);
- delay_50us(100);
- write_com(0x38);
- write_com(0x38);
- write_com(0x08);
- write_com(0x01);
- write_com(0x06);
- write_com(0x0c);
- }
- void display_shu(uchar add,uchar dat) //顯示數字
- {
- uchar l,m;
-
- // k=dat/100;
- l=dat%100/10;
- m=dat%10;
- write_com(0x80+add);
- // write_data(k+0x30);
- write_data(l+0x30);
- write_data(m+0x30);
- }
- void display_string(uchar add,uchar *dat) //顯示字符串
- {
- uchar i;
- write_com(0x80+add);
- while(dat!=0&&(*dat!='\0')&&i<16)
- {
- write_data(*dat);
- dat++;
- i++;
- if(i==15) i=0;
- }
- }
- /*****************************************/
- /****************主函數*******************/
- void main()
- {
- EA=1; //開總中斷
- EX0=1; //開外部中斷0
- EX1=1; //開外部中斷1
- IT0=0; //外部中斷0觸發方式為低電平
- IT1=0; //外部中斷1觸發方式為低電平
-
- init_lcd1602();
- // relay=0;
- display_string(0,"Hum: %"); //實時顯示當前的濕度
- display_string(11,"H: %"); //顯示設置的濕度最大值
- display_string(0x40,"Mode:"); //顯示工作模式
- display_string(0x40+11,"L: %"); //顯示設置的濕度最小值
- while(1)
- {
- uchar i;
-
- i=100-read_ad(0)*0.39;
- display_shu(4,i);
- display_shu(13,Hum_H);
- display_shu(0x40+13,Hum_L);
- if(key1==0)
- {
- delay_50us(100);
- if(key1==0)
- {
- while(!key1);
- num++;
- if(num>2) num=0;
- }
-
- switch (num) //選擇工作模式和調整濕度設置最大、最小值
- {
- case 0:flag=~flag;
- flag_jia=0;
- flag_jian=0;
- //write_com(0x80+0x40);
- //write_com(0x0f);
- break;
- case 1://write_com(0x80+9);
- //write_com(0x0f);
- //delay_50us(1000);
- //write_com(0x0c);
- flag_jia=1;
- flag_jian=0;
- break;
- case 2://write_com(0x80+0x40+9);
- //write_com(0x0f);
- //delay_50us(1000);
- //write_com(0x0c);
- flag_jian=1;
- flag_jia=0;
- break;
- }
- if(flag==0&&num==1)
- {
- flag=~flag;
- num=0;
- flag_jia=0;
- flag_jian=0;
- }
- }
- if(flag==0) //手動模式
- {
-
- display_string(0x40+5,"MT");
- // if(flag_motor) relay=1;
- if(i<=Hum_H) relay=1; //不能超過濕度最大值
- else relay=0;
- }
- else //自動模式
- {
- display_string(0x40+5,"AT");
- // if(i<(Hum_L+Hum_H)/2) //最大和最小值的平均值作為抽水的判斷條件
- if(i<=Hum_L)
- {
- relay=1; //繼電器閉合低電平有效
- }
- else
- relay=0; //繼電器斷開
- }
- }
- }
- /********************************************/
- /***********************外部中斷*********************/
- void int0() interrupt 0
- {
- delay_50us(20);
- if(key2==0)
- while(!key2);
- flag_motor=~flag_motor;
- if(flag&&flag_jia)
- {
- //write_com(0x80+9);
- //write_com(0x0f);
- //delay_50us(1000);
- //write_com(0x0c);
- //delay_50us(1000);
- Hum_H++;
- if(Hum_H>=99) Hum_H=99;
- }
- if(flag&&flag_jian)
- {
- //write_com(0x80+0x40+9);
- //write_com(0x0f);
- //delay_50us(1000);
- //write_com(0x0c);
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
單片機士壤濕度1602 自動澆花系統.7z
(2.95 MB, 下載次數: 180)
2019-1-21 02:51 上傳
點擊文件名下載附件
|