51 单片机驱动 LED 数码管显示出生日期

51单片机驱动LED数码管显示出生日期

一、实验目的

通过51单片机驱动八位LED数码管,控制数码管稳定显示本人的出生年月日。例如2003年4月17日出生的同学,应在八位数码管上稳定显示20030417。

要求:

(1)进一步理解LED数码管静态显示原理

(2)掌握LED数码管动态显示编程,参考课堂上及钉钉群介绍的两种编程方法,在开发板和PROTEUS中,实现八位数码的动态稳定显示。

 二、实验原理

1. LED数码管结构

LED数码管本质是多个发光二极管构成,如"8"字型七段数码管,共由七个发光二极管构成,分为共阴极和共阳极两种类型。同时多位数码管具有位选引脚来控制仅某位数码管工作。

2. 显示原理

 静态显示

静态显示是指每个数码管的段选线与单片机的I/O口直接相连,位选线由单片机控制。当需要显示某个数字时,单片机将对应的段码输出到段选线上,同时选通对应的位选线,使该位数码管显示相应的数字。

 动态显示

动态显示是指将所有数码管的段选线并联在一起,由单片机的一个I/O口控制,而每个数码管的位选线由单片机的另一个I/O口控制。单片机通过分时轮流控制各个数码管的位选线,使各个数码管轮流点亮。由于人的视觉暂留效应,当轮流点亮的速度足够快时,就会看到所有数码管同时点亮的效果。

 三、实验步骤

1. 首先,我们需要在Proteus中创建一个新的项目,然后添加所需的元件:

- AT89C51单片机

- 八位共阴极数码管

- 电阻(限流电阻)

- 电容(去耦电容)

- 晶振(11.0592MHz)

电路连接如下:

- 数码管的段选线(a-g和dp)通过限流电阻连接到单片机的P0口

- 数码管的位选线(1-8)通过三极管驱动连接到单片机的P2口

- 单片机的P1口可以留作备用

- 单片机的RST引脚连接复位电路(电容和电阻)

- 单片机的XTAL1和XTAL2引脚连接晶振和电容

示例图如下:

2. 在Keil uVision集成开发环境中编写源程序

根据实验要求,我们需要编写一个程序,使八位数码管稳定显示本人的出生年月日。下面是实现代码:

#include <reg52.h>

// 定义数码管段选端口和位选端口

#define SEG_PORT P0  // 段选端口

#define BIT_PORT P2  // 位选端口

// 共阴极数码管0-9的段码表(无小数点)

unsigned char code seg_table[] = {

    0x3F, 0x06, 0x5B, 0x4F, 0x66,

    0x6D, 0x7D, 0x07, 0x7F, 0x6F

};

// 定义显示缓冲区,存储要显示的8位数字

unsigned char display_buffer[8] = {2, 0, 0, 3, 0, 4, 1, 7};  // 示例:20030417

// 延时函数

void delay_ms(unsigned int ms) {

    unsigned int i, j;

    for(i = 0; i < ms; i++)

        for(j = 0; j < 110; j++);

}

// 数码管动态显示函数

void display() {

    unsigned char i;

    for(i = 0; i < 8; i++) {

        BIT_PORT = ~(1 << i);        // 位选,选中第i位数码管

        SEG_PORT = seg_table[display_buffer[i]];  // 段选,显示对应的数字

        delay_ms(1);                 // 延时,控制显示时间

        SEG_PORT = 0x00;             // 消隐,防止残影

    }

}

// 主函数

void main() {

    while(1) {

        display();  // 调用数码管显示函数

    }

}

```

3. 编译并生成目标文件

在Keil uVision中,打开上述代码文件,进行编译。确保编译过程中没有错误和警告。编译成功后,生成HEX文件,这是我们需要下载到单片机中的目标文件。

 4. 为单片机加载目标代码文件,设置时钟频率

回到Proteus中,双击AT89C51单片机,在弹出的对话框中,选择刚才生成的HEX文件,并设置时钟频率为11.0592MHz。

5. Proteus仿真运行,查看效果

点击Proteus中的运行按钮,开始仿真。此时,八位数码管应该稳定显示出设定的出生年月日。如果显示不正常,可以检查电路连接是否正确,程序是否有逻辑错误,或者调整延时时间。

四、实验结果与分析

通过上述步骤,我们成功实现了用51单片机驱动八位LED数码管显示出生年月日的功能。在实验过程中,我对LED数码管的静态显示和动态显示原理有了更深入的理解。

静态显示虽然简单,但占用I/O口资源较多,而动态显示通过分时复用的方式,大大节省了I/O口资源,但需要编写更复杂的程序来控制显示效果。

在编程实现过程中,需要注意以下几点:

1. 段码表的正确定义,共阴极和共阳极数码管的段码是不同的

2. 位选信号的控制,确保每次只选中一位数码管

3. 显示延时的设置,过短会导致显示不稳定,过长会导致闪烁明显

4. 消隐操作的添加,防止出现残影影响显示效果

 五、总结

本次实验通过51单片机驱动LED数码管显示出生年月日,不仅加深了对LED数码管显示原理的理解,还提高了单片机编程能力和硬件设计能力。

在实验过程中,遇到了一些问题,如显示不稳定、有残影等,但通过调整程序和电路,最终都得到了解决。在单片机开发中,硬件设计和软件编程是相辅相成的,需要综合考虑才能实现良好的效果。

以上就是本次实验的全部内容,希望对大家有所帮助。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值