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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3060|回復: 3
收起左側

八路搶答器單片機源代碼

[復制鏈接]
ID:207644 發表于 2017-6-4 13:16 | 顯示全部樓層 |閱讀模式
  1. /******************************************************************
  2.              按鍵功能簡介
  3.              S15 搶答開始     S14 清零
  4.               S6--S13   分別為1到8號選手按鍵
  5. ********************************************************************
  6. 功能簡介:本例程為一搶答器;其中主持人操控S14與S15兩個按鍵。選手共六位,分別操控S6--S13中的一個按鍵。
  7.           當主持人按下搶答開始按鍵S15后,倒計時開始,計時5s。此后最先按下按鍵的選手號碼將顯示與數碼管上。
  8.           后來按下的將無顯示。
  9.           若五秒計時結束后,再按下按鍵也不會顯示。
  10.           若主持人沒有按開始鍵,就有選手搶答,則視為犯規。此時犯規的選手號碼將被顯示于數碼管上(最多顯示五位犯規選手)
  11.           同時,蜂鳴器發出報警聲,數碼管全亮。
  12.           而當主持人按下清零鍵S14后,一切狀態均恢復,可以開始新一輪的搶答。   
  13. **********************************************************************/                     
  14. #include<reg51.h>
  15. #define uchar unsigned char
  16. sbit dula=P2^6;                       //申明U1鎖存器的鎖存端
  17. sbit wela=P2^7;                        //申明U2鎖存器的鎖存端
  18. sbit beep=P2^3;                          //定義蜂鳴器端口
  19. uchar key,j,k,temp,daojishi=5,wei;
  20. bit begin,end,clear,fangui;
  21. uchar a0,b0=16;c0=16;d0=16;e0=16;g0=16;h0=16;f0=5;
  22. unsigned int pp;
  23. unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
  24.                         0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};

  25. void delay(unsigned char i)                       //延時函數
  26. {
  27.   for(j=i;j>0;j--)
  28.     for(k=125;k>0;k--);
  29. }
  30. void display(uchar a,uchar b,uchar c,uchar d,uchar e,uchar f,uchar g,uchar h)
  31. {                                                                           
  32.    dula=0;                            //關閉U1鎖存端
  33.    P0=table[a];                        //送入位選信號
  34.    dula=1;                                 //打開U1鎖存端
  35.    dula=0;
  36.    
  37.    wela=0;                               //關閉U1鎖存端
  38.    P0=0xfe;                             //送段選選信號
  39.    wela=1;                               //打開U1鎖存端
  40.    wela=0;
  41.    delay(5);                            //延時
  42.    
  43.    P0=table[b];
  44.    dula=1;
  45.    dula=0;
  46.    
  47.    P0=0xfd;
  48.    wela=1;
  49.    wela=0;
  50.    delay(5);

  51.    P0=table[c];
  52.    dula=1;
  53.    dula=0;
  54.    
  55.    P0=0xfb;
  56.    wela=1;
  57.    wela=0;
  58.    delay(5);
  59.    
  60.    P0=table[d];
  61.    dula=1;
  62.    dula=0;
  63.    
  64.    P0=0xf7;
  65.    wela=1;
  66.    wela=0;
  67.    delay(5);
  68.    
  69.    P0=table[e];
  70.    dula=1;
  71.    dula=0;
  72.    
  73.    P0=0xef;
  74.    wela=1;
  75.    wela=0;
  76.    delay(5);
  77.    
  78.    P0=table[f];
  79.    dula=1;
  80.    dula=0;
  81.    
  82.    P0=0xdf;
  83.    wela=1;
  84.    wela=0;
  85.    delay(5);

  86.    P0=table[g];
  87.    dula=1;
  88.    dula=0;
  89.    
  90.    P0=0xbf;
  91.    wela=1;
  92.    wela=0;
  93.    delay(5);

  94.    P0=table[h];
  95.    dula=1;
  96.    dula=0;
  97.    
  98.    P0=0x7f;
  99.    wela=1;
  100.    wela=0;
  101.    delay(5);
  102. }
  103. void keyscan()                              //鍵盤掃描
  104. {
  105.     P3=0xfe;                             //第一排鍵盤掃描
  106.     temp=P3;
  107.     temp=temp&0xf0;
  108.     if(temp!=0xf0)
  109.     {
  110.       delay(10);
  111.       if(temp!=0xf0)
  112.       {
  113.         temp=P3;
  114.         switch(temp)
  115.         {
  116.           case 0xee:
  117.                key=1;                //按鍵1
  118.                wei++;
  119.                break;

  120.           case 0xde:
  121.                key=2;               //按鍵2
  122.                wei++;
  123.                break;

  124.           case 0xbe:
  125.                key=3;                   //按鍵3
  126.                wei++;
  127.                break;

  128.           case 0x7e:
  129.                key=4;                  //按鍵4
  130.                wei++;
  131.                break;
  132.          }
  133.          while(temp!=0xf0)
  134.          {
  135.            temp=P3;
  136.            temp=temp&0xf0;
  137.            beep=0;                         //蜂鳴器響
  138.          }
  139.          beep=1;                             //關閉蜂鳴器
  140.       }
  141.     }
  142.     P3=0xfd;                              //第二排鍵盤掃描
  143.     temp=P3;
  144.     temp=temp&0xf0;
  145.     if(temp!=0xf0)
  146.     {
  147.       delay(10);
  148.       if(temp!=0xf0)
  149.       {
  150.         temp=P3;
  151.         switch(temp)
  152.         {
  153.           case 0xed:
  154.                key=5;                          //按鍵5
  155.                wei++;
  156.                break;

  157.           case 0xdd:
  158.                key=6;                            //按鍵6
  159.                wei++;
  160.                break;

  161.          case 0xbd:
  162.               key=7;                           //按鍵7
  163.                wei++;
  164.                break;

  165.           case 0x7d:
  166.                 key=8;                            //按鍵8
  167.                wei++;
  168.                break;        
  169.          }
  170.          while(temp!=0xf0)
  171.          {
  172.            temp=P3;
  173.            temp=temp&0xf0;
  174.            beep=0;
  175.          }
  176.          beep=1;
  177.       }
  178.       }

  179.     P3=0xfb;                      //第三排鍵盤掃描
  180.     temp=P3;
  181.     temp=temp&0xf0;
  182.     if(temp!=0xf0)
  183.     {
  184.       delay(10);
  185.       if(temp!=0xf0)
  186.       {
  187.         temp=P3;
  188.         switch(temp)
  189.         {
  190.           case 0xeb:
  191.                clear=1;                    //按鍵復位清除
  192.                break;

  193.           case 0xdb:
  194.                  begin=1;                    //按鍵開始
  195.                break;
  196.          }
  197.          while(temp!=0xf0)
  198.          {
  199.            temp=P3;
  200.            temp=temp&0xf0;
  201.            beep=0;
  202.          }
  203.          beep=1;
  204.       }
  205.     }
  206. }

  207. void main()
  208. {
  209.     TMOD=0x01;             //定時器為工作方式1(0000 0001)
  210.    
  211.     TH0=(65536-46080)/256;// 由于晶振為11.0592,故所記次數應為46080,計時器每隔50000微秒發起一次中斷。
  212.     TL0=(65536-46080)%256;//46080的來歷,為50000*11.0592/12
  213.     ET0=1;
  214.     EA=1;
  215.     while(1)
  216.     {
  217.         keyscan();
  218.         if(begin)
  219.         {
  220.             if(!end)
  221.             {
  222.                 TR0=1;
  223.                 if(pp==20)
  224.                 {
  225.                     pp=0;
  226.                     daojishi--;       //倒計時               
  227.                 }

  228.             f0=daojishi;
  229.             if(key!=0)
  230.             a0=key;
  231.             if(!daojishi|a0)
  232.             {
  233.                 end=1;
  234.                 TR0=0;
  235.                 pp=0;
  236.             }
  237.             }        
  238.     }
  239.     else
  240.     {   
  241.             if(key!=0)
  242.         {
  243.             switch(wei)                                   //顯示按鍵位置
  244.             {
  245.                 case 1: a0=key;break;
  246.                 case 2: b0=key;break;
  247.                 case 3: c0=key;break;
  248.                 case 4: d0=key;break;
  249.                 case 5: e0=key;break;
  250.             }        
  251.                 fangui=1;
  252.                 beep=0;             //讓蜂鳴器響
  253.                 beep=~beep;        //讓蜂鳴器狀態取反
  254.         }
  255.     }
  256.     if(clear)                      //按鍵清除
  257.     {
  258.         a0=0;key=0;begin=0;end=0;fangui=0;beep=1;daojishi=5;f0=5;clear=0;
  259.         b0=16;c0=16;d0=16;e0=16;wei=0; P1=0xff;
  260.     }
  261.     display(a0,b0,c0,d0,e0,f0,g0,h0);
  262.     if(fangui)   
  263.     {
  264.         beep=1;
  265.         P1=0x00;    //犯規爆燈
  266.     }        
  267. }
  268. }
  269. void time0() interrupt 1       //定時器中斷設置
  270. {    TH0=(65536-46080)/256;            //重裝初值
  271.     TL0=(65536-46080)%256;
  272.     pp++;
  273. }


復制代碼
回復

使用道具 舉報

ID:89286 發表于 2017-6-4 21:33 | 顯示全部樓層
thanks for sharing
回復

使用道具 舉報

ID:260522 發表于 2017-12-12 10:31 | 顯示全部樓層
請問有仿真圖嗎  
回復

使用道具 舉報

ID:285714 發表于 2018-3-1 19:21 | 顯示全部樓層
問下是用矩陣鍵盤實現的嗎?  燒進去沒反應啊
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产91亚洲精品一区二区三区 | 韩国主播午夜大尺度福利 | 国产探花在线精品一区二区 | 亚洲久久 | 欧美在线a | 国产日韩一区二区 | 色婷婷一区二区三区四区 | 精品欧美一区二区三区久久久 | 国内精品视频在线观看 | 最新日韩在线视频 | 国产一区免费视频 | 孕妇一级毛片 | 亚洲在线| 精品视频免费在线 | 一级毛片在线播放 | 日本视频在线 | 久久99久久 | 亚洲高清视频在线观看 | 欧美阿v| 亚洲第一成年免费网站 | 日本不卡免费新一二三区 | 天天操天天插 | 人人擦人人干 | 欧美日韩不卡 | 在线播放国产视频 | 国产高清视频一区 | 欧美一区二区免费 | 欧美日韩在线不卡 | 精品国产一区二区三区在线观看 | 久久香蕉精品视频 | 天天艹天天干天天 | 暖暖日本在线视频 | 成人在线精品视频 | 天堂一区二区三区 | 伊人伊成久久人综合网站 | 免费大黄视频 | 欧美一级www片免费观看 | 成人免费黄色片 | 中文一级片| 91亚洲国产精品 | 中文字幕精品一区久久久久 |