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

QQ登錄

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

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

數(shù)碼管顯示的單片機(jī)籃球比賽記分牌程序、Proteus仿真

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:524923 發(fā)表于 2021-12-20 16:40 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
1、比賽開(kāi)始,比分能夠全部清零,數(shù)碼管前2位、末2位做記分用,當(dāng)中2位做24秒倒計(jì)時(shí)用。
2、24秒倒計(jì)時(shí)時(shí)間到,蜂鳴器響、指示燈亮,重新開(kāi)始倒計(jì)時(shí),蜂鳴器停止鳴叫、指示燈滅。
3、比分進(jìn)行增加后,倒計(jì)時(shí)從24秒重新開(kāi)始倒計(jì)時(shí)。任意時(shí)刻24秒可以重新開(kāi)始倒計(jì)時(shí)。必要時(shí)候能夠關(guān)閉倒計(jì)時(shí)。
4、利用AT24C02或者單片機(jī)內(nèi)部資源保存比分,支持復(fù)位保存,掉電保存功能

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機(jī)源程序如下:

  1. #include<REG51.h>                         //此文件中定義了單片機(jī)的一些特殊功能寄存器
  2. #include"keybord.h"
  3. #include"timer.h"
  4. #include"string.h"
  5. #include"i2c.h"

  6. sbit LSA=P2^2;
  7. sbit LSB=P2^3;
  8. sbit LSC=P2^4;

  9. unsigned char key_num = 0;        //按鍵值
  10. unsigned char A_Score = 0;        //A隊(duì)比分
  11. unsigned char B_Score = 0;        //B隊(duì)比分
  12. //unsigned char Second = 24;        //24秒倒計(jì)時(shí)
  13. unsigned char Start_flag = 0;     //開(kāi)始標(biāo)志位
  14. unsigned char Clear_flag = 0;     //清除標(biāo)志位

  15. unsigned char code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  16.                                         0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//顯示0~F的值

  17. unsigned char PassWord[8]={0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f};//顯示1-8的值

  18. unsigned char DisplayData[8] = {0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f};

  19. void DigDisplay();
  20. void Display();

  21. /*******************************************************************************
  22. * 函 數(shù) 名       : main
  23. * 函數(shù)功能                 : 主函數(shù)
  24. * 輸    入       : 無(wú)
  25. * 輸    出             : 無(wú)
  26. *******************************************************************************/
  27. void main()
  28. {
  29.     unsigned char i,num=0;

  30.     Timer0_Init();

  31.      A_Score=At24c02Read(1);          //在地址1內(nèi)讀出數(shù)據(jù)并賦值A(chǔ)_Score
  32.      B_Score=At24c02Read(50);         //在地址50內(nèi)讀出數(shù)據(jù)并賦值B_Score
  33.             

  34.         while(1)
  35.         {
  36.         Display();                   //調(diào)用顯示函數(shù)
  37.         key_num = KeyPro();          //獲取按鍵值

  38.         if(Second == 0xff)           //判斷秒數(shù)是否記到,0-1 ,計(jì)到0再減1
  39.         {
  40.             Second = 24;             //Second重新賦值24
  41.             Start_flag = 0;          //開(kāi)始標(biāo)志位清零
  42.             TR0 = 0;                 //關(guān)閉定時(shí)器0
  43.             TR1 = 1;                 //打開(kāi)定時(shí)器1 ,為無(wú)源蜂鳴器提供振蕩頻率
  44.         }
  45.         if(Clear_flag)
  46.         {           
  47.             At24c02Write(50,0);   //在地址50內(nèi)寫(xiě)入數(shù)據(jù)B_Score
  48.             Clear_flag = 0;
  49.         }
  50.         if(key_num == 0)          //比賽開(kāi)始
  51.         {
  52.             TR0 = 1;              //打開(kāi)定時(shí)0開(kāi)始計(jì)數(shù)
  53.             TR1 = 0;
  54.             LED = 1;
  55.             Beep = 1;
  56.             Start_flag = 1;  
  57.         }
  58.         else if(key_num == 1)     //比賽暫停
  59.         {
  60.             TR0 = 0;
  61.             TR1 = 0;
  62.             Start_flag = 0;  
  63.         }

  64.         else if(key_num == 2)    //A隊(duì)加1分
  65.         {
  66.             if(Start_flag)
  67.             {
  68.                 A_Score++;
  69.                 Second = 24;
  70.                 At24c02Write(1,A_Score);   //在地址1內(nèi)寫(xiě)入數(shù)據(jù)A_Score
  71.             }   
  72.         }
  73.         else if(key_num == 6)    //A隊(duì)加2分
  74.         {
  75.             if(Start_flag)
  76.             {
  77.                 A_Score += 2;
  78.                 Second = 24;
  79.                 At24c02Write(1,A_Score);   //在地址1內(nèi)寫(xiě)入數(shù)據(jù)A_Score
  80.             }   
  81.         }
  82.         else if(key_num == 10)    //A隊(duì)加3分
  83.         {
  84.             if(Start_flag)
  85.             {
  86.                 A_Score += 3;
  87.                 Second = 24;
  88.                 At24c02Write(1,A_Score);   //在地址1內(nèi)寫(xiě)入數(shù)據(jù)A_Score
  89.             }   
  90.         }
  91.         else if(key_num == 3)    //B隊(duì)加1分
  92.         {
  93.             if(Start_flag)
  94.             {
  95.                 B_Score++;
  96.                 Second = 24;
  97.                 At24c02Write(50,B_Score);   //在地址50內(nèi)寫(xiě)入數(shù)據(jù)B_Score
  98.             }   
  99.         }
  100.         else if(key_num == 7)    //B隊(duì)加2分
  101.         {
  102.             if(Start_flag)
  103.             {
  104.                 B_Score += 2;
  105.                 Second = 24;
  106.                 At24c02Write(50,B_Score);   //在地址50內(nèi)寫(xiě)入數(shù)據(jù)B_Score
  107.             }   
  108.         }
  109.         else if(key_num == 11)    //B隊(duì)加3分
  110.         {
  111.             if(Start_flag)
  112.             {
  113.                 B_Score += 3;
  114.                 Second = 24;
  115.                 At24c02Write(50,B_Score);   //在地址50內(nèi)寫(xiě)入數(shù)據(jù)B_Score
  116.             }   
  117.         }
  118.         else if(key_num == 4)     //清除比分
  119.         {
  120.             A_Score = 0;
  121.             B_Score = 0;
  122.             At24c02Write(1,0);   //在地址1內(nèi)寫(xiě)入數(shù)據(jù)0,清除比分
  123.             At24c02Write(50,0);   //在地址50內(nèi)寫(xiě)入數(shù)據(jù)0,清除比分
  124.             Clear_flag = 1;
  125.             Second = 24;
  126.             TR0 = 0;   
  127.         }
  128.         else if(key_num == 5)
  129.         {
  130.             Second = 24;   
  131.         }

  132.                         
  133.         }               
  134. }

  135. /*******************************************************************************
  136. * 函 數(shù) 名         : delay
  137. * 函數(shù)功能                   : 延時(shí)函數(shù),i=1時(shí),大約延時(shí)10us
  138. *******************************************************************************/
  139. void delay(unsigned int i)
  140. {
  141.         while(i--);        
  142. }

  143. /*******************************************************************************
  144. * 函 數(shù) 名         : DigDisplay
  145. * 函數(shù)功能                   : 數(shù)碼管顯示函數(shù),顯示比分?jǐn)?shù)據(jù)
  146. *******************************************************************************/
  147. void Display()
  148. {
  149.     LSA=1;LSB=1;LSC=1;//顯示第7位
  150.     P0=smgduan[A_Score/10];//發(fā)送段碼
  151.     delay(100); //間隔一段時(shí)間掃描        
  152.         P0=0x00;//消隱

  153.     LSA=0;LSB=1;LSC=1; //顯示第6位
  154.     P0=smgduan[A_Score%10];//發(fā)送段碼
  155.     delay(100); //間隔一段時(shí)間掃描        
  156.         P0=0x00;//消隱

  157.     LSA=0;LSB=0;LSC=1;//顯示第4位
  158.     P0=smgduan[Second/10];//發(fā)送段碼
  159.     delay(100); //間隔一段時(shí)間掃描        
  160.         P0=0x00;//消隱

  161.     LSA=1;LSB=1;LSC=0;//顯示第3位
  162.     P0=smgduan[Second%10];//發(fā)送段碼
  163.     delay(100); //間隔一段時(shí)間掃描        
  164.         P0=0x00;//消隱

  165.     LSA=1;LSB=0;LSC=0;//顯示第1位
  166.     P0=smgduan[B_Score/10];//發(fā)送段碼
  167.     delay(100); //間隔一段時(shí)間掃描        
  168.         P0=0x00;//消隱

  169.     LSA=0;LSB=0;LSC=0;//顯示第0位
  170.     P0=smgduan[B_Score%10];//發(fā)送段碼
  171.     delay(100); //間隔一段時(shí)間掃描        
  172.         P0=0x00;//消隱
  173. }

  174. /*******************************************************************************
  175. * 函 數(shù) 名         : DigDisplay
  176. * 函數(shù)功能                   : 數(shù)碼管動(dòng)態(tài)掃描函數(shù),循環(huán)掃描8個(gè)數(shù)碼管顯示
  177. *******************************************************************************/
  178. void DigDisplay()
  179. {
  180.         unsigned char i;
  181.         for(i=0;i<8;i++)
  182.         {
  183.                 switch(i)         //位選,選擇點(diǎn)亮的數(shù)碼管,
  184.                 {
  185.                         case(0):
  186.                                 LSA=0;LSB=0;LSC=0; break;//顯示第0位
  187.                         case(1):
  188.                                 LSA=1;LSB=0;LSC=0; break;//顯示第1位
  189.                         case(2):
  190.                                 LSA=0;LSB=1;LSC=0; break;//顯示第2位
  191.                         case(3):
  192.                                 LSA=1;LSB=1;LSC=0; break;//顯示第3位
  193.                         case(4):
  194.                                 LSA=0;LSB=0;LSC=1; break;//顯示第4位
  195.                         case(5):
  196.                                 LSA=1;LSB=0;LSC=1; break;//顯示第5位
  197.                         case(6):
  198.                                 LSA=0;LSB=1;LSC=1; break;//顯示第6位
  199.                         case(7):
  200.                                 LSA=1;LSB=1;LSC=1; break;//顯示第7位        
  201.                 }
  202.                 P0=DisplayData[i];//發(fā)送段碼
  203.                 delay(100); //間隔一段時(shí)間掃描        
  204.                 P0=0x00;//消隱
  205.         }
  206. }
復(fù)制代碼

Keil代碼與Proteus8.8仿真下載:
籃球比賽計(jì)分牌.7z (74.1 KB, 下載次數(shù): 38)

評(píng)分

參與人數(shù) 1黑幣 +30 收起 理由
admin + 30 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:908826 發(fā)表于 2021-12-21 09:02 | 只看該作者
我就是好奇這種記分牌不就是實(shí)時(shí)的嗎?往24c02里面存是啥意思。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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