自动喂食器一等奖文档格式.docx
《自动喂食器一等奖文档格式.docx》由会员分享,可在线阅读,更多相关《自动喂食器一等奖文档格式.docx(22页珍藏版)》请在冰豆网上搜索。
第节喂食器功能的详细说明5
第节喂食器的操作说明5
第3章喂食器的理论设计过程5
第节喂食器的设计始末6
第节喂食器的设计思路6
第节喂食器最终方案工作原理7
第4章软件设计9
第节软件开发工具9
第5章结论10
附录............................................................................................................11
第1章引言
为响应学校关于加强大学生的创新意识、合作精神和创新能力的培养的号召,我们组积极参加了学校举办的“萌芽杯”科技创新大赛。
围绕生活中出现的喂养的鱼类喂食麻烦的问题,我们组进行了鱼缸自动喂食器的研究,以务实为基础,现已取得一些成果。
我们自学了单片机及其外设的一些知识,充分利用了网络和图书馆的一些资源,最终确定了自动喂食器的控制方案,并且以实物实现。
第2章喂食器的功能及操作说
第节喂食器的外观图
图1
第节喂食器功能的详细说明
(1)能够实现家庭大中小型鱼缸的自动喂食,为工作学习繁忙或是出差的人群提供方便。
(2)能够在0时0分到59时59分范围内任意设定喂食时间间隔,比如设定8时8分,则能够每隔8小时8分对鱼进行一次喂食。
(说明:
作出的喂食器模型为了测试的方便我们的程序中用分代表小时,用秒代表分钟,但在该技术中仍以小时和分说明问题。
)
(3)喂食器的喂食持续时间分为五档,这关系到每次喂食量的多少,可依据需要人为设定。
(4)能够实时显示已设定的喂食时间间隔,距离下一次喂食的时间,还有设定的喂食持续时间为第几档,每次修改时间时能够立即刷新并显示时间。
(5)即时喂食,按下即时喂食键,喂食器能够停下计时立即开始喂食,喂食结束后喂食器继续计时。
第节喂食器的操作说明
(1)该喂食器总共包括五个键,FUNCTION键,ADD键(即时喂食键),DEC键,RESET键,ON/OFF键。
(2)按下ON/OFF键,自动喂食器电源打开,指示灯亮,LCD显示开机欢迎词。
(3)没有按FUNCTION键时,按下ADD键,实现即时喂食功能。
(4)按下FUNCTIUON键一下,光标在设置时间位置的分的十位处闪烁两下,说明可以进行的分的调节,每按一次ADD键,分加1,每按一下DEC键,分减1。
(5)FUNCTION键按两次,光标在设置时间位置的时的位置闪烁两次,说明可以进行时的调节,同理用ADD键和DEC键进行时间的调节操作。
(6)FUNCTION键按三次,喂食持续时间位闪烁两次,说明投食时间可以修改,同样用ADD键和DEC键进行加减修改。
(7)第四次按下FUNCTION键,光标不再闪烁,调时过程结束。
(8)按RESET键时,喂食器重新启动,喂食时间恢复默认,如有需要可以重新设定,RESET键用于防止系统出错时,恢复系统。
第3章喂食器的理论设计过程
第节喂食器的设计始末
我们宿舍曾经喂养了一缸金鱼,寒假时出现了无人照看金鱼的情况,直接导致了金鱼的死亡。
考虑到现实生活中的宠物爱好者也会遇见这种情况,所以我们感觉到设计出这样一款自动喂食器能够方便人们的生活,这是我们设计的动机。
第节喂食器的设计思路
、控制部分
我们最开始的方案是用555定时器作为定时芯片,。
但是在随后的理论分析过程中,我们认为555定时器不能满足正常的定时需要,我们的喂食器必须是一款实用的,经得起生活检验的定时器,所以必须在定时上能够针对不同的喂食环境设置不同的喂食时间间隔和喂食持续时间。
而且这些控制必须要能够用显示装置显示出来。
这样我们就否定了功能单一的555定时器的方案。
我们得知用单片机能够进行高级的编程控制,于是我们便自学了单片机,并且最终讨论决定使用Atmel公司的AT89S52单片机作为控制芯片。
使用单片机的好处是能够精确计时,能够通过编程更简单地更方便地驱动各个部件,这是模拟电路所不能达到的效果。
、喂食部分
最初的喂食模块我们是计划用类似于电磁继电器开关的装置来控制喂食阀门的开闭,但是最后考虑到此装置的不稳定性和制作工艺的复杂性,我们决定采用步进电机来实现此阀门的开闭。
步进电机能够精确地控制阀门的开闭,且运行稳定。
、显示部分
最初的选用的显示装置为数码管,但是数码管只能显示0-9数字和几个英语字母,受数码管显示能力的限制,我们第二次做出来的作品仅能显示喂食时间间隔,而且只能精确到小时。
随着制作经验的积累,我们决定采用LCD显示装置,也就是我们现在作品。
LCD能够显示大量的信息,除了能显示设定的喂食时间间隔,显示距离下一次喂食的时间,喂食持续时间外,还能显示声音的关闭以及开机欢迎语。
、按键部分
第二个作品采用的是矩阵扫描键盘进行时间的修改,但是矩阵扫描键盘非常占用单片机资源,于是在第三次的作品中我们换用了独立键盘。
按键的数目和功能也是逐渐增加的,最开始仅有一个ADD键,到最后根据需要逐渐加入FUNTION键,DEC键,RESET键,以及电源开关。
第节喂食器最终方案工作原理
、整个喂食器的电路图(仅供参考,部分有改动)
图
喂食器的内部实际电路图
、单片机控制部分
按键为独立按键,接低电平,加入防抖程序,按下时,单片机对应接口被赋成低电平,从而修改程序中的定时时间参数。
采用1602蓝底白字LCD显示屏,接单片机P2端口的P20-P27口。
采用5V电压供电,接有可调变阻器用于调节显示屏字符的对比度。
用来显示喂食器的三个时间参数,设定时间时,LCD实时显示。
、电机部分
采用5V四相五线步进电机,电机布进角度度,内置减速装置,减速比1/64,信号线接电机P10-P13口,由ULN2003管进行功率放大,然后驱动步进电机,电机轴的末端有铣面,喂食器的阀门开关固定在铣面上。
电机先正转20度打开阀门,经过提前设定的喂食持续时间后反转20度关闭阀门。
、电源部分
采用USB接口直接进行供电,单片机与步进电机并联在电源上,电源有总开关控制,并且在电源正负极并联一个LED作为电源指示灯。
、主体结构
第4章软件设计
第节软件开发工具
开发语言:
C语言
开发工具:
开发工具为KeiluVision4,截图如下:
图4
第节调试测验工具
用KeiluVision4检查程序运行过程中各个端口的电平情况在调试过程中可以方便的设置断点、选用单步运行的方式,同时查看各个IO口的值,这些强大的功能,都为我们的软件调试提供了极大的便利。
利用51单片机开发板测试各个模块的运行情况,将各个模块调试好以后再组装在一起,这样能够减少出错,一旦出错,可以方便地找到故障所在地。
截图如下:
第5章结论
从一群只会书本知识的懵懂的大学生,到能够做出自己梦想的作品的实践型大学生,我们感到很是高兴。
从最开始对这些东西的一窍不通,到一点点的自学和苦心收集,我们付出了很多,学到了很多。
我们懂得了如何去寻搜集所需的资料,懂得如何寻找故障,如何排除故障,如何改进方案,如何实现想法,更是懂得了所学课程的重要性。
还记得第一次进中关村电子城的尴尬,还记得第一次模块测试时的纠结,我们坚持了下来,并且不断地改进我们得作品。
从最开始的一个数码管显示以为时间,到后来的LCD显示,从最开始的一个按键,到后来的5个按键,从最开始简单的代码,到后来比较精确的控制,技术的进步在实际检验中给我们带来自信。
我们的自动喂食器还有很大的发展空间,现阶段还有几个不完美的地方:
1,在供电电路的稳定方面,现阶段在喂食时LCD显示会变暗,主要是喂食时电机分的电流太大。
2,喂食阀门处,这种设计有一定的堵塞的概率,受条件的限定,我们暂时没有办法做出更好的方案。
3,当喂食过程不能按RESET键,或是关闭电源,这样阀门开关的位置就会不对了,还需要3-4次同样操作来修改过来。
以上这些都是我们准备改进的方向,随着我们知识的不断提高,我们准备做出更加完美的自动喂食器,去参加挑战杯等科技创新大赛。
我们相信:
技术进步永无止境!
参考文献
王幸之钟爱琴王雷王闪编著.AT89系列单片机原理与接口技术[M].北京:
北京航空航天大学出版社,2004:
100-129
彭为黄科雷道仲编著.单片机典型系统设计实例精讲[M].北京:
电子工业出版社,2006:
250-273
戴佳戴卫恒编著.51单片机C语言应用程序设计实例精讲[M].北京:
248-260
陶庆生徐传顺李中良,步进电机驱动电路实现设计及驱动研究[A].价值工程,30(4):
47-48
郑振杰江衍煊游德智,单片机结合uln2003驱动步进电机[A].电机技术,6:
44-46
陈素华王国志,基于单片机的LCD显示系统的设计与实现[A].许昌学院学报,5:
75-78
致谢:
衷心感谢商晓东辅导员在我们的创作过程中给予我们的支持鼓励与帮助!
衷心感谢北京化工大学团委给我们提供了一个良好的创作环境!
郭青老师在单片机方面给我们提供了很多的帮助,在此表达深切感激之情!
附录:
附录A,程序源代码
#include<
>
#defineuintunsignedint
#defineucharunsignedchar
//定义开机显示的欢迎词
ucharcodetable1[]="
WELCOME"
;
ucharcodetable2[]="
MADEBYXINSHI"
ucharcodetable3[]="
SE02:
00R02:
00"
ucharcodetable4[]="
FEEDTIME03WORK"
;
ucharnum;
ucharcount=0,s1num=0;
charmiao=0,fen=2;
uintfeed=3;
voiddianji();
charmiaojs=0;
charfenjs=0;
charmiaoss=0;
charfenss=2;
//对步进电机接口的定义
sbitD1=P1^0;
sbitD2=P1^1;
sbitD3=P1^2;
sbitD4=P1^3;
//对FUNCYION(S1),ADD(S2),减(s3)按键的定义
sbits1=P3^0;
sbits2=P3^1;
sbits3=P3^7;
//对LCD显示屏控制的端口定义
sbitlcdrs=P3^4;
sbitrw=P3^5;
sbitlcden=P3^6;
//*****************LCD显示部分用到的延时程序
(1)**********************
voiddelay(uintn)
{
uintx,y;
for(x=n;
x>
0;
x--)
for(y=110;
y>
y--);
}
//******************LCD写命令程序************************************
voidwrite_com(ucharcom)
lcdrs=0;
rw=0;
P2=com;
delay(5);
lcden=1;
lcden=0;
//*********************LCD写数据程序********************************
voidwrite_data(uchardate)
lcdrs=1;
P2=date;
//***********************开机准备函**********************************
voidinit()
//**********************LCD显示开机欢迎*************************
write_com(0x38);
//首先选择显示方式
write_com(0x0c);
//开始先不显示光标
write_com(0x06);
//选择显示新数据时屏幕上的情况
write_com(0x01);
//数据指针清零,所有显示清零
write_com(0x80+0x10);
//确定首地址
for(num=0;
num<
7;
num++)//待显示数据先存储在缓冲区中
{
write_data(table1[num]);
delay(20);
}
write_com(0x80+0x50);
//确定第二行的首地址
14;
num++)
write_data(table2[num]);
16;
num++)//使整个屏幕左移
write_com(0x18);
delay(370);
delay(800);
//写入未设定时间之前默认数据
write_com(0x80);
for(num=0;
num++)
write_data(table3[num]);
write_com(0x80+0x40);
write_data(table4[num]);
//计时器初始化
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
//显示需用的函数
voidwrite_sfm(ucharadd,uchardate)
ucharshi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+add);
write_data(0x30+shi);
write_data(0x30+ge);
//**********************按键function(S1)程序************************
voidkeyscan()
if(s1==0)
{
delay(5);
if(s1==0)
{
TR0=0;
s1num++;
while(!
s1);
if(s1num==1)
{
write_com(0x80+6);
write_com(0x0f);
}
if(s1num==2)
write_com(0x80+3);
if(s1num==3)
write_com(0x80+0X40+10);
if(s1num==4)
s1num=0;
write_com(0x0c);
TR0=1;
//***************按键ADD(s2)键的子程序******************************
if(s2==0)
if(s2==0)
TR0=0;
while(!
s2);
if(s1num!
=0)
miao++;
miaoss=miao;
if(miao==60)
miao=0;
fenss=fen;
write_sfm(6,miao);
write_sfm(14,miaoss);
write_sfm(11,fenss);
//用于恢复地址
fen++;
if(fen==60)
fen=0;
write_sfm(3,fen);
feed++;
if(feed==6)
feed=0;
write_com(0x80+0x40+10);
write_data(0x30+feed);
else{dianji();
TR0=1;
}
//************************按键DEC(s3)程序***************************
if(s3==0)
if(s3==0)
s3);
miao--;
if(miao==-1)
miao=59;
fen--;
if(fen==-1)
fen=59;
feed--;
if(feed==-1)
feed=5;
//***************************计时中断子程序**************************
voidtimer0()interrupt1
count++;
if(count==20)
count=0;
miaojs++;
miaoss--;
if(miaoss==-1)
miaoss=59;
fenss--;
write_sfm(11,fenss);
write_sfm(14,miaoss);
if(miaojs==60)
miaojs=0;
fenjs++;
if(fenjs==60)
{
fenjs=0;
}
//**********************电机工作时序延时程序(2************************
voiddelay2(uintq)
for(x=0;
x<
q;
x++)
{7
for(y=15;
}
//*************************电机工作时间延时程序(3)********************
voiddelay3(uinttt)
uintx,y;
for(x=0;
tt;
for(y=30000;
//*************************电机工作子程序****************************
voiddianji()
uintx1,x2;
D1=0;
D2=0;