仿真版本:Proteus8.6及以上版本
程序編譯:Keil5 C51
編程語(yǔ)言:C語(yǔ)言
設(shè)計(jì)編號(hào):【S01】
1.? 簡(jiǎn)介
? 本文提出了一種基于51單片機(jī)的智能澆花系統(tǒng)設(shè)計(jì)。該設(shè)計(jì)以AT89C51單片機(jī)和ADC0832組成系統(tǒng)的核心部分,濕度傳感器將采集到的數(shù)據(jù)直接傳送到ADC0832的IN端作為輸入的模擬信號(hào)。單片機(jī)需要采集數(shù)據(jù)時(shí),發(fā)出指令啟動(dòng)A/D轉(zhuǎn)換器工作,ADC0832根據(jù)送來(lái)的地址信號(hào)選通IN1通道,然后對(duì)輸入的模擬信號(hào)進(jìn)行轉(zhuǎn)換,最后,單片機(jī)把采集到的濕度數(shù)據(jù)經(jīng)過(guò)軟件程序處理后送到LCD1602進(jìn)行顯示。智能澆水部分是通過(guò)單片機(jī)程序設(shè)計(jì)澆水的上下限值與感應(yīng)電路送入單片機(jī)的土壤濕度值相比較,當(dāng)?shù)陀谙孪拗禃r(shí),單片機(jī)輸出一個(gè)信號(hào)控制澆水,高于上限值時(shí)再由單片機(jī)輸出一個(gè)信號(hào)控制停止?jié)菜?/span>
2.? 主要功能
a.通過(guò)LCD1602顯示當(dāng)前溫濕度信息。
b.通過(guò)按鍵對(duì)溫濕度的上下限值進(jìn)行設(shè)置。
c.通過(guò)DS18B20溫度傳感器提供溫度信息,滑動(dòng)變阻器模擬濕度信息。
d.當(dāng)溫度高于上限值或濕度低于下限值時(shí),蜂鳴器報(bào)警,電機(jī)轉(zhuǎn)動(dòng),啟動(dòng)澆水。
3.? 源程序(Keil5)
本設(shè)計(jì)采用keil5 C51軟件(內(nèi)附安裝包)實(shí)現(xiàn)程序設(shè)計(jì)。如需用keil4打開(kāi)程序,可自行通過(guò).c和.h文件新建工程即可。
#include <reg52.h> //調(diào)用單片機(jī)頭文件
#define uchar unsigned char //無(wú)符號(hào)字符型 宏定義 變量范圍0~255
#define uint unsigned int //無(wú)符號(hào)整型 宏定義 變量范圍0~65535
sbit SCL=P1^4; //SCL定義為P1口的第3位腳,連接ADC0832SCL腳
sbit DO=P1^5; //DO定義為P1口的第4位腳,連接ADC0832DO腳
sbit CS=P1^3; //CS定義為P1口的第4位腳,連接ADC0832CS腳
sbit beep = P3^3; //蜂鳴器IO口定義
sbit dq = P1^7; //18b20 IO口的定義
uint temperature ; //溫度的變量
uchar shidu; //濕度等級(jí)
uchar s_high = 70,s_low = 25; //濕度報(bào)警參數(shù)
uint t_high = 50,t_low = 10; //溫度報(bào)警參數(shù)
uchar flag_en = 1,flag_sd,flag_wd;
bit sd_sd; //手動(dòng)模式 的變量
sbit dianji = P1^6; //電機(jī)IO定義
uint flag_250ms ;
uchar key_can; //按鍵值的變量
uchar menu_1; //菜單設(shè)計(jì)的變量
//這三個(gè)引腳參考資料
sbit rs=P1^0; //1602數(shù)據(jù)/命令選擇引腳 H:數(shù)據(jù) L:命令
sbit rw=P1^1; //1602讀寫(xiě)引腳 H:數(shù)據(jù)寄存器 L:指令寄存器
sbit e =P1^2; //1602使能引腳 下降沿觸發(fā)
/********************************************************************
* 名稱 : delay_uint()
* 功能 : 小延時(shí)。
* 輸入 : 無(wú)
* 輸出 : 無(wú)
***********************************************************************/
void delay_uint(uint q)
{
while(q--);
}
/********************************************************************
* 名稱 : write_com(uchar com)
* 功能 : 1602命令函數(shù)
* 輸入 : 輸入的命令值
* 輸出 : 無(wú)
***********************************************************************/
void write_com(uchar com)
{
e=0;
rs=0;
rw=0;
P0=com;
delay_uint(3);
e=1;
delay_uint(25);
e=0;
}
/********************************************************************
* 名稱 : write_data(uchar dat)
* 功能 : 1602寫(xiě)數(shù)據(jù)函數(shù)
* 輸入 : 需要寫(xiě)入1602的數(shù)據(jù)
* 輸出 : 無(wú)
***********************************************************************/
void write_data(uchar dat)
{
e=0;
rs=1;
rw=0;
P0=dat;
delay_uint(3);
e=1;
delay_uint(25);
e=0;
}
/********************************************************************
* 名稱 : write_sfm2(uchar hang,uchar add,uchar date)
* 功能 : 顯示2位十進(jìn)制數(shù),如果要讓第一行,第五個(gè)字符開(kāi)始顯示"23" ,調(diào)用該函數(shù)如下
write_sfm1(1,5,23)
* 輸入 : 行,列,需要輸入1602的數(shù)據(jù)
* 輸出 : 無(wú)
***********************************************************************/
void write_sfm2(uchar hang,uchar add,uint date)
{
if(hang==1)
write_com(0x80+add);
else
write_com(0x80+0x40+add);
write_data(0x30+date/10%10);
write_data(0x30+date%10);
}
/***********************lcd1602上顯示特定的字符************************/
void write_zifu(uchar hang,uchar add,uchar date)
{
if(hang==1)
write_com(0x80+add);
else
write_com(0x80+0x40+add);
write_data(date);
}
/********************************************************************
* 名稱 : write_string(uchar hang,uchar add,uchar *p)
* 功能 : 改變液晶中某位的值,如果要讓第一行,第五個(gè)字符開(kāi)始顯示"ab cd ef" ,調(diào)用該函數(shù)如下
write_string(1,5,"ab cd ef;")
* 輸入 : 行,列,需要輸入1602的數(shù)據(jù)
* 輸出 : 無(wú)
***********************************************************************/
void write_string(uchar hang,uchar add,uchar *p)
{
if(hang==1)
write_com(0x80+add);
else
write_com(0x80+0x40+add);
while(1)
{
if(*p == '