开放性实验实验报告

  • 格式:docx
  • 大小:1.63 MB
  • 文档页数:15

中国海洋大学

开放实验结题报告

项目中文名称:

自动投食设备的自主制作

设计中使用到的器件: PIC单片机(18F452)、液晶屏、电机、固定辅助器件等

指导老师: 张凯临

小组成员: 陈志勇、刘凯悦

② 项目实现构思

背景分析: 1.配合SRDP需要、节省经费

2.锻炼动手实践能力

3.提高单片机编程能力

应用市场分析:适用于一些养鱼爱好者,需要出门旅游,以及一些爱养鱼但又很忙的人

特色描述:鱼食防潮、定期投食、LCD时钟显示、

项目实现方案

总体设计方案:

前期:

系统学习PIC板的编程、软件的使用等,完成定时器程序

准备好投食装备的材料

中期:

着手准备投食设备的制作

后期:

总结改进

实际应用

项目实现过程:

一 准备硬件

硬件部分包括:电路板、液晶屏、电机、储食槽

1、焊接电路板的焊接

图一为原始电路板焊接完成图样

2、设计所需器件(齿轮、导槽、固定板)

绘图软件Solid Works画好3D图,导出到刀具切割软件,机床切割加工出所需器件;

图二为装配体设计图稿 ④ 图三为机床加工过程

图四为设计成型的小齿轮

二 软件的实现(编程操作)

1、 LED灯定时亮灭

定时实现:

思路1一个按键控制模式,调节喂食间隔、喂食时间;

 一个按键控制模式,调节喂食间隔、喂食时间;

 另一个按钮控制需要调节的量的加减。

 优点:用户可以完全实现自定义控制

 缺点:给编程带来了极大的困难,如何区分,加减后如何通过将设定的时

⑤ 间通过定时器控制实现定时控制

 现实状况:投食系统不需要给用户太多选择,给用户提到三四种模式选择即可

思路2:用两个数组预置好需要投食间隔及投食时间

 一个按钮控制数组下标的加减来提取数组预先设置好的值

 另一个按钮确定,并将数组的值设定定时器定时的时间。

 缺点:需预先设置好数组,只能通过更改程序数组才能改变预留模式,不能给用户带来足够的自由

 优点:大大简化了编程,能满足大多数用户的需求

所以采用思路2

2.液晶屏以及按钮实现可视化

图二为所设液晶屏最初开启界面

⑥ 图三为液晶屏设置界面

3.定量:电机时间转动一定时间

电机转动一圈由于重力作用下落的鱼食数目大致相同,60r/min,控制转的时间即可

图四为小电机模块

三 自动投食设备模型制作及测试

最后,我们对单片机、液晶屏、小电机等模块进行拼接操作,先将所编程序烧录到单片机中,电源为单片机供电,成功地实现了通过设置、确定按钮对投食设备的定时投食进行了控制。

至此,系统反应虽稍欠灵敏,但基本能够达到所需操作。

⑦ 图五为最终设计成图

四 最终程序

#include "E:\2011cl\2w.h"

#include "lcd.c" //调用lcd.c实现显示屏的显示

#use fast_io(all) //声明使用所有端口

unsigned int16 counter;

unsigned int secs;

unsigned int feed1[3]={1,6,9};//两次喂鱼时间的间隔

unsigned int feed2[3]={2,10,17};//完成一次喂鱼周期的时间

unsigned int i;

`

#int_TIMER2 //声明使用定时器2

void TIMER2_isr(void) //定时器2中断函数

{

counter++; //计数器计数,counter单位是毫秒

if(counter>=1000)

{

counter=counter-1000; //清零

secs++; //秒数加一

}

if(secs==feed1[i])//i由后面程序提供

{

output_d(0001);//d0口输出高电平,高电平连接电机io端

//电机开始工作

}

⑧ if(secs==feed2[i])

{

output_d(0); //电机停止工作,工作时间feed2-feed1;

secs=0; /将时间清零,开始进入下一个循环/

}

}

void main()

{

setup_adc_ports(NO_ANALOGS); //编译软件自带语句,声明一些硬件的使用

//例如不使用看门狗,AD转换

setup_adc(ADC_OFF);

setup_psp(PSP_DISABLED);

setup_spi(SPI_SS_DISABLED);

setup_wdt(WDT_OFF);

setup_timer_0(RTCC_INTERNAL);

setup_timer_1(T1_DISABLED);

setup_timer_3(T3_DISABLED|T3_DIV_BY_1);

lcd_init();//调用lcd.c中的函数

//Setup_Oscillator parameter not selected from Intr Oscillator Config tab

printf(lcd_putc,"\fHello sk and czy!\n 2013");//在显示屏输出开机界面

// TODO: USER CODE!!

set_tris_d(0); //声明D端口起输出作用

⑨ output_d(0); //将D端口初始化

secs=0;

i=-1;

/*********************************************/

//该段为投入实际作用需要使用,实验阶段为了便于观察实验现象,时间都是

//以秒为单位,而实际应用中投食间隔应以小时为单位

while(1)

{

if(counter==1000)

{

counter=0;

sec++;

}

if(sec==60)

{

sec=0;

min++;

}

if(min==60)

{

min=0;

hour++;

}

if(hour==24) hour=0;

}*/

/**************************************************/

⑩ while(1)

{

if (input(PIN_B5) == 0) //s3按键按下,s3键用来选择工作模式,即喂鱼时

//间间隔,喂鱼时间的选择

{

delay_ms(10); //去抖动,10ms后再次检测pin_b5端口

if (input(PIN_B5) == 0) {

i++; //i作为变量,调用数组预先存好的数值

if(i>=3)i=0; //数组只放了三个值,正常i=0,1,2,才可以调用数组

//中的值,将i清零

}

while(input(PIN_B5) == 0);//松手检测,按住s3的时候一直停留在

delay_ms(10);//延时10ms

printf(lcd_putc,"\f**feedoff = %uS**",feed1[i]);//在显示屏显示喂食间隔

printf(lcd_putc,"\n**feedon = %uS**",feed2[i]-feed1[i]);//在显示显示喂

//食时间,给用户提供可视化界面,便于操作

}

if (input(PIN_B4) == 0) //s4键按下。S4键为设置(确定)键

{

delay_ms(10); //去抖动,避免误触,

if (input(PIN_B4) == 0)

{

setup_timer_2(T2_DIV_BY_4,124,10);//设置计数器2,每计数一次间隔

//为1ms

enable_interrupts(INT_TIMER2);//声明使用定时器2中断可以用

enable_interrupts(GLOBAL);

⑪ //TIMER2_isr(i) ;

counter=0;//清零

secs=0;

output_d(0);//电机停止工作

output_high(pin_d3);//让d3灯闪烁亮三次

delay_ms(200);

output_low(pin_d3);

delay_ms(200);

output_high(pin_d3);

delay_ms(200);

output_low(pin_d3);

delay_ms(200);

output_high(pin_d3);

delay_ms(200);

output_low(pin_d3);

delay_ms(200);

}

while(input(PIN_B4) == 0);//松手检测

delay_ms(10);

printf(lcd_putc,"\f OK!!!");//显示设置完成