终极文档下载解决方案:kill-doc 轻松获取全网免费文档资源
2026/6/4 21:24:06
目录
一、基础准备
1. 硬件材料
2. 开发软件
二、方案 1:基础延时实现 LED 闪烁(入门级)
1. 硬件接线
2. 完整代码(Keil C51)
3. 代码解析
4. 编译与下载
三、方案 2:定时器中断实现 LED 闪烁(进阶版)
1. 硬件接线
2. 完整代码(晶振 12MHz)
3. 代码核心解析
(1)定时器初值计算(晶振 12MHz)
(2)中断配置关键
(3)闪烁逻辑
四、常见问题与调试技巧
1. LED 不亮
2. LED 常亮 / 常灭
3. 闪烁频率不准
五、扩展玩法
| 元件 | 数量 | 备注 |
|---|---|---|
| STC89C52 单片机最小系统板 | 1 块 | 核心控制单元 |
| LED 发光二极管 | 1 个 | 任意颜色(红 / 绿 / 蓝) |
| 限流电阻 | 1 个 | 220Ω~330Ω(保护 LED,防止过流烧坏) |
| 杜邦线 | 若干 | 连接电路 |
| USB 转 TTL 模块 | 1 个 | 下载程序 + 供电 |
| 5V 电源 | 1 个 | 也可通过 USB 转 TTL 给最小系统供电 |
以控制 P1.0 引脚为例,接线逻辑(灌电流驱动,51 单片机推荐方式):
⚠️ 若用拉电流驱动(LED 正极接 P1.0,负极接 GND),亮度会稍低,因为 51 拉电流能力弱,优先推荐灌电流方式。
c
运行
// 头文件:51单片机寄存器定义 #include <reg52.h> // 引脚定义:将P1.0定义为LED_PIN,方便修改 sbit LED_PIN = P1^0; // 延时函数:软件延时约1秒(晶振12MHz) void Delay1s() { unsigned int i, j, k; for(i=15; i>0; i--) for(j=200; j>0; j--) for(k=200; k>0; k--); } // 主函数:程序入口 void main() { while(1) { // 死循环,持续执行 LED_PIN = 0; // P1.0输出低电平,LED导通亮 Delay1s(); // 延时1秒 LED_PIN = 1; // P1.0输出高电平,LED截止灭 Delay1s(); // 延时1秒 } }sbit LED_PIN = P1^0;:位定义,将 P1 口的第 0 位命名为 LED_PIN,可直接操作该引脚电平;Delay1s():三层嵌套循环实现软件延时,晶振 12MHz 时,1 个机器周期 = 1μs,循环次数决定延时时间(可根据实际需求调整);while(1):死循环保证 LED 持续闪烁,不会执行一次就停止;Atmel → AT89C52(STC89C52 兼容此型号);.hex文件;STC89C52RC,导入.hex文件,选择正确串口,点击 “下载 / 编程”,给单片机上电即可。软件延时的缺点是占用 CPU 资源(延时期间 CPU 无法做其他事),定时器中断是更高效的方式,CPU 可在定时期间处理其他任务。
与方案 1 完全相同(P1.0 接 LED)。
c
运行
#include <reg52.h> sbit LED_PIN = P1^0; unsigned int count = 0; // 中断计数变量 // 定时器0初始化函数:配置10ms定时 void Timer0_Init() { TMOD &= 0xF0; // 清空定时器0模式位 TMOD |= 0x01; // 定时器0模式1(16位定时) TH0 = 0xDC; // 高8位初值:65536 - 10000 = 55536 → 0xDC00 TL0 = 0x00; // 低8位初值 ET0 = 1; // 开启定时器0中断 EA = 1; // 开启总中断(必须) TR0 = 1; // 启动定时器0 } // 定时器0中断服务函数 void Timer0_ISR() interrupt 1 { TH0 = 0xDC; // 重装初值(16位定时器溢出后需手动重装) TL0 = 0x00; count++; // 每10ms计数+1 if(count == 100) { // 10ms×100=1000ms=1秒 count = 0; // 计数清零 LED_PIN = ~LED_PIN; // 翻转LED电平(亮→灭/灭→亮) } } void main() { Timer0_Init(); // 初始化定时器 while(1) { // 此处可添加其他任务,如按键检测、串口通信等 // 定时器中断会自动触发,不影响主函数执行 } }0xDC00(TH0=0xDC,TL0=0x00)。interrupt 1:中断号,定时器 0 中断对应中断号 1(外部中断 0=0,定时器 1=3,串口 = 4);ET0=1:开启定时器 0 中断,EA=1:开启总中断(51 所有中断必须先开总中断);count加 1;count=100时(累计 1 秒),翻转 LED 引脚电平,实现 1 秒闪烁。EA=1和ET0=1是否配置;P1^0、P1^1、P1^2),实现流水灯;