1. 裸机顺序执行基础
任务说明
本案例要求在不使用操作系统、不依赖定时器中断的前提下,仅利用主循环与软件延时,驱动单片机上的LED按固定周期闪烁。核心目标是理解裸机程序从上电复位到main()顺序执行的完整流程,以及CPU逐条执行指令、循环跳转的基本工作原理。
硬件连接与执行流程
以STC89C52单片机为例,LED阳极经1kΩ限流电阻接至VCC(+5V),阴极直接连接P1.0引脚。当P1.0输出低电平时LED点亮,输出高电平时熄灭。程序复位后,CPU从0x0000地址取指,跳转至main()函数入口,随后按照代码书写顺序依次执行初始化、循环体内的点亮、延时、熄灭、延时操作,如此往复。
完整代码实现
以下代码使用STC89C52寄存器头文件,通过两层嵌套循环实现约500ms软件延时。主循环内依次执行点亮、延时、熄灭、延时操作,形成周期为1s的闪烁效果。
#include <reg52.h>
sbit LED = P1^0; // LED阴极接P1.0
/* 软件延时函数:约延时500ms(12MHz晶振) */
void delay_ms(unsigned int ms)
{
unsigned int i, j;
for (i = 0; i < ms; i++)
for (j = 0; j < 123; j++); // 空循环产生延时
}
void main(void)
{
LED = 1; // 初始状态:P1.0输出高电平,LED熄灭
while (1)
{
LED = 0; // P1.0输出低电平,LED点亮
delay_ms(500); // 保持点亮500ms
LED = 1; // P1.0输出高电平,LED熄灭
delay_ms(500); // 保持熄灭500ms
}
}
编译与烧录
使用Keil C51或SDCC编译器将上述代码编译为HEX文件。以Keil为例:新建工程选择STC89C52器件,添加源文件后编译生成.hex文件。随后使用STC-ISP烧录软件,通过USB转TTL模块将HEX文件下载至单片机。
验证方法与判定标准
硬件验证:将程序烧录至单片机后上电,观察LED是否以约1秒周期(亮500ms、灭500ms)持续闪烁。若LED完全不亮,检查P1.0接线方向及限流电阻是否接在VCC一侧;若常亮不闪烁,检查延时函数是否被正确调用。
逻辑验证:在Keil中进入Debug模式,单步执行观察P1口寄存器值变化。执行LED = 0后P1口第0位变为0,执行LED = 1后恢复为1,且每次赋值间需经历约500ms的延时循环计数过程,以此确认程序严格按顺序执行。
判定标准:LED闪烁周期误差在±20%以内(即亮灭周期在0.8s~1.2s之间)视为通过。若周期偏差过大,检查晶振频率是否为12MHz,或调整delay_ms()内层循环次数(当前123次基于12MHz晶振计算)。