1. 项目概述
51单片机作为嵌入式领域的经典入门芯片,至今仍是电子工程师和创客们最常用的开发平台之一。在上一部分我们完成了基础环境搭建和简单IO控制后,这部分将深入探讨51单片机的中断系统、定时器应用、串口通信等核心功能模块。
我使用STC89C52RC芯片进行演示,这款增强型51单片机在传统8051基础上扩展了更多功能,价格却依然保持在5元以内。通过面包板搭建的最小系统包含11.0592MHz晶振(这个频率特别适合串口通信)、复位电路和基本的电源滤波电路。
注意:初学者常犯的错误是忽略电源滤波,建议至少并联一个104瓷片电容和10μF电解电容,否则程序运行时可能出现随机复位现象。
2. 中断系统深度解析
2.1 中断源与优先级配置
51单片机提供5个固定中断源:
- 外部中断0(INT0)
- 定时器0中断(TF0)
- 外部中断1(INT1)
- 定时器1中断(TF1)
- 串口中断(RI/TI)
通过IP寄存器设置优先级时要注意:
c复制// 设置定时器0为高优先级
IP |= 0x02; // 00000010
实际项目中我推荐将实时性要求高的中断设为高优先级,比如电机控制中的编码器信号采集适合用外部中断,而数据显示更新可以用低优先级的定时器中断。
2.2 中断服务函数编写规范
Keil环境下正确的中断函数声明方式:
c复制void Timer0_ISR() interrupt 1 // 1对应定时器0的中断号
{
static unsigned char count = 0;
TH0 = 0xFC; // 重装初值
TL0 = 0x66;
if(++count >= 100){
count = 0;
P1 ^= 0x01; // LED闪烁
}
}
常见问题排查:
- 中断未触发:检查EA总中断开关是否打开
- 进入死循环:忘记重装定时器初值
- 响应延迟:中断服务函数执行时间过长
3. 定时器高级应用
3.1 精确延时实现
传统教材教的软件延时在实际项目中不可靠,应采用定时器中断方式:
c复制void delay_ms(unsigned int ms)
{
TM
