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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

籃球計分器 單片機程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:918728 發表于 2025-4-10 09:30 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  1. #include<reg51.h>//51單片機頭文件
  2. typedef unsigned char uchar;
  3. typedef unsigned int  uint;
  4. sbit K1=P3^2;//比賽倒計時開始/暫停
  5. sbit K2=P3^3;//24s倒計時重新開始
  6. sbit K3=P1^3;//乙隊+1按鍵
  7. sbit K4=P1^2;//乙隊+2按鍵
  8. sbit K5=P1^1;//甲隊+1按鍵
  9. sbit K6=P1^0;//甲隊+2按鍵
  10. sbit K7=P1^4;//乙隊+3按鍵
  11. sbit K8=P1^5;//甲隊+3按鍵
  12. sbit K9=P1^6;//半場積分互換
  13. sbit K10=P1^7;//分數清0
  14. sbit K11=P2^1;//乙隊-1按鍵
  15. sbit K12=P2^2;//甲隊-1按鍵

  16. sbit K13=P2^3;//乙隊犯規按鍵
  17. sbit K14=P2^4;//甲隊犯規按鍵
  18. sbit LED1=P2^6;//乙隊犯規燈
  19. sbit LED2=P3^4;//乙隊犯規燈

  20. sbit LED3=P3^0;//甲隊犯規燈
  21. sbit LED4=P3^1;//甲隊犯規燈

  22. sbit K15=P3^5;//乙隊犯規清0按鍵
  23. sbit K16=P3^6; //甲隊犯規清0按鍵


  24. sbit beep=P2^0;//蜂鳴器接口  
  25. sbit RS=P2^7;
  26. sbit E=P2^5;
  27. char miao,fen,num,time,aa;
  28. uchar bb,cc,tt;
  29. uchar code table1[]={"H.T 000:000 R.T "};
  30. uchar code table2[]={"10:00  SEC-1  24"};

  31. bit key_pressed = 0;              // 按鍵按下標志
  32. bit key_pressed1 = 0;              // 按鍵按下標志
  33. unsigned char led_state = 0; // LED狀態: 0=都滅, 1=LED1亮, 2=都亮
  34. unsigned char led_state1 = 0; // LED狀態: 0=都滅, 1=LED1亮, 2=都亮
  35. //延時子函數
  36. void delay(uint z)  
  37. {
  38.         uint x;
  39.         uchar y;
  40.         for(x=z;x>0;x--)
  41.                   for(y=110;y>0;y--);
  42. }

  43. //LCD1602液晶寫指令子函數
  44. void write_com(uchar com)
  45. {
  46.         RS=0;
  47.         P0=com;
  48.         delay(5);
  49.         E=1;
  50.         delay(5);
  51.         E=0;
  52. }

  53. //LCD1602液晶寫數據子函數
  54. void write_date(uchar date)
  55. {
  56.         RS=1;
  57.         P0=date;
  58.         delay(5);
  59.         E=1;
  60.         delay(5);
  61.         E=0;
  62. }

  63. //LCD1602液晶初始化子函數
  64. void LCD1602_init()
  65. {
  66.         uchar i;
  67.         bb=0;    //H.T分數初始化
  68.         cc=0;    //R.T分數初始化
  69.         time=0;
  70.         TMOD=0x10;    //定時器1初始化
  71.         TL1=0x00;
  72.         TH1=0x4c;
  73.         EA=1;     //開總中斷
  74.         ET1=1;     //開定時器1
  75.         TR1=0;     //定時器1不工作
  76.         EX0=1;     //開中斷0
  77.         EX1=1;     //開中斷1
  78.         IT0=1;     //中斷0為邊沿觸發
  79.         IT1=1;     //中斷1為邊沿觸發
  80.         E=0;
  81.         beep=0;
  82.         miao=0;
  83.         fen=10;
  84.         num=1;
  85.         aa=24;
  86.         write_com(0x38);  //LCD設置初始化
  87.         write_com(0x0c);
  88.         write_com(0x06);
  89.         write_com(0x01);
  90.         write_com(0x80);  //LCD顯示初始化
  91.         for(i=0;i<16;i++)
  92.         {
  93.                   write_date(table1[i]);
  94.         }
  95.         write_com(0x80+0x40);
  96.         for(i=0;i<16;i++)
  97.         {
  98.                   write_date(table2[i]);
  99.         }
  100. }
  101. //分數更新子函數
  102. void point_lcd(uchar add,uchar dat)
  103. {
  104.         write_com(0x80+add);
  105.         write_date(0x30+dat/100);
  106.         write_date(0x30+(dat%100)/10);
  107.         write_date(0x30+dat%10);
  108.         write_com(0x80+add);
  109. }
  110. //按鍵掃描子函數
  111. void keyscan()
  112. {
  113.         if(K3==0)     //K3按下H.T分數加一
  114.         {
  115.                   while(K3==0);
  116.                 bb++;
  117.                   point_lcd(0x04,bb);  //分數顯示更新
  118.                   if(K3==0)    //松手檢測
  119.                   {
  120.                            while(K3==0);
  121.                            delay(20);
  122.                   }
  123.         }

  124.         else if(K4==0)    //K4按下H.T分數加二
  125.         {
  126.                   while(K4==0);
  127.                 bb=bb+2;
  128.                   point_lcd(0x04,bb);
  129.                   if(K4==0)
  130.                   {
  131.                            while(K4==0);
  132.                            delay(20);
  133.                   }
  134.         }
  135.         else if(K7==0)          //K7按下H.T分數加3
  136.         {
  137.                 while(K7==0);
  138.                 bb=bb+3;
  139.                   point_lcd(0x04,bb);
  140.                   if(K7==0)
  141.                   {
  142.                            while(K7==0);
  143.                            delay(20);
  144.                   }
  145.         }

  146.         else if(K5==0)    //K5按下R.T分數加一
  147.         {
  148.                   while(K5==0);
  149.                 cc++;
  150.                   point_lcd(0x08,cc);
  151.                   if(K5==0)
  152.                   {
  153.                            while(K5==0);
  154.                            delay(20);
  155.                   }
  156.         }
  157.         else if(K6==0)    //K6按下R.T分數加2
  158.         {
  159.                   while(K6==0);
  160.                 cc=cc+2;
  161.                   point_lcd(0x08,cc);
  162.                   if(K6==0)
  163.                   {
  164.                            while(K6==0);
  165.                            delay(20);
  166.                   }
  167.         }
  168. else if(K8==0)          //K9按下R.T分數加3
  169.         {
  170.                 while(K8==0);
  171.                 cc=cc+3;
  172.                   point_lcd(0x08,cc);
  173.                   if(K8==0)
  174.                   {
  175.                            while(K8==0);
  176.                            delay(20);
  177.                   }
  178.         }

  179. else if(K10==0)          //K10按下分數清0
  180.         {
  181.                 while(K10==0);
  182.                 bb=0;
  183.                 cc=0;
  184.                   point_lcd(0x04,bb);               
  185.                   point_lcd(0x08,cc);
  186.                   if(K10==0)
  187.                   {
  188.                            while(K10==0);
  189.                            delay(20);
  190.                   }
  191.         }        
  192.         else if(K9==0)    //K9半場場地互換,積分互換
  193.         {                                          
  194.                                 while(K9==0);
  195.                 {
  196. //                        uchar code table3[]={"R.T 000:000 H.T "};
  197.                         tt=bb;bb=cc;cc=tt;
  198.                 }
  199.                         point_lcd(0x04,bb);
  200.                   point_lcd(0x08,cc);
  201.                 if(K9==0)
  202.                 {
  203.                         while(K9==0);
  204.                         delay(20);
  205.                 }
  206.         }

  207.         if(K13 == 0)       //K13乙隊犯規按鍵
  208.         {
  209.                         delay(10);  // 消抖延時
  210.                         if(K13 == 0 && !key_pressed) {
  211.                                         key_pressed = 1;  // 設置按鍵按下標志
  212.                                        
  213.                                         // 根據當前狀態切換LED
  214.                                         if(led_state == 0) {
  215.                                                         LED1 = 1;     // 點亮第一個LED
  216.                                                         led_state = 1;
  217.                                         }
  218.                                         else if(led_state == 1) {
  219.                                                         LED2 = 1;    // 點亮第二個LED
  220.                                                         led_state = 2;
  221.                                         }
  222.                                         // 當led_state == 2時不做任何操作
  223.                         }
  224.         } else {
  225.                         key_pressed = 0;  // 按鍵釋放,清除標志
  226.         }

  227.         if(K14 == 0)       //K13甲隊犯規按鍵
  228.         {
  229.                         delay(10);  // 消抖延時
  230.                         if(K14 == 0 && !key_pressed1) {
  231.                                         key_pressed1 = 1;  // 設置按鍵按下標志
  232.                                        
  233.                                         // 根據當前狀態切換LED
  234.                                         if(led_state1 == 0) {
  235.                                                         LED3 = 1;     // 點亮第一個LED
  236.                                                         led_state1 = 1;
  237.                                         }
  238.                                         else if(led_state1 == 1) {
  239.                                                         LED4 = 1;    // 點亮第二個LED
  240.                                                         led_state1 = 2;
  241.                                         }
  242.                                         // 當led_state == 2時不做任何操作
  243.                         }
  244.         } else {
  245.                         key_pressed1 = 0;  // 按鍵釋放,清除標志
  246.         }

  247.         if(K15==0)     //K15按下乙隊犯規清0
  248.         {
  249.                   while(K15==0);
  250.       LED1=0;
  251.       LED2=0;               
  252.                   if(K15==0)    //松手檢測
  253.                   {
  254.                            while(K15==0);
  255.                            delay(20);
  256.                   }
  257.         }

  258.         if(K16==0)     //K15按下乙隊犯規清0
  259.         {
  260.                   while(K16==0);
  261.       LED3=0;
  262.       LED4=0;               
  263.                   if(K16==0)    //松手檢測
  264.                   {
  265.                            while(K16==0);
  266.                            delay(20);
  267.                   }
  268.         }        
  269.         
  270. }

  271. //比賽倒計時/24s倒計時
  272. void counter_down()
  273. {
  274.         uchar i;
  275.         if(time>=20)     //每1s倒計時做減一操作
  276.         {
  277.                   miao--;
  278.                   aa--;
  279.                   write_com(0x80+0x4e);  //24s倒計時顯示
  280.                   write_date(0x30+aa/10);
  281.                   write_date(0x30+aa%10);
  282.                 write_com(0x80+0x4e);
  283.                   if(aa==0)    //24s結束發出3s連續報警
  284.                   {
  285.                            beep=1;
  286.                            delay(3000);
  287.                            beep=0;
  288.                            aa=24;
  289.                   }
  290.                   if((miao==0)&&(fen==0))  //檢測一節比賽是否結束
  291.                   {
  292.                            TR1=0;     //定時器1暫停
  293.                            write_com(0x80+0x44);
  294.                            write_date(0x30);
  295.                            num++;
  296.                            aa=24;    //24s計時復位
  297.                            write_com(0x80+0x4e);  //24s倒計時顯示
  298.                            write_date(0x30+aa/10);
  299.                            write_date(0x30+aa%10);
  300.                         write_com(0x80+0x4e);
  301.                            if(num<5)    //每節結束蜂鳴器發出8s的間斷報警
  302.                            {
  303.                             for(i=80;i>0;i--)
  304.                             {
  305.                                      beep=1;
  306.                                      delay(500);
  307.                                      beep=0;
  308.                                      delay(500);
  309.                             }
  310.                            }
  311.                            if(num==5)    //終場結束,蜂鳴器發出10s的連續警報聲
  312.                            {
  313.                              beep=1;
  314.                              delay(10000);
  315.                              num=0;
  316.                            }        


  317.                            beep=0;     //蜂鳴器關閉
  318.                         write_com(0x80+0x4b); //更新"SEC-?"
  319.                         write_date(0x30+num);
  320.                         write_com(0x80+0x4b);
  321.                         miao=0;     //倒計時復位
  322.                         fen=10;
  323.                   }
  324.                   if(miao<=0)
  325.                   {
  326.                            miao=59;
  327.                            fen--;
  328.                   }
  329.                   write_com(0x80+0x40);  //更新倒計時顯示
  330.                   write_date(0x30+fen/10);
  331.                   write_date(0x30+fen%10);
  332.                   write_com(0x80+0x43);
  333.                   write_date(0x30+miao/10);
  334.                   write_date(0x30+miao%10);
  335.                 write_com(0x80+0x43);
  336.                   time=0;
  337.         }
  338. }

  339. //主函數
  340. void main()
  341. {
  342.         LCD1602_init();
  343.         LED1 = 0;  // 初始關閉LED1
  344.         LED2 = 0;  // 初始關閉LED2        
  345.         LED3 = 0;  // 初始關閉LED1
  346.         LED4 = 0;  // 初始關閉LED2                        
  347.         while(1)
  348.         {
  349.                   keyscan();  //分數按鍵檢測
  350.         }
  351. }

  352. //外部0中斷子函數
  353. void wb0() interrupt 0  //比賽時間開始/暫停
  354. {
  355.         TR1=~TR1;     //定時器1工作/暫停
  356.         if(TR1==1)  //當倒計時工作時,S1按下定時器立即停止工作
  357.         {
  358.                   PT1=0;
  359.         }
  360.         else   //倒計時不工作時,S1按下倒計時立即工作
  361.         {
  362.                   PT1=1;
  363.         }
  364.         if(K1==0)     //松手檢測
  365.         {
  366.                   while(K1==0);
  367.                    counter_down();
  368.           //        delay(20);
  369.         }
  370. }

  371. //外部1中斷子函數
  372. void wb1() interrupt 2   //24s倒計時重新開始
  373. {
  374.         aa=24;
  375.         write_com(0x80+0x4e);   //24s倒計時顯示
  376.         write_date(0x30+aa/10);
  377.         write_date(0x30+aa%10);
  378.         write_com(0x80+0x4e);
  379.         if(K2==0)      //松手檢測
  380.         {
  381.                   while(K2==0)
  382.                   {
  383.                            counter_down();
  384.                   }
  385.                   delay(20);
  386.         }
  387. }
  388. //定時器1中斷子函數
  389. void t1() interrupt 3   //定時器1中斷20次為1s
  390. {
  391.         time++;
  392.         TL1=0x00;
  393.         TH1=0x4c;
  394.         counter_down();     //倒計時
  395. }
復制代碼
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品国产乱码一区二区三 | 日韩福利片 | 成人三级在线观看 | 中文字幕国产第一页 | 国产极品粉嫩美女呻吟在线看人 | 中文字幕精品一区二区三区精品 | 综合久久亚洲 | 日韩精品视频在线观看一区二区三区 | 久久99视频精品 | 国产精品久久久久久久久久久久久 | 黄色免费网站在线看 | 成人水多啪啪片 | 精品国产一区二区三区日日嗨 | 日日骚网 | 精品国产一区二区三区观看不卡 | 99re热这里只有精品视频 | 视频一区二区在线观看 | 欧美日本韩国一区二区三区 | 婷婷丁香在线视频 | 欧美日韩精品一区 | 91社区在线观看 | 狠狠做六月爱婷婷综合aⅴ 国产精品视频网 | 天天精品在线 | 一区二区国产精品 | 二区中文 | 青娱乐自拍 | 国产高清免费 | 精品一区二区电影 | 九九综合 | 精久久| 亚洲aⅴ| 久久不卡| 精品一区久久 | 国产精品视频999 | 国产精品国产精品国产专区不卡 | 国产精品日韩在线观看一区二区 | 日本黄色不卡视频 | 久久一二| 亚洲精品国产一区 | av免费入口 | 免费的av网站 |