开放性实验实验报告
- 格式: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!!!");//显示设置完成