尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

基于AT89S52的自动灌装控制系统设计与抗干扰实践

基于AT89S52的自动灌装控制系统设计与抗干扰实践 简介基于AT89S52单片机的自动灌装控制系统毕业论文面向自动化、电子信息类本科毕业设计或课程设计场景。论文围绕液体产品灌装效率与精度问题设计了一套以AT89S52为核心的模拟控制系统完整阐述了系统方案选型、硬件模块划分与实现思路包括控制器选型对比、三相异步电机驱动、光电与行程开关检测、双四位数码管显示、蜂鸣器报警及步进电机挡板控制等并给出灌装时间0999.9秒、控制精度0.1秒、计数范围09999等核心指标。读者可从中获取毕业设计所需的整体架构、模块电路思路、控制逻辑及论文组织方法便于直接套用或二次开发。资源为doc格式共1个文件压缩包大小1.34MB内容集中、便于下载查阅。已有65人学习浏览适合正在开展单片机类毕设或对自动灌装控制感兴趣的学习者。1. 从“看机器”到“做机器”为什么这套灌装控制选了AT89S52在车间看到自动芯柱机一个人同时盯几台设备时很多人第一反应是“PLC 就能干这事”。但从课题设计的实际约束看PLC 方案只能按固定容积灌装产品线一换瓶子就得改初始值换几种容器就要配几台机器成本和人力的浪费很直接。AT89S52 的优势在于软件程序灵活定时、计数、按键设定、报警逻辑全部可以由代码重定义32 个 I/O 口也正好覆盖传感器、数码管、继电器和步进电机这些外设。更关键的是这套系统要解决的不只是“能不能灌”而是“如何在 8 位机上把 0.1s 的时间精度稳定做出来”。下面按硬件信号链、定时器时基、加料状态机、实测排错这条线把整个系统拆开讲。2. 硬件信号链继电器驱动、行程开关与红外对射的选型逻辑2.1 主控选型与 I/O 资源规划AT89S52 属于增强型 51 内核单片机片内 8KB Flash、256 字节 RAM、32 个双向 I/O 口、3 个 16 位定时器/计数器、1 个看门狗定时器还支持 ISP 在线编程。对于灌装这种低速控制场景资源是够用的不需要外部扩展 RAM程序存储器也不紧张真正要花心思的是 I/O 分配因为系统里既有开关量输入也有继电器输出和数码管动态扫描。写程序前先把 I/O 口定义清楚比画完电路图再回来改引脚要省事得多。原设计的引脚分配如下表P1 口主要承担控制输出和传感器输入P3 口留给按键设定。引脚方向功能说明P1.0输出BELL蜂鸣器报警控制P1.1输出jia加料指示模拟电磁水阀P1.2输入zheng原料液位检测红外对射P1.3输出dong继电器控制传送带电机通断P1.4输出miao系统运行秒闪烁灯P1.5输入jiance瓶子到位检测行程开关模拟P1.6输入start开始工作按键P1.7输入stop停止/暂停按键P3.4输入shujia产量设定加P3.5输入shujian产量设定减P3.6输入KEY按住加料并计时松开记忆加料时间P3.7输入qingling加料时间清零P0输出段码数码管段选P2输出位选数码管位选及控制信号I/O 分配的原则是把中断相关的输入放在 P3 口因为 P3.2/P3.3 是外部中断 0/1 的复用引脚普通开关量如行程开关如果信号抖动较大可以软件消抖。P0 口作为段码输出时必须接上拉电阻或锁存器这直接关系到数码管显示是否稳定。2.2 继电器驱动与弱电隔离传送带电机是 220V 供电的三相异步电机单片机是 5V 系统中间必须经过继电器做电气隔离。原设计选用鸿龙 JQX-38F 小型大功率继电器线圈电压 AC380V、额定电流 40A、6 触点结构三常开三常闭。这里要特别注意的是继电器触点容量是按阻性负载标的电机属于感性负载启动电流是额定电流的 5~7 倍所以 40A 的触点容量要给电机启动留出余量不要贴着额定值选。驱动电路用的是 PNP 三极管单片机 I/O 口输出低电平时三极管导通继电器线圈得电吸合。实际搭电路时继电器线圈两端必须反向并联一个续流二极管否则断电瞬间线圈产生的反向感应电动势会击穿三极管的发射结。I/O 初始化时要把所有控制口先置为安全电平防止上电瞬间继电器误动作。// I/O 初始化防止上电瞬间继电器误动作 void io_init(void) { P0 0xFF; // 段码口先拉高数码管不显示乱码 P2 0xFF; // 位选全部关闭 dong 0; // 传送带电机默认停止 jia 0; // 电磁水阀默认关闭 BELL 1; // 蜂鸣器默认关闭低电平驱动 P1 0xE0; // P1.0~P1.2 置为安全状态其余按输入处理 }逻辑说明上电时 P0 和 P2 先全部置 1让数码管所有位选处于失电状态避免显示随机值dong 和 jia 清零保证电机和水阀不会在单片机复位期间乱开P1 口的初始电平要根据外部电路的实际接法确认如果继电器是低电平驱动初始化时就必须先输出高电平断开。参数说明JQX-38F 的线圈电压和触点容量要区分开线圈是控制侧触点才是负载侧。实际做 PCB 时继电器下方要留出爬电距离强电和弱电区域分开布线否则 220V 侧的干扰会通过地线串进单片机复位电路。2.3 传感器选型TM1308 行程开关与 M12 红外对射系统里有两类检测一类是检测瓶子是否到达灌装位置原设计用乐清永得 TM1308 微动开关常开触点瓶子碰撞后开关闭合单片机收到低电平信号另一类是检测原料桶液位用凌创 M12 红外对射传感器发射管和接收管对射浮壶下沉到挡光位置时接收管收不到光输出电平翻转。行程开关的优点是便宜、抗干扰强机械触点的通断状态非常明确不需要像光电传感器那样调阈值。缺点是有机械寿命频繁碰撞下触点会氧化实际使用中可以定期检查触点压降。红外对射传感器要重点处理环境光干扰安装时给发射管和接收管加遮光罩或者选带调制频率的型号否则太阳光和车间照明灯都会造成误触发。sbit zheng P1^2; // 原料液位检测高电平表示有原料 sbit jiance P1^5; // 瓶子到位检测低电平表示有瓶子 // 读取传感器状态并处理 bit check_material(void) { if (zheng 0) // P1.2 为低说明红外对射被挡住 { return 0; // 原料不足 } return 1; // 原料正常 }逻辑说明红外对射传感器的输出逻辑取决于接收管是导通还是截止代码里假设有原料时输出高电平实际接线后要在现场确认逻辑接反了会在原料充足时报警。行程开关同样需要确认常开/常闭接法TM1308 是常开未触碰时输入悬空这里要用内部上拉或外部上拉电阻否则输入电平不定。参数说明行程开关的接法是“常开——碰撞闭合——恢复断开”对应到程序中就是每次检测到下降沿算一次到位。原设计用按键 JISHU 模拟行程开关正是为了验证这段检测逻辑按键按下产生的边沿和真实行程开关的动作是等效的。2.4 步进电机挡板与三相异步电机传送带传送带电机选用同步转速 1400r/min 的三相异步电机配合减速器实现 30r/min 的输出转速灌装机按 3000 瓶/小时的生产能力设计。这里有个关键选择传送带保持常转不用启停方式控制瓶子而是用步进电机带动齿轮挡板拦截瓶子。原因在于频繁启停三相异步电机会造成很大的启动电流冲击对电机和电网都不友好而且启停延迟不好控制。步进电机靠脉冲序列驱动单片机发送一个脉冲电机转过一个固定步距角天然适合做挡板这种需要精确转角控制的机构。原设计用步进电机驱动挡板转 90 度放行瓶子再转 90 度复位相比直流电机加减速控制的方案省掉了整流桥和变压器成本和可靠性都更好。sbit dong P1^3; // 传送带电机继电器控制 // 步进电机驱动函数按固定速度旋转指定步数 void stepper_rotate(unsigned int steps, bit direction) { unsigned int i; for (i 0; i steps; i) { STEP direction; // 设置旋转方向 PULSE 1; // 脉冲上升沿 delay_us(500); // 脉冲宽度 500us PULSE 0; delay_us(500); // 等待电机完成一步 } }逻辑说明步进电机的速度由脉冲频率决定这里是 1kHz 左右的频率也就是每步 1ms适合大多数小型步进电机的启动范围。如果直接把频率调高到 3kHz 以上电机会因为启动扭矩不足而失步挡板角度就不准了。参数说明步进电机选型时看两个参数静力矩和步距角。挡板属于轻负载重点是步距角要匹配 90 度转角的精度需求常见 1.8 度步距角电机转 90 度需要 50 个脉冲计算好脉冲数后在程序里用常量定义方便调试时修改。3. AT89S52 定时器与 0.1s 时基动态扫描的时序分配3.1 为什么需要独立的 0.1s 时基灌装时间的设定范围是 0~999.9s最小分辨率和控制精度都是 0.1s这个要求决定了不能靠主循环里的 delay 函数来计时——主循环要处理的按键扫描、数码管显示、传感器检测都是耗时操作任何一个分支的执行时间变化都会让计时产生累积误差。正确做法是用定时器中断产生一个稳定的时基在中断服务程序里做秒和毫秒的累加。主循环只需要读取中断里更新的全局变量这样即使主循环某次执行了 3ms也不会影响定时精度。AT89S52 有 3 个 16 位定时器选择定时器 0 工作在方式 116 位定时模式配合中断实现 0.1s 的基准。3.2 定时器 0 的初值计算与中断重装定时器的工作方式是把内部计数寄存器从初值开始累加溢出时触发中断。AT89S52 在 12MHz 晶振下12 个时钟周期为一个机器周期即 1MHz 计数频率定时器每计数一次耗时 1µs。要产生 50ms 的中断周期初值应设为 65536 - 50000约等于 0x3CB0。原设计中用的是 0x4C00这是在 11.0592MHz 晶振下的常用初值实际定时约 46ms配合两次中断累加得到 0.1s。这里要理解一个细节中断服务程序里不能只重装初值还要考虑重装指令本身占用的时间严格的做法是在定时器溢出后先关中断重装再开中断或者用自动重装方式方式 2但方式 2 是 8 位定时精度不够。// 定时器 0 初始化方式 150ms 中断 void time0_init(void) { TMOD 0xF0; // 清空定时器 0 的模式位 TMOD | 0x01; // 定时器 0 工作在方式 116 位定时 TH0 0x4C; // 高 8 位初值 TL0 0x00; // 低 8 位初值 ET0 1; // 允许定时器 0 中断 EA 1; // 开启总中断 TR0 1; // 启动定时器 0 } volatile unsigned int sec 0; // 0.1s 计数器 volatile unsigned char flag 0; // 中断次数标志 volatile unsigned int she 0; // 记忆的加料时间 // 定时器 0 中断服务函数 void time0_Int(void) interrupt 1 { TH0 0x4C; // 重装初值 TL0 0x00; flag; // 中断次数加 1 if (flag 2) // 两次中断累计约 0.1s { flag 0; sec; // 0.1s 计数加 1 if (sec 10000) sec 0; // 最大 999.9s } }逻辑说明定时器 0 每溢出一次就产生一次中断中断服务函数里重装初值并累加 flag。flag 计数到 2 时 sec 加 1也就是说两个中断周期合成一个 0.1s 的时基。sec 最大值 10000 正好对应 999.9s超过后归零重新从 0 开始计时。参数说明初值 0x4C00 是在 11.0592MHz 晶振下的常用值如果实际电路用的是 12MHz 晶振单次定时是 46.08ms两次中断后是 92.16ms比 0.1s 少了约 8ms。要严格做到 0.1s建议用示波器测一下实际的溢出周期或者把初值改成 0x3CB012MHz 下正好 50ms。这个差异在灌装场景下通常可以接受但如果对时间一致性有要求必须以实际晶振为准。3.3 数码管动态扫描与主循环时序两组四位共阴数码管分别显示灌装产量和加料时间P0 口输出段码P2 口输出位选。为了提升驱动电流段码经过 74HC573 锁存器再送到数码管这样单片机的 P0 口不需要直接承受数码管的全部电流而且锁存器可以保持段码输出减轻 CPU 的刷新负担。动态扫描的基本思路是逐位点亮利用人眼视觉暂留效果让 8 个数码管看起来同时亮。每一位点亮后延时约 2ms8 位全部扫完约 16ms刷新率大约 60Hz看起来不会有明显闪烁。延时太短会亮度不足太长则会出现闪烁这个延时参数需要在实际硬件上调整。unsigned char code du[] {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F}; // 共阴数码管段码表0~9 // 产量显示千位 h1百位 h十位 m1个位 m void xianshi(uchar h1, uchar h, uchar m1, uchar m) { P0 du[m]; P2 0xEF; delay(2); // 个位 P0 du[m1]; P2 0xDF; delay(2); // 十位 P0 du[h]; P2 0xBF; delay(2); // 百位 P0 du[h1]; P2 0x7F; delay(2); // 千位 } // 加料时间显示功能同产量显示位选不同 void sxianshi(uchar s1, uchar s, uchar h1, uchar h) { P0 du[h1]; P2 0xFD; delay(2); // 个位 P0 du[h]; P2 0xFE; delay(2); // 十位 P0 du[s1]; P2 0xF7; delay(2); // 百位 P0 du[s]; P2 0xFB; delay(2); // 千位 }逻辑说明xianshi 函数先把段码放到 P0再通过 P2 口选中对应的位延时 2ms 后切换到下一位。注意这里的位选值是按 P2 口低 4 位控制的0xEF 表示 P2.4 输出 0选中第一组数码管的个位。两组数码管共用 P0 段码口靠 P2 口的不同位选区分。参数说明动态扫描的段码表顺序是按共阴数码管 a~dp 引脚排列的如果实际用的是共阳数码管段码要全部取反。延时 2ms 用的是软件 delay 函数具体时长取决于晶振频率和编译器优化级别换编译器后要重新验证显示效果。4. 按键设定与加料状态机行程开关触发后的执行路径4.1 按键功能语义与调试模式这套系统的核心交互逻辑不是直接输入灌装时间而是通过“按住加料、松开记忆”的方式把操作员的经验值写进系统类似示教编程的思路。第一次使用时按住 S7系统边加料边计时松手后加料时间被记住之后每次灌装都按这个时间执行直到重新设定或断电。按键功能触发方式对应系统动作S5产量设定加单击预置产量加 1S6产量设定减单击预置产量减 1S7加料时间设定按住加料松开记忆按住时 LED4 亮计时累加S8加料时间清零单击sec 清零重新设定JISHU瓶子到位检测按下模拟行程开关开始加料流程DANG传送带启动单击电机继电器吸合LED1 亮KAI传送带停止单击电机继电器断开系统暂停这个设计让操作员不需要懂任何编程也不需要设置复杂的参数。S7 的实现逻辑是检测到 KEY 为 0 时打开定时器同时点亮加料指示灯松开后关闭定时器把 sec 的当前值赋给 she。之后生产过程中she 就是默认的加料时间。4.2 加料主流程状态机系统上电后初始化数码管显示产量初始值 1000 和加料时间 0。按下 DANG 启动传送带电机挡板默认处于拦截位置。当行程开关检测到瓶子到达模拟时按 JISHU 键系统进入加料状态电磁水阀打开同时定时器开始计时。加料时间达到 she 的值后电磁水阀关闭步进电机带动挡板转 90 度放行瓶子瓶子通过后挡板再转 90 度复位产量计数加 1。整个流程可以抽象成四个状态空闲、加料中、放行等待、挡板复位。用状态机实现的好处是每个状态的动作单一异常分支容易插入。// 加料流程状态机 #define STATE_IDLE 0 // 空闲等待瓶子到位 #define STATE_FILLING 1 // 加料中 #define STATE_PASS 2 // 放行等待 #define STATE_RESET 3 // 挡板复位 unsigned char state STATE_IDLE; unsigned int fill_time 0; // 当前加料计时 void fill_process(void) { switch (state) { case STATE_IDLE: if (jiance 0) // 检测到瓶子到位 { jia 1; // 打开电磁水阀 fill_time 0; // 清零本次加料计时 state STATE_FILLING; // 进入加料状态 } break; case STATE_FILLING: fill_time sec; // 读取当前 0.1s 计数 if (fill_time she) // 到达设定加料时间 { jia 0; // 关闭电磁水阀 stepper_rotate(50, 1); // 挡板转 90 度放行 state STATE_PASS; } break; case STATE_PASS: if (jiance 1) // 瓶子离开检测位置 { stepper_rotate(50, 0); // 挡板回转 90 度复位 guo; // 产量计数加 1 state STATE_RESET; } break; case STATE_RESET: state STATE_IDLE; // 回到空闲状态 break; } }逻辑说明状态机的每个分支都只做一件事空闲状态只检测瓶子到位信号加料状态只比较计时值放行状态等瓶子离开后复位挡板。fill_time 来自定时器中断里的 sec 全局变量主循环里读取时要注意 sec 是 volatile 类型防止编译器优化导致读取不到最新值。参数说明stepper_rotate(50, 1) 中的 50 是 1.8 度步距角电机转 90 度所需的脉冲数。如果实际电机步距角不同这个值要按“90 / 步距角”重新计算。放行状态的退出条件用的是 jiance 电平恢复如果传感器安装位置离挡板太近瓶子还没完全通过就被判定离开挡板会提前复位撞到瓶子所以传感器位置要在挡板后留出瓶身长度的距离。4.3 异常分支瓶子卧倒与原料不足系统要求两类报警一是加料过程中瓶子突然卧倒或从挡板下方滑走二是原料桶里原料用完。这两类异常的处理路径不同瓶子卧倒时报警并停止加料但不停止传送带因为下一个瓶子可能马上到位原料不足时报警并停机因为后续瓶子即使到位也无法加料。原设计中用红外对射传感器检测原料液位浮壶下沉挡住光路触发报警。加料过程中用行程开关的持续信号判断瓶子是否还在如果加料还没完成但 jiance 已经恢复为 1说明瓶子提前离开此时要立刻关闭电磁水阀防止液体洒在传送带上。// 异常检测与报警处理 void check_alarm(void) { if (state STATE_FILLING jiance 1) { // 加料中瓶子丢失停止加料并报警 jia 0; // 关闭电磁水阀 BELL 0; // 蜂鸣器响 guo--; // 废品不计入产量 state STATE_IDLE; // 回到空闲状态 } if (zheng 0) // 原料不足 { dong 0; // 停传送带电机 jia 0; // 关电磁水阀 BELL 0; // 蜂鸣器响 state STATE_IDLE; } }逻辑说明guo-- 这里用先减再判断的方式处理实际编码时要注意产量变量不要减成负数可以加一个判定“guo 0 才减”。原料不足的检查放在主循环末尾因为它不需要实时响应几十毫秒的延迟对停机逻辑影响不大。参数说明报警后蜂鸣器要保持响直到人工处理需要增加一个清除报警的按键或复位逻辑。实际设计里可以让 DANG 键兼做报警复位按下后清除报警标志重新启动系统。5. 实测排错继电器触点弹跳、传感器误触发与步进电机失步5.1 继电器触点抖动导致计数跳变继电器吸合和释放的瞬间触点不是一次完成接触而是在几毫秒内反复通断这在电气上叫触点弹跳。如果行程开关信号直接接到单片机外部中断引脚一次碰撞可能触发 3~5 次中断产量计数会多算。解决办法分软件和硬件两层。软件层是检测到边沿后延时 10~20ms 再确认电平确认有效后才执行动作硬件层是在信号线上并联一个 104 电容做 RC 滤波把高频抖动吸收掉。对于行程开关这种机械触点软件消抖更可靠因为电容值受触点接触电阻影响效果不稳定。// 按键/行程开关消抖检测 bit read_key_dbnc(sbit key_pin) { if (key_pin 0) // 第一次检测到按下 { delay(10); // 延时 10ms 避开抖动 if (key_pin 0) // 再次确认 { while (key_pin 0); // 等待释放 return 1; // 确认按下 } } return 0; // 未按下或抖动 }逻辑说明第一次读到低电平不立即确认延时 10ms 后再读一次如果还是低电平才认为有效。while 循环等待释放是为了避免一次按键被重复计数。这个函数同时适用于行程开关和普通按键区别只是触发源不同。参数说明10ms 消抖时长覆盖了大多数机械触点的弹跳窗口继电器触点弹跳一般在 5ms 以内行程开关稍长10ms 是折中值。如果现场发现消抖不够可以加到 20ms但按键响应会变迟钝要平衡。5.2 红外对射传感器在强光下的误动作M12 红外对射传感器在车间环境里最容易出的问题是太阳光或照明灯直射接收管导致接收管始终导通单片机检测不到电平变化。原设计里液位检测用了浮壶挡光的方式如果环境光干扰浮壶下降挡光时系统无反应原料用完也不报警。处理办法有两个方向一是机械遮挡给发射管和接收管都加遮光罩让接收管只能接收发射管的直射光二是换用带调制频率的光电传感器发射端输出特定频率的红外光接收端只放大同频信号环境光的直流分量被过滤掉。第二种方案成本高一些但可靠性提升明显批量生产时值得优先考虑。另外要注意红外对射传感器的输出晶体管是开集电极结构上拉电阻的取值会影响输出电平的上升时间。10k 上拉在长线传输时上升沿会变缓改成 4.7k 或 1k 可以改善但功耗会略增。5.3 步进电机失步与挡板定位偏差步进电机失步的表现是挡板转不到位或转动角度过大瓶子放行时卡在半路。原因通常是脉冲频率太高、负载扭矩不足或者加减速过程太陡。挡板从静止直接进入高频脉冲电机会因为启动扭矩不够而丢失前几步之后每一步的角度基准就错了。解决方法是让脉冲频率从低到高逐渐上升也就是常说的梯形加减速。简单的实现是在启动阶段用较长的延时电机转过前 10 步后逐步缩短延时到目标频率。对于挡板这种小惯量负载可以更简单地用固定低速脉冲只是换位时间稍长但对灌装节奏影响不大。// 步进电机缓启动前 20 步降低脉冲频率 void stepper_rotate_smooth(unsigned int steps) { unsigned int i; unsigned int delay_us_count 2000; // 初始 2ms 每步 for (i 0; i steps; i) { PULSE 1; delay_us(delay_us_count); PULSE 0; delay_us(delay_us_count); if (i 20) delay_us_count - 50; // 逐步加速 } }逻辑说明初始每步 2ms前 20 步内每步缩短 50µs20 步后进入 1ms 每步的稳定速度。这样电机从静止缓慢加速到目标速度不会因为启动扭矩不足而丢步。参数说明加减速步数 20 和每步减 50µs 是根据挡板负载实测的经验值。如果换用更大扭矩的电机可以更激进地加速如果负载变大要增加加速步数或降低目标速度否则还是有可能失步。5.4 数码管显示闪烁与亮度不均动态扫描最容易遇到的问题是个别位数码管亮度明显偏暗或者整体有轻微闪烁。亮度不均的根源是每一位的点亮时间不一致xianshi 函数里如果某个分支执行时间较长这一位实际点亮时间就比其他位短。另一个常见问题是 P0 口段码输出后没有及时关闭位选导致显示拖影。正确的顺序是先输出段码再延时然后关闭位选最后切换下一位的段码。如果先切换位选再输出段码上一位的段码会残留在下一位上造成数字重影。排错时先用排除法固定显示一个数字观察 8 位亮度是否一致再用万用表测各位选引脚的电平时间。下面这张表汇总了本文涉及的典型故障和处理方向。故障现象可能原因处理方向产量计数跳变行程开关触点弹跳软件消抖 10~20ms硬件并联 104 电容原料报警频繁误触发红外对射受环境光干扰加遮光罩或换调制型光电传感器挡板定位不准步进电机失步降低脉冲频率增加缓启动数码管闪烁扫描周期太长缩短每位延时到 2ms 以内继电器频繁烧毁触点容量不足或没接续流二极管换更大容量继电器加续流二极管上电时电机误动作I/O 初始化电平不对初始化时先置继电器控制口为断开电平6. 进阶把灌装时间记忆下来再把 0.1s 精度往上提6.1 用 EEPROM 保存示教灌装时间原系统的加料时间 she 定义在 RAM 里断电后就丢失每次开机都需要重新按住 S7 设定。实际生产中这很麻烦产品换线后一天要设好几次。改进方案是外挂一片 AT24C02 EEPROM128 字节容量足够存灌装时间、产量设置和标定参数。I2C 总线的接线方式是 SDA 接 P2.0、SCL 接 P2.1两个引脚都要接 10k 上拉电阻。写入时机选在 S7 松开、加料时间记忆完成后此时 she 的值是本次示教的结果立即写进 EEPROM开机初始化时读取 EEPROM 中的值赋给 she这样断电重启后加料时间不会丢。写入 EEPROM 要注意寿命问题AT24C02 的擦写次数约 100 万次如果每次灌装都写会很快耗尽。正确的做法是只在加料时间重新设定时才写生产过程中不写。另外 EEPROM 写入需要约 5ms 的完成时间写完后要等待应答或加延时不能连续快速写入。6.2 精度从 0.1s 提升到 1ms 级0.1s 的控制精度对灌装水饮料是够用的按 3000 瓶/小时算单瓶灌装周期 1.2s0.1s 误差对应的液体量偏差约 8%。但如果要灌装注射液之类的高附加值产品可以把时基改成 1ms 中断这样加料时间分辨率提升到 1ms。改成 1ms 中断的初值计算11.0592MHz 晶振下机器周期约 1.085µs定时 1ms 需要 922 个计数初值 65536 - 922 64614即 0xFC66。每次中断都要重装初值1ms 中断频率下 CPU 占用率会比 50ms 中断高不少主循环的按键扫描和数码管刷新要控制执行时间避免在中断里做耗时操作。// 1ms 定时器初始化11.0592MHz 晶振 void time0_init_1ms(void) { TMOD 0xF0; TMOD | 0x01; // 方式 1 TH0 0xFC; // 高字节初值 TL0 0x66; // 低字节初值 ET0 1; EA 1; TR0 1; }逻辑说明初值 0xFC66 让定时器只需计数 922 次就溢出相比 50ms 定时1ms 中断的重装更频繁中断服务函数里只能做秒计数累加和标志位设置不能放数码管扫描这类耗时操作。参数说明改 1ms 后需要同步修改加料时间的比较逻辑原来的 sec 变量现在每次中断加 1存储范围要重新规划。0~999.9s 需要 999900 个计数要用 unsigned long 类型保存或者另设一个溢出计数器。6.3 用看门狗防程序跑飞AT89S52 内置看门狗定时器程序正常运行时每隔一段时间喂狗一旦程序跑飞或进入死循环看门狗超时后自动复位单片机。这对灌装设备很重要如果主循环意外死掉而电磁水阀还开着轻则浪费原料重则造成溢流。看门狗初始化在系统上电后执行喂狗放在主循环的固定位置。注意喂狗间隔必须小于看门狗超时时间否则正常运行时也会触发复位。AT89S52 的看门狗超时时间由预分频值决定典型的设置是超时 1.6s主循环每圈耗时最多几十毫秒每圈喂一次没有问题。// 看门狗初始化与喂狗示例 void wdt_init(void) { WDT_CONTR 0x35; // 使能看门狗预分频设为最大 } void wdt_feed(void) { WDT_CONTR 0x35; // 重新写入使能值清除计数 }逻辑说明WDT_CONTR 是看门狗控制寄存器写入使能值的同时起到喂狗作用。中断服务函数里不要喂狗否则主循环死掉但中断还活着时看门狗永远不会超时就失去了保护意义。喂狗动作必须放在主循环的业务逻辑之后确保完整跑过一圈才喂。调试看门狗时容易遇到“程序不断重启但找不到原因”的情况先在初始化阶段把看门狗关闭定位到具体问题后再打开。生产版本的看门狗超时时间不要设置得太短给主循环留出足够的余量避免在传感器长信号处理时误触发复位。本文还有配套的精品资源点击获取
返回列表