51 单片机 LED 流水灯 + 数码管动态扫描学习笔记(STC89C52)

1. 实验目的

  • 掌握 IO 口驱动 LED 的基本方法;
  • 理解数码管动态扫描原理,利用人眼视觉暂留实现多位显示;
  • 使用定时器 0 中断实现秒计时,并在数码管上显示计数值。

2. 硬件电路

plaintext 复制代码
LED(共阳极)
5V → LED阳极 → LED阴极 → 220Ω电阻 → P2.x

2位共阴极数码管
P0.0~P0.7 → 数码管 a~g、dp(P0 接 8 位上拉排阻)
P1.0 → 数码管个位位选
P1.1 → 数码管十位位选

3. 核心代码

c 复制代码
#include <reg52.h>

sbit EN1 = P1^0;
sbit EN2 = P1^1;

// 共阴极段码 0~9
unsigned char code seg[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};

volatile unsigned char cnt=0;
unsigned int num=0;

void delay(unsigned int t)
{
    while(t--);
}

// 动态扫描显示两位数字
void display(unsigned int n)
{
    unsigned char shi = n/10;
    unsigned char ge  = n%10;

    EN1=1; P0=seg[ge];  delay(400); EN1=0;
    EN2=1; P0=seg[shi]; delay(400); EN2=0;
}

// 定时器0中断 50ms@12M
void Timer0_ISR(void) interrupt 1
{
    TH0=0x3C; TL0=0xAF;
    cnt++;
    if(cnt >= 20){
        cnt = 0;
        num++;
    }
}

void Timer0_Init(void)
{
    TMOD |= 0x01;
    TH0=0x3C; TL0=0xAF;
    ET0 = 1;
    TR0 = 1;
    EA  = 1;
}

void main(void)
{
    Timer0_Init();
    while(1)
    {
        P2 = 0xFE;   // P2.0的LED点亮
        display(num);
    }
}

4. 实验现象

  • P2.0 LED 保持点亮;
  • 数码管每秒数值加 1;
  • 动态扫描必须加短暂延时,否则数码管过暗看不清。

5. 踩坑小结

  • P0 口无上拉排阻,数码管亮度不足;
  • 定时器模式 1 中断,必须手动重装 TH0、TL0 初值;
  • 被中断修改的全局变量建议加 volatile,防止编译器优化出错。
相关推荐
无敌最俊朗-1 天前
【电感专题2:电感的感抗、电路的阻抗、电流的滞后】
单片机·嵌入式硬件·元器件·电感
柳鲲鹏1 天前
内斗学概论:43、平级内斗
笔记
wuyk5551 天前
嵌入式故障诊断-Bug002-局部大数组压栈高温必死机
stm32·单片机·嵌入式硬件·mcu·物联网·51单片机·嵌入式实时数据库
星恒随风1 天前
MySQL 从零入门(四):表的增删改查与基础查询详解
linux·服务器·数据库·笔记·mysql
li星野1 天前
相位补偿学习记录:把被颅骨“打乱“的声波重新对齐
学习
Z21-X1 天前
云原生运维学习笔记:ECShop全链路容器化部署与Docker底层资源隔离深度剖析
运维·笔记·学习·云原生
red_redemption1 天前
自由学习记录(230)
学习
Zwawa1 天前
嵌入式OLED表驱动菜单:用一张表、一个栈和一个窗口重写表驱动菜单
c语言·单片机·嵌入式
Dev_XH1 天前
【成品设计】基于沁恒单片机的电动汽车充电站智慧调度系统
stm32·单片机·嵌入式硬件·物联网
minglie11 天前
esp32c3+atshell测试ov7670
单片机·嵌入式硬件