仿真电路

  • 元件:

英文名|中文名|属性
:-|:-|:-|:-
7SEG-COM-AN-GRN|7段共阳极数码管(绿色)|-
74HC273|8位锁存器|-
RX8|8位电阻排|元件值设置为100
BUTTON|按键|-
RES|电阻|元件值设置为10K

  • 电路图:
    电路图

  • 仿真图:
    仿真图

    按键1 数码管1 加1
    按键2 数码管2 加1
    按键3 重置锁存器

程序设计

  • main.c:
    #include <AT89X51.H>
    #define uchar unsigned char
    #define uint unsigned int
    //字形码(0-9)
    uchar ca[10] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99,
                  0x92, 0x82, 0xf8, 0x80, 0x90};
    //延时函数 t为毫秒(不准)
    void delay(uint t)
    {
    uint i;
    while (t--)
    {
      for (i = 1200; i; i--)
        ;
    }
    }
    //刷新两个数码管
    void display(uchar m, uchar n)
    {
    P2_0 = 0;
    P3 = ca[m];
    P2_0 = 1;//更新锁存器1
    P2_1 = 0;
    P3 = ca[n];
    P2_1 = 1;//更新锁存器2
    }
    //主程入口
    void main()
    {
    uchar m = 0; //数码管1显示的数字
    uchar n = 0; //数码管2显示的数字
    P1 = 0xff;   //P1所有脚输出高电平
    display();   //更新显示
    for (;;)
    //死循环,和while(1)等价
    {
      if ((P1 & 0x07) != 0x07)
      //判断P1的1,2,3脚是不是高电平
      {
        delay(10); //延时消除抖动
        if (!(P1 & 0x01))
        //按键1
        {
          if (++m > 9)
          {
            m = 0;
          }
          display(m, n);
        }
        if (!(P1 & 0x02))
        //按键2
        {
          if (++n > 9)
          {
            n = 0;
          }
          display(m, n);
        }
        if (!(P1 & 0x04))
        //按键3,清除锁存器
        {
          P2_2 = 0;
          delay(10);
          P2_2 = 1;
        }
      }
      delay(10); //粗略延时
    }
    }

注解

锁存器

  • 锁存器
  • 锁存器顾名思义,可以把输出信号住。一般用于引脚复用,扩充引脚数量。
  • 引脚类型: 清除引脚MR,时钟引脚CLK,数据输入引脚D,数据输出引脚Q
    清除引脚MR: 低电平时将锁存器锁住的信号清除,输出Q置为低电平
    时钟引脚CLK: 收到上升沿信号时解锁,输入D的信号可以传到输出Q,其余时候输出Q会被锁住,保持当前状态
  • 上升沿与下降沿

74HC273真值表

清除引脚MR 时钟引脚CLK 数据输入引脚D 数据输出引脚Q
L * * L
H 上升沿 H H
H 上升沿 L L
H 非上升沿 * Q

L:低电平,H:高电平

最后修改:2020 年 04 月 02 日 06 : 29 PM