微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 单片机上电后,数码管全亮,紧急求助

单片机上电后,数码管全亮,紧急求助

时间:10-02 整理:3721RD 点击:
我用51做了一个记分牌,但是上电后数码管全亮,按键操作无效。检查了硬件电路,应该是没问题的。程序仿真也没错,不知道哪里出了问题

  1. #include <reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int

  4. sbit K0=P1^0;
  5. sbit K1=P1^1;
  6. sbit K2=P1^2;
  7. sbit K3=P1^3;                  
  8. sbit K4=P1^4;


  9. sbit LED1=P3^4;
  10. sbit LED2=P3^5;
  11. sbit LED3=P3^6;
  12. sbit LED4=P3^7;




  13. unsigned char tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

  14. uchar cz=24;
  15. uchar timebegin =0;
  16. uchar bittime=0,bit1s=0;
  17. //uchar score=0;
  18. uchar mode=0;
  19. uchar score1=1;
  20. uchar score2=2;


  21. void delay10ms(void)
  22. {

  23.          unsigned char i,j,k;

  24.                 for(i=5;i>0;i--)

  25.                 for(j=4;j>0;j--)

  26.                 for(k=248;k>0;k--);

  27. }


  28. void delay_key(void)
  29. {
  30.         delay10ms();
  31.         delay10ms();
  32.         delay10ms();
  33. }


  34. void display_time()
  35. {         
  36.     TR0=1;
  37.     P2=0XFb;
  38.     P0=tab[cz/10];
  39.     delay(10);
  40.     P2=0XF7;
  41.     P0=tab[cz%10];
  42.     delay(10);
  43. }

  44. void display_1(uint z)
  45. {
  46.    P2=0XFd;
  47.    P0=tab[z%10];
  48.    delay(10);
  49.    P2=0XFe;
  50.    P0=tab[z/10];
  51.    delay(10);
  52. }


  53. void display_2(uint z)
  54. {
  55.    P2=0XF7;
  56.    P0=tab[z%10];
  57.    delay(10);
  58.    P2=0XFb;
  59.    P0=tab[z/10];
  60.    delay(10);
  61. }

  62. void mode_set()
  63. {
  64.    if(K0==0)
  65.    {
  66.                  delay_key();
  67.                  
  68.                  if(K0==0)
  69.           {
  70.                         while(~K0);
  71.                         timebegin = 0;
  72.                         mode++;
  73.                         if(mode >= 3) mode=1;
  74.                 }
  75.         }
  76.         
  77.          if(K4==0)
  78. {
  79.                 delay_key();
  80.                 if(K4==0)  
  81.                 {
  82.                         while(~K4)
  83.                         cz = 24 ;
  84.                         mode = 4;
  85.                         timebegin = 1;
  86.                 }
  87. }

  88. }

  89. int inc(uchar num)
  90. {
  91.    if(~K1)
  92.    {
  93.                  delay_key();
  94.            if(~K1) num +=1;
  95.                  while(~K1);
  96.    }
  97.    if(~K2)
  98.    {
  99.      delay_key();
  100.      if(~K2)  num +=2;
  101.      while(~K2);
  102.          }
  103.           if(~K3)
  104.           {
  105.                  delay_key();
  106.                  if(~K3)  num +=3;
  107.                  while(~K3);
  108.           }
  109.   return num ;
  110. }



  111. void init_timer0(void)
  112.   {
  113.           TMOD = 0x01;
  114.     TH0 = 0x3C;
  115.     TL0 = 0x0b0;
  116.     EA = 1;
  117.     ET0 = 1;
  118.     TR0 = 0;
  119.         }


  120.   void main(void)
  121. {
  122.   init_timer0();
  123.   P2=0XF0;
  124.   P0=0X3F;

  125.         while(1)
  126.         {
  127.           mode_set();
  128.          
  129.           if(mode==1)
  130.           {
  131.                 LED1=0;
  132.                 LED2=1;
  133.                 LED3=1;
  134.                 LED4=1;
  135.                 score1 = inc(score1);
  136.                 display_1(score1);
  137.                 display_2(score2);
  138.                 }
  139.                  
  140.            if(mode==2)
  141.           {
  142.                  LED2=0;
  143.                  LED1=1;
  144.                  LED3=1;
  145.                  LED4=1;
  146.                  score2 = inc(score2);
  147.                  display_1(score1);
  148.                  display_2(score2);
  149.                 }
  150.                
  151.                  if(mode == 4)
  152.                  {        
  153.                   LED1=1;
  154.                   LED2=1;
  155.                         LED3=0;
  156.                         display_time();

  157.                  }

  158. }

  159. void timer0 (void) interrupt 1 using 0
  160. {

  161.     TH0=0X3C;
  162.     TL0=0X0B0;
  163.         
  164.         if(bittime == 20)
  165.         {
  166.          bittime = 0;
  167.          if(timebegin) bit1s = 1;
  168.                 else bit1s = 0;
  169.   }
  170.   else  bittime++;
  171.         

  172.                   if(timebegin)
  173.                         {
  174.                                 if(bit1s == 1)
  175.                                 {
  176.                                         bit1s = 0;
  177.                                        
  178.                                         cz--;
  179.                
  180.                                                 if(cz == 0)
  181.                                                 {                                                   
  182.                                                         cz=0;
  183.                                                         LED4=0;
  184.                                                         timebegin = 0;
  185.                                                         
  186.                                           }
  187.                                 }
  188.                         }


  189.           TH0=0X3C;
  190.     TL0=0X0B0;
  191. }

复制代码



可能需要增加驱动电路。这也是程序仿真和实验板的区别。

我同学的跟我硬件电路一样的,他的就可以显示

你贴上来的代码对吗?编译能通过吗?

在显示部分加上关闭,每次P0送完段码延时结束后,将P0关闭,再试试

数码是共阴还是共阳的?

共阴的数码管

可以通过,仿真运行一切正常

那可能是我的问题,我没找到,
我在keil里编译通不过
你找到问题了@我一下 我也学习一下

数码管扫描过快,把delay时间改大一点就好

学习了
我看在你贴上来的代码里添加到keil 里编译通不过
谢谢指导

根据我的教训,烧录的时候 多检查下熔丝位,特别一些什么复用端口的熔丝位。

小编板子是你自己手焊的? 如果硬件电路是一致的话,那要检查一下焊接的状况,看看会不会因为焊接异常导致此问题!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top