怎么用51单片机建构计数系统

左边数码管显示产品数量1000,右边数码管显示产品个数和批次分别是6和10

用三个按键,一个用来选择要改变的数字,另外两个按键用来加减,再用一个传感器来计数,自动加一

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7808714
  • 这篇博客你也可以参考下:使用51单片机以及数码管来显示十字路口红绿灯
  • 除此之外, 这篇博客: 基于51单片机数字电压表仿真设计_数码管显示中的 原理图 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    img

  • 您还可以看一下 张长志老师的大白话学懂机器学习与推荐系统实战课程中的 000_机器学习和推荐系统_课程简介小节, 巩固相关知识点
  • 以下回答来自chatgpt:

    针对问题的具体解决方案如下:

    1.确定硬件连接方案,将左边的数码管连接在P1口,右边的数码管连接在P2口,根据具体型号确定使用共阴极数码管还是共阳极数码管,确定哪些管脚接VCC,哪些管脚接GND。

    2.编写驱动程序,通过P1口驱动左边的数码管显示产品数量为1000。由于51单片机的IO口最多可以输出高电平5V,需要通过外部电路将其放大到数码管所需的电压(一般为7V-12V)。具体实现方法是将P1口设置为输出模式,然后将P1口的输出与一个经过放大电路之后的电压比较器输入端相接,在程序中分别将数码显示的数据(1,0,0,0)对应的码(0x7C,0x58,0x38,0x3F)赋值给P1口,从而实现在数码管上显示产品数量。

    3.编写驱动程序,通过P2口驱动右边的数码管以及对应的批次信息显示。由于要显示的内容比较复杂,需要将其分别拆分成“产品个数”和“批次”两个部分。其中“产品个数”只需要在数码管上显示数字即可,与左边的数码管驱动方式相同;“批次”需要将10个数码管依次进行扫描并切换显示,虽然不需要实现动态扫描,但是扫描的过程依然需要在程序中明确表示。针对这一部分的具体驱动程序实现如下:

    #include<reg52.h>
    #define uint unsigned int
    #define uchar unsigned char
    
    sbit P2_0 = P2^0; //用P2.0~P2.3分别表示数码管的CS1~CS4引脚
    sbit P2_1 = P2^1;
    sbit P2_2 = P2^2;
    sbit P2_3 = P2^3;
    
    uchar code num_table[] = {
        0x3F, 0x06, 0x5B, 0x4F, 0x66, 
        0x6D, 0x7D, 0x07, 0x7F, 0x6F
    }; //数码管数字的显示码
    uchar code batch_table[] = {
        0x3F, 0x06, 0x5B, 0x4F, 0x66, 
        0x6D, 0x7D, 0x07, 0x7F, 0x6F, 0x00
    }; //数码管批次的显示码
    
    //在P2口的n个数码管中显示数字num
    void display_num(uchar num, uchar n) {
        uchar code *table=num_table; 
        if (n == 5) { table = num_table; } //第一个数码管
        if (n == 6) { table = num_table; } //第二个数码管
        if (n == 7) { table = batch_table; } //批次的第一个数码管
        if (n == 8) { table = batch_table; } //批次的第二个数码管
        if (n == 9) { table = batch_table; } //批次的第三个数码管
        if (n == 10) { table = batch_table; } //批次的第四个数码管
        P2_0 = P2_1 = P2_2 = P2_3 = 1; //关闭所有数码管
        P2 &= 0xFF00; P2 |= (1<<(n-1)); //打开n对应的数码管1<<1:0x0002, 1<<2:0x0004, 1<<3:0x0008 
        P0 = table[num];
    }
    
    void main() {
        uint i = 0;
        uchar num = 0, batch = 0;
        while (1) {
            //左边的数码管显示产品数量1000
            P1 = 0xFF; //清空P1口输出
            P1 = 0x08; //输出高电平到P1.3
            display_num(num, 5); //右边的第一个数码管显示产品个数
            display_num(batch / 1000, 7); //右边的第一个数码管显示批次的千位
            display_num(batch % 1000 / 100, 8);  //右边的第二个数码管显示批次的百位
            display_num(batch % 100 / 10, 9); //右边的第三个数码管显示批次的十位
            display_num(batch % 10, 10); //右边的第四个数码管显示批次的个位
            num++; //每次num加1模拟产品数量的增加
            i++;
            if (i >= 100) { //每过100次循环模拟批次增加
                i = 0;
                batch++;
            }
        }
    }
    

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^