带自动喂鱼的鱼缸自动控制系统设计与制作

发布者:火箭少年最新更新时间:2021-12-16 来源: eefocus 手机看文章 扫描二维码
随时随地手机看文章

经常好几天不在家,一直想做一个自动喂鱼的东西,在网上找了很久,就看到一个用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    //低温指示灯   

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15


C语言参考源代码 如下:


#include


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((h6)&(m0)&(s0))

{

dianji();

}

if(K10)

{

DelayMs(20);

if(K10)

{

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{

LcdWriteData(num1[i]);

delay_ms(1);

}

LcdWriteCom(0x80+0x40);//第二行显示

j=strlen(num2);

for(i=0; 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_choise0)

{

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_temperature0)//增加温度

{

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_temperature0)//减少温度

{

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_temperature0)//增加温度

{

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_temperature0)//减少温度

{

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;


鉴于篇幅有限,只能写部分代码

引用地址:带自动喂鱼的鱼缸自动控制系统设计与制作

上一篇:单片机锂电池容量测试仪设计制作
下一篇:单片机做的半导体制冷小冰箱

小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved