51单片机数码管有没有人教一下

八片共阴极数码管 8跑马8遍。即从左到右依次在每一片数码管上显示8,这是跑马一遍,如此重复8遍。P0.0----
-P0.7接A-----DP










P2.0--P2.7 接S0-S7

以下是使用51单片机控制八片共阴极数码管实现八位数字循环跑马灯的代码:

#include <reg51.h>

// 数码管位选控制变量
unsigned char code Digit[] = {0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xBF, 0x7F};

// 数码管段选控制变量
unsigned char code LedChar[] = {
    0xC0,  // 0
    0xF9,  // 1
    0xA4,  // 2
    0xB0,  // 3
    0x99,  // 4
    0x92,  // 5
    0x82,  // 6
    0xF8,  // 7
    0x80,  // 8
    0x90   // 9
};

// 数码管显示控制函数
void Display(unsigned char x, unsigned char y)
{
    P0 = Digit[x];     // 选中对应位数的数码管
    P2 = LedChar[y];   // 显示对应数字
}

void main()
{
    unsigned char i, j, k;

    while (1)
    {
        // 循环8次,每次循环显示8个数字
        for (i = 0; i < 8; i++)
        {
            // 循环8次,每次循环控制一位数码管显示数字8
            for (j = 0; j < 8; j++)
            {
                // 循环8次,每次循环控制8位数码管依次显示数字8
                for (k = 0; k < 8; k++)
                {
                    Display(k, 8);     // 选中k位数码管,显示数字8
                    delay(1);          // 延时一段时间,使数字8可以被看到
                }
            }
        }
    }
}


该代码定义了两个控制变量:Digit和LedChar,分别对应数码管的位选控制和段选控制。Display函数用于显示对应的数字。在主函数中,使用三重循环,分别控制位数、数码管和数字的显示。在控制数码管显示时,选中对应位数的数码管,然后在一个短暂的时间内显示数字8,重复此过程,就可以实现八位数字循环跑马灯的效果。

以下内容部分参考ChatGPT模型:


首先需要了解51单片机的IO口控制和数码管显示的基本原理。然后可以按照以下步骤来实现题目要求:

  1. 定义数码管显示的数字数组,例如:

    unsigned char num[8] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07};
    

    其中,每个元素对应一个数字的编码,可以根据具体的数码管型号来修改。

  2. 初始化IO口,将P0和P2设置为输出模式,例如:

    P0 = 0xff; //设置P0口为输出模式
    P2 = 0xff; //设置P2口为输出模式
    
  3. 在主函数中循环显示8个数字,每个数字显示一段时间后切换到下一个数字,例如:

    while (1) {
     for (int i = 0; i < 8; i++) {
         P0 = num[i];
         P2 = 1 << i;
         delay(); //延时一段时间,控制数码管显示的速度
     }
    }
    

    其中,P0用来控制数码管显示的数字,P2用来控制数码管的位选,delay()函数用来延时,可以根据具体的需求来修改。

  4. 编写延时函数,例如:

    void delay() {
     int i, j;
     for (i = 0; i < 100; i++) {
         for (j = 0; j < 1000; j++);
     }
    }
    

    该函数用来控制数码管显示的速度,可以根据具体的需求来修改。

完整代码如下:

#include <reg51.h>

unsigned char num[8] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07};

void delay() {
    int i, j;
    for (i = 0; i < 100; i++) {
        for (j = 0; j < 1000; j++);
    }
}

void main() {
    P0 = 0xff;
    P2 = 0xff;
    while (1) {
        for (int i = 0; i < 8; i++) {
            P0 = num[i];
            P2 = 1 << i;
            delay();
        }
    }
}

如果我的建议对您有帮助、请点击采纳、祝您生活愉快