找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4004|回复: 7
收起左侧

做了一个8路抢答器,可是数码管显示乱码,请大家帮忙看看

[复制链接]
ID:330538 发表于 2018-7-22 15:22 | 显示全部楼层 |阅读模式
微信图片_20180722152140.jpg 微信图片_20180722152130.png 微信图片_20180722152137.png 微信图片_20180722152157.jpg
程序源码
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. sbit smg1=P2^0;                //定义数码管第一位
  4. sbit smg2=P2^1;                //定义数码管第二位
  5. sbit smg3=P2^2;                //定义数码管第三位
  6. sbit keyks=P3^0;        //定义开始按键
  7. sbit keytz=P3^1;        //定义停止按键
  8. sbit keyqc=P3^2;        //定义清除按键
  9. sbit key1=P1^0;                //定义1号抢答选手
  10. sbit key2=P1^1;                //定义2号抢答选手
  11. sbit key3=P1^2;                //定义3号抢答选手
  12. sbit key4=P1^3;                //定义4号抢答选手
  13. sbit key5=P1^4;                //定义5号抢答选手
  14. sbit key6=P1^5;                //定义6号抢答选手
  15. sbit key7=P1^6;                //定义7号抢答选手
  16. sbit key8=P1^7;                //定义8号抢答选手
  17. sbit spk=P3^7;                //定义蜂鸣器
  18. int djs=60,js=0;                   //djs和bt是初始倒计时时间,可修改
  19. //int table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  20. int table[]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x40};

  21. void delayms(int x)           //延时函数
  22. {
  23. char i;
  24. while(x--)
  25. {
  26.   for(i=500;i>0;i--);
  27. }
  28. }



  29. void Timer0_init()                        //定时器0初始化
  30. {
  31.       js=0;
  32.           TMOD=0x01;                                  //T0为定时器方式1
  33.       TH0=0x4c;
  34.           TL0=0x00;                        
  35.       //TR0=1;//IT1=1;
  36.           ET0=1;//EX1=1;
  37.           EA=1;        
  38. }

  39. void timer0() interrupt 1 using 1        //定时器0中断服务函数
  40. {
  41.             TF0=0;
  42.                  TH0=0x4c;
  43.                 TL0=0x00;                                        //赋初值
  44.                 js++;
  45.                 if(js==15)
  46.                   { js=0;
  47.                     djs--;                                        //产生1s的倒计时
  48.                         //led1=~led1;
  49.                    }
  50. }

  51. void djsxs()                                   //显示倒计时函数
  52. {        int b1,b2;
  53.          b1=djs/10;
  54.         b2=djs%10;                                  // 将倒计时时间分成高低位
  55.         P0=table[b1];
  56.     smg2=0;
  57.     delayms(3);
  58.     smg2=1;                                         //显示十位数字

  59.         P0=table[b2];
  60.         smg3=0;
  61.         delayms(3);                                 //显示个位数字
  62.         smg3=1;
  63. }
  64. void djsxs22()                                 
  65. {        
  66.          P0=0x40;
  67.     smg1=0;
  68.     delayms(3);
  69.     smg1=1;                                        //第一位数码管显示-

  70.         P0=0x40;
  71.     smg2=0;
  72.     delayms(3);                           //第三位数码管显示-
  73.     smg2=1;

  74.         P0=0x40;
  75.         smg3=0;
  76.         delayms(3);
  77.         smg3=1;                                  //第四位数码管显示-
  78. }

  79. void djsxs1()
  80. {
  81.         P0=table[1];
  82.     smg1=0;
  83.     delayms(3);
  84.     smg1=1;                                   //第一位数码管显示1

  85. }
  86. void djsxs2()
  87. {
  88.         P0=table[2];
  89.     smg1=0;
  90.     delayms(3);
  91.     smg1=1;                                //第一位数码管显示2

  92. }
  93. void djsxs3()
  94. {
  95.         P0=table[3];
  96.     smg1=0;
  97.     delayms(3);
  98.     smg1=1;                          //第一位数码管显示3

  99. }
  100. void djsxs4()
  101. {
  102.         P0=table[4];
  103.     smg1=0;
  104.     delayms(3);
  105.     smg1=1;                         //第一位数码管显示4

  106. }
  107. void djsxs5()
  108. {
  109.         P0=table[5];
  110.     smg1=0;
  111.     delayms(3);
  112.     smg1=1;                   //第一位数码管显示5

  113. }
  114. void djsxs6()
  115. {
  116.         P0=table[6];
  117.     smg1=0;
  118.     delayms(3);
  119.     smg1=1;                        //第一位数码管显示6

  120. }
  121. void djsxs7()
  122. {
  123.         P0=table[7];
  124.     smg1=0;
  125.     delayms(3);
  126.     smg1=1;                  //第一位数码管显示7
  127. }
  128. void djsxs8()
  129. {
  130.         P0=table[8];
  131.     smg1=0;
  132.     delayms(3);
  133.     smg1=1;                 //第一位数码管显示8

  134. }
  135. void main()
  136. {
  137. int djs1=60;
  138. Timer0_init();         //初始化定时器中断
  139. spk=1;                          //蜂鸣器不响
  140.         djs=60;                //倒计时赋值
  141. while(1)
  142. {

  143. LOOP1:   djs=djs1;
  144. djsxs22();        //LOOP1是标号,显示 -  --

  145.                         if(key1==0)                 //在定时器运行状态下,key1==0 则说明1号选手按下按键
  146.                                                 {
  147.                                                            delayms(3);
  148.                                                            if(key1==0)
  149.                                                            {
  150.                                                             while(!key1);          //去除按键抖动后,重新在判断,是否确实按下
  151.                                                          djs=60;
  152.                                                          while(1)
  153.                                                           {
  154.                                                             TR0=0;                  //定时器停止
  155.                                                                 djsxs();         
  156.                                                            if(key2==0)          //复位按下按下
  157.                                                            {        
  158.                                                                                    delayms(3);                   //去除抖动
  159.                                                                                    if(key2==0)           //再次判断是否按下复位按键
  160.                                                                                    {
  161.                                                                                     while(!key2); //如果按下复位键,则回到- --状态
  162.                                                                                  djs++;
  163.                                                                                  djs1=djs;
  164.                                                                                 }
  165.                                                                         }
  166.                                                            if(key3==0)          //复位按下按下
  167.                                                            {        
  168.                                                                                    delayms(3);                   //去除抖动
  169.                                                                                    if(key3==0)           //再次判断是否按下复位按键
  170.                                                                                    {
  171.                                                                                     while(!key3); //如果按下复位键,则回到- --状态
  172.                                                                                  djs--;
  173.                                                                                  djs1=djs;
  174.                                                                                 }
  175.                                                                         }
  176.                                                            if(key1==0)          //复位按下按下
  177.                                                            {        
  178.                                                                                    delayms(3);                   //去除抖动
  179.                                                                                    if(key1==0)           //再次判断是否按下复位按键
  180.                                                                                    {
  181.                                                                                     while(!key1); //如果按下复位键,则回到- --状态
  182.                                                                                 goto LOOP1;                  //goto语句,回到loop1表号处
  183.                                                                                 }
  184.                                                                         }                                                                                   
  185.                                                           }
  186.                                                         }
  187.                                                 }
  188.                         if(keyks==0)
  189.                         {                  
  190.                           //spk=0;
  191.                            delayms(3);                 //去除按键抖动
  192.                            if(keyks==0)
  193.                            {
  194.                             while(!keyks);          //以上表示按下开始按键
  195.                                 //spk=1;                           //蜂鸣器不响
  196.                                 TR0=1;                           //启动定时器 开始倒计时
  197.                                 while(1)
  198.                                   {
  199.                                     djsxs();
  200.                                 if(keytz==0)
  201.                                                 {
  202.                                                            delayms(3);                         //此处表示出去抖动, 以后不一一标出
  203.                                                            if(keytz==0)
  204.                                                            {
  205.                                                             while(!keytz);           //以上表示按下停止按键后

  206.                                                             TR0=0;                   //定时器停止

  207.                                                         }
  208.                                                 }
  209.                                    if(keyks==0)
  210.                                                 {
  211.                                                     //spk=0;
  212.                                                            delayms(3);
  213.                                                            if(keyks==0)
  214.                                                            {
  215.                                                             while(!keyks);           //以上表示按下清楚按键后
  216.                                                          //spk=1;                           //蜂鸣器不响
  217.                                                             TR0=1;                   //定时器启动

  218.                                                         }
  219.                                                 }
  220. /***************************以下是八个选手抢答,key1表示1号选手,依次类推,注释只写第一位选手,其他和第一个完全一致,************************************/
  221.                                 if((key1==0)&&(TR0==1))                 //在定时器运行状态下,key1==0 则说明1号选手按下按键
  222.                                                 {                 spk=0;                 //蜂鸣器响
  223.                                                            delayms(3);
  224.                                                            if(key1==0)
  225.                                                            {
  226.                                                             while(!key1);          //去除按键抖动后,重新在判断,是否确实按下
  227.                                                           spk=1;                  //蜂鸣器不响
  228.                                                          while(1)
  229.                                                           {
  230.                                                             TR0=0;                  //定时器停止
  231.                                                                  djsxs1();          //显示选手编号
  232.                                                                 djsxs();          //显示剩余倒计时时间
  233.                                                            if(keyqc==0)
  234.                                                            {        
  235.                                                                                    delayms(3);                   //去除抖动
  236.                                                                                    if(keyqc==0)
  237.                                                                                    {
  238.                                                                                     while(!keyqc); //如果按下清楚键,则回到- --状态

  239.                                                                                 goto LOOP1;                  //goto语句,回到loop1表号处
  240.                                                                                 }
  241.                                                                                 }                                                                                   
  242.                                                           }
  243.                                                         }
  244.                                                 }
  245.                                 if((key2==0)&&(TR0==1))
  246.                                                 {        spk=0;
  247.                                                            delayms(3);
  248.                                                            if(key2==0)
  249.                                                            {
  250.                                                             while(!key2);
  251.                                                           spk=1;
  252.                                                          while(1)
  253.                                                           {
  254.                                                             TR0=0;
  255.                                                                  djsxs2();
  256.                                                                 djsxs();
  257.                                                            if(keyqc==0)
  258.                                                            {        
  259.                                                                                    delayms(3);
  260.                                                                                    if(keyqc==0)
  261.                                                                                    {
  262.                                                                                     while(!keyqc);

  263.                                                                                 goto LOOP1;        
  264.                                                                                 }
  265.                                                                                 }                                                                                   
  266.                                                           }
  267.                                                         }
  268.                                                 }
  269.                                         if((key3==0)&&(TR0==1))
  270.                                                 {        spk=0;
  271.                                                            delayms(3);
  272.                                                            if(key3==0)
  273.                                                            {
  274.                                                             while(!key3);
  275.                                                           spk=1;
  276.                                                          while(1)
  277.                                                           {
  278.                                                             TR0=0;
  279.                                                                  djsxs3();
  280.                                                                 djsxs();
  281.                                                            if(keyqc==0)
  282.                                                            {        
  283.                                                                                    delayms(3);
  284.                                                                                    if(keyqc==0)
  285.                                                                                    {
  286.                                                                                     while(!keyqc);

  287.                                                                                 goto LOOP1;        
  288.                                                                                 }
  289.                                                                                 }                                                                                   
  290.                                                           }
  291.                                                         }
  292.                                                 }
  293.                                 if((key4==0)&&(TR0==1))
  294.                                                 {        spk=0;
  295.                                                            delayms(3);
  296.                                                            if(key4==0)
  297.                                                            {
  298.                                                             while(!key4);
  299.                                                           spk=1;
  300.                                                          while(1)
  301.                                                           {
  302.                                                             TR0=0;
  303.                                                                  djsxs4();
  304.                                                                 djsxs();
  305.                                                            if(keyqc==0)
  306.                                                            {        
  307.                                                                                    delayms(3);
  308.                                                                                    if(keyqc==0)
  309.                                                                                    {
  310.                                                                                     while(!keyqc);

  311.                                                                                 goto LOOP1;        
  312.                                                                                 }
  313.                                                                                 }                                                                                   
  314.                                                           }
  315.                                                         }
  316.                                                 }
  317.                                         if((key5==0)&&(TR0==1))
  318.                                                 {        spk=0;
  319.                                                            delayms(3);
  320.                                                            if(key5==0)
  321.                                                            {
  322.                                                             while(!key5);
  323.                                                           spk=1;
  324.                                                          while(1)
  325.                                                           {
  326.                                                             TR0=0;
  327.                                                                  djsxs5();
  328.                                                                 djsxs();
  329.                                                            if(keyqc==0)
  330.                                                            {        
  331.                                                                                    delayms(3);
  332.                                                                                    if(keyqc==0)
  333.                                                                                    {
  334.                                                                                     while(!keyqc);

  335.                                                                                 goto LOOP1;        
  336.                                                                                 }
  337.                                                                                 }                                                                                   
  338.                                                           }
  339.                                                         }
  340.                                                 }
  341.                                         if((key6==0)&&(TR0==1))
  342.                                                 {  spk=0;
  343.                                                            delayms(3);
  344.                                                            if(key6==0)
  345.                                                            {
  346.                                                             while(!key6);
  347.                                                           spk=1;
  348.                                                          while(1)
  349.                                                           {
  350.                                                             TR0=0;
  351.                                                                  djsxs6();
  352.                                                                 djsxs();
  353.                                                            if(keyqc==0)
  354.                                                            {        
  355.                                                                                    delayms(3);
  356.                                                                                    if(keyqc==0)
  357.                                                                                    {
  358.                                                                                     while(!keyqc);

  359.                                                                                 goto LOOP1;        
  360.                                                                                 }
  361.                                                                                 }                                                                                   
  362.                                                           }
  363.                                                         }
  364.                                                 }
  365.                                         if((key7==0)&&(TR0==1))
  366.                                                 {        spk=0;
  367.                                                            delayms(3);
  368.                                                            if(key7==0)
  369.                                                            {
  370.                                                             while(!key7);
  371.                                                           spk=1;
  372.                                                          while(1)
  373.                                                           {
  374.                                                             TR0=0;
  375.                                                                  djsxs7();
  376.                                                                 djsxs();
  377.                                                                 if(keyqc==0)
  378.                                                            {        
  379.                                                                                    delayms(3);
  380.                                                                                    if(keyqc==0)
  381.                                                                                    {
  382.                                                                                     while(!keyqc);

  383.                                                                                 goto LOOP1;        
  384.                                                                                 }
  385.                                                                                 }           
  386.                                                           }
  387.                                                         }
  388.                                                 }
  389.                                         if((key8==0)&&(TR0==1))
  390.                                                 {        spk=0;
  391.                                                            delayms(3);
  392.                                                            if(key8==0)
  393.                                                            {
  394.                                                             while(!key8);
  395.                                                         
  396.                                                          while(1)
  397.                                                           {
  398.                                                             TR0=0;
  399.                                                                  spk=1;
  400.                                                                  djsxs8();
  401.                                                                 djsxs();
  402.                                                            if(keyqc==0)
  403.                                                            {        
  404.                                                                                    delayms(3);
  405.                                                                                    if(keyqc==0)
  406.                                                                                    {
  407.                                                                                     while(!keyqc);

  408.                                                                                 goto LOOP1;        
  409.                                                                                 }
  410.                                                                                 }           
  411.                                                                                   }
  412.                                                              }
  413.                                                 }  
  414.                                          if(djs<=5)  spk=0;          //到倒计时小于5是,蜂鸣器响
  415.                                          if(djs==0)                           //当倒计时时间等于0后,需要按清楚键恢复
  416.                                           {
  417.                                           while(1)
  418.                                                   {
  419.                                                                  if(keyqc==0)
  420.                                                            {        
  421.                                                                                    delayms(3);
  422.                                                                                    if(keyqc==0)
  423.                                                                                    {
  424.                                                                                     while(!keyqc);
  425.                                                                                 spk=1;                  
  426.                                                                                 goto LOOP1;        
  427.                                                                                 }
  428.                                                                                 }
  429.                                                 }
  430.                                           }

  431.                                   }

  432.                                 }
  433.                            }
  434. }
  435. }
复制代码

回复

使用道具 举报

ID:375003 发表于 2018-7-22 17:30 | 显示全部楼层
不知道你弄好了没有,用上面一个数组;
写了个测试代码放在主函数里,
int djs1=60;
Timer0_init();         //初始化定时器中断
spk=1;                          //蜂鸣器不响
        djs=60;                //倒计时赋值
while(1)
{
        TR0=1;
        if(js)
                {
                        P0=table[js];
                        smg3=1;
                        smg1=1;
                        smg2=1;
                        js=0;//
          }
}
tset1.PNG
回复

使用道具 举报

ID:377510 发表于 2018-7-22 19:41 | 显示全部楼层
同求解
回复

使用道具 举报

ID:330538 发表于 2018-7-22 20:14 | 显示全部楼层
guangshi_wq 发表于 2018-7-22 17:30
不知道你弄好了没有,用上面一个数组;
写了个测试代码放在主函数里,
int djs1=60;

是插入我上面的代码里吗
回复

使用道具 举报

ID:330538 发表于 2018-7-22 20:26 | 显示全部楼层
guangshi_wq 发表于 2018-7-22 17:30
不知道你弄好了没有,用上面一个数组;
写了个测试代码放在主函数里,
int djs1=60;

在开发板上可以显示1,然后在那里就不行额
回复

使用道具 举报

ID:330538 发表于 2018-7-22 20:28 | 显示全部楼层
guangshi_wq 发表于 2018-7-22 17:30
不知道你弄好了没有,用上面一个数组;
写了个测试代码放在主函数里,
int djs1=60;

是不是我画板有问题
回复

使用道具 举报

ID:330538 发表于 2018-7-22 21:16 | 显示全部楼层

你也出现这种问题?、
回复

使用道具 举报

ID:375003 发表于 2018-7-23 01:33 | 显示全部楼层
终于搞好了
增加
#define uchar unsigned char //¸Ä¶t′|
#define uint unsigned int
sbit smg4=P2^3;                //¶¨òåêyÂë1üμúèyλ
void delayms(uint x)  //¸Äèy′|         //Ñóê±oˉêy
{
uchar i;
while(x--)
{
  for(i=50;i>0;i--); //¸Äò»′|;
}
}
void Timer0_init()                        //¶¨ê±Æ÷03õê¼»ˉ
{
      js=0;  TMOD=0x01;                   //T0Îa¶¨ê±Æ÷·½ê½1
      TH0=0x4c;
          TL0=0x00;                        
      //TR0=1;//IT1=1;
          ET0=1;//EX1=1;
          EA=1;        
}
void timer0() interrupt 1 using 1        //¶¨ê±Æ÷0ÖD¶Ï·tÎñoˉêy
{
        TF0=0;
        TH0=0x4c;
        TL0=0x00;                                        //¸33õÖμ
        js++;
        if(js==15)
        {
                js=0;
          djs--;                                        //2úéú1sμÄμ1¼Æê±
        //led1=~led1;
        }
}

void djsxs()                                   //ÏÔê¾μ1¼Æê±oˉêy
{
          uchar shi,ge;
                shi=djs/10;
                ge=djs%10;
        // ½«μ1¼Æê±ê±¼ä·Ö3é¸ßμíλ
                smg1=0;  
                //delayms(3);        //ÏÔê¾ê®Î»êy×Ö
                P0=table[shi];
                smg3=1;
                delayms(3);                                 //ÏÔ꾸öλêy×Ö
                smg3=0;
                //delayms(3);
          P0=table[ge];
                smg4=1;
                delayms(3);
                smg4=0;
                smg2=0;
}
void djsxs22()                                 
{        
         P0=0xc0;
    smg1=1;
    delayms(3);
    smg1=0;                                        //μúò»Î»êyÂë1üÏÔê¾-
    smg2=1;
    delayms(3);                           //μúèyλêyÂë1üÏÔê¾-
    smg2=0;
                smg3=1;
                delayms(3);
                smg3=0;  
                smg4=1;
                delayms(3);
                smg4=0;         //μúËÄλêyÂë1üÏÔê¾-
}

void djsxs1(uchar aa)
{
        P0=table[aa];
    smg1=0;
    delayms(3);
    smg1=1;                                   //μúò»Î»êyÂë1üÏÔê¾1

}
//把程序中的void djsxs1()留着,
void djsxs2(),void djsxs3(),void djsxs4(),void djsxs5(),void djsxs6(),void djsxs7(),void djsxs8(),
子函数删了
调用处这样djsxs1(1);
调用djsxs2();处改成djsxs1(2);
调用djsxs3();处改成djsxs1(3);
直到8
122.PNG
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表