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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

8位競賽搶答器 單片機程序

[復制鏈接]
跳轉到指定樓層
樓主
以單片機為核心,設計一個8位競賽搶答器:同時供8名選手或8個代表隊比賽,分別8個按鈕S0~S7表示。設置一個系統清除和搶答控制開關S,開關由主持人控制。搶答器具有鎖存與顯示功能。即選手按按鈕,鎖存相應的編號,并在優先搶答選手的編號一直保持到主持人將系統清除為止。搶答器具有定時搶答功能,且一次搶答的時間由主持人設定(如30秒)。當主持人啟動“開始”鍵后,定時器進行減計時,同時揚聲器發出短暫的聲響,聲響持續的時間為0.5s左右。參賽選手在設定的時間搶答,搶答有效,定時器停止工作,顯示器上顯示選手的編號和搶答時間,并保持到主持人將系統清除為止。如果定時時間已到,無人搶答,本次搶答無效,系統報警并禁止搶答,定時顯示器上顯示00



單片機源程序如下:
  1. #include<reg51.h>

  2. sbit DIN=P3^0;//與max7219接口定義
  3. sbit LOAD=P3^1;
  4. sbit CLK=P3^2;

  5. sbit key0=P1^0;//8路搶答器按鍵
  6. sbit key1=P1^1;
  7. sbit key2=P1^2;
  8. sbit key3=P1^3;
  9. sbit key4=P1^4;
  10. sbit key5=P1^5;
  11. sbit key6=P1^6;
  12. sbit key7=P1^7;

  13. sbit key_clear=P2^0;//主持人時間設置、清除
  14. sbit begin=P2^1;//主持人開始按鍵

  15. sbit sounder=P3^7;//蜂鳴器

  16. unsigned char second=30;//秒表計數值
  17. unsigned char counter=0;//counter每100,minite加1
  18. unsigned char people=0;//搶答結果

  19. unsigned char num_add[]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};//max7219讀寫地址、內容
  20. unsigned char num_dat[]={0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89};

  21. unsigned char keyscan()//鍵盤掃描函數
  22. {
  23.   unsigned char keyvalue,temp;
  24.   
  25.   keyvalue=0;
  26.   P1=0xff;
  27.   temp=P1;
  28.   if(~(P1&temp))
  29.   {
  30.     switch(temp)
  31.         {
  32.           case 0xfe:
  33.             keyvalue=1;
  34.             break;
  35.           case 0xfd:
  36.             keyvalue=2;
  37.             break;
  38.           case 0xfb:
  39.             keyvalue=3;
  40.             break;
  41.           case 0xf7:
  42.             keyvalue=4;
  43.             break;
  44.           case 0xef:
  45.             keyvalue=5;
  46.             break;
  47.           case 0xdf:
  48.             keyvalue=6;
  49.             break;
  50.           case 0xbf:
  51.             keyvalue=7;
  52.             break;
  53.       case 0x7f:
  54.             keyvalue=8;
  55.             break;
  56.           default:
  57.             keyvalue=0;
  58.             break;
  59.         }
  60.   }

  61.   return keyvalue;
  62. }

  63. void max7219_send(unsigned char add,unsigned char dat)//向max7219寫指令函數
  64. {
  65.   unsigned char        ADS,i,j;

  66.   LOAD=0;
  67.   i=0;
  68.   while(i<16)
  69.   {
  70.     if(i<8)
  71.         {
  72.           ADS=add;
  73.         }
  74.         else
  75.         {
  76.           ADS=dat;
  77.         }
  78.         for(j=8;j>=1;j--)
  79.         {
  80.           DIN=ADS&0x80;
  81.           ADS=ADS<<1;
  82.           CLK=1;
  83.           CLK=0;
  84.         }
  85.         i=i+8;
  86.   }
  87.   LOAD=1;
  88. }

  89. void max7219_init()//max7219初始化函數
  90. {
  91.   max7219_send(0x0c,0x01);
  92.   max7219_send(0x0b,0x07);
  93.   max7219_send(0x0a,0xf5);
  94.   max7219_send(0x09,0xff);
  95. }

  96. void time_display(unsigned char x)//時間顯示
  97. {
  98.   unsigned char i,j;
  99.   i=x/10;
  100.   j=x%10;
  101.   max7219_send(num_add[1],num_dat[j]);
  102.   max7219_send(num_add[0],num_dat[i]);
  103. }

  104. void scare_display(unsigned char x)//搶答結果顯示
  105. {
  106.   unsigned char i,j;
  107.   i=x/10;
  108.   j=x%10;
  109.   max7219_send(num_add[3],num_dat[j]);
  110.   max7219_send(num_add[2],num_dat[i]);
  111. }

  112. void holderscan()//搶答時間設置,0-60s
  113. {
  114.   time_display(second);
  115.   scare_display(people);
  116.   if(~key_clear)//如果有鍵按下,改變搶答時間
  117.   {
  118.     while(~key_clear);
  119.         if(people)//如果搶答結果沒有清空,搶答器重置
  120.         {
  121.           second=30;
  122.           people=0;
  123.         }
  124.         if(second<60)
  125.         {
  126.           second++;
  127.         }
  128.         else
  129.         {
  130.           second=0;
  131.         }
  132.   }
  133. }

  134. void timer_init()
  135. {
  136.   EA=1;
  137.   ET0=1;
  138.   TMOD=0x01;
  139.   TH0=0xd8;//設定10ms中斷一次
  140.   TL0=0xef;
  141. }

  142. void main()
  143. {
  144.   while(1)
  145.   {
  146.   do{
  147.     holderscan();
  148.   }while(begin);//開始前進行設置,若未按下開始鍵
  149.   while(~begin);//防抖
  150.   max7219_init(); //芯片初始化
  151.   timer_init();          //中斷初始化
  152.   TR0=1;                  //開始中斷
  153.   do{
  154.     time_display(second);
  155.         scare_display(people);
  156.         people=keyscan();
  157.   }while((!people)&&(second));//運行直到搶答結束或者時間結束
  158.   TR0=0;
  159.   }
  160. }

  161. void timer0() interrupt 1
  162. {
  163.   if(counter<100)
  164.   {
  165.     counter++;
  166.         if(counter==50)
  167.         {
  168.           sounder=0;
  169.         }
  170.   }
  171.   else
  172.   {
  173.     sounder=1;
  174.     counter=0;
  175.         second=second-1;
  176.   }
  177.   TH0=0xd8;//重新裝載
  178.   TL0=0xef;
  179.   TR0=1;
  180. }
復制代碼

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

使用道具 舉報

沙發
ID:779164 發表于 2020-6-14 22:18 | 只看該作者
很有用,謝謝
回復

使用道具 舉報

板凳
ID:779647 發表于 2020-6-16 21:44 | 只看該作者
真的不錯謝謝
回復

使用道具 舉報

地板
ID:781699 發表于 2020-6-17 09:41 | 只看該作者

真的不錯謝謝樓主
回復

使用道具 舉報

5#
ID:962259 發表于 2021-8-25 12:26 | 只看該作者
為什么我的數碼管不亮呢,接的共陰極數碼管,換成共陽極后數碼管又全亮了,求大神教教我
回復

使用道具 舉報

6#
ID:399179 發表于 2022-1-7 11:51 來自手機 | 只看該作者
怎么顯示第一第二第三名次?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文在线亚洲 | 精品国产91乱码一区二区三区 | www精品 | 国产精品欧美一区二区 | 综合国产 | 欧美日韩亚洲一区 | 国产女人与拘做受免费视频 | 欧美一区日韩一区 | 国产精品久久久久久238 | 亚洲毛片一区二区 | 中文字幕亚洲欧美 | 国产精品一区二区三区久久 | 中文字幕欧美一区二区 | 久草视 | 欧美福利 | 欧美一区二区大片 | 久久91精品国产 | 看片国产 | 国产区视频在线观看 | 狠狠干网 | 日本福利在线观看 | 色婷婷av一区二区三区软件 | 久久久久久高潮国产精品视 | 日韩精品在线看 | 操皮视频 | 久久久久久网站 | 欧美在线看片 | 午夜激情视频在线 | 伊人中文字幕 | 日本一区二区高清视频 | 国产精品久久久久久久久久久免费看 | 香蕉国产在线视频 | 亚洲二区精品 | 日韩a在线观看 | 91精品国产综合久久久久 | 亚洲欧美日韩国产综合 | 久久夜视频 | 国产japanhdxxxx麻豆 | 国产高清区| 在线成人免费视频 | 国产成人免费视频网站高清观看视频 |