1. 项目概述:51单片机外部中断启停的非精准计时方案
这个项目源于我在工业控制现场遇到的一个实际需求——需要用一个低成本方案实现设备启停时间的粗略统计。当时产线上有十几台老式设备需要加装运行计时器,但预算有限不能更换PLC,于是我想到了用51单片机配合外部中断来实现这个功能。
51单片机的外部中断功能确实很适合这种场景。当设备启动时,通过外部中断0触发计时开始;设备停止时,外部中断1触发计时停止。这种方案最大的优势就是硬件成本极低,一片STC89C52芯片加上几个电阻电容就能解决问题。虽然计时精度比不上专业的时间继电器,但对于只需要统计设备大概运行时间的场景完全够用。
注意:这里的"非精准"指的是毫秒级的误差,对于需要微秒级精度的场合不适用。但在大多数工业设备统计场景中,分钟级别的精度已经足够。
2. 硬件设计要点解析
2.1 中断引脚电路设计
我选择了P3.2(INT0)和P3.3(INT1)作为两个外部中断输入引脚。这两个引脚都支持低电平触发和下降沿触发两种模式,具体电路设计要注意以下几点:
- 必须加上拉电阻:我通常使用10kΩ的上拉电阻,确保引脚在空闲时保持高电平
- 添加按键消抖电路:最简单的方案是并联一个104电容
- 保护二极管:如果中断信号来自较远距离,建议在引脚处添加1N4148二极管防止静电损坏
c复制// 典型电路连接示例
INT0 ----[10kΩ]---- VCC
|
[104电容]
|
GND
2.2 电源与抗干扰设计
工业现场环境复杂,电源稳定性特别重要。我的经验是:
- 使用7805稳压芯片,输入输出端都要加滤波电容
- 在单片机VCC和GND之间加一个10μF电解电容和104瓷片电容并联
- 如果可能,为晶振电路加一个金属屏蔽罩
3. 软件实现细节
3.1 中断服务程序编写
关键点在于中断服务函数要尽可能短小精悍。我的习惯写法是:
c复制unsigned long runtime = 0;
bit timer_run = 0;
void INT0_ISR() interrupt 0 {
timer_run = 1; // 启动计时
TR0 = 1;
