
简介这是一份面向自动化控制、机电一体化及水产养殖相关专业学生与工程人员的课程设计资料围绕单片机在鱼用投饵机自动控制系统中的应用展开用以解决传统投饵机定时不准、投饵与间歇时间设置不合理、投饵距离无法调节以及饲料浪费等问题适合作为毕业设计、课程设计或小型自动化项目的参考方案。资源包共1个文件为325KB的doc文档内容涵盖系统整体设计思路、硬件组成与外围电路、软件程序模块以及供饵时间、停饵时间、投饵时间和投饵距离等关键参数的设定方法并给出实验结果与结论分析。目前已有215人学习下载。文档从输送减速交流电机与投饵直流电机的控制出发梳理了系统初始化、参数设置、定时控制与电机驱动等模块化编程思路读者可据此理解单片机定时定量投饵的实现逻辑掌握硬件选型与软件框架搭建方法并借鉴其降低饲料浪费、减少劳动力投入的设计取舍对同类渔业自动化项目具有较高参考价值。1. 池塘边的定时器这套 51 单片机投饵系统到底解决什么问题养过鱼的人都知道投饵是件磨人的事。人工撒料一天两趟风里雨里都得去撒得匀不匀全凭手感换成品振动式投饵机人是省了但料基本堆在抛盘正下方两三米内边缘的鱼抢不到中间的料沉底腐烂水体氨氮指标过几天就往上窜。这套基于 89C51 单片机的鱼用投饵机自动控制系统切入的正是这个矛盾点把按时撒一把改成按设定时长驱动输送减速交流电机和投饵直流电机,让供饵时间、停饵时间、投饵时间、投饵距离四个参数都能落在代码里,而不是靠机械凸轮和电位器碰运气。它的控制对象很清晰——一路输送减速交流电机负责从料斗往下走料,一路投饵直流电机带动叶轮盘把料甩出去,前者决定投多少,后者决定投多远。整套方案的硬件底子是 MCS-51 系列 89C51,配合 DS12887 这类带后备电池的时钟芯片,掉电后走时和寄存器数据不丢。适合谁看?做单片机课程设计、毕业设计选题的学生,以及想给自家小塘口加一套可调参数投喂设备的水产从业者。下面从框架到位号,从时钟到电机,一层层拆。2. 89C51 主控与外设选型投饵控制系统硬件怎么搭2.1 总框架输送系统与投饵系统两段式结构这套机器在结构上分成输送系统和投饵系统两大部分。输送系统由输送减速电机带动旋转式供料器,饲料经输送搅龙从料斗落到高速旋转的叶轮盘上;减速电机转速恒定,所以供料多少这件事,只能靠运行时间的长短来换算——这一点直接决定了软件侧必须把时间参数做准,否则定量就是空话。投饵系统则是离心抛料结构,投饵电机带动叶轮盘为颗粒提供初速度,转速高低直接决定抛撒半径。提示把系统切成输送和投饵两条独立控制回路,是这套设计最好用的一点。任何一路出问题都能单独隔离排查,不会出现电机在转但不知道是哪台在转的糊涂账。选型上为什么落地 89C51 而不是更贵的 32 位方案?按这篇设计的场景,任务只有定时、计数、IO 翻转和 LCD 显示,没有浮点运算、没有网络协议栈,89C51 的 4KB Flash、128B RAM、两个 16 位定时器和 32 根 IO 口完全够用,而且开发链路短,Keil 加一个 USB 转串口的烧录器就能跑通全流程。常见的做法是主控用 STC89C52RC 替代原版 89C51,两者指令集兼容,片上 Flash 翻倍到 8KB,ISP 串口下载不用拔芯片。2.1.1 主要技术指标对照项目参数说明电源220V整机市电输入主电机功率70W输送减速交流电机副电机功率18W投饵直流电机外形尺寸450×650×980mm长×宽×高整机重量40kg含料斗空载载料量100kg料斗容量投饵覆盖半径 12m,弧度 110°扇形与转速相关时钟显示24hDS12887 走时定时设定电子时钟控制两组定时开机上午、下午各一组这张表里最值得盯的是投饵覆盖半径 12m、弧度 110°。很多人选机器时迷信抛得越远越好,实际上抛撒距离过远、覆盖面过大,池塘边缘的料根本没人吃,反而浪费并污染水体。经验数据是 0.2~0.35 公顷的池塘、每 667 平方米产鱼 1500 公斤左右时,抛撒距离落在 5~8 米最合适。所以投饵距离可调这个功能点,本质是让转速可调,而不是追求极值。2.2 晶振、复位与时钟芯片 DS12887单片机要跑得准,时钟源和复位电路是地基。89C51 需要外接石英晶振,常用 11.0592MHz 或 12MHz——前者是为了串口波特率整除,后者是为了定时器分频计算方便。如果系统只做定时且用串口烧录,选 11.0592MHz 更省心。晶振两端各接一只 30pF 左右的瓷片电容到地,走线尽量短,别和电机驱动线并排走。复位电路常见做法是上电复位加手动按键复位:10μF 电解电容一端接 VCC,另一端接 RST 引脚,同时并联一只 10kΩ 电阻到地,再并联一个复位按键。这样上电瞬间 RST 维持高电平若干个机器周期完成复位,按键按下也能强制复位。DS12887 是这套系统的关键外设,它把实时时钟、闹钟、100 年日历和 114 字节带电池保护的 RAM 全集成在一块芯片里。掉电、断电、关机都不影响它继续走时。它通过三总线方式挂到单片机:地址线参与片选,数据线接 P0 口(需要上拉电阻),读写控制接 RD、WR。软件上通过访问固定地址读写时、分、秒寄存器和闹钟寄存器。// DS12887 常用寄存器偏移(以 0x00 为基址) #define DS_SEC 0x00 // 秒,含停止位 #define DS_MIN 0x02 // 分 #define DS_HOUR 0x04 // 时 #define DS_HOUR_ALM 0x05 // 上午开机闹钟小时 #define DS_MIN_ALM 0x03 // 上午开机闹钟分钟 #define DS_REG_B 0x0B // 控制寄存器 B #define DS_REG_C 0x0C // 中断标志寄存器 // 关闭 DS12887 内部写保护并开更新,标准初始化写法 void ds12887_init(void) { XBYTE[DS_REG_B] 0x22; // 置 24 小时制、开更新周期 XBYTE[DS_REG_B] | 0x80; // 置 SET 位,准备写入时间 XBYTE[DS_SEC] 0x00; // 秒清 0 XBYTE[DS_MIN] 0x00; // 分清 0 XBYTE[DS_HOUR] 0x08; // 设为 08 点 XBYTE[DS_REG_B] 0x7F; // 清 SET 位,时间开始走 }这段代码的逻辑是:先用控制寄存器 B 配置工作模式,再把 SET 位置 1 让芯片暂停走时以便安全写入,写完后清 SET 位恢复走时。0x22的含义是启用 24 小时制、开启更新结束中断标志,具体位定义要对着数据手册逐位核对。XBYTE 是 Keil C51 里访问外部数据存储器的宏,前提是硬件上地址线和数据总线接法正确。注意DS12887 内部的电池是焊接封装,一旦耗尽整片芯片报废,不像 DS1302 可以换纽扣电池。设计阶段就要评估使用寿命,或者干脆选用 DS1302 加备用电池的方案降低成本。2.3 电机驱动与 DAC 输出通道两路电机的驱动逻辑完全不同。输送减速交流电机是 220V 交流负载,单片机 IO 绝对不能直连,标准做法是 IO 经三极管或光耦隔离后驱动继电器,由继电器触点控制交流电机的通断。继电器线圈两端必须并接续流二极管(如 1N4007),否则断电瞬间的反电动势会把驱动三极管打坏。投饵直流电机的调速走 DAC 通道。系统采用 DAC0832 这类 8 位电流输出型数模转换器,单片机把数字量写进去,输出对应模拟电压,再经运放(LM358 或 LM386)放大后驱动直流电机调速电路。转速高抛得远,转速低抛得近,这就把投饵距离从机械调节变成了软件写值。#include reg51.h #include absacc.h sbit FEED_AC P1^0; // 输送交流电机继电器控制脚 #define DAC0832 XBYTE[0x7FFF] // DAC0832 片选地址 // speed: 0~255,数值越大投饵直流电机转速越高,抛撒越远 void set_throw_distance(unsigned char speed) { DAC0832 speed; // 写入 8 位数字量,转换成模拟电压 } // 启动一次供料动作:先开输送电机,延时供饵时间,再关 void feed_once(unsigned int feed_ms) { unsigned int i; FEED_AC 0; // 低电平吸合(视继电器驱动极性而定) for (i 0; i feed_ms; i) { delay_1ms(); // 供饵期间保持输送电机运转 } FEED_AC 1; // 断开输送电机,停止下料 }set_throw_distance是整个系统里最直观的一个函数,一个字节就能改变抛撒半径,调试时可以直接在串口终端里发数字试效果。feed_once则体现前面说的用时间换算量的思路:输送减速电机转速恒定,所以供饵 1 秒和供饵 3 秒对应的落料量成比例,前提是叶轮式喂料器的每个扇区容积一致。如果想做按日投喂量设置而不是按时间设置,就得靠这个固定容积去反算时间。3. 定时、供饵、停顿三段时间参数怎么写进程序3.1 时序状态机:供饵与停顿如何交替系统运行时序可以抽象成一个循环状态机:开机后进入投饵阶段,输送电机和下料门配合送料;送一段时间后进入停顿阶段,下料门关闭,让已经落下的料充分被抛散、被鱼吃掉;停顿结束再回到供饵状态。如此反复,直到累计到设定的总投饵时间或投喂量,整机自动停机,进入待机,等下一个闹钟时刻。三段时间的关系是这套设计的核心约束:供饵时间:单次下料持续时长,决定单次落料量;停顿时间:两次下料之间的间隔,避免料堆在同一个落点;投饵时间:整个投饵过程的总时长上限。参数量级上,市面常见电子定时器的喂料时间多为 1~9 秒可调,停顿时间也是 1~9 秒可调,抛料定时器机械式为 0~60 分钟、电子式为 10~100 分钟。这套设计把量级往量的方向靠,设置了 15~200kg 共 18 个级别的日投喂量档位,每档对应一组预设的供饵/停顿/投饵组合,用户只要按料台边上的按键选档确认就行,不用自己去设每一段时间。这是一个明确的产品判断:面对养殖户,给 18 个档位比给一个 0~9 小键盘友好得多,减少误操作也提高了自动化程度。3.2 定时器中断驱动的软件定时用软件循环 delay 做主定时,一旦中断进来时间就飘了,精度根本保证不了。合格的做法是用定时器 0 或定时器 1 产生固定周期中断,比如 50ms 一次,在中断里累加计数,累到设定值就翻转状态。volatile unsigned int g_tick 0; // 50ms 计数单元 unsigned int g_feed_ticks 20; // 供饵时间:20*50ms 1s unsigned int g_pause_ticks 40; // 停顿时间:40*50ms 2s unsigned char g_phase 0; // 0供饵 1停顿 void timer0_isr(void) interrupt 1 { TH0 0x3C; // 重装初值,11.0592MHz 下约 50ms TL0 0xB0; g_tick; if (g_phase 0) { // 处于供饵阶段 if (g_tick g_feed_ticks) { g_tick 0; close_door(); // 关下料门,停止落料 g_phase 1; // 切到停顿阶段 } } else { // 处于停顿阶段 if (g_tick g_pause_ticks) { g_tick 0; open_door(); // 开下料门,重新落料 g_phase 0; // 切回供饵阶段 } } }定时器初值TH00x3C、TL00xB0是按 11.0592MHz 晶振、定时器模式 1(16 位)算出来的,约为 50ms 一次中断,具体数值可以用初值 65536 − 定时时间 × 晶振频率 / 12复算。把供饵和停顿做成交互切换的两个分支,逻辑非常干净,改参数只需改g_feed_ticks和g_pause_ticks两个变量,不用动中断结构。注意中断服务函数里只做计数和状态翻转,下料门开关这类带机械动作的操作最好置标志位,在主循环里执行,避免中断执行时间过长导致后续中断丢失。3.3 日投喂量档位与分段投喂策略把日投喂量平均分成上、下午两部分,是这套控制器的时间分配原则。上午定时点开机,把当天上午那份投完自动停机;下午定时点再开一次,投完再停。这样一天两次,契合鱼类摄食节律,也避免了单次大量投料造成的浪费。18 个档位的映射可以做成一张常量表:档位日投喂量(kg)单侧投饵时间(s)供饵(s)停顿(s)115约 6012545约 1802310105约 4203418200约 90055这张表里数字只是示范量级,真实值要在现场用电子秤标定:开一档投一次,称落料重量,反推单次供饵时间对应的克数,再修正表格。这也是按量设置和按时间设置的分水岭——表格标定准了,系统才真正是定量投喂,而不是名义上的定量。4. 下料门卡料、继电器干扰与参数标定现场排错怎么做4.1 叶轮齿状咬合解决颗粒卡料这套设计里最值钱的一个细节,是叶轮式喂料器的叶片边缘与机壳挡板开口做成齿状并错开。原来叶片和挡板之间留平直间隙,小圆柱形颗粒饲料很容易卡在中间,叶轮转不动,整个喂料器停摆。如果把间隙放大来防卡,饲料又会从缝隙直接漏到离心抛盘,喂料器形同虚设。改成齿尖对齿尖、留小间隙之后,卡住的颗粒会被上下齿尖直接切断,叶轮继续转,问题从避免卡变成卡了也能剪断。按量投喂能成立,正是靠这个 6 片叶片的叶轮:六个扇区容积相等,每个扇区转过去就是一格固定料量,时间单位内的喂料量可以算出来,饲料也能均匀落到抛盘上。停机时叶轮叶片直接把料隔断,不会继续往下漏。这一点在改造老旧投饵机时尤其值得借鉴,不需要换整机,换个喂料器结构就能把定量精度提上去。4.2 继电器与电机干扰的硬件对策交流电机和继电器是单片机系统里最大的干扰源,常见症状是显示乱跳、时钟走时不准、程序跑飞。对策分三层:继电器线圈并续流二极管,触点上并联 RC 吸收网络(100Ω 加 0.1μF)抑制触点火花;单片机电源与电机电源分开走线,各自加 7805 或开关电源稳压,电机侧加 1000μF 以上的大电容储能;强电线和弱信号线在机箱内分开走,不要捆在一起。时钟芯片被干扰导致走时偏移时,先查 DS12887 的电源脚是否接了后备电池供电,再确认地址总线上有没有上拉电阻。P0 口做数据总线时是开漏输出,不加上拉电阻读写会随机出错,这是很多人调试 DS12887 时的第一个坑。# 串口调试时用十六进制直接看 DS12887 回读值 # 假设波特率 9600,8 位数据,无校验 python -m serial.tools.miniterm /dev/ttyUSB0 9600用串口终端连上主控后,把时钟寄存器的回读值打印出来,对照标准时间看每小时漂多少秒。如果日漂超过几秒,多半是晶振或布线问题,而不是芯片本身。4.3 投饵距离与料量的现场标定流程标定分两步。第一步标量:选最小档,空料斗装已知重量的料,开机投一次,用电子秤称剩余料差,换算单次落料克数,和表格对照修正供饵时间。第二步标距离:在无风条件下,把 DAC 写值从 60 试到 200,每次称量抛撒最远落点的距离,画出写值—距离曲线,选出对应 5~8 米的目标区间写进档位表。提示标定时一定要在有鱼、有风、料密度的实际池塘条件下做一次复核,实验室里的抛撒距离和池塘里会不一样,尤其是颗粒料的含水率变化会明显影响抛远。标完之后,投饵距离可调才不是一句宣传语,而是用户能在面板上切换到具体射程的实用功能。对 0.2~0.35 公顷的塘口,把射程锁在 5~8 米区间,既能把料铺开,又不会把料甩到塘边无效区域。本文还有配套的精品资源点击获取