建设生活 2024-03-15 01:13 采纳率: 33.3%
浏览 17

51单片机江科大 求解答取反为什么数码管不用取反

img

img

p1是led移位
p2是数码管
为什么数码管不用取反啊单片机0 1和c语言不是相反的么 不取反p0不应该是亮么为什么还是清零了。
求解惑。

  • 写回答

6条回答 默认 最新

  • 关注

    建设生活 上午好☀️☀️☀️️
    本答案参考ChatGPT-3.5

    数码管不需要取反的原因在于其工作原理和LED不同。LED是一种主动发光元件,可以直接通过给LED施加正向电压来点亮。而数码管是一种被动显示器件,需要通过控制对应的引脚信号来显示数字。通过给不同的引脚施加高电平或低电平来控制数码管的亮灭。在51单片机中,引脚的高电平对应于逻辑电平1,低电平对应于逻辑电平0。

    对于给定的数字,如1、2、3等,会有不同的引脚需要置高电平来显示。通过给对应的引脚上拉高电平,就可以点亮数码管显示相应的数字。因此,我们并不需要对数字取反,只需要按照不同数字的引脚设置相应的高电平或低电平即可。

    解决方案:

    1. 读取输入的数字,根据该数字对应的引脚设置相应的高低电平。可以使用一个函数来实现,根据输入的数字和引脚位置参数,设置相应的高低电平状态。
    2. 在主函数中调用该函数,根据需要显示的数字和对应引脚位置,设置相应的高低电平状态,来显示数码管的数字。
    3. 根据需要可能需要添加延迟函数来控制数码管显示的刷新速度。

    修改后的代码示例:

    #include <REGX52.H>
    
    void Delay(unsigned int xms);
    void Nixie(unsigned char Location, unsigned char Number);
    
    int main() {
      unsigned char LEDNum = 0;
      while(1) {
        LEDNum++;
        if(LEDNum >= 8)
          LEDNum = 0;
        Nixie(1, LEDNum);
        Delay(20);
      }
    }
    
    void Delay(unsigned int xms) {
      unsigned char i, j;
      while(xms) {
        i = 2;
        j = 239;
        do {
          while (--j);
        } while (--i);
        xms--;
      }
    }
    
    void Nixie(unsigned char Location, unsigned char Number) {
      switch(Location) {
        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;
        default:
          break;
      }
    
      P0 = Number;
    }
    
    

    在这段代码中,我们使用P2作为数码管的引脚控制端口,通过设置P2的不同引脚的电平状态,来显示不同的数字。在Nixie函数中,我们根据Location和Number参数的值,来设置相应的引脚电平状态,然后将Number赋给P0,即可显示相应数字。

    评论

报告相同问题?

问题事件

  • 创建了问题 3月15日

悬赏问题

  • ¥15 陆空双模式无人机飞控设置
  • ¥15 sentaurus lithography
  • ¥100 求抖音ck号 或者提ck教程
  • ¥15 关于#linux#的问题:子进程1等待子进程A、B退出后退出(语言-c语言)
  • ¥20 web页面如何打开Outlook 365的全球离线通讯簿功能
  • ¥15 io.jsonwebtoken.security.Keys
  • ¥15 急,ubuntu安装后no caching mode page found等
  • ¥15 联想交换机NE2580O/NE1064TO安装SONIC
  • ¥15 防火墙的混合模式配置
  • ¥15 Ubuntu不小心注销了要怎么恢复啊