找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2502|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

求助:我按照程序打的代碼為什么成功不了(籃球計(jì)時(shí)計(jì)分器)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
這些是我自己做的
這張是應(yīng)該成功后的
我自己做的C和仿真 新建文件夾 (3).rar (17.83 KB, 下載次數(shù): 27)
這是我自己照著打出來(lái)的

單片機(jī)源程序:
  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;     //時(shí)間快進(jìn)
  17. sbit k5=P3^4;     //A-1
  18. sbit k6=P3^5;     //B-1
  19. sbit P1_0=P1^0;   //暫停、啟動(dòng)
  20. //#include <REGX51.H>為頭文件P1口各位分別用P1_0等表示
  21. void delay(int t)             // 延時(shí)子程序   通過(guò)參數(shù)t,可以調(diào)整暫停時(shí)間
  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)     //  數(shù)碼管動(dòng)態(tài)刷新顯示程序
  31. {
  32.      if(jie==1&&bujin!=2)       //中間變量jie==1時(shí),為上半場(chǎng),對(duì)P1賦值
  33.   P1=0xbf;                 //P1=0xbf, 即P1=1011 1111B,點(diǎn)亮對(duì)應(yīng)上半場(chǎng)指示燈
  34.      
  35.   P2=0xfe;           //數(shù)碼管動(dòng)態(tài)刷新顯示程序 P2=1111 1110,i為分鐘
  36.      P0=seg[i%100/10];         //刷新顯示時(shí)間顯示分鐘十位,調(diào)用延時(shí)程序,
  37.      delay(1);                  //延時(shí)數(shù)碼管的點(diǎn)亮
  38.      P2=0xff;
  39.      P0=0;
  40.      P2=0xfd;                //同理,動(dòng)態(tài)刷新時(shí)分鐘個(gè)位并延時(shí)點(diǎn)亮
  41.      P0=seg[i%10];
  42.      delay(1);
  43.      P2|=0xff;
  44.      P0=0;
  45.      P2=0xfb;                //同理,動(dòng)態(tài)刷新時(shí)秒鐘十位并延時(shí)點(diǎn)亮
  46.      P0=seg[j%100/10];
  47.      delay(1);
  48.      P0=0;
  49.      P2=0xff;
  50.      P2=0xf7;                //同理,動(dòng)態(tài)刷新時(shí)秒鐘個(gè)位并延時(shí)點(diǎn)亮
  51.      P0=seg[j%10];
  52.      delay(1);
  53.      P0=0;
  54.      P2=0xff;
  55.      P2=0xef;            //同理,動(dòng)態(tài)刷新甲隊(duì)分?jǐn)?shù)十位并延時(shí)點(diǎn)亮
  56.   P0=seg[x%100/10];
  57.   delay(1);
  58.   P2=0xff;
  59.   P0=0;
  60.   P2=0xdf;              //同理,動(dòng)態(tài)刷新甲隊(duì)分?jǐn)?shù)個(gè)位并延時(shí)點(diǎn)亮
  61.   P0=seg[x%10];
  62.   delay(1);
  63.   P2=0xff;
  64.   P0=0;
  65.    
  66.   P2=0xbf;              //同理,動(dòng)態(tài)刷新乙隊(duì)分?jǐn)?shù)十位并延時(shí)點(diǎn)亮
  67.   P0=seg[y%100/10];
  68.      delay(1);
  69.      P0=0;
  70.      P2=0xff;

  71.   P2=0x7f;                //同理,動(dòng)態(tài)刷新乙隊(duì)分?jǐn)?shù)十位并延時(shí)點(diǎn)亮
  72.      P0=seg[y%10];
  73.      delay(1);
  74.      P0=0;
  75.      P2=0xff;
  76. }
  77. void t0(void) interrupt 1       //調(diào)用定時(shí)器T0      基本計(jì)時(shí)單位秒
  78. {  TH0=0xb1;                //利用定時(shí)器T0,送入計(jì)數(shù)初值TH0=0xb1; TL0=0x10;
  79.    TL0=0x10;                 //定時(shí)器定時(shí)單位為20毫秒
  80.    if(n==0)
  81.    {                           //分鐘與秒時(shí)間調(diào)整   當(dāng)秒減到0以后分鐘減1
  82.    n=60;m--;
  83.    }
  84.    i++;
  85.    if(i==50)
  86.    {                          //利用中間變量i   令i值為50  50*20毫秒=1秒
  87.    n--;                         //以實(shí)現(xiàn)一秒計(jì)時(shí)
  88.    i=0;
  89.    }
  90.    display(m,n-1,x,y);              //調(diào)用動(dòng)態(tài)刷新顯示程序
  91. }

  92. void keyjiafen1()        //加分按鍵子程序,在主程序中不斷調(diào)用該子程序
  93. {                                  //當(dāng)檢測(cè)到甲隊(duì)加分按鍵按下時(shí),對(duì)應(yīng)加分
  94.     if(k1==0)  
  95.    {                              //調(diào)用延時(shí)子程序  實(shí)現(xiàn)消除按鍵抖動(dòng)功能,即,當(dāng)
  96.      delay(1);                   //檢測(cè)到按鍵按下時(shí)候,延時(shí),按鍵仍按下,說(shuō)明按鍵
  97.      if(k1==0)                 //確實(shí)按下,非抖動(dòng),甲隊(duì)對(duì)應(yīng)加分
  98.       {
  99.    while(k1==0);
  100.    x++;
  101.     }
  102.    }   
  103. if(k2==0)                      //同理,檢測(cè)乙隊(duì)加分按鍵時(shí)候按下,并加分
  104.    {
  105.    delay(1);
  106.     if(k2==0)
  107.    {
  108.     while(k2==0);
  109.     y++;
  110.    }
  111.     }
  112. }
  113. void keyjianfen1()      //減分按鍵檢測(cè)子程序,其基本算法及功能與加
  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()        //顯示時(shí)間調(diào)整程序,即回表和快表
  135. {
  136.    if(k3==0)
  137.   {                                 //在比賽中有時(shí)經(jīng)常需要回表,故寫此程序
  138. delay(10);
  139. if(k3==0)                      //回表子程序,檢測(cè)到INT0按下時(shí),使時(shí)間回倒
  140.     {
  141. chuzanting==0;               // chuzanting==0; zanting=1;為附加變量,當(dāng)回表按鍵
  142. zanting=1;                    //松開(kāi)時(shí),表暫停,這兩個(gè)變量用來(lái)調(diào)用暫停
  143.   n++;
  144.   if(n==60)
  145.     {
  146.    m++;
  147.    n=1;
  148.   }
  149.     }                        
  150.   }                           
  151.    if(k4==0)                     //快表子程序,檢測(cè)到INT1按下時(shí),使倒計(jì)加快,
  152.   {                               //通常情況下與回表子程序配合使用,即當(dāng)回表
  153.                                   //回過(guò)的時(shí)候,按此鍵調(diào)整時(shí)間
  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()                      //該程序使回表和快表按鍵松開(kāi)時(shí)候能自動(dòng)暫停
  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;          //當(dāng)按鍵松開(kāi)的時(shí)候,調(diào)用暫停程序條件
  169.   chuzanting=0;       //zanting=0;chuzanting=0,初始化,以便下次回表和快表      
  170.     while(1)                    //按鍵松開(kāi)時(shí)候仍能調(diào)用暫停程序
  171.      {
  172.           display(m,n,x,y);     
  173.              if(P1_0==0)            //檢測(cè)暫停鍵按下,開(kāi)中斷,跳出暫停
  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. {     //半場(chǎng)交換場(chǎng)地時(shí)自動(dòng)交換雙方比賽分?jǐn)?shù)子程序{
  188.    int temp;               //定義中間變量temp,檢測(cè)到有按鍵按下時(shí)候
  189.    if(zidong==1&&jie==1)   //交換甲隊(duì),乙隊(duì)比賽分?jǐn)?shù)
  190.    {
  191.      temp=x;             // zidong==1&&jie==1是判斷半場(chǎng)的條件              //
  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)                //檢測(cè)到暫停按鍵按下時(shí)候,令EA=0關(guān)閉中斷
  202.   {
  203.      delay(1);               //同通過(guò)死循環(huán)程序while(1),不斷刷新數(shù)碼管
  204.      if(P1_0==0)             //當(dāng)暫停鍵再次按下時(shí)候,開(kāi)中斷,以使比賽時(shí)間
  205.      {                      //繼續(xù)倒計(jì)時(shí),由于在暫停的時(shí)候,程序處于死循
  206.         while(P1_0==0);
  207.          EA=0;               //無(wú)法回到主程序,故主程序中檢測(cè)按鍵按下的
  208.          while(1)              //無(wú)法回到主程序,即實(shí)現(xiàn)了暫停時(shí),除了暫停鍵
  209.      {                          //其他按鍵按下均無(wú)效
  210.           display(m,n,x,y);
  211.              if(P1_0==0)
  212.              {                  //當(dāng)暫停鍵再次按下時(shí)候,EA=1開(kāi)中斷,計(jì)時(shí)數(shù)碼管
  213.                delay(1);       //繼續(xù)倒計(jì)時(shí),同時(shí)通過(guò)break語(yǔ)句,跳出死循環(huán)
  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()         //比賽結(jié)束及及點(diǎn)亮下半場(chǎng)指示燈程序
  227. {
  228. if((m==0)&&(n==0))             //當(dāng)m,n均為0的時(shí)候,通過(guò)變量jie的值判斷比賽  
  229.    {                           //是否結(jié)束
  230.        if(jie>1)             //如果jie>1,說(shuō)明半場(chǎng)到了,比賽沒(méi)有結(jié)束,      {
  231.      {                          //jie--,關(guān)中斷,再次按下暫停鍵時(shí)候繼續(xù)倒計(jì)時(shí)
  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,說(shuō)明比賽結(jié)束了,令EA=0,
  255.        {                    //比關(guān)閉中斷,比賽秒表不再走動(dòng),同時(shí)不短刷新數(shù)碼管,
  256.      EA=0;              //全場(chǎng)比賽結(jié)束蜂鳴器開(kāi)始報(bào)警
  257.      m=0;
  258.      n=0;
  259.            T1=1;
  260.            delay(400);
  261.            T1=0;
  262.      P1=0x3f;             // P1=0x3f上下半場(chǎng)指示燈同時(shí)點(diǎn)亮,比賽結(jié)束
  263.    while(1)
  264.       display(m,n,x,y);     //不斷刷新數(shù)碼管
  265.     }
  266. }      
  267. }
  268. void main()        // 主程序
  269. {   TMOD=0x01;                //設(shè)置定時(shí)器工作方式
  270.     EA=1;                  
  271.     ET0=1;                 
  272. TH0=0xb1;                  //定時(shí)器送計(jì)數(shù)初值,EA=1,開(kāi)中斷,P3口電平拉高
  273. TL0=0x10;                   // P1=0x7f, 上半場(chǎng)指示燈點(diǎn)亮
  274. TR0=1;
  275. P3=0xff;
  276. P1=0x7f;
  277.     T1=0;
  278. while(1)
  279. {                        //通過(guò) while(1),反復(fù)調(diào)用循環(huán)體內(nèi)的子程序
  280.      keyjiafen1();              //執(zhí)行相應(yīng)的功能
  281.   keyjianfen1();            
  282.      key2();
  283.   if(zidong==1)            //zidong==1為key3()執(zhí)行條件,僅當(dāng)半場(chǎng)結(jié)束時(shí)候執(zhí)行
  284.   key3();
  285.   if(n==18&&bujin==0)
  286.   {
  287.    bujin=2;           //修改變量bujin的值,設(shè)定over()中第二個(gè)if語(yǔ)句的執(zhí)行條件
  288.    }
  289.       shijian();
  290.   
  291.   key4();
  292.      over();
  293.   }
  294. }
  295. 下面的是我看的原來(lái)的程序
  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. //分別對(duì)應(yīng)數(shù)碼管顯示的字形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分別表示分鐘與秒計(jì)時(shí),x,y分別表示甲乙//兩隊(duì)的分?jǐn)?shù),其余中間變量


  303. void delay(int t)                 // 延時(shí)子程序   通過(guò)參數(shù)t,可以調(diào)整暫停時(shí)間

  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)     //  數(shù)碼管動(dòng)態(tài)刷新顯示程序

  313. {

  314.     if(jie==1&&bujin!=2)      //中間變量jie==1時(shí),為上半場(chǎng),對(duì)P1賦值

  315.         P1=0xbf;                 //P1=0xbf, 即P1=1011 1111B,點(diǎn)亮對(duì)應(yīng)上半場(chǎng)指示燈

  316.      

  317.         P2=0xfe;                      //數(shù)碼管動(dòng)態(tài)刷新顯示程序 P2=1111 1110,i為分鐘

  318.     P0=seg[i%100/10];         //刷新顯示時(shí)間顯示分鐘十位,調(diào)用延時(shí)程序,

  319.     delay(1);                  //延時(shí)數(shù)碼管的點(diǎn)亮

  320.     P2=0xff;

  321.     P0=0;


  322.     P2=0xfd;                //同理,動(dòng)態(tài)刷新時(shí)分鐘個(gè)位并延時(shí)點(diǎn)亮

  323.     P0=seg[i%10];

  324.     delay(1);

  325.     P2|=0xff;

  326.     P0=0;


  327.     P2=0xfb;                //同理,動(dòng)態(tài)刷新時(shí)秒鐘十位并延時(shí)點(diǎn)亮

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

  329.     delay(1);

  330.     P0=0;

  331.     P2=0xff;


  332.     P2=0xf7;                //同理,動(dòng)態(tài)刷新時(shí)秒鐘個(gè)位并延時(shí)點(diǎn)亮

  333.     P0=seg[j%10];

  334.     delay(1);

  335.     P0=0;

  336.     P2=0xff;


  337.     P2=0xef;                       //同理,動(dòng)態(tài)刷新甲隊(duì)分?jǐn)?shù)十位并延時(shí)點(diǎn)亮

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

  339.         delay(1);

  340.         P2=0xff;

  341.         P0=0;


  342.         P2=0xdf;              //同理,動(dòng)態(tài)刷新甲隊(duì)分?jǐn)?shù)個(gè)位并延時(shí)點(diǎn)亮

  343.         P0=seg[x%10];

  344.         delay(1);

  345.         P2=0xff;

  346.         P0=0;

  347.          

  348.         P2=0xbf;              / /同理,動(dòng)態(tài)刷新乙隊(duì)分?jǐn)?shù)十位并延時(shí)點(diǎn)亮

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

  350.     delay(1);

  351.     P0=0;

  352.     P2=0xff;


  353.         P2=0x7f;                //同理,動(dòng)態(tài)刷新乙隊(duì)分?jǐn)?shù)十位并延時(shí)點(diǎn)亮

  354.     P0=seg[y%10];

  355.     delay(1);

  356.     P0=0;

  357.      P2=0xff;

  358. }


  359. void t0(void) interrupt 1             //調(diào)用定時(shí)器T0      基本計(jì)時(shí)單位秒

  360. { TH0=0xb1;                //利用定時(shí)器T0,送入計(jì)數(shù)初值TH0=0xb1; TL0=0x10;

  361.   TL0=0x10;                 //定時(shí)器定時(shí)單位為20毫秒

  362.   if(n==0)   

  363.    {                           //分鐘與秒時(shí)間調(diào)整   當(dāng)秒減到0以后分鐘減1

  364.   n=60;m--;

  365.    }

  366.    i++;

  367.   if(i==50)

  368.    {                          //利用中間變量i   令i值為50  50*20毫秒=1秒

  369.    n--;                         //以實(shí)現(xiàn)一秒計(jì)時(shí)

  370.    i=0;

  371.    }

  372.   display(m,n-1,x,y);             //調(diào)用動(dòng)態(tài)刷新顯示程序

  373. }


  374. void keyjiafen1()                                 //加分按鍵子程序,在主程序中不斷調(diào)用該子程序

  375. {                                  //當(dāng)檢測(cè)到甲隊(duì)加分按鍵按下時(shí),對(duì)應(yīng)加分

  376.    if(RXD==0)  

  377.    {                              //調(diào)用延時(shí)子程序  實(shí)現(xiàn)消除按鍵抖動(dòng)功能,即,當(dāng)

  378.     delay(1);                   //檢測(cè)到按鍵按下時(shí)候,延時(shí),按鍵仍按下,說(shuō)明按鍵

  379.     if(RXD==0)                 //確實(shí)按下,非抖動(dòng),甲隊(duì)對(duì)應(yīng)加分

  380.       {

  381.          while(RXD==0);

  382.          x++;

  383.           }

  384.   }   

  385. if(TXD==0)                      //同理,檢測(cè)乙隊(duì)加分按鍵時(shí)候按下,并加分

  386.    {

  387.   delay(1);

  388.    if(TXD==0)

  389.          {

  390.           while(TXD==0);

  391.           y++;

  392.          }

  393.     }

  394. }

  395. void keyjianfen1()                                    //減分按鍵檢測(cè)子程序,其基本算法及功能與加{

  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()                                            //顯示時(shí)間調(diào)整程序,即回表和快表

  416. {

  417.   if(INT0==0)

  418.   {                                 //在比賽中有時(shí)經(jīng)常需要回表,故寫此程序

  419.        delay(10);

  420.        if(INT0==0)                      //回表子程序,檢測(cè)到INT0按下時(shí),使時(shí)間回倒

  421.     {

  422.        chuzanting==0;               // chuzanting==0; zanting=1;為附加變量,當(dāng)回表按鍵

  423.        zanting=1;                    //松開(kāi)時(shí),表暫停,這兩個(gè)變量用來(lái)調(diào)用暫停

  424.               n++;

  425.               if(n==60)

  426.           {

  427.                m++;

  428.                n=1;

  429.               }

  430.     }                        

  431.   }                           

  432.   if(INT1==0)                     //快表子程序,檢測(cè)到INT1按下時(shí),使倒計(jì)加快,

  433.   {                               //通常情況下與回表子程序配合使用,即當(dāng)回表

  434.                                   //回過(guò)的時(shí)候,按此鍵調(diào)整時(shí)間

  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()                      / /該程序使回表和快表按鍵松開(kāi)時(shí)候能自動(dòng)暫停

  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;          //當(dāng)按鍵松開(kāi)的時(shí)候,調(diào)用暫停程序條件

  450.               chuzanting=0;       //zanting=0;chuzanting=0,初始化,以便下次回表和快表        while(1)                    //按鍵松開(kāi)時(shí)候仍能調(diào)用暫停程序

  451.            {

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

  453.             if(P1_0==0)            //檢測(cè)暫停鍵按下,開(kāi)中斷,跳出暫停

  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()                         //半場(chǎng)交換場(chǎng)地時(shí)自動(dòng)交換雙方比賽分?jǐn)?shù)子程序{

  467.    inttemp;               //定義中間變量temp,檢測(cè)到有按鍵按下時(shí)候

  468.   if(zidong==1&&jie==1)   //交換甲隊(duì),乙隊(duì)比賽分?jǐn)?shù)

  469.    {

  470.     temp=x;             //zidong==1&&jie==1是判斷半場(chǎng)的條件              //

  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)                //檢測(cè)到暫停按鍵按下時(shí)候,令EA=0關(guān)閉中斷

  481.   {

  482.     delay(1);               //同通過(guò)死循環(huán)程序while(1),不斷刷新數(shù)碼管

  483.     if(P1_0==0)             //當(dāng)暫停鍵再次按下時(shí)候,開(kāi)中斷,以使比賽時(shí)間

  484.      {                      //繼續(xù)倒計(jì)時(shí),由于在暫停的時(shí)候,程序處于死循

  485.        while(P1_0==0);

  486.         EA=0;               //無(wú)法回到主程序,故主程序中檢測(cè)按鍵按下的

  487.         while(1)              //無(wú)法回到主程序,即實(shí)現(xiàn)了暫停時(shí),除了暫停鍵

  488.            {                          //其他按鍵按下均無(wú)效

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

  490.             if(P1_0==0)

  491.             {                  //當(dāng)暫停鍵再次按下時(shí)候,EA=1開(kāi)中斷,計(jì)時(shí)數(shù)碼管

  492.               delay(1);       //繼續(xù)倒計(jì)時(shí),同時(shí)通過(guò)break語(yǔ)句,跳出死循環(huán)

  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()                                             //比賽結(jié)束及及點(diǎn)亮下半場(chǎng)指示燈程序

  506. {

  507. if((m==0)&&(n==0))             //當(dāng)m,n均為0的時(shí)候,通過(guò)變量jie的值判斷比賽  

  508.    {                           //是否結(jié)束

  509.       if(jie>1)                      //如果jie>1,說(shuō)明半場(chǎng)到了,比賽沒(méi)有結(jié)束,      {

  510.      {                          //jie--,關(guān)中斷,再次按下暫停鍵時(shí)候繼續(xù)倒計(jì)時(shí)

  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,說(shuō)明比賽結(jié)束了,令EA=0,      {                    //比關(guān)閉中斷,比賽秒表不再走動(dòng),同時(shí)不短刷新數(shù)碼管,             EA=0;              

  534.                       //全場(chǎng)比賽結(jié)束蜂鳴器開(kāi)始報(bào)警

  535.               m=0;

  536.               n=0;

  537. T1=1;

  538.       delay(400);

  539.         T1=0;

  540.               P1=0x3f;             // P1=0x3f上下半場(chǎng)指示燈同時(shí)點(diǎn)亮,比賽結(jié)束

  541.                      while(1)

  542.             display(m,n,x,y);     //不斷刷新數(shù)碼管

  543.           }

  544.        }            

  545. }

  546. void main()                                   // 主程序

  547. {  TMOD=0x01;                //設(shè)置定時(shí)器工作方式

  548.    EA=1;                  

  549.    ET0=1;                 

  550.        TH0=0xb1;                  //定時(shí)器送計(jì)數(shù)初值,EA=1,開(kāi)中斷,P3口電平拉高

  551.        TL0=0x10;                   // P1=0x7f, 上半場(chǎng)指示燈點(diǎn)亮

  552.        TR0=1;

  553.        P3=0xff;

  554.        P1=0x7f;

  555.    T1=0;

  556.        while(1)

  557.        {                        //通過(guò) while(1),反復(fù)調(diào)用循環(huán)體內(nèi)的子程序

  558.     keyjiafen1();              //執(zhí)行相應(yīng)的功能

  559.         keyjianfen1();            

  560.      key2();

  561.         if(zidong==1)            //zidong==1為key3()執(zhí)行條件,僅當(dāng)半場(chǎng)結(jié)束時(shí)候執(zhí)行

  562.         key3();

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

  564.         {

  565.          bujin=2;           //修改變量bujin的值,設(shè)定over()中第二個(gè)if語(yǔ)句的執(zhí)行條件

  566.          }

  567.      shijian();

  568.         

  569.         key4();

  570.     over();

  571.         }
  572. }
復(fù)制代碼


調(diào)查.png (234.19 KB, 下載次數(shù): 57)

調(diào)查.png

3332.png (346.31 KB, 下載次數(shù): 46)

3332.png
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:891769 發(fā)表于 2021-3-14 21:09 | 只看該作者
能不能加一個(gè)24秒的功能呢
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表