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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于51單片機的籃球計分計時板程序+電路設計

[復制鏈接]
跳轉到指定樓層
樓主
在主程序中,先使能全局中斷,然后使能74HC245來控制數碼管。配置定時器0工作在模式1并設置定時初值1ms,清零TF位,使能定時器0并啟動定時器0。按鍵動作函數keys進行按鍵消抖。進入中斷后,不斷掃描按鍵動作,并在中斷中完成隊伍比分、倒計時和蜂鳴器的顯示。最后while(1)循環中調用按鍵掃描掃描函數Keys、 600s和24s倒計時, 檢測一次按鍵狀態,如果在連續的8次移位檢測中按鍵狀態保持不變,則判定為按鍵已動作,顯示相應的數碼管動態。主程序流程圖如圖6所示:
                             
圖6 主程序流程圖

3.2蜂鳴器子程序設計
在中斷子程序中,對蜂鳴器函數進行調用,并判斷600s和24s函數中sec是否為0。當十分鐘倒計未結束的時候,蜂鳴器不工作,當十分鐘倒計時結束的時候,蜂鳴器發出響聲。蜂鳴器電路流程圖如圖6所示:

                                  圖7 蜂鳴器電路


3.3按鍵動作子程序設計
在中斷中完成按鍵掃描并消抖,主程序調用按鍵動作函數。如果檢測到按鍵1按下,給k賦值1;如果檢測到按鍵2按下,給k賦值2;如果檢測到按鍵3按下,給k賦值3;如果檢測到按鍵4按下,給k賦值4;如果檢測到按鍵5按下,給k賦值5;如果檢測到按鍵6按下,給k賦值6;如果檢測到按鍵7按下,給k賦值7;如果檢測到按鍵8按下,給k賦值8;如果檢測到按鍵9按下,給k賦值9;如果檢測到按鍵10按下,給k賦值10。按鍵動作函數流程圖如圖8所示:
   
圖8 按鍵動作函數流程圖
3.4中斷子程序設計
中斷子程序中,通過定時器T0調用數碼管動態刷新函數、矩陣按鍵掃描函數以及蜂鳴器函數。中斷1000次即一秒,當達到一秒時,清零計數值以重新開始下一個一秒計時,同時設置一秒定時器標志為1。定時器中斷流程圖如圖9所示:

單片機源程序如下:
  1. #include<reg52.h>
  2.   
  3. sbit ADDR0 = P1^0;
  4. sbit ADDR1 = P1^1;
  5. sbit ADDR2 = P1^2;
  6. sbit ADDR3 = P1^3;



  7. sbit KEY_OUT_1 = P2^3;
  8. sbit KEY_OUT_2 = P2^2;
  9. sbit KEY_OUT_3 = P2^1;
  10. sbit KEY_OUT_4 = P2^0;

  11. sbit KEY_IN_1 = P2^4;
  12. sbit KEY_IN_2 = P2^5;
  13. sbit KEY_IN_3 = P2^6;
  14. sbit KEY_IN_4 = P2^7;

  15. sbit BUZZ = P1^6;

  16. unsigned char code a[]={
  17.         0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
  18.         0x80, 0x90};
  19. unsigned char  ledbuff[12] = {
  20. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  21. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
  22. };
  23. unsigned char  KeySta[4][4] = {
  24.         {1,1,1,1,},
  25.         {1,1,1,1,},
  26.         {1,1,1,1,},
  27.         {1,1,1,1,}};
  28. char x,z,k;
  29. char add1,add2;
  30. unsigned char flagls = 0;
  31. unsigned char rst24 = 24;
  32. int sec = 600;
  33. char cnt1 = 0;
  34. char cnt2 = 0;
  35. unsigned char b[4][4]={
  36.         {1,3,0,9,},
  37.         {2,4,0,0,},
  38.         {5,6,0,10,},
  39.         {7,8,0,0,}};


  40. //蜂鳴器部分
  41. void buzz()
  42. {
  43.    if(sec == 0) BUZZ=0;
  44. }


  45. //矩陣按鍵消抖
  46. void keyx()
  47. {
  48.     unsigned char i;
  49.     static unsigned char keyout = 0;   //矩陣按鍵掃描輸出索引
  50.     static unsigned char keybuf[4][4] = {  //矩陣按鍵掃描緩沖區
  51.         {0xFF, 0xFF, 0xFF, 0xFF},  {0xFF, 0xFF, 0xFF, 0xFF},
  52.         {0xFF, 0xFF, 0xFF, 0xFF},  {0xFF, 0xFF, 0xFF, 0xFF}
  53.     };

  54.     //將一行的4個按鍵值移入緩沖區
  55.     keybuf[keyout][0] = (keybuf[keyout][0] << 1) | KEY_IN_1;
  56.     keybuf[keyout][1] = (keybuf[keyout][1] << 1) | KEY_IN_2;
  57.     keybuf[keyout][2] = (keybuf[keyout][2] << 1) | KEY_IN_3;
  58.     keybuf[keyout][3] = (keybuf[keyout][3] << 1) | KEY_IN_4;
  59.     //消抖后更新按鍵狀態
  60.     for (i=0; i<4; i++)  //每行4個按鍵,所以循環4次
  61.     {
  62.         if ((keybuf[keyout][i] & 0x0F) == 0x00)
  63.         {   //連續4次掃描值為0,即4*4ms內都是按下狀態時,可認為按鍵已穩定的按下
  64.             KeySta[keyout][i] = 0;
  65.         }
  66.         else if ((keybuf[keyout][i] & 0x0F) == 0x0F)
  67.         {   //連續4次掃描值為1,即4*4ms內都是彈起狀態時,可認為按鍵已穩定的彈起
  68.             KeySta[keyout][i] = 1;
  69.         }
  70.     }
  71.     //執行下一次的掃描輸出
  72.     keyout++;                //輸出索引遞增
  73.     keyout = keyout & 0x03;  //索引值加到4即歸零
  74.     switch (keyout)          //根據索引,釋放當前輸出引腳,拉低下次的輸出引腳
  75.     {
  76.         case 0: KEY_OUT_4 = 1; KEY_OUT_1 = 0; break;
  77.         case 1: KEY_OUT_1 = 1; KEY_OUT_2 = 0; break;
  78.         case 2: KEY_OUT_2 = 1; KEY_OUT_3 = 0; break;
  79.         case 3: KEY_OUT_3 = 1; KEY_OUT_4 = 0; break;
  80.         default: break;
  81.     }
  82. }



  83. //600s  and  24秒暫停
  84. void s600and24()
  85. {
  86.         
  87.         static char y;
  88.         y = rst24;
  89.         
  90.         if(cnt2 != 0)
  91.         {
  92.                 if(flagls == 1)
  93.                 {
  94.                         sec--;
  95.                         if(cnt1 % 2 == 1)
  96.                         {
  97.                                 flagls = 0;        
  98.                         }
  99.                         
  100.                 }
  101.         }
  102.         if(cnt1%2 == 0)
  103.         {
  104.                 if(flagls == 1)
  105.                 {
  106.                         rst24--;
  107.                         flagls = 0;
  108.                 }
  109.         }
  110.         else
  111.         {
  112.                 rst24 = y;
  113.         
  114.         }
  115. }


  116. //數碼管掃描
  117. void LED()
  118. {        
  119.         static char n = 0;

  120.         P0 =0XFF;

  121.         ledbuff[0] = a[(sec%60)%10];
  122.         ledbuff[1] = a[(sec%60)/10];
  123.         ledbuff[2] = a[(sec/60)%10] & 0x7F;
  124.         ledbuff[3] = a[(sec/60)/10];

  125.         ledbuff[4] = a[rst24%10];
  126.         ledbuff[5] = a[rst24/10];

  127.         ledbuff[6] = a[add1%10];
  128.         ledbuff[7] = a[add1/10%10];
  129.         ledbuff[8] = a[add1/100%10];

  130.         ledbuff[9] = a[add2%10];
  131.         ledbuff[10] = a[add2/10%10];
  132.         ledbuff[11] = a[add2/100%10];

  133.         switch(n)
  134.         {
  135.                 case 0:   P3 = 0XFF;ADDR0 = 0;ADDR1 = 1;ADDR2 = 1;ADDR3 = 1; n++;P0 = ledbuff[0];break;
  136.                 case 1:   P3 = 0XFF;ADDR0 = 1;ADDR1 = 0;ADDR2 = 1;ADDR3 = 1; n++;P0 = ledbuff[1];break;
  137.                 case 2:   P3 = 0XFF;ADDR0 = 1;ADDR1 = 1;ADDR2 = 0;ADDR3 = 1; n++;P0 = ledbuff[2];break;
  138.                 case 3:   P3 = 0XFF;ADDR0 = 1;ADDR1 = 1;ADDR2 = 1;ADDR3 = 0; n++;P0 = ledbuff[3];break;
  139.                 case 4:   P3 = 0XFE;ADDR0 = 1;ADDR1 = 1;ADDR2 = 1;ADDR3 = 1; n++;P0 = ledbuff[4];break;
  140.                 case 5:   P3 = 0XFD;ADDR0 = 1;ADDR1 = 1;ADDR2 = 1;ADDR3 = 1; n++;P0 = ledbuff[5];break;
  141.                 case 6:   P3 = 0XFB;ADDR0 = 1;ADDR1 = 1;ADDR2 = 1;ADDR3 = 1; n++;P0 = ledbuff[6];break;
  142.                 case 7:   P3 = 0XF7;ADDR0 = 1;ADDR1 = 1;ADDR2 = 1;ADDR3 = 1; n++;P0 = ledbuff[7];break;
  143.                 case 8:   P3 = 0XEF;ADDR0 = 1;ADDR1 = 1;ADDR2 = 1;ADDR3 = 1; n++;P0 = ledbuff[8];break;
  144.                 case 9:   P3 = 0XDF;ADDR0 = 1;ADDR1 = 1;ADDR2 = 1;ADDR3 = 1; n++;P0 = ledbuff[9];break;
  145.                 case 10:  P3 = 0XBF;ADDR0 = 1;ADDR1 = 1;ADDR2 = 1;ADDR3 = 1; n++;P0 = ledbuff[10];break;
  146.                 case 11:  P3 = 0X7F;ADDR0 = 1;ADDR1 = 1;ADDR2 = 1;ADDR3 = 1; n=0;P0 = ledbuff[11];break;
  147.                 default: break;
  148.                
  149.         

  150.                                                                                                                   

  151.         }

  152. }

  153. //矩陣按鍵動作函數,根據鍵碼進行相關操作
  154. void  keys()
  155. {
  156.         unsigned char i, j;

  157.         static        unsigned char backup [4][4] = {
  158.         {1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}
  159.         };

  160.         for(i=0; i<4; i++)
  161.                 {
  162.                         for(j=0; j<4; j++)
  163.                         {
  164.                                 if(backup[i][j] != KeySta[i][j])
  165.                                 {
  166.                                         if(backup[i][j] == 0)
  167.                                         {
  168.                                                 k = b[i][j]        ;
  169.                                                 
  170.                                                 switch(k)
  171.                                                 {
  172.                                                          case 1: add1++;break;
  173.                                                         case 2: add1--;break;
  174.                                                         case 3: add2++;break;
  175.                                                         case 4: add2--;break;
  176.                                                         case 5: rst24=24;break;
  177.                                                         case 6: cnt1++;break;
  178.                                                         case 7: x = add1; add1 = add2; add2 =x;break;
  179.                                                         case 8: cnt2++;break;
  180.                                                         case 9: sec = sec+60; break;
  181.                                                         case 10: sec = sec-60;break;
  182.                                                         default: break;
  183.                                                 }
  184.                                                 

  185.                                         }
  186.                                         backup[i][j] = KeySta[i][j];
  187.                                 }
  188.                         }        
  189.                 }                  
  190.         
  191.         
  192. }



  193. void main()
  194. {
  195.         EA = 1;
  196.         TMOD = 0X01;
  197.         TH0 = 0XFC;
  198.         TL0 = 0X67;
  199.         ET0 = 1;
  200.         TR0 = 1;

  201.         add1 = add2 = 0;
  202.         while(1)
  203.         {
  204.                 keys();
  205.                 s600and24();        
  206.         }

  207. }

  208. //T0中斷服務函數
  209. void InterruptTimer0()interrupt 1
  210. {
  211.         static int cnt = 0;

  212.         TH0 = 0XFC;
  213.         TL0 = 0X67;

  214.         cnt ++ ;
  215.         keyx();
  216.         LED() ;
  217.         if(cnt >= 1000)
  218.         {
  219.                 cnt = 0;
  220.                 flagls = 1;
  221.         }
  222.         buzz();

  223. }
復制代碼

所有資料51hei提供下載:
籃球計分計時.rar (2.34 MB, 下載次數: 35)

評分

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

查看全部評分

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日本午夜精品一区二区三区 | 亚洲精品一区二三区不卡 | 国产精品一区二区三区久久 | 亚洲欧美在线一区 | 天堂va在线 | 亚洲一区 | 国产一级成人 | 99久久精品一区二区毛片吞精 | 久久精品视频网站 | 亚洲免费网站 | 日本一区二区视频 | 午夜成人免费视频 | 一级黄色裸片 | 黑人久久 | 亚洲黄色视屏 | 99精品视频在线观看免费播放 | 欧美一区二区三区在线 | 欧美综合一区二区 | 桃花av在线| 日本福利视频 | 成人国产免费视频 | 国产精品久久久久久久午夜片 | 亚洲成人免费电影 | 在线观看亚洲专区 | 亚洲精品电影网在线观看 | 一区二区三区小视频 | 国产成人精品999在线观看 | 久久久精 | 亚洲视频中文字幕 | 午夜羞羞 | 99精品电影 | 国产一区91精品张津瑜 | 97精品超碰一区二区三区 | 国产成人精品在线 | 视频在线一区二区 | 国产日韩欧美一区 | 日韩免费av | 久久人人网| 交专区videossex农村 | 欧美精品一区三区 | 国产午夜精品一区二区三区在线观看 |