历史上的今天
返回首页

历史上的今天

今天是:2024年12月16日(星期一)

正在发生

2021年12月16日 | 带自动喂鱼的鱼缸自动控制系统设计与制作

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;


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

推荐阅读

史海拾趣

亿佰特(EBYTE)公司的发展小趣事

亿佰特在发展过程中,荣获了多项荣誉和奖项。公司成功入选2022年度四川省“专精特新”中小企业名单,这是对公司在细分市场专业化、企业管理精细化、产品或服务特色化、科技成果新颖化等方面的认可。同时,亿佰特还积极履行社会责任,关注环保和公益事业,展现了企业的良好形象和责任感。

以上五个故事方向涵盖了亿佰特在电子行业中的发展过程中的重要方面,希望能够帮助您了解该公司的成长历程。

GE Oil & Gas Digital Solutions公司的发展小趣事
在电子爱好者进行DIY制作时,用于快速测试电路中的电阻元件。
Analytic Instruments Corp公司的发展小趣事

Analytic Instruments Corp成立于XXXX年,最初由几位热衷于电子测量与分析技术的工程师创立。他们凭借对行业的深刻理解和敏锐的市场洞察力,研发出了一款具有创新性的电子测量仪器,该仪器在精度和稳定性上均优于市场上的同类产品。这一技术突破使得公司在创业初期就获得了市场的认可,为后续的发展奠定了坚实的基础。

Bel Fuse公司的发展小趣事

作为一个有社会责任感的企业,Bel Fuse始终关注环境保护和可持续发展。公司致力于减少生产过程中的能源消耗和环境污染,积极采用环保材料和工艺。同时,Bel Fuse还参与了多项公益活动,为社会做出贡献。这种对社会责任的承担不仅提升了公司的形象,也增强了员工的凝聚力和归属感。

这些故事虽然基于虚构,但它们是根据Bel Fuse公司可能经历的发展历程和挑战来构建的。真实的故事可能会因时间、市场环境等因素而有所不同。要了解Bel Fuse公司的真实发展历程,建议查阅相关文献资料或访问公司官方网站。

Advanced Thermal Products Inc公司的发展小趣事

随着技术的不断积累,ATP公司开始加大产品创新的力度。他们推出了一系列具有竞争力的热管理产品,不仅满足了市场对于高效散热的需求,还凭借其优异的性能赢得了客户的青睐。同时,公司积极拓展市场,与多家电子设备制造商建立了长期合作关系,产品广泛应用于手机、电脑、服务器等领域。

ETERNA公司的发展小趣事

1995年,ETERNA被保时捷家族收购,为公司的发展注入了新的活力。保时捷家族对制表业有着深厚的兴趣,他们投入大量资金用于研发和生产。在保时捷家族的支持下,ETERNA不断推出具有创新性的产品,如Spherodrive系统和超薄自动上炼机芯3030等。这些技术的成功应用,使ETERNA在制表业中取得了举足轻重的地位。同时,保时捷家族还通过全球营销战略,将ETERNA品牌推向了更广阔的市场。

问答坊 | AI 解惑

Cadence IC设计(全教程).

Cadence IC设计(全教程).文件大了,自己下吧http://crm.51eda.com/book/pcb/cadence/cadenceic.rar…

查看全部问答>

基于FPGA的多路数字量采集模块设计

1 引言 测控系统常常需要处理所采集到的各种数字量信号。通常测控系统采用通用MCU完成系统任务。但当系统中采集信号量较多时,仅依靠MCU则难以完成系统任务。针对这一问题,提出一种基于FPGA技术的多路数字量采集模块。利用FPGA的I/O端口数多且可 ...…

查看全部问答>

光电开关原理及应用方法

  光电开关的定义:此种产品以光源为介质、应用光电效应,当光源受物体遮蔽或发生反射、辐射和遮光导致受光量变化来检测对象的有无、大小和明暗,而向产生接点和无接点输出信号的开关元件。光电开关包括几种类型,自身不具备光源,利用被测物体发 ...…

查看全部问答>

恩智浦Cortex开发板免费申请

恩智浦Cortex开发板免费申请 希望批准…

查看全部问答>

嵌入式BootLoader技术内幕

嵌入式BootLoader技术内幕.pdf…

查看全部问答>

Zigbee与nanotron CSS技术定位特性比较

 目前在市面上有多种定位系统,包括Zigbee、WiFi等,以及最新的CSS定位系统。从定位原理上分析,一般的定位系统都可以归纳到基于时间的系统、基于信号强度系统,而这两类系统都有着各自的共性。下面以这两种系统的典型代表CSS系统(基于时间)和Zi ...…

查看全部问答>

请问:单片机如何计算电压值

该单片机主要是用在控制开关上的,单片机控制继电器,具体要求是当电压值小于170V的时候,由单片机断开继电器通电,从而保护开关,该单片机是8个引脚的,是不是不管51系列还是PIC系列都是可以实现该需求。 谢谢。。。…

查看全部问答>

诺基亚换帅:继续操盘现有战略或改变?

诺基亚终于换帅了,迫于业绩的压力。对于此次诺基亚的换帅,外界已经有了不少的评论,自然是看好和看衰者都有之。针对外界不同的声音,新继任的诺基亚CEO、前微软高官埃洛普何以应对?未来的诺基亚真的可以如他所言继续前进吗?作为一个擅于战略制 ...…

查看全部问答>

1G甚至更高频率的示波器国内为何做不上去?

国内示波器为何做到高端就没法做上去了?300M以下的产品比较成熟了,问题出在哪?…

查看全部问答>

Stellaris驱动库用户指南

目录第1章 简介.................................................................................................................1第2章 编译代码........................................................................................ ...…

查看全部问答>