1. 裸机顺序执行基础

裸机顺序执行基础 学习卡片

任务说明

本案例要求在不使用操作系统、不依赖定时器中断的前提下,仅利用主循环与软件延时,驱动单片机上的LED按固定周期闪烁。核心目标是理解裸机程序从上电复位到main()顺序执行的完整流程,以及CPU逐条执行指令、循环跳转的基本工作原理。

硬件连接与执行流程

以STC89C52单片机为例,LED阳极经1kΩ限流电阻接至VCC(+5V),阴极直接连接P1.0引脚。当P1.0输出低电平时LED点亮,输出高电平时熄灭。程序复位后,CPU从0x0000地址取指,跳转至main()函数入口,随后按照代码书写顺序依次执行初始化、循环体内的点亮、延时、熄灭、延时操作,如此往复。

裸机顺序执行流程(LED闪烁) 上电复位 (0x0000) main() 函数入口 P1.0 初始化(置高电平) while(1) 主循环 LED点亮 软件延时 LED熄灭 软件延时

完整代码实现

以下代码使用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晶振计算)。