找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1953|回复: 1
打印 上一主题 下一主题
收起左侧

求助:我按照程序打的代码为什么成功不了(篮球计时计分器)

[复制链接]
跳转到指定楼层
楼主
这些是我自己做的
这张是应该成功后的
我自己做的C和仿真 新建文件夹 (3).rar (17.83 KB, 下载次数: 27)
这是我自己照着打出来的

单片机源程序:
  1. #include<reg51.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. code unsigned seg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  5. int m=1,n=60,x=0,y=0,i=0,jie=2,zidong=1,bujin=1,zanting=0,chuzanting=0;
  6. sbit P1_1=P1^1;
  7. sbit P1_2=P1^2;
  8. sbit P1_3=P1^3;
  9. sbit P1_4=P1^4;
  10. sbit P1_5=P1^5;
  11. sbit P1_6=P1^6;
  12. sbit P1_7=P1^7;
  13. sbit k1=P3^0;    //A+1
  14. sbit k2=P3^1;     //B+1
  15. sbit k3=P3^2;     //回表按键
  16. sbit k4=P3^3;     //时间快进
  17. sbit k5=P3^4;     //A-1
  18. sbit k6=P3^5;     //B-1
  19. sbit P1_0=P1^0;   //暂停、启动
  20. //#include <REGX51.H>为头文件P1口各位分别用P1_0等表示
  21. void delay(int t)             // 延时子程序   通过参数t,可以调整暂停时间
  22. {
  23.    while(t--)
  24.   {
  25.     unsigned int i;
  26.    for(i=0;i<200;i++);
  27.    }
  28. }
  29.   
  30. void display(int i,int j,int x,int y)     //  数码管动态刷新显示程序
  31. {
  32.      if(jie==1&&bujin!=2)       //中间变量jie==1时,为上半场,对P1赋值
  33.   P1=0xbf;                 //P1=0xbf, 即P1=1011 1111B,点亮对应上半场指示灯
  34.      
  35.   P2=0xfe;           //数码管动态刷新显示程序 P2=1111 1110,i为分钟
  36.      P0=seg[i%100/10];         //刷新显示时间显示分钟十位,调用延时程序,
  37.      delay(1);                  //延时数码管的点亮
  38.      P2=0xff;
  39.      P0=0;
  40.      P2=0xfd;                //同理,动态刷新时分钟个位并延时点亮
  41.      P0=seg[i%10];
  42.      delay(1);
  43.      P2|=0xff;
  44.      P0=0;
  45.      P2=0xfb;                //同理,动态刷新时秒钟十位并延时点亮
  46.      P0=seg[j%100/10];
  47.      delay(1);
  48.      P0=0;
  49.      P2=0xff;
  50.      P2=0xf7;                //同理,动态刷新时秒钟个位并延时点亮
  51.      P0=seg[j%10];
  52.      delay(1);
  53.      P0=0;
  54.      P2=0xff;
  55.      P2=0xef;            //同理,动态刷新甲队分数十位并延时点亮
  56.   P0=seg[x%100/10];
  57.   delay(1);
  58.   P2=0xff;
  59.   P0=0;
  60.   P2=0xdf;              //同理,动态刷新甲队分数个位并延时点亮
  61.   P0=seg[x%10];
  62.   delay(1);
  63.   P2=0xff;
  64.   P0=0;
  65.    
  66.   P2=0xbf;              //同理,动态刷新乙队分数十位并延时点亮
  67.   P0=seg[y%100/10];
  68.      delay(1);
  69.      P0=0;
  70.      P2=0xff;

  71.   P2=0x7f;                //同理,动态刷新乙队分数十位并延时点亮
  72.      P0=seg[y%10];
  73.      delay(1);
  74.      P0=0;
  75.      P2=0xff;
  76. }
  77. void t0(void) interrupt 1       //调用定时器T0      基本计时单位秒
  78. {  TH0=0xb1;                //利用定时器T0,送入计数初值TH0=0xb1; TL0=0x10;
  79.    TL0=0x10;                 //定时器定时单位为20毫秒
  80.    if(n==0)
  81.    {                           //分钟与秒时间调整   当秒减到0以后分钟减1
  82.    n=60;m--;
  83.    }
  84.    i++;
  85.    if(i==50)
  86.    {                          //利用中间变量i   令i值为50  50*20毫秒=1秒
  87.    n--;                         //以实现一秒计时
  88.    i=0;
  89.    }
  90.    display(m,n-1,x,y);              //调用动态刷新显示程序
  91. }

  92. void keyjiafen1()        //加分按键子程序,在主程序中不断调用该子程序
  93. {                                  //当检测到甲队加分按键按下时,对应加分
  94.     if(k1==0)  
  95.    {                              //调用延时子程序  实现消除按键抖动功能,即,当
  96.      delay(1);                   //检测到按键按下时候,延时,按键仍按下,说明按键
  97.      if(k1==0)                 //确实按下,非抖动,甲队对应加分
  98.       {
  99.    while(k1==0);
  100.    x++;
  101.     }
  102.    }   
  103. if(k2==0)                      //同理,检测乙队加分按键时候按下,并加分
  104.    {
  105.    delay(1);
  106.     if(k2==0)
  107.    {
  108.     while(k2==0);
  109.     y++;
  110.    }
  111.     }
  112. }
  113. void keyjianfen1()      //减分按键检测子程序,其基本算法及功能与加
  114. {
  115.    if(k5==0)                        //相同
  116.    {
  117.    delay(1);
  118.    if(k5==0)
  119.       {
  120.     while(k5==0);
  121.     x--;
  122.    }
  123.    }   
  124. if(k6==0)
  125.    {
  126.   delay(1);
  127.   if(k6==0)
  128.    {
  129.    while(k6==0);
  130.     y--;
  131.    }
  132.    }
  133. }
  134. void key2()        //显示时间调整程序,即回表和快表
  135. {
  136.    if(k3==0)
  137.   {                                 //在比赛中有时经常需要回表,故写此程序
  138. delay(10);
  139. if(k3==0)                      //回表子程序,检测到INT0按下时,使时间回倒
  140.     {
  141. chuzanting==0;               // chuzanting==0; zanting=1;为附加变量,当回表按键
  142. zanting=1;                    //松开时,表暂停,这两个变量用来调用暂停
  143.   n++;
  144.   if(n==60)
  145.     {
  146.    m++;
  147.    n=1;
  148.   }
  149.     }                        
  150.   }                           
  151.    if(k4==0)                     //快表子程序,检测到INT1按下时,使倒计加快,
  152.   {                               //通常情况下与回表子程序配合使用,即当回表
  153.                                   //回过的时候,按此键调整时间
  154.     delay(10);                      // chuzanting==0; zanting=1;作用同上
  155.     if(k4==0)
  156. {   
  157.   chuzanting==0;
  158.   zanting=1;
  159.   n--;
  160. }
  161.    }
  162. }
  163. void shijian()                      //该程序使回表和快表按键松开时候能自动暂停
  164. {
  165.   if(zanting==1&&k3==1&&k4==1&&chuzanting==0 )
  166.   {
  167.      EA=0;         // zanting==1&&k3==1&&k4==1&&chuzanting==0作用为
  168.   zanting=0;          //当按键松开的时候,调用暂停程序条件
  169.   chuzanting=0;       //zanting=0;chuzanting=0,初始化,以便下次回表和快表      
  170.     while(1)                    //按键松开时候仍能调用暂停程序
  171.      {
  172.           display(m,n,x,y);     
  173.              if(P1_0==0)            //检测暂停键按下,开中断,跳出暂停
  174.              {
  175.                delay(1);
  176.                if(P1_0==0)
  177.                 {
  178.                  while(P1_0==0);
  179.                    EA=1;
  180.                   break;
  181.                  }
  182.              }
  183.            }
  184.    }
  185. }
  186. void key3()
  187. {     //半场交换场地时自动交换双方比赛分数子程序{
  188.    int temp;               //定义中间变量temp,检测到有按键按下时候
  189.    if(zidong==1&&jie==1)   //交换甲队,乙队比赛分数
  190.    {
  191.      temp=x;             // zidong==1&&jie==1是判断半场的条件              //
  192.      y=temp;
  193.      display(m,n,x,y);
  194.      zidong=0;   
  195.   bujin=0;
  196.    }
  197.       
  198. }
  199. void key4()                            //比赛暂停子程序
  200. {
  201.    if(P1_0==0)                //检测到暂停按键按下时候,令EA=0关闭中断
  202.   {
  203.      delay(1);               //同通过死循环程序while(1),不断刷新数码管
  204.      if(P1_0==0)             //当暂停键再次按下时候,开中断,以使比赛时间
  205.      {                      //继续倒计时,由于在暂停的时候,程序处于死循
  206.         while(P1_0==0);
  207.          EA=0;               //无法回到主程序,故主程序中检测按键按下的
  208.          while(1)              //无法回到主程序,即实现了暂停时,除了暂停键
  209.      {                          //其他按键按下均无效
  210.           display(m,n,x,y);
  211.              if(P1_0==0)
  212.              {                  //当暂停键再次按下时候,EA=1开中断,计时数码管
  213.                delay(1);       //继续倒计时,同时通过break语句,跳出死循环
  214.                if(P1_0==0)
  215.                 {
  216.                  while(P1_0==0);
  217.                    EA=1;
  218.                   break;
  219.                  }
  220.              }
  221.       
  222.      }
  223.        }
  224.     }
  225. }   

  226. void over()         //比赛结束及及点亮下半场指示灯程序
  227. {
  228. if((m==0)&&(n==0))             //当m,n均为0的时候,通过变量jie的值判断比赛  
  229.    {                           //是否结束
  230.        if(jie>1)             //如果jie>1,说明半场到了,比赛没有结束,      {
  231.      {                          //jie--,关中断,再次按下暂停键时候继续倒计时
  232.         m=2;
  233.         n=0;
  234.         EA=0;
  235.            T1=1;
  236.         delay(400);
  237.          T1=0;
  238.          while(1)        
  239.          {            
  240.         display(m,n,x,y);
  241.       if(P1_0==0)
  242.               {
  243.                delay(1);
  244.               if(P1_0==0)
  245.                   {
  246.                    while(P1_0==0);
  247.                      EA=1;
  248.                     break;
  249.                    }
  250.              }
  251.             }
  252.         jie--;
  253.    }
  254.     if(jie==1&&bujin==2)     //如果jie==1&&bujin==2,说明比赛结束了,令EA=0,
  255.        {                    //比关闭中断,比赛秒表不再走动,同时不短刷新数码管,
  256.      EA=0;              //全场比赛结束蜂鸣器开始报警
  257.      m=0;
  258.      n=0;
  259.            T1=1;
  260.            delay(400);
  261.            T1=0;
  262.      P1=0x3f;             // P1=0x3f上下半场指示灯同时点亮,比赛结束
  263.    while(1)
  264.       display(m,n,x,y);     //不断刷新数码管
  265.     }
  266. }      
  267. }
  268. void main()        // 主程序
  269. {   TMOD=0x01;                //设置定时器工作方式
  270.     EA=1;                  
  271.     ET0=1;                 
  272. TH0=0xb1;                  //定时器送计数初值,EA=1,开中断,P3口电平拉高
  273. TL0=0x10;                   // P1=0x7f, 上半场指示灯点亮
  274. TR0=1;
  275. P3=0xff;
  276. P1=0x7f;
  277.     T1=0;
  278. while(1)
  279. {                        //通过 while(1),反复调用循环体内的子程序
  280.      keyjiafen1();              //执行相应的功能
  281.   keyjianfen1();            
  282.      key2();
  283.   if(zidong==1)            //zidong==1为key3()执行条件,仅当半场结束时候执行
  284.   key3();
  285.   if(n==18&&bujin==0)
  286.   {
  287.    bujin=2;           //修改变量bujin的值,设定over()中第二个if语句的执行条件
  288.    }
  289.       shijian();
  290.   
  291.   key4();
  292.      over();
  293.   }
  294. }
  295. 下面的是我看的原来的程序
  296. #include <REGX51.H>     //#include <REGX51.H>为头文件P1口各位分别用P1_0等表示

  297. code unsignedseg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

  298. //其中{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}

  299. //分别对应数码管显示的字形0到9

  300. intm=1,n=60,x=0,y=0,i=0,jie=2,zidong=1,bujin=1,zanting=0,chuzanting=0;

  301. //定义全局变量m,n,x,y,i,jie,zidong,bujin,zanting,chuzanting

  302. //并初始化,其中m,n分别表示分钟与秒计时,x,y分别表示甲乙//两队的分数,其余中间变量


  303. void delay(int t)                 // 延时子程序   通过参数t,可以调整暂停时间

  304. {

  305.   while(t--)

  306.   {

  307.    unsigned int i;

  308.   for(i=0;i<200;i++);

  309.    }

  310. }

  311.   

  312. void display(int i,int j,int x,int y)     //  数码管动态刷新显示程序

  313. {

  314.     if(jie==1&&bujin!=2)      //中间变量jie==1时,为上半场,对P1赋值

  315.         P1=0xbf;                 //P1=0xbf, 即P1=1011 1111B,点亮对应上半场指示灯

  316.      

  317.         P2=0xfe;                      //数码管动态刷新显示程序 P2=1111 1110,i为分钟

  318.     P0=seg[i%100/10];         //刷新显示时间显示分钟十位,调用延时程序,

  319.     delay(1);                  //延时数码管的点亮

  320.     P2=0xff;

  321.     P0=0;


  322.     P2=0xfd;                //同理,动态刷新时分钟个位并延时点亮

  323.     P0=seg[i%10];

  324.     delay(1);

  325.     P2|=0xff;

  326.     P0=0;


  327.     P2=0xfb;                //同理,动态刷新时秒钟十位并延时点亮

  328.     P0=seg[j%100/10];

  329.     delay(1);

  330.     P0=0;

  331.     P2=0xff;


  332.     P2=0xf7;                //同理,动态刷新时秒钟个位并延时点亮

  333.     P0=seg[j%10];

  334.     delay(1);

  335.     P0=0;

  336.     P2=0xff;


  337.     P2=0xef;                       //同理,动态刷新甲队分数十位并延时点亮

  338.         P0=seg[x%100/10];

  339.         delay(1);

  340.         P2=0xff;

  341.         P0=0;


  342.         P2=0xdf;              //同理,动态刷新甲队分数个位并延时点亮

  343.         P0=seg[x%10];

  344.         delay(1);

  345.         P2=0xff;

  346.         P0=0;

  347.          

  348.         P2=0xbf;              / /同理,动态刷新乙队分数十位并延时点亮

  349.         P0=seg[y%100/10];

  350.     delay(1);

  351.     P0=0;

  352.     P2=0xff;


  353.         P2=0x7f;                //同理,动态刷新乙队分数十位并延时点亮

  354.     P0=seg[y%10];

  355.     delay(1);

  356.     P0=0;

  357.      P2=0xff;

  358. }


  359. void t0(void) interrupt 1             //调用定时器T0      基本计时单位秒

  360. { TH0=0xb1;                //利用定时器T0,送入计数初值TH0=0xb1; TL0=0x10;

  361.   TL0=0x10;                 //定时器定时单位为20毫秒

  362.   if(n==0)   

  363.    {                           //分钟与秒时间调整   当秒减到0以后分钟减1

  364.   n=60;m--;

  365.    }

  366.    i++;

  367.   if(i==50)

  368.    {                          //利用中间变量i   令i值为50  50*20毫秒=1秒

  369.    n--;                         //以实现一秒计时

  370.    i=0;

  371.    }

  372.   display(m,n-1,x,y);             //调用动态刷新显示程序

  373. }


  374. void keyjiafen1()                                 //加分按键子程序,在主程序中不断调用该子程序

  375. {                                  //当检测到甲队加分按键按下时,对应加分

  376.    if(RXD==0)  

  377.    {                              //调用延时子程序  实现消除按键抖动功能,即,当

  378.     delay(1);                   //检测到按键按下时候,延时,按键仍按下,说明按键

  379.     if(RXD==0)                 //确实按下,非抖动,甲队对应加分

  380.       {

  381.          while(RXD==0);

  382.          x++;

  383.           }

  384.   }   

  385. if(TXD==0)                      //同理,检测乙队加分按键时候按下,并加分

  386.    {

  387.   delay(1);

  388.    if(TXD==0)

  389.          {

  390.           while(TXD==0);

  391.           y++;

  392.          }

  393.     }

  394. }

  395. void keyjianfen1()                                    //减分按键检测子程序,其基本算法及功能与加{

  396.   if(WR==0)                        //相同

  397.    {

  398.   delay(1);

  399.   if(WR==0)

  400.       {

  401.           while(WR==0);

  402.           x--;

  403.          }

  404.   }   

  405. if(RD==0)

  406.    {

  407. delay(1);

  408. if(RD==0)

  409.          {

  410.          while(RD==0);

  411.           y--;

  412.          }

  413.    }

  414. }

  415. void key2()                                            //显示时间调整程序,即回表和快表

  416. {

  417.   if(INT0==0)

  418.   {                                 //在比赛中有时经常需要回表,故写此程序

  419.        delay(10);

  420.        if(INT0==0)                      //回表子程序,检测到INT0按下时,使时间回倒

  421.     {

  422.        chuzanting==0;               // chuzanting==0; zanting=1;为附加变量,当回表按键

  423.        zanting=1;                    //松开时,表暂停,这两个变量用来调用暂停

  424.               n++;

  425.               if(n==60)

  426.           {

  427.                m++;

  428.                n=1;

  429.               }

  430.     }                        

  431.   }                           

  432.   if(INT1==0)                     //快表子程序,检测到INT1按下时,使倒计加快,

  433.   {                               //通常情况下与回表子程序配合使用,即当回表

  434.                                   //回过的时候,按此键调整时间

  435.    delay(10);                      // chuzanting==0; zanting=1;作用同上

  436.    if(INT1==0)

  437.        {   

  438.         chuzanting==0;

  439.         zanting=1;

  440.         n--;

  441.        }

  442.    }

  443. }

  444. void shijian()                      / /该程序使回表和快表按键松开时候能自动暂停

  445. {

  446. if(zanting==1&&INT0==1&&INT1==1&&chuzanting==0 )

  447.   {

  448.            EA=0;         //zanting==1&&INT0==1&&INT1==1&&chuzanting==0作用为

  449.               zanting=0;          //当按键松开的时候,调用暂停程序条件

  450.               chuzanting=0;       //zanting=0;chuzanting=0,初始化,以便下次回表和快表        while(1)                    //按键松开时候仍能调用暂停程序

  451.            {

  452.          display(m,n,x,y);     

  453.             if(P1_0==0)            //检测暂停键按下,开中断,跳出暂停

  454.             {

  455.               delay(1);

  456.               if(P1_0==0)

  457.                 {

  458.                  while(P1_0==0);

  459.                    EA=1;

  460.                   break;

  461.                  }

  462.             }

  463.              }

  464.    }

  465. }

  466. void key3()                         //半场交换场地时自动交换双方比赛分数子程序{

  467.    inttemp;               //定义中间变量temp,检测到有按键按下时候

  468.   if(zidong==1&&jie==1)   //交换甲队,乙队比赛分数

  469.    {

  470.     temp=x;             //zidong==1&&jie==1是判断半场的条件              //

  471.     y=temp;

  472.     display(m,n,x,y);

  473.      zidong=0;   

  474.         bujin=0;

  475.    }

  476.                                     

  477. }

  478. void key4()                            //比赛暂停子程序

  479. {

  480.   if(P1_0==0)                //检测到暂停按键按下时候,令EA=0关闭中断

  481.   {

  482.     delay(1);               //同通过死循环程序while(1),不断刷新数码管

  483.     if(P1_0==0)             //当暂停键再次按下时候,开中断,以使比赛时间

  484.      {                      //继续倒计时,由于在暂停的时候,程序处于死循

  485.        while(P1_0==0);

  486.         EA=0;               //无法回到主程序,故主程序中检测按键按下的

  487.         while(1)              //无法回到主程序,即实现了暂停时,除了暂停键

  488.            {                          //其他按键按下均无效

  489.          display(m,n,x,y);

  490.             if(P1_0==0)

  491.             {                  //当暂停键再次按下时候,EA=1开中断,计时数码管

  492.               delay(1);       //继续倒计时,同时通过break语句,跳出死循环

  493.               if(P1_0==0)

  494.                 {

  495.                  while(P1_0==0);

  496.                    EA=1;

  497.                   break;

  498.                  }

  499.             }

  500.       

  501.            }

  502.       }

  503.     }

  504. }   


  505. void over()                                             //比赛结束及及点亮下半场指示灯程序

  506. {

  507. if((m==0)&&(n==0))             //当m,n均为0的时候,通过变量jie的值判断比赛  

  508.    {                           //是否结束

  509.       if(jie>1)                      //如果jie>1,说明半场到了,比赛没有结束,      {

  510.      {                          //jie--,关中断,再次按下暂停键时候继续倒计时

  511.               m=2;

  512.               n=0;

  513.               EA=0;

  514.           T1=1;

  515.        delay(400);

  516.         T1=0;

  517.         while(1)        

  518.                {            

  519.               display(m,n,x,y);


  520.                     if(P1_0==0)

  521.              {

  522.               delay(1);

  523.              if(P1_0==0)

  524.                   {

  525.                    while(P1_0==0);

  526.                      EA=1;

  527.                     break;

  528.                    }

  529.             }

  530.            }

  531.         jie--;

  532.          }

  533.           if(jie==1&&bujin==2)     //如果jie==1&&bujin==2,说明比赛结束了,令EA=0,      {                    //比关闭中断,比赛秒表不再走动,同时不短刷新数码管,             EA=0;              

  534.                       //全场比赛结束蜂鸣器开始报警

  535.               m=0;

  536.               n=0;

  537. T1=1;

  538.       delay(400);

  539.         T1=0;

  540.               P1=0x3f;             // P1=0x3f上下半场指示灯同时点亮,比赛结束

  541.                      while(1)

  542.             display(m,n,x,y);     //不断刷新数码管

  543.           }

  544.        }            

  545. }

  546. void main()                                   // 主程序

  547. {  TMOD=0x01;                //设置定时器工作方式

  548.    EA=1;                  

  549.    ET0=1;                 

  550.        TH0=0xb1;                  //定时器送计数初值,EA=1,开中断,P3口电平拉高

  551.        TL0=0x10;                   // P1=0x7f, 上半场指示灯点亮

  552.        TR0=1;

  553.        P3=0xff;

  554.        P1=0x7f;

  555.    T1=0;

  556.        while(1)

  557.        {                        //通过 while(1),反复调用循环体内的子程序

  558.     keyjiafen1();              //执行相应的功能

  559.         keyjianfen1();            

  560.      key2();

  561.         if(zidong==1)            //zidong==1为key3()执行条件,仅当半场结束时候执行

  562.         key3();

  563.         if(n==18&&bujin==0)

  564.         {

  565.          bujin=2;           //修改变量bujin的值,设定over()中第二个if语句的执行条件

  566.          }

  567.      shijian();

  568.         

  569.         key4();

  570.     over();

  571.         }
  572. }
复制代码


调查.png (234.19 KB, 下载次数: 56)

调查.png

3332.png (346.31 KB, 下载次数: 45)

3332.png
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:891769 发表于 2021-3-14 21:09 | 只看该作者
能不能加一个24秒的功能呢
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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