历史上的今天
今天是: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; 鉴于篇幅有限,只能写部分代码
上一篇:单片机锂电池容量测试仪设计制作
下一篇:单片机做的半导体制冷小冰箱
史海拾趣
|
Cadence IC设计(全教程).文件大了,自己下吧http://crm.51eda.com/book/pcb/cadence/cadenceic.rar… 查看全部问答> |
|
1 引言 测控系统常常需要处理所采集到的各种数字量信号。通常测控系统采用通用MCU完成系统任务。但当系统中采集信号量较多时,仅依靠MCU则难以完成系统任务。针对这一问题,提出一种基于FPGA技术的多路数字量采集模块。利用FPGA的I/O端口数多且可 ...… 查看全部问答> |
|
光电开关的定义:此种产品以光源为介质、应用光电效应,当光源受物体遮蔽或发生反射、辐射和遮光导致受光量变化来检测对象的有无、大小和明暗,而向产生接点和无接点输出信号的开关元件。光电开关包括几种类型,自身不具备光源,利用被测物体发 ...… 查看全部问答> |
|
目前在市面上有多种定位系统,包括Zigbee、WiFi等,以及最新的CSS定位系统。从定位原理上分析,一般的定位系统都可以归纳到基于时间的系统、基于信号强度系统,而这两类系统都有着各自的共性。下面以这两种系统的典型代表CSS系统(基于时间)和Zi ...… 查看全部问答> |
|
该单片机主要是用在控制开关上的,单片机控制继电器,具体要求是当电压值小于170V的时候,由单片机断开继电器通电,从而保护开关,该单片机是8个引脚的,是不是不管51系列还是PIC系列都是可以实现该需求。 谢谢。。。… 查看全部问答> |
|
诺基亚终于换帅了,迫于业绩的压力。对于此次诺基亚的换帅,外界已经有了不少的评论,自然是看好和看衰者都有之。针对外界不同的声音,新继任的诺基亚CEO、前微软高官埃洛普何以应对?未来的诺基亚真的可以如他所言继续前进吗?作为一个擅于战略制 ...… 查看全部问答> |
|
目录第1章 简介.................................................................................................................1第2章 编译代码........................................................................................ ...… 查看全部问答> |




