蓝桥杯单片机比赛数码管模块(代码、原理详解)

文章详细介绍了数码管的工作原理,包括LED数码管的结构,如何通过控制八段的亮灭显示不同数字。同时,讲解了共阳极和共阴极的区别以及低电平驱动的优势。通过示例代码展示了如何使用单片机和573锁存器控制数码管显示特定数字,以及动态数码管显示的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

工作原理

在使用数码管之前我们首先来了解一下数码管的工作原理

LED数码管:数码管是一种简单、廉价的显示器,是由多个发光二极管封装在一起组成“8”字型的器件。

其实数码管就是控制八个LED灯的亮灭来进行显示的,如图2所示A、B、C、D、E、F、G、DP,分别是数码管的八段,我们只需要点亮或熄灭这八段就可以显示需要显示的内容了。

例如:显示1  点亮B、C段   熄灭A、D、E、F、G、DP                                                                 转化二进制段码值是1111 1001  十六进制段码值是0XF9(共阳极)                                                 转化二进制段码值是0000 0110 十六进制段码值是0X06(共阴极)

                                               

                    图1(数码管实物图)                                                图2(数码管段码图)

                     图3(共阳极)                                                        图4(共阴极)

 注:共阳极与共阴极的区别是高低电平驱动,一般我们使用的是低电平驱动,由电源给发光二极管供电,这样电压会更稳定。如果是高电平驱动的话则有单片机进行供电,但是单片机的电压在工作的时候会进行分压,会导致电压偏低。所有我们一般使用低电平驱动。

如图3 发光二极管的阳极接在了一起,公共端为高电平(1),这时我们只用将阴极置低电平(0),二极管导通发光。(低电平驱动)

如图4 发光二极管的阴极接在了一起,公共端为低电平(0),这时我们只用将阳极置高电平(1),二极管导通发光。(高电平驱动) 

原理图

现在我们来看一下开发板上的原理图,看如何控制单片机操作数码管。

数码管是由两个573锁存器控制的,分别控制数码管的位选(选择使用哪一个数码管)和段选(显示的内容)

Y6锁存器控制数码管的位选        P2=0XC0打开位选573锁存器  

 

 Y7锁存器控制数码管的段选        P2=0XE0打开段选573锁存器 

代码详解

1、点亮第一个数码管,显示数字1

//点亮第一个数码管,显示数字1
#include <STC15F2K60S2.H>

void Delayms(int ms);

void main(void)
{
    
    P2=0X80;P0=0XFF;P2=0XA0;P0=0X00;       //初始化,下一篇会专门解释初始化函数的
    while(1)
    {
        P2=0XC0;        //打开位选573锁存器
        P0=0X01;        //使用第一个数码管
        P2=0XE0;        //打开段选573锁存器
        P0=0XF9;        //显示数字1
        Delayms(1);     
    }
}
void Delayms(int ms)        //延时
{
    unsigned int i,j;
    for(i=0;i<ms;i++)
    for(j=845;j>0;j--);
}

2、动态数码管函数的使用

#include <STC15F2K60S2.H>

unsigned char yi,er,san,si,wu,liu,qi,ba;    //数码管位选值
unsigned char tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XBF,0XFF,0X00};      //数码管段选值

void Delayms(int ms);                               //延时
void SMG1(unsigned char yi,unsigned char er);       //数码管
void SMG2(unsigned char san,unsigned char si);
void SMG3(unsigned char wu,unsigned char liu);
void SMG4(unsigned char qi,unsigned char ba);


void main(void)
{
    
    P2=0X80;P0=0XFF;P2=0XA0;P0=0X00;       //初始化,下一篇会专门解释初始化函数的
    while(1)
    {
        SMG1(1,3);      //调用函数,传参数 显示1314520  
        SMG2(1,4);
        SMG3(5,2);
        SMG4(0,11);           
    }
}

void SMG1(unsigned char yi,unsigned char er)        //第一、二两个数码管
{
    P2=0XC0;            //打开数码管位选573锁存器
    P0=0X01;            //打开第一个数码管
    P2=0XE0;            //打开数码管段选573锁存器
    P0=tab[yi];         //显示数码管段选
    Delayms(1);         //动态数码管延时
    
    P2=0XC0;
    P0=0X02;
    P2=0XE0;
    P0=tab[er];
    Delayms(1);
}
void SMG2(unsigned char san,unsigned char si)      //第三、四两个数码管
{
    P2=0XC0;
    P0=0X04;
    P2=0XE0;
    P0=tab[san];
    Delayms(1);
    
    P2=0XC0;
    P0=0X08;
    P2=0XE0;
    P0=tab[si];
    Delayms(1);
}
void SMG3(unsigned char wu,unsigned char liu)       //第五,六两个数码管
{
    P2=0XC0;
    P0=0X10;
    P2=0XE0;
    P0=tab[wu];
    Delayms(1);
    
    P2=0XC0;
    P0=0X20;
    P2=0XE0;
    P0=tab[liu];
    Delayms(1);
}
void SMG4(unsigned char qi,unsigned char ba)        //第七、八两个数码管
{
    P2=0XC0;
    P0=0X40;
    P2=0XE0;
    P0=tab[qi];
    Delayms(1);
    
    P2=0XC0;
    P0=0X80;
    P2=0XE0;
    P0=tab[ba];
    Delayms(1);
}

void Delayms(int ms)        //延时
{
    unsigned int i,j;
    for(i=0;i<ms;i++)
    for(j=845;j>0;j--);
}

在写程序之前我们一定一定要看懂原理图。

以上就是我对数码管模块的全部理解,如有不对之处,还希望大家留言指正。有什么好的建议也可以留言。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值