tft每日頭條

 > 科技

 > 基于單片機智能魚缸控制設計

基于單片機智能魚缸控制設計

科技 更新时间:2024-12-28 04:24:12

各位小夥伴大家好,考研的事總算告一段落了,最近有點難受去醫院一查,呀,好像有點神經衰弱,幹什麼都有點力不從心,熱心的護士小姐姐給我測量了體溫查看健康碼一氣呵成,然後順利進入了醫院。回到家喂了一下魚感覺有點麻煩,于是就有了自動喂魚器這個想法。在網上找了很久,就看到一個用15F104W單片機 隻用定時器功能定時震動下魚食的,不太喜歡,今天給大家分享一個我自己設計制作,還算比較滿意的小作品。

單片機電路原理圖如下:可能有點醜啊

基于單片機智能魚缸控制設計(自動喂魚的魚缸自動控制系統設計與制作)1

基于單片機智能魚缸控制設計(自動喂魚的魚缸自動控制系統設計與制作)2

手繪電路圖:

基于單片機智能魚缸控制設計(自動喂魚的魚缸自動控制系統設計與制作)3

控制端口分配:

引腳分配 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 //低溫指示燈

基于單片機智能魚缸控制設計(自動喂魚的魚缸自動控制系統設計與制作)4

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((h==0)&(m==0)&(s==5))BENG=0; if((h==3)&(m==0)&(s==0))BENG=1;

if((h==4)&(m==0)&(s==0))BENG=0; if((h==7)&(m==0)&(s==0))BENG=1;

if((h==8)&(m==0)&(s==0))BENG=0; if((h==11)&(m==0)&(s==0))BENG=1;

if(BENG==1)

{

YANGQI=0;

XIAODU=1;

}

else

{

YANGQI=1;

XIAODU=0;

}

if((h==6)&(m==0)&(s==0))

{

dianji();

}

if(K1==0)

{

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=tp*0.0625*100 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_choise==0)//選擇按鍵

{

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_num==1)//調節上限溫度

{

LcdWriteCom(0x80 0X40 2);

LcdWriteCom(0x0f);//開啟光标

if(increase_temperature==0)//增加溫度

{

delay_ms(5);

if(increase_temperature==0)

{

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);

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);

LcdWriteCom(0x80 0X40 2);//光标回寫

}

}

}

if(limit_choise_num==2)//調節下限溫度

{

LcdWriteCom(0x80 0X40 12);

LcdWriteCom(0x0f);//開啟光标

if(increase_temperature==0)//增加溫度

{

delay_ms(5);

if(increase_temperature==0)

{

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);

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);

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;

鑒于篇幅限制,隻能寫部分代碼

最後,如果有什麼意見或者建議歡迎您留言給我,讓我們共同學習一起進步,

如果需要 完整代碼或設計文件,請在下方留言或者私信我,看到後會第一時間回複。

謝謝!

感謝你的閱讀,希望您有所收獲,喜歡請點贊評論加關注!

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关科技资讯推荐

热门科技资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved