51单片机数码管

1.数码管的原理与电路图

1.1数码管的发光原理

51单片机上的数码管发光原理是一个数字8字型的数码管由7个led灯组成,还有一个是DP。(DP 是数码管中的一种特殊LED,用于显示小数点。当需要显示小数时,可以通过控制 DP 的亮灭状态来表示小数点的位置。在某些数码管中,DP 还可以用于显示其他特殊符号或功能,如温度单位(°C、°F)、时间单位(AM、PM)等。)

第一个是共阴极连接,第二个是共阳极连接。那共阴极举例,控制数码管亮的基本就是得先让3,8处的是低电平(0),其他的在阳极部分根据要显示的数字分别给出高电平和低电平(比如显示6,应该给出10111110)。

当有多个数码管时,像图中那样相连可以减少I/O口数量,原理和单个是一样的。

1.2 数码管的电路图

要使数码管发光首先是要确定是哪个位置,总共有八个数码管,所以要控制单个数码管显示数字,则需要通过译码器138来控制具体是哪个数码管,原理是通过p24、p23、p22来表示三个二进制数,从而在转化成十进制数,例如要让第三个灯亮就让p24、p23、p22输入110。

哪个数码管选择好了就该弄显示哪个数字了,显示数字也很简单如1.1中的发光原理所说

2.静态数码管显示

#include <REGX52.H>
unsigned char arr[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void fam(unsigned char x,y)
{

    
    switch(x)
    {
        case 1:
        P2_4=1;
        P2_3=1;
        P2_2=1;
            break;
        case 2:
        P2_4=1;
        P2_3=1;
        P2_2=0;
            break;
        case 3:
        P2_4=1;
        P2_3=0;
        P2_2=1;
            break;
        case 4:
        P2_4=1;
        P2_3=0;
        P2_2=0;
            break;
        case 5:
        P2_4=0;
        P2_3=1;
        P2_2=1;
            break;
        case 6:
        P2_4=0;
        P2_3=1;
        P2_2=0;
            break;
        case 7:
        P2_4=0;
        P2_3=0;
        P2_2=1;
            break;
        case 8:
        P2_4=0;
        P2_3=0;
        P2_2=0;
            break;
            
        
    }
    
    
        
        P0=arr[y];
        
}


void main()
{
    fam(8,1);
    while(1)
    {
    
    }
}

其中使用了数组和分支语句。单片机上的数码管是八个,编号分别是从Y0到Y7,根据输入口p22、p23、p24二进制知道有如下对应关系

二进制(Binary)十进制(Decimal)十六进制(Hexadecimal)
000000
000111
001022
001133
010044
010155
011066
011177

剩下的是其他的二进制转换

 

二进制(Binary)十进制(Decimal)十六进制(Hexadecimal)
000000
000111
001022
001133
010044
010155
011066
011177
100088
100199
101010A
101111B
110012C
110113D
111014E
111115F

 数码管的顺序是从右面往左面开始

3.动态数码管显示

程序如下

#include <REGX52.H>
void Delay(unsigned char xms)    //@12.000MHz
{
    unsigned char data i, j;
    while(xms--)
    {
        i = 2;
    j = 239;
    do
    {
        while (--j);
    } while (--i);
    }
    
}


unsigned char arr[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void fam(unsigned char x,y)
{

    
    switch(x)
    {
        case 1:
        P2_4=1;
        P2_3=1;
        P2_2=1;
            break;
        case 2:
        P2_4=1;
        P2_3=1;
        P2_2=0;
            break;
        case 3:
        P2_4=1;
        P2_3=0;
        P2_2=1;
            break;
        case 4:
        P2_4=1;
        P2_3=0;
        P2_2=0;
            break;
        case 5:
        P2_4=0;
        P2_3=1;
        P2_2=1;
            break;
        case 6:
        P2_4=0;
        P2_3=1;
        P2_2=0;
            break;
        case 7:
        P2_4=0;
        P2_3=0;
        P2_2=1;
            break;
        case 8:
        P2_4=0;
        P2_3=0;
        P2_2=0;
            break;
            
        Delay(1);
        P0=0x00;
    }
    
    
        
        P0=arr[y];
        
}


void main()
{
    
    while(1)
    {
        fam(1,0);
        Delay(1);
        fam(2,1);
        Delay(1);
        fam(3,2);
        Delay(1);
        fam(4,3);
        Delay(1);
        fam(5,4);
        Delay(1);
        fam(6,5);
        Delay(1);
        fam(7,6);
        Delay(1);
        fam(8,7);
        Delay(1);
    }
}

通过单片机自身的不断扫描从而达到显示不同数字的效果

  • 19
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值