久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2305|回復: 1
打印 上一主題 下一主題
收起左側

數碼管顯示的單片機籃球比賽記分牌程序、Proteus仿真

[復制鏈接]
跳轉到指定樓層
樓主
1、比賽開始,比分能夠全部清零,數碼管前2位、末2位做記分用,當中2位做24秒倒計時用。
2、24秒倒計時時間到,蜂鳴器響、指示燈亮,重新開始倒計時,蜂鳴器停止鳴叫、指示燈滅。
3、比分進行增加后,倒計時從24秒重新開始倒計時。任意時刻24秒可以重新開始倒計時。必要時候能夠關閉倒計時。
4、利用AT24C02或者單片機內部資源保存比分,支持復位保存,掉電保存功能

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


單片機源程序如下:

  1. #include<REG51.h>                         //此文件中定義了單片機的一些特殊功能寄存器
  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隊比分
  11. unsigned char B_Score = 0;        //B隊比分
  12. //unsigned char Second = 24;        //24秒倒計時
  13. unsigned char Start_flag = 0;     //開始標志位
  14. unsigned char Clear_flag = 0;     //清除標志位

  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. * 函 數 名       : main
  23. * 函數功能                 : 主函數
  24. * 輸    入       : 無
  25. * 輸    出             : 無
  26. *******************************************************************************/
  27. void main()
  28. {
  29.     unsigned char i,num=0;

  30.     Timer0_Init();

  31.      A_Score=At24c02Read(1);          //在地址1內讀出數據并賦值A_Score
  32.      B_Score=At24c02Read(50);         //在地址50內讀出數據并賦值B_Score
  33.             

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

  38.         if(Second == 0xff)           //判斷秒數是否記到,0-1 ,計到0再減1
  39.         {
  40.             Second = 24;             //Second重新賦值24
  41.             Start_flag = 0;          //開始標志位清零
  42.             TR0 = 0;                 //關閉定時器0
  43.             TR1 = 1;                 //打開定時器1 ,為無源蜂鳴器提供振蕩頻率
  44.         }
  45.         if(Clear_flag)
  46.         {           
  47.             At24c02Write(50,0);   //在地址50內寫入數據B_Score
  48.             Clear_flag = 0;
  49.         }
  50.         if(key_num == 0)          //比賽開始
  51.         {
  52.             TR0 = 1;              //打開定時0開始計數
  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隊加1分
  65.         {
  66.             if(Start_flag)
  67.             {
  68.                 A_Score++;
  69.                 Second = 24;
  70.                 At24c02Write(1,A_Score);   //在地址1內寫入數據A_Score
  71.             }   
  72.         }
  73.         else if(key_num == 6)    //A隊加2分
  74.         {
  75.             if(Start_flag)
  76.             {
  77.                 A_Score += 2;
  78.                 Second = 24;
  79.                 At24c02Write(1,A_Score);   //在地址1內寫入數據A_Score
  80.             }   
  81.         }
  82.         else if(key_num == 10)    //A隊加3分
  83.         {
  84.             if(Start_flag)
  85.             {
  86.                 A_Score += 3;
  87.                 Second = 24;
  88.                 At24c02Write(1,A_Score);   //在地址1內寫入數據A_Score
  89.             }   
  90.         }
  91.         else if(key_num == 3)    //B隊加1分
  92.         {
  93.             if(Start_flag)
  94.             {
  95.                 B_Score++;
  96.                 Second = 24;
  97.                 At24c02Write(50,B_Score);   //在地址50內寫入數據B_Score
  98.             }   
  99.         }
  100.         else if(key_num == 7)    //B隊加2分
  101.         {
  102.             if(Start_flag)
  103.             {
  104.                 B_Score += 2;
  105.                 Second = 24;
  106.                 At24c02Write(50,B_Score);   //在地址50內寫入數據B_Score
  107.             }   
  108.         }
  109.         else if(key_num == 11)    //B隊加3分
  110.         {
  111.             if(Start_flag)
  112.             {
  113.                 B_Score += 3;
  114.                 Second = 24;
  115.                 At24c02Write(50,B_Score);   //在地址50內寫入數據B_Score
  116.             }   
  117.         }
  118.         else if(key_num == 4)     //清除比分
  119.         {
  120.             A_Score = 0;
  121.             B_Score = 0;
  122.             At24c02Write(1,0);   //在地址1內寫入數據0,清除比分
  123.             At24c02Write(50,0);   //在地址50內寫入數據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. * 函 數 名         : delay
  137. * 函數功能                   : 延時函數,i=1時,大約延時10us
  138. *******************************************************************************/
  139. void delay(unsigned int i)
  140. {
  141.         while(i--);        
  142. }

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

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

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

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

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

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

  174. /*******************************************************************************
  175. * 函 數 名         : DigDisplay
  176. * 函數功能                   : 數碼管動態掃描函數,循環掃描8個數碼管顯示
  177. *******************************************************************************/
  178. void DigDisplay()
  179. {
  180.         unsigned char i;
  181.         for(i=0;i<8;i++)
  182.         {
  183.                 switch(i)         //位選,選擇點亮的數碼管,
  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];//發送段碼
  203.                 delay(100); //間隔一段時間掃描        
  204.                 P0=0x00;//消隱
  205.         }
  206. }
復制代碼

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

評分

參與人數 1黑幣 +30 收起 理由
admin + 30 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91看片在线 | 黄片毛片免费看 | 亚洲视频在线看 | 亚洲免费三级 | 中文字幕在线剧情 | 一区精品视频 | 久久国产精品久久久久久 | 国产小视频在线看 | 久久久999国产精品 中文字幕在线精品 | 国产在线一区二区三区 | 亚洲成av人影片在线观看 | 亚洲xx在线 | 午夜视频网 | 精品久久久网站 | 国产欧美在线观看 | 一级一级毛片免费看 | 亚洲成人精选 | 日韩a视频 | 欧美国产日韩在线观看 | 欧美二区三区 | 欧美在线一二三 | 亚洲精品乱码久久久久久按摩观 | 欧美综合久久 | av天天看 | 美女天天干天天操 | 国产精品毛片久久久久久久 | 久久久久久久97 | 久久99久久 | av手机在线免费观看 | 超碰在线97国产 | 天天av网 | 视频1区2区| 99综合在线 | 黄色成人在线网站 | 亚洲a视| 久久久久久电影 | 国产激情视频在线 | 成年人在线观看 | 精品视频99 | 我要看黄色录像一级片 | 欧美日韩手机在线观看 |