實驗五
- 實驗名稱
溫室盆栽灌溉系統(tǒng)
軟件設(shè)計:
1. 定義對應(yīng)的引腳和端口的別名。
2. 編寫延時函數(shù),用于控制程序的執(zhí)行速度。
3. 編寫LCD控制函數(shù),包括發(fā)送命令和發(fā)送數(shù)據(jù)兩種操作。
4. 編寫顯示函數(shù),用于在LCD上顯示字符串。
5. 編寫獲取AD轉(zhuǎn)換結(jié)果的函數(shù),用于測量環(huán)境濕度。
6. 編寫顯示百分比的函數(shù),用于在LCD上顯示濕度百分比。
7. 編寫按鍵掃描函數(shù),用于檢測按鍵的狀態(tài)。
8. 在主函數(shù)中,初始化LCD顯示屏,并顯示初始界面。
9. 進入主循環(huán),不斷執(zhí)行以下操作:
???a. 掃描按鍵,根據(jù)按鍵的狀態(tài)更新標(biāo)準(zhǔn)濕度值。
???b. 根據(jù)當(dāng)前選擇的花卉類型,顯示相應(yīng)的花卉名稱。
???c. 獲取環(huán)境濕度,并計算百分比。
???d. 在LCD上顯示當(dāng)前濕度百分比和標(biāo)準(zhǔn)濕度。
???e. 根據(jù)濕度與標(biāo)準(zhǔn)濕度的比較結(jié)果,控制水泵、風(fēng)機和LED燈的狀態(tài)。
具體:
- delay函數(shù)實現(xiàn)了一個簡單的延遲函數(shù),n為延遲的時間,具體延遲的時間可以通過調(diào)整循環(huán)的次數(shù)來實現(xiàn)。
- lcd_cmd函數(shù)用于發(fā)送命令到液晶顯示屏。a為要發(fā)送的命令值,將它賦給P0端口,然后將RS置為0以表示發(fā)送命令,將EN置為1以啟動命令傳輸,延遲一段時間后將EN置為0以停止傳輸。
- lcd_data函數(shù)用于向液晶顯示屏發(fā)送數(shù)據(jù)。和lcd_cmd函數(shù)相似,不同之處在于將RS置為1以表示發(fā)送數(shù)據(jù)。
- display函數(shù)用于在液晶顯示屏上顯示字符串。通過指針ptr遍歷字符串,對每個字符調(diào)用lcd_data函數(shù)進行顯示。
- delay_10us函數(shù)用于微秒級別的延遲。通過循環(huán)次數(shù)來實現(xiàn)延遲。
- 利用`display_percentage`函數(shù)來將溫度值轉(zhuǎn)換成字符串,并顯示百分比值。
??1.將芯片代碼進行編譯測試,結(jié)果正確無任何錯誤
2.生成HEX文件,放入AT89C51芯片中運行硬件電路。
3.不同花卉的閾值濕度和土壤濕度:
六、軟件源碼
#include<reg51.h>
#include<intrins.h>
typedef unsigned char u8;
typedef unsigned int u16;
sbit RS=P2^0;
sbit RW=P2^1;
sbit EN=P2^2;
sbit CS=P3^0;
sbit CLK=P3^1;
sbit DIO=P3^2;
sbit D_STD=P1^0;
sbit P_STD=P1^1;
sbit R_STD=P1^2;
sbit INC=P1^3;
sbit DEC=P1^7;
sbit FMQ=P2^3;
sbit LED_RED=P2^4;
sbit WATER=P2^5;
#define LCD P0
void delay_10us(u16 ten_us)
{
while(ten_us--);
}文章來源地址http://www.zghlxwxcb.cn/news/detail-808647.html
void delay(int n)
{
int i,j;
for(i=0;i<n;i++)
for(j=0;j<255;j++);
}文章來源:http://www.zghlxwxcb.cn/news/detail-808647.html
void lcd_cmd(char a)
{
LCD = a;
RS = 0;
EN = 1;
delay(10);
EN = 0;
}
void lcd_data(char a)
{
LCD = a;
RS = 1;
EN = 1;
delay(10);
EN = 0;
}
void display(char *ptr)
{
while(*ptr != '\0')
{
lcd_data(*ptr);
ptr++;
}
}
u8 getADRes()
{
u8 i, data1=0, data2=0;
CS=0;
CLK=0;DIO=1;_nop_();
CLK=1;_nop_();
CLK=0;DIO=1;_nop_();
CLK=1;_nop_();
CLK=0;DIO=0;_nop_();
CLK=1;_nop_();
CLK=0;DIO=1;_nop_();
for(i=0; i<8; i++)
{
CLK=1;_nop_();
CLK=0;_nop_();
data1=(data1<<1)|(u8)DIO;
}
for(i=0; i<8; i++)
{
data2=data2|(u8)DIO<<i;
CLK=1;_nop_();
CLK=0;_nop_();
}
CS=1;
return(data1==data2)?data1:0;
}
void display_percentage(u8 value)
{
u8 temp[3];
temp[0]=value/100+'0';
temp[1]=value%100/10+'0';
temp[2]=value%100%10+'0';
if(temp[0]=='1')lcd_data(temp[0]);
lcd_data(temp[1]);
lcd_data(temp[2]);
lcd_data('%');
}
u8 key_scan(u8 mode)
{
u8 key=1;
if(mode)key=1;
if(key==1&&(D_STD==0||P_STD==0||R_STD==0||INC==0||DEC==0))
{
delay_10us(1000);
key=0;
if(D_STD==0)
return 0;
else if(P_STD==0)
return 1;
else if(R_STD==0)
return 2;
else if(INC==0)
return 3;
else if(DEC==0)
return 4;
}
else if(D_STD==1&&P_STD==1&&R_STD==1&&INC==1&&DEC==1)
{
key=1;
}
return 5;
}
void main()
{
u8 value=0, index=0, key_value=0;
char standard[3]={40, 50, 30};
RW=0;
WATER=0;
FMQ=1;
LED_RED=0;
lcd_cmd(0x01); //clear screen
lcd_cmd(0x0E); //Display On, Cursor Blinking
lcd_cmd(0x38); //2 lines and 5*7 matrix
lcd_cmd(0x80); //Force Cursor to beginning of first
display("shuixianhua");
lcd_cmd(0xC0);
display("N:");
lcd_cmd(0xC8);
display("S:");
while(1)
{
key_value=key_scan(0);
if(key_value==3){
standard[index]++;
if(standard[index]>100)standard[index]=100;
}else if(key_value==4){
standard[index]--;
if(standard[index]<0)standard[index]=0;
}else if(key_value>=0&&key_value<=2){
index=key_value;
}
switch(index){
case 0: lcd_cmd(0x80);
display("shuixianhua");
break;
case 1: lcd_cmd(0x80);
display("mudanhua");
break;
case 2: lcd_cmd(0x80);
display("meiguihua");
break;
}
lcd_cmd(0xC2);
value=getADRes()*100/255;
display_percentage(value);
lcd_cmd(0xCA);
display_percentage(standard[index]);
if(value<standard[index]){
WATER=1;
FMQ=0;
LED_RED=1;
}else{
WATER=0;
FMQ=1;
LED_RED=0;
}
}
}
六、軟件源碼
#include<reg51.h>
#include<intrins.h>
typedef unsigned char u8;
typedef unsigned int u16;
sbit RS=P2^0;
sbit RW=P2^1;
sbit EN=P2^2;
sbit CS=P3^0;
sbit CLK=P3^1;
sbit DIO=P3^2;
sbit D_STD=P1^0;
sbit P_STD=P1^1;
sbit R_STD=P1^2;
sbit INC=P1^3;
sbit DEC=P1^7;
sbit FMQ=P2^3;
sbit LED_RED=P2^4;
sbit WATER=P2^5;
#define LCD P0
void delay_10us(u16 ten_us)
{
while(ten_us--);
}
void delay(int n)
{
int i,j;
for(i=0;i<n;i++)
for(j=0;j<255;j++);
}
void lcd_cmd(char a)
{
LCD = a;
RS = 0;
EN = 1;
delay(10);
EN = 0;
}
void lcd_data(char a)
{
LCD = a;
RS = 1;
EN = 1;
delay(10);
EN = 0;
}
void display(char *ptr)
{
while(*ptr != '\0')
{
lcd_data(*ptr);
ptr++;
}
}
u8 getADRes()
{
u8 i, data1=0, data2=0;
CS=0;
CLK=0;DIO=1;_nop_();
CLK=1;_nop_();
CLK=0;DIO=1;_nop_();
CLK=1;_nop_();
CLK=0;DIO=0;_nop_();
CLK=1;_nop_();
CLK=0;DIO=1;_nop_();
for(i=0; i<8; i++)
{
CLK=1;_nop_();
CLK=0;_nop_();
data1=(data1<<1)|(u8)DIO;
}
for(i=0; i<8; i++)
{
data2=data2|(u8)DIO<<i;
CLK=1;_nop_();
CLK=0;_nop_();
}
CS=1;
return(data1==data2)?data1:0;
}
void display_percentage(u8 value)
{
u8 temp[3];
temp[0]=value/100+'0';
temp[1]=value%100/10+'0';
temp[2]=value%100%10+'0';
if(temp[0]=='1')lcd_data(temp[0]);
lcd_data(temp[1]);
lcd_data(temp[2]);
lcd_data('%');
}
u8 key_scan(u8 mode)
{
u8 key=1;
if(mode)key=1;
if(key==1&&(D_STD==0||P_STD==0||R_STD==0||INC==0||DEC==0))
{
delay_10us(1000);
key=0;
if(D_STD==0)
return 0;
else if(P_STD==0)
return 1;
else if(R_STD==0)
return 2;
else if(INC==0)
return 3;
else if(DEC==0)
return 4;
}
else if(D_STD==1&&P_STD==1&&R_STD==1&&INC==1&&DEC==1)
{
key=1;
}
return 5;
}
void main()
{
u8 value=0, index=0, key_value=0;
char standard[3]={40, 50, 30};
RW=0;
WATER=0;
FMQ=1;
LED_RED=0;
lcd_cmd(0x01); //clear screen
lcd_cmd(0x0E); //Display On, Cursor Blinking
lcd_cmd(0x38); //2 lines and 5*7 matrix
lcd_cmd(0x80); //Force Cursor to beginning of first
display("shuixianhua");
lcd_cmd(0xC0);
display("N:");
lcd_cmd(0xC8);
display("S:");
while(1)
{
key_value=key_scan(0);
if(key_value==3){
standard[index]++;
if(standard[index]>100)standard[index]=100;
}else if(key_value==4){
standard[index]--;
if(standard[index]<0)standard[index]=0;
}else if(key_value>=0&&key_value<=2){
index=key_value;
}
switch(index){
case 0: lcd_cmd(0x80);
display("shuixianhua");
break;
case 1: lcd_cmd(0x80);
display("mudanhua");
break;
case 2: lcd_cmd(0x80);
display("meiguihua");
break;
}
lcd_cmd(0xC2);
value=getADRes()*100/255;
display_percentage(value);
lcd_cmd(0xCA);
display_percentage(standard[index]);
if(value<standard[index]){
WATER=1;
FMQ=0;
LED_RED=1;
}else{
WATER=0;
FMQ=1;
LED_RED=0;
}
}
}
到了這里,關(guān)于【51單片機Keil+Proteus8.9】溫室盆栽灌溉系統(tǒng)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!