創意設計:帶自動餵魚的魚缸自動控制系統設計與製作 單片機程序 原理圖 源代碼

經常好幾天不在家,一直想做一個自動餵魚的東西,在網上找了很久,就看到一個用15F104W單片機 只用定時器功能定時震動下魚食的,不太喜歡,今天給大家分享一個我自己設計製作,還算比較滿意的小作品。
第一次發帖 不太會啊……

製作出來的實物圖如下:
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

引腳分配 lcd lcddata: P0
lcd_e: P2^7
lcd_rs: P2^6
lcd_rw: P2^5

    設置按鍵    limit_choise:        P    //溫度上下限選擇按鍵
            increase_temperature        P    //增加溫度限值按鍵
            reduce_temperature        P    //減少溫度限值按鍵
    
    蜂鳴器報警    warning        P   

    溫度傳感器    temperature_sensor    P

    制熱    heatting    P

    製冷    refrigerating    P

    LED顯示        normal        P    //正常溫度指示燈
            high_temperature    P    //高溫指示燈
            low_temperature        P    //低溫指示燈   

在這裏插入圖片描述
C語言參考源代碼 如下:

#include <main.h>

void DelayUs(unsigned char tu)
{
while(–tu);
}

void DelayMs(unsigned char tm)
{
while(tm–)
{
DelayUs(248);
DelayUs(248);
}
}

void dianji() //餵魚
{
unsigned int i;
speed=10;
i=3000;
while(i–)
{
A_ON
DelayMs(speed);
AB_ON
DelayMs(speed);
B_ON
DelayMs(speed);
BC_ON
DelayMs(speed);
C_ON
DelayMs(speed);
CD_ON
DelayMs(speed);
D_ON
DelayMs(speed);
DA_ON
DelayMs(speed);
}
ABCD_OFF
}
void dianji_shoudong() //手動餵魚
{
unsigned int i;
speed=10;
i=500;
while(i–)
{
A_ON
DelayMs(speed);
AB_ON
DelayMs(speed);
B_ON
DelayMs(speed);
BC_ON
DelayMs(speed);
C_ON
DelayMs(speed);
CD_ON
DelayMs(speed);
D_ON
DelayMs(speed);
DA_ON
DelayMs(speed);
}
ABCD_OFF
}
void Timer0Init()
{
TMOD|=0X01;
TH0=0xB8; //11.0592M晶振 定時20ms
TL0=0x00;
ET0=1;
EA=1;
TR0=1;
}

void main()//主函數
{
init();//初始化函數
K1=1;
XIAODU=1;
YANGQI=1;
BENG=1;
Timer0Init();
while(1)
{
temp_control();//控制按鍵函數
unnormal_proccessing(get_temp(Ds18b20ReadTemp()),up_limit_temp,down_limit_temp);//恆溫控制函數
if((h0)&(m0)&(s5))BENG=0; if((h3)&(m0)&(s0))BENG=1;
if((h4)&(m0)&(s0))BENG=0; if((h7)&(m0)&(s0))BENG=1;
if((h8)&(m0)&(s0))BENG=0; if((h11)&(m0)&(s0))BENG=1;
if(BENG1)
{
YANGQI=0;
XIAODU=1;
}
else
{
YANGQI=1;
XIAODU=0;
}
if((h
6)&(m0)&(s0))
{
dianji();
}
if(K10)
{
DelayMs(20);
if(K1
0)
{
dianji_shoudong();
}
}
}
}

void init()//初始化函數
{
uint i,j;
//函數初始化
LcdInit();//LCD初始化函數
Ds18b20Init();

//I/O口初始化
heatting=1;//不制熱
refrigerating=1;//不製冷
normal=1;//正常溫度指示燈不顯示
unnormal=1;//不正常溫度指示燈不顯示
warning=1;//蜂鳴器不報警

//LCD初始化顯示
LcdWriteCom(0x80);//第一行顯示
j=strlen(num1);
for(i=0; i<j; i++)
{
LcdWriteData(num1[i]);
delay_ms(1);
}
LcdWriteCom(0x80+0x40);//第二行顯示
j=strlen(num2);
for(i=0; i<j; i++)
{
LcdWriteData(num2[i]);
delay_ms(1);
}
LcdWriteCom(0x04); //關閉寫一個指針加1
}

uint get_temp(uint temp)//計算溫度函數
{
float tp;

tp=temp;//因爲數據處理有小數點所以將溫度賦給一個浮點型變量
//如果溫度是正的那麼,那麼正數的原碼就是補碼它本身
temp=tp0.0625100+0.5;
//留兩個小數點就*100,+0.5是四捨五入,因爲C語言浮點數轉換爲整型的時候把小數點
//後面的數自動去掉,不管是否大於0.5,而+0.5之後大於0.5的就是進1了,小於0.5的就
//算加上0.5,還是在小數點後面。
return temp;
}

void display_real_tenp(uint temp)//實時溫度顯示函數
{
uchar datas[] = {0, 0, 0, 0}; //定義數組

datas[0] = temp % 10000 / 1000;
datas[1] = temp % 1000 / 100;
datas[2] = temp % 100 / 10;
datas[3] = temp % 10;

LcdWriteCom(0x80+0x0a); //寫地址 80表示初始地址
LcdWriteData(‘0’+datas[0]); //十位

LcdWriteCom(0x80+0x0b); //寫地址 80表示初始地址
LcdWriteData(‘0’+datas[1]); //個位

LcdWriteCom(0x80+0x0d); //寫地址 80表示初始地址
LcdWriteData(‘0’+datas[2]); //顯示小數點

LcdWriteCom(0x80+0x0e); //寫地址 80表示初始地址
LcdWriteData(‘0’+datas[3]); //顯示小數點

}

void temp_control()//控制溫度上下限函數
{
if(limit_choise0)//選擇按鍵
{
delay_ms(5);
if(limit_choise
0)
{
while(!limit_choise);
limit_choise_num++;
if(limit_choise_num>=3)
{
limit_choise_num=0;
}
}
}
if(limit_choise_num==0)//正常顯示
{
LcdWriteCom(0x0c);//關閉光標
display_real_tenp(get_temp(Ds18b20ReadTemp()));//顯示函數
}

if(limit_choise_num1)//調節上限溫度
{
LcdWriteCom(0x80+0X40+2);
LcdWriteCom(0x0f);//開啓光標
if(increase_temperature
0)//增加溫度
{
delay_ms(5);
if(increase_temperature0)
{
while(!increase_temperature);
up_limit_temp++;
if(up_limit_temp>=100)
{
up_limit_temp=0;
}
//寫入新數據
LcdWriteCom(0x80+0X40+0x03);
LcdWriteData(‘0’+up_limit_temp/10);
LcdWriteCom(0x80+0X40+0x04);
LcdWriteData(‘0’+up_limit_temp%10);
LcdWriteCom(0x80+0X40+2);//光標回寫
}
}
if(reduce_temperature
0)//減少溫度
{
delay_ms(5);
if(reduce_temperature==0)
{
while(!reduce_temperature);
up_limit_temp–;
if(up_limit_temp<0)
{
up_limit_temp=99;
}
//寫入新數據
LcdWriteCom(0x80+0X40+0x03);
LcdWriteData(‘0’+up_limit_temp/10);
LcdWriteCom(0x80+0X40+0x04);
LcdWriteData(‘0’+up_limit_temp%10);
LcdWriteCom(0x80+0X40+2);//光標回寫
}
}
}

if(limit_choise_num2)//調節下限溫度
{
LcdWriteCom(0x80+0X40+12);
LcdWriteCom(0x0f);//開啓光標
if(increase_temperature
0)//增加溫度
{
delay_ms(5);
if(increase_temperature0)
{
while(!increase_temperature);
down_limit_temp++;
if(down_limit_temp>=100)
{
down_limit_temp=0;
}
//寫入新數據
LcdWriteCom(0x80+0X40+0x0d);
LcdWriteData(‘0’+down_limit_temp/10);
LcdWriteCom(0x80+0X40+0x0e);
LcdWriteData(‘0’+down_limit_temp%10);
LcdWriteCom(0x80+0X40+12);//光標回寫
}
}
if(reduce_temperature
0)//減少溫度
{
delay_ms(5);
if(reduce_temperature==0)
{
while(!reduce_temperature);
down_limit_temp–;
if(down_limit_temp<0)
{
down_limit_temp=99;
}
//寫入新數據
LcdWriteCom(0x80+0X40+0x0d);
LcdWriteData(‘0’+down_limit_temp/10);
LcdWriteCom(0x80+0X40+0x0e);
LcdWriteData(‘0’+down_limit_temp%10);
LcdWriteCom(0x80+0X40+12);//光標回寫
}
}
}
}

void unnormal_proccessing(uint temp,uint up_temp,uint down_temp)//恆溫控制函數
{
uchar datas[] = {0, 0, 0, 0}; //定義數組
uint temp1=0;

datas[0] = temp % 10000 / 1000;
datas[1] = temp % 1000 / 100;
datas[2] = temp % 100 / 10;
datas[3] = temp % 10;
temp1=datas[0]*1000+datas[1]*100+datas[2]*10+datas[3];//實際的溫度乘以100

if(temp1 < down_temp*100)//升溫函數
{
heatting=0;//制熱
refrigerating=1;//不製冷

unnormal=0;//不正常溫度指示燈顯示
normal=1;//正常溫度指示燈不顯示

//蜂鳴器報警
//warning=0;
//delay_ms(10);
//warning=1;
}
else if(temp1 > up_temp*100)//降溫函數
{
heatting=1;//不制熱
refrigerating=0;//製冷

unnormal=0;//不正常溫度指示燈顯示
normal=1;//正常溫度指示燈不顯示

//蜂鳴器報警
// warning=0;
// delay_ms(10);
// warning=1;
}
else//正常
{
heatting=1;//不制熱
refrigerating=1;//不製冷

unnormal=1;//不正常溫度指示燈不顯示
normal=0;//正常溫度指示燈顯示

//蜂鳴器不報警
// warning=1;
}
}
void Time0() interrupt 1
{
static u8 i;
TH0=0xB8; //11.0592M晶振 定時20ms
TL0=0x00;
i++;
if(i>=50) //1秒時間到
{
i=0;

鑑於篇幅有限,只能寫部分代碼

最後,如果有什麼意見或者建議歡迎您留言給我,讓我們共同學習一起進步,
本博客所有技術文件目前全部開源下載 ,如果需要完整代碼或設計文件,請加簡介中QQ羣自行下載 或者私信我下載鏈接
謝謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章