找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

求助:我照著這個報告做的籃球計時計分器為什么是錯的

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:259440 發(fā)表于 2017-12-9 20:17 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
仿真 新建 Microsoft Word 文檔.docx (1.1 MB, 下載次數(shù): 14)

報告 led鏁扮爜綆÷風鐞冭鏃惰鍒嗗櫒.doc (572.5 KB, 下載次數(shù): 9)
程序和仿真 新建文件夾 (3).rar (17.83 KB, 下載次數(shù): 7)
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
code unsigned seg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
int m=1,n=60,x=0,y=0,i=0,jie=2,zidong=1,bujin=1,zanting=0,chuzanting=0;
sbit P1_1=P1^1;
sbit P1_2=P1^2;
sbit P1_3=P1^3;
sbit P1_4=P1^4;
sbit P1_5=P1^5;
sbit P1_6=P1^6;
sbit P1_7=P1^7;
sbit k1=P3^0;    //A+1
sbit k2=P3^1;     //B+1
sbit k3=P3^2;     //回表按鍵
sbit k4=P3^3;     //時間快進
sbit k5=P3^4;     //A-1
sbit k6=P3^5;     //B-1
sbit P1_0=P1^0;   //暫停、啟動
//#include <REGX51.H>為頭文件P1口各位分別用P1_0等表示
void delay(int t)             // 延時子程序   通過參數(shù)t,可以調(diào)整暫停時間
{
   while(t--)
  {
    unsigned int i;
   for(i=0;i<200;i++);
   }
}
  
void display(int i,int j,int x,int y)     //  數(shù)碼管動態(tài)刷新顯示程序
{
     if(jie==1&&bujin!=2)       //中間變量jie==1時,為上半場,對P1賦值
  P1=0xbf;                 //P1=0xbf, 即P1=1011 1111B,點亮對應上半場指示燈
     
  P2=0xfe;           //數(shù)碼管動態(tài)刷新顯示程序 P2=1111 1110,i為分鐘
     P0=seg[i%100/10];         //刷新顯示時間顯示分鐘十位,調(diào)用延時程序,
     delay(1);                  //延時數(shù)碼管的點亮
     P2=0xff;
     P0=0;
     P2=0xfd;                //同理,動態(tài)刷新時分鐘個位并延時點亮
     P0=seg[i%10];
     delay(1);
     P2|=0xff;
     P0=0;
     P2=0xfb;                //同理,動態(tài)刷新時秒鐘十位并延時點亮
     P0=seg[j%100/10];
     delay(1);
     P0=0;
     P2=0xff;
     P2=0xf7;                //同理,動態(tài)刷新時秒鐘個位并延時點亮
     P0=seg[j%10];
     delay(1);
     P0=0;
     P2=0xff;
     P2=0xef;            //同理,動態(tài)刷新甲隊分數(shù)十位并延時點亮
  P0=seg[x%100/10];
  delay(1);
  P2=0xff;
  P0=0;
  P2=0xdf;              //同理,動態(tài)刷新甲隊分數(shù)個位并延時點亮
  P0=seg[x%10];
  delay(1);
  P2=0xff;
  P0=0;
   
  P2=0xbf;              //同理,動態(tài)刷新乙隊分數(shù)十位并延時點亮
  P0=seg[y%100/10];
     delay(1);
     P0=0;
     P2=0xff;

  P2=0x7f;                //同理,動態(tài)刷新乙隊分數(shù)十位并延時點亮
     P0=seg[y%10];
     delay(1);
     P0=0;
     P2=0xff;
}
void t0(void) interrupt 1       //調(diào)用定時器T0      基本計時單位秒
{  TH0=0xb1;                //利用定時器T0,送入計數(shù)初值TH0=0xb1; TL0=0x10;
   TL0=0x10;                 //定時器定時單位為20毫秒
   if(n==0)
   {                           //分鐘與秒時間調(diào)整   當秒減到0以后分鐘減1
   n=60;m--;
   }
   i++;
   if(i==50)
   {                          //利用中間變量i   令i值為50  50*20毫秒=1秒
   n--;                         //以實現(xiàn)一秒計時
   i=0;
   }
   display(m,n-1,x,y);              //調(diào)用動態(tài)刷新顯示程序
}

void keyjiafen1()        //加分按鍵子程序,在主程序中不斷調(diào)用該子程序
{                                  //當檢測到甲隊加分按鍵按下時,對應加分
    if(k1==0)  
   {                              //調(diào)用延時子程序  實現(xiàn)消除按鍵抖動功能,即,當
     delay(1);                   //檢測到按鍵按下時候,延時,按鍵仍按下,說明按鍵
     if(k1==0)                 //確實按下,非抖動,甲隊對應加分
      {
   while(k1==0);
   x++;
    }
   }   
if(k2==0)                      //同理,檢測乙隊加分按鍵時候按下,并加分
   {
   delay(1);
    if(k2==0)
   {
    while(k2==0);
    y++;
   }
    }
}
void keyjianfen1()      //減分按鍵檢測子程序,其基本算法及功能與加
{
   if(k5==0)                        //相同
   {
   delay(1);
   if(k5==0)
      {
    while(k5==0);
    x--;
   }
   }   
if(k6==0)
   {
  delay(1);
  if(k6==0)
   {
   while(k6==0);
    y--;
   }
   }
}
void key2()        //顯示時間調(diào)整程序,即回表和快表
{
   if(k3==0)
  {                                 //在比賽中有時經(jīng)常需要回表,故寫此程序
delay(10);
if(k3==0)                      //回表子程序,檢測到INT0按下時,使時間回倒
    {
chuzanting==0;               // chuzanting==0; zanting=1;為附加變量,當回表按鍵
zanting=1;                    //松開時,表暫停,這兩個變量用來調(diào)用暫停
  n++;
  if(n==60)
    {
   m++;
   n=1;
  }
    }                        
  }                           
   if(k4==0)                     //快表子程序,檢測到INT1按下時,使倒計加快,
  {                               //通常情況下與回表子程序配合使用,即當回表
                                  //回過的時候,按此鍵調(diào)整時間
    delay(10);                      // chuzanting==0; zanting=1;作用同上
    if(k4==0)
{   
  chuzanting==0;
  zanting=1;
  n--;
}
   }
}
void shijian()                      //該程序使回表和快表按鍵松開時候能自動暫停
{
  if(zanting==1&&k3==1&&k4==1&&chuzanting==0 )
  {
     EA=0;         // zanting==1&&k3==1&&k4==1&&chuzanting==0作用為
  zanting=0;          //當按鍵松開的時候,調(diào)用暫停程序條件
  chuzanting=0;       //zanting=0;chuzanting=0,初始化,以便下次回表和快表      
    while(1)                    //按鍵松開時候仍能調(diào)用暫停程序
     {
          display(m,n,x,y);     
             if(P1_0==0)            //檢測暫停鍵按下,開中斷,跳出暫停
             {
               delay(1);
               if(P1_0==0)
                {
                 while(P1_0==0);
                   EA=1;
                  break;
                 }
             }
           }
   }
}
void key3()
{     //半場交換場地時自動交換雙方比賽分數(shù)子程序{
   int temp;               //定義中間變量temp,檢測到有按鍵按下時候
   if(zidong==1&&jie==1)   //交換甲隊,乙隊比賽分數(shù)
   {
     temp=x;             // zidong==1&&jie==1是判斷半場的條件              //
     y=temp;
     display(m,n,x,y);
     zidong=0;   
  bujin=0;
   }
      
}
void key4()                            //比賽暫停子程序
{
   if(P1_0==0)                //檢測到暫停按鍵按下時候,令EA=0關(guān)閉中斷
  {
     delay(1);               //同通過死循環(huán)程序while(1),不斷刷新數(shù)碼管
     if(P1_0==0)             //當暫停鍵再次按下時候,開中斷,以使比賽時間
     {                      //繼續(xù)倒計時,由于在暫停的時候,程序處于死循
        while(P1_0==0);
         EA=0;               //無法回到主程序,故主程序中檢測按鍵按下的
         while(1)              //無法回到主程序,即實現(xiàn)了暫停時,除了暫停鍵
     {                          //其他按鍵按下均無效
          display(m,n,x,y);
             if(P1_0==0)
             {                  //當暫停鍵再次按下時候,EA=1開中斷,計時數(shù)碼管
               delay(1);       //繼續(xù)倒計時,同時通過break語句,跳出死循環(huán)
               if(P1_0==0)
                {
                 while(P1_0==0);
                   EA=1;
                  break;
                 }
             }
      
     }
       }
    }
}   

void over()         //比賽結(jié)束及及點亮下半場指示燈程序
{
if((m==0)&&(n==0))             //當m,n均為0的時候,通過變量jie的值判斷比賽  
   {                           //是否結(jié)束
       if(jie>1)             //如果jie>1,說明半場到了,比賽沒有結(jié)束,      {
     {                          //jie--,關(guān)中斷,再次按下暫停鍵時候繼續(xù)倒計時
        m=2;
        n=0;
        EA=0;
           T1=1;
        delay(400);
         T1=0;
         while(1)        
         {            
        display(m,n,x,y);
      if(P1_0==0)
              {
               delay(1);
              if(P1_0==0)
                  {
                   while(P1_0==0);
                     EA=1;
                    break;
                   }
             }
            }
        jie--;
   }
    if(jie==1&&bujin==2)     //如果jie==1&&bujin==2,說明比賽結(jié)束了,令EA=0,
       {                    //比關(guān)閉中斷,比賽秒表不再走動,同時不短刷新數(shù)碼管,
     EA=0;              //全場比賽結(jié)束蜂鳴器開始報警
     m=0;
     n=0;
           T1=1;
           delay(400);
           T1=0;
     P1=0x3f;             // P1=0x3f上下半場指示燈同時點亮,比賽結(jié)束
   while(1)
      display(m,n,x,y);     //不斷刷新數(shù)碼管
    }
}      
}
void main()        // 主程序
{   TMOD=0x01;                //設置定時器工作方式
    EA=1;                  
    ET0=1;                 
TH0=0xb1;                  //定時器送計數(shù)初值,EA=1,開中斷,P3口電平拉高
TL0=0x10;                   // P1=0x7f, 上半場指示燈點亮
TR0=1;
P3=0xff;
P1=0x7f;
    T1=0;
while(1)
{                        //通過 while(1),反復調(diào)用循環(huán)體內(nèi)的子程序
     keyjiafen1();              //執(zhí)行相應的功能
  keyjianfen1();            
     key2();
  if(zidong==1)            //zidong==1為key3()執(zhí)行條件,僅當半場結(jié)束時候執(zhí)行
  key3();
  if(n==18&&bujin==0)
  {
   bujin=2;           //修改變量bujin的值,設定over()中第二個if語句的執(zhí)行條件
   }
      shijian();
  
  key4();
     over();
  }
}


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:891769 發(fā)表于 2021-3-14 21:08 | 只看該作者
include <REGX51.H>這里錯了吧是reg51.h
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表