亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码
標(biāo)題:
單片機(jī)澆花系統(tǒng)Proteus仿真程序
[打印本頁(yè)]
作者:
1236222
時(shí)間:
2021-5-6 11:25
標(biāo)題:
單片機(jī)澆花系統(tǒng)Proteus仿真程序
本設(shè)計(jì)是基于AT89C51單片機(jī)和ADC0832的自動(dòng)澆花系統(tǒng)。本設(shè)計(jì)的電路內(nèi)部包含濕度采集和AD轉(zhuǎn)換等主要功能。自動(dòng)澆水系統(tǒng)設(shè)計(jì)的澆水部分是通過(guò)單片機(jī)程序設(shè)計(jì)澆水的上下限值與感應(yīng)電路送入單片機(jī)的土壤濕度值相比較,當(dāng)?shù)陀谙孪拗禃r(shí),單片機(jī)輸出一個(gè)信號(hào)控制澆水,高于上限值時(shí)再由單片機(jī)輸出一個(gè)信號(hào)控制停止?jié)菜_@樣可以幫助人們及時(shí)地給心愛(ài)的盆花澆水
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.png
(20.31 KB, 下載次數(shù): 47)
下載附件
2021-5-6 17:37 上傳
單片機(jī)源程序如下:
//程序頭函數(shù)
#include <reg52.h>
#include <intrins.h> //包含頭文件
//顯示函數(shù)
#include <display.h>
#include "eeprom52.h"
//宏定義
#define uint unsigned int
#define uchar unsigned char
//管腳聲明
sbit LED_R= P2^2; //紅色指示燈
sbit LED_G= P2^0; //綠色指示燈
sbit FENG = P2^5; //蜂鳴器
sbit CS = P1^4;
sbit Clk = P1^2;
sbit DATI = P1^3;
sbit DATO = P1^3; //ADC0832引腳
sbit san=P3^4; //繼電器
//按鍵
sbit Key1=P2^6;
sbit Key2=P2^7;
sbit Key3=P3^7;
/*******************************定義全局變量********************************/
unsigned char dat = 0; //AD值
unsigned char CH=0; //通道變量
unsigned int sum=0; //平均值計(jì)算時(shí)的總數(shù)
unsigned char m=0;
bit bdata flag; //定義位變量
uchar set; //設(shè)置變量
uchar full_range=153; //滿量程AD數(shù)值
//函數(shù)聲明
extern void Key();
//濕度值變量
uint temp=0;
char MH=80,ML=20; //上下限變量
/******************把數(shù)據(jù)保存到單片機(jī)內(nèi)部eeprom中******************/
void write_eeprom()
{
SectorErase(0x2000);
byte_write(0x2000, MH);
byte_write(0x2001, ML);
byte_write(0x2060, a_a);
}
/******************把數(shù)據(jù)從單片機(jī)內(nèi)部eeprom中讀出來(lái)*****************/
void read_eeprom()
{
MH = byte_read(0x2000);
ML = byte_read(0x2001);
a_a = byte_read(0x2060);
}
/**************開機(jī)自檢eeprom初始化*****************/
void init_eeprom()
{
read_eeprom(); //先讀
if(a_a != 1) //新的單片機(jī)初始單片機(jī)內(nèi)問(wèn)eeprom
{
MH = 80;
ML = 20;
a_a = 1;
write_eeprom(); //保存數(shù)據(jù)
}
}
/****************************************************************************
函數(shù)功能:AD轉(zhuǎn)換子程序
入口參數(shù):CH
出口參數(shù):dat
****************************************************************************/
unsigned char adc0832(unsigned char CH)
{
unsigned char i,test,adval;
adval = 0x00;
test = 0x00;
Clk = 0; //初始化
DATI = 1;
_nop_();
CS = 0;
_nop_();
Clk = 1;
_nop_();
if ( CH == 0x00 ) //通道選擇
{
Clk = 0;
DATI = 1; //通道0的第一位
_nop_();
Clk = 1;
_nop_();
Clk = 0;
DATI = 0; //通道0的第二位
_nop_();
Clk = 1;
_nop_();
}
else
{
Clk = 0;
DATI = 1; //通道1的第一位
_nop_();
Clk = 1;
_nop_();
Clk = 0;
DATI = 1; //通道1的第二位
_nop_();
Clk = 1;
_nop_();
}
Clk = 0;
DATI = 1;
for( i = 0;i < 8;i++ ) //讀取前8位的值
{
_nop_();
adval <<= 1;
Clk = 1;
_nop_();
Clk = 0;
if (DATO)
adval |= 0x01;
else
adval |= 0x00;
}
for (i = 0; i < 8; i++) //讀取后8位的值
{
test >>= 1;
if (DATO)
test |= 0x80;
else
test |= 0x00;
_nop_();
Clk = 1;
_nop_();
Clk = 0;
}
if (adval == test) //比較前8位與后8位的值,如果不相同舍去。若一直出現(xiàn)顯示為零,請(qǐng)將該行去掉
dat = test;
nop_();
CS = 1; //釋放ADC0832
DATO = 1;
Clk = 1;
return dat;
}
void init() //定時(shí)器初始化函數(shù)
{
TMOD=0x01; //定時(shí)器工作方式
TL0=0xb0;
TH0=0x3c; //賦初值50ms
EA=1; //打開中斷總開關(guān)
ET0=1; //打開定時(shí)器0中斷允許開關(guān)
TR0=1; //打開定時(shí)器0定時(shí)開關(guān)
}
void main() //主函數(shù)
{
Init1602(); //初始化液晶函數(shù)
init(); //初始化定時(shí)器
init_eeprom(); //開始初始化保存的數(shù)據(jù)
while(1) //進(jìn)入循環(huán)
{
for(m=0;m<50;m++) //讀50次AD值
sum = adc0832(0)+sum; //讀到的AD值,將讀到的數(shù)據(jù)累加到sum
temp=sum/50; //跳出上面的for循環(huán)后,將累加的總數(shù)除以50得到平均值temp
sum=0; //平均值計(jì)算完成后,將總數(shù)清零
if(temp<=full_range) //讀取的AD數(shù)值小于滿量程數(shù)值
temp=(temp*100)/full_range; //除以滿量程數(shù)值,得到百分比
else //如果大于
temp=100; //直接賦值100%
if(set==0) //set為0,說(shuō)明現(xiàn)在不是設(shè)置狀態(tài)
Display_1602(temp,MH,ML); //顯示AD數(shù)值和報(bào)警值
if(temp<ML&&set==0) //AD數(shù)值小于報(bào)警值
{
flag=1; //打開報(bào)警
san=0; //打開繼電器
LED_G=1; //綠燈熄滅
LED_R=0; //紅燈點(diǎn)亮
}
else if(temp>MH&&set==0)//AD值大于報(bào)警值
{
flag=0; //關(guān)閉報(bào)警
san=1; //關(guān)閉繼電器
LED_G=0; //綠燈點(diǎn)亮
LED_R=1; //紅燈熄滅
}
else
{
flag=0; //關(guān)閉報(bào)警
LED_G=0; //綠燈點(diǎn)亮
LED_R=1; //紅燈熄滅
}
Key(); //調(diào)用按鍵函數(shù)
}
}
void Key() //按鍵函數(shù)
{
if(Key1==0) //設(shè)置鍵按下
{
while(Key1==0); //按鍵松開
FENG=0; //蜂鳴器響
set++; //設(shè)置變量加
flag=0; //關(guān)閉報(bào)警
TR0=0; //關(guān)閉定時(shí)器
}
if(set==1) //設(shè)置報(bào)警值時(shí)
{
write_com(0x80+0x40+4);//位置
write_com(0x0f);//打開顯示 無(wú)光標(biāo) 光標(biāo)閃爍
FENG=1; //關(guān)閉蜂鳴器
}
if(set==2) //設(shè)置報(bào)警值時(shí)
{
write_com(0x80+0x40+14);//位置
write_com(0x0f);//打開顯示 無(wú)光標(biāo) 光標(biāo)閃爍
FENG=1; //關(guān)閉蜂鳴器
}
else if(set>=3) //設(shè)置完成時(shí)
{
set=0; //變量清零
write_com(0x38);//屏幕初始化
write_com(0x0c);//打開顯示 無(wú)光標(biāo) 無(wú)光標(biāo)閃爍
FENG=1; //關(guān)閉蜂鳴器
flag=1; //打開報(bào)警
TR0=1; //打開定時(shí)器
}
if(Key2==0&&set!=0) //設(shè)置報(bào)警值時(shí)加鍵按下
{
while(Key2==0); //按鍵松開
FENG=0; //打開蜂鳴器
if(set==1)
{
MH++; //報(bào)警值加
if(MH>99) //最大加到99
MH=ML+1; //上限=下限+1
write_com(0x80+0x40+3); //選中液晶屏上的第二行第3列
write_data('0'+MH/10);
write_data('0'+MH%10); //顯示上限數(shù)值
write_com(0x80+0x40+4);//閃爍位置
FENG=1; //關(guān)閉蜂鳴器
}
if(set==2)
{
ML++; //報(bào)警值加
if(ML>=MH&&MH<99) //下限值大于上限并且上限小于99時(shí)
MH=ML+1; //上限=下限+1
if(ML>98) //下限加到大于98
ML=0; //下限清零
write_com(0x80+0x40+3); //選中液晶屏上的第二行第3列
write_data('0'+MH/10);
write_data('0'+MH%10);
write_com(0x80+0x40+13); //選中液晶屏上的第二行第13列
write_data('0'+ML/10);
write_data('0'+ML%10);
write_com(0x80+0x40+14);//閃爍位置
FENG=1; //關(guān)閉蜂鳴器
}
write_eeprom(); //保存數(shù)據(jù)
}
if(Key3==0&&set!=0) //注釋同加按鍵
{
while(Key3==0);
FENG=0;
if(set==1)
{
MH--; //上限值減
if(MH<=ML&&ML>0) //上限小于下限且下限大于0時(shí)
ML=MH-1; //下限=上限-1
if(MH<1) //上限小于1時(shí)
MH=99; //上限賦值99
write_com(0x80+0x40+3); //選中液晶屏上的第二行第3列
write_data('0'+MH/10);
write_data('0'+MH%10);
write_com(0x80+0x40+13); //選中液晶屏上的第二行第13列
write_data('0'+ML/10);
write_data('0'+ML%10);
write_com(0x80+0x40+4);//閃爍位置
FENG=1; //關(guān)閉蜂鳴器
}
if(set==2)
{
ML--; //下限值減
if(ML<0) //小于0時(shí)
ML=MH-1; //下限-上限-1
write_com(0x80+0x40+13); //選中液晶屏上的第二行第13列
write_data('0'+ML/10);
write_data('0'+ML%10);
write_com(0x80+0x40+14);//閃爍位置
FENG=1; //關(guān)閉蜂鳴器
}
write_eeprom(); //保存數(shù)據(jù)
}
}
void time1_int(void) interrupt 1 //定時(shí)器工作函數(shù)
{
uchar count; //定義計(jì)時(shí)變量
TL0=0xb0;
TH0=0x3c; //重新賦初值50ms
count++; //變量加一次就是50ms
if(count==10) //加到10次就是500ms
{
if(flag==0) //flag=0時(shí),也就是不開啟報(bào)警
FENG=1; //關(guān)閉蜂鳴器
if(flag==1) //flag為1時(shí),也就是打開報(bào)警
FENG=0; //打開蜂鳴器
}
if(count==20) //計(jì)數(shù)20次,就是1s
{ //在1s時(shí),紅綠燈都是熄滅狀態(tài),蜂鳴器也是關(guān)閉狀態(tài),可以達(dá)到閃爍的目的
count=0; //變量清零
if(flag==0) //不是報(bào)警狀態(tài)時(shí)
FENG=1;
if(flag==1) //報(bào)警狀態(tài)時(shí)
FENG=1;
}
}
復(fù)制代碼
所有資料51hei提供下載(Proteus7.5仿真才能打開哦):
澆花系統(tǒng).7z
(423.66 KB, 下載次數(shù): 62)
2021-5-6 17:38 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
作者:
行吧好的沒(méi)問(wèn)題
時(shí)間:
2021-5-12 16:37
澆水的模塊呢
歡迎光臨 (http://www.denmoz.com/bbs/)
Powered by Discuz! X3.1