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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于51單片機的六路搶答器程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:678490 發表于 2020-1-2 12:08 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
                #include<reg51.h>
                #include<intrins.h>
                #define uint unsigned int
                #define uchar unsigned char
                sbit P37=P3^7;
                sbit P07=P0^7;
                sbit P06=P0^6;
                uchar m,a,b,c,i,k,s,r=0;
                uint j,sum,d1=0,d2=0,d3=0,d4=0,d5=0,d6=0;
                uchar code tab1[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};   //倒計時字符表
                uchar code tab[6]={0x06,0x5b,0x4f,0x66,0x6d,0x7d};        //編號字符表
                                                                               //頭文件及參數定義
                main()              //主函數
                 {
//中斷服務程序~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                   EA=1;            //開中斷總開關
                   EX0=1;           //開外部中斷INT0
                   IT0=1;           //選擇下降沿觸發方式
                   TMOD=0x01;       //定時器T0選擇方式一
                   while(1)         //等待中斷
//跑馬程序~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                    {  for(k=0;k<6;k++)
                        {
                          P1=0x40;           //P1口位選
                          for(i=0;i<6;i++)
                           {
                             if(P0==0xff)    //無違規操作
                              {
                                P2=tab[k];  //P2對應輸出字符
                                for(j=0;j<=25000;j++);    //延時
                                P1=_cror_(P1,1);    //左移一位
                                for(j=0;j<=25000;j++);
                              }
                             else          //有違規操作
                              {
                                P1=0x02;    //對應位數碼管被選中
                                P2=0x6d;
                                for(j=0;j<=1000;j++);
                                P1=0x04;
                                P2=0x78;
                                for(j=0;j<=1000;j++);
                                P1=0x08;
                                P2=0x3f;
                                for(j=0;j<=1000;j++);
                                P1=0x10;
                                P2=0x73;
                                for(j=0;j<=1000;j++);
                              }
                             while(r==3)   //3輪答題結束后顯示對應位得分結果
                              {
                                P1=0x01;P2=tab1[d1];for(j=0;j<50;j++);
                                P1=0x02;P2=tab1[d2];for(j=0;j<50;j++);
                                P1=0x04;P2=tab1[d3];for(j=0;j<50;j++);
                                P1=0x08;P2=tab1[d4];for(j=0;j<50;j++);
                                P1=0x10;P2=tab1[d5];for(j=0;j<50;j++);
                                P1=0x20;P2=tab1[d6];for(j=0;j<50;j++);
                              }
                           }
                       }
                   }
               }
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

           int0() interrupt 0       //進入中斷(開始搶答)
             {
              P0=0xff;             //初始化P0口開關無人撥開

              for(m=9;m>=0;m--)
               {
                P1=0xff;
                P2=0x00;
                TR0=1; TMOD=0x01;
                for(s=1;s<=20;)       //定時器定時一秒
                 {
                  if(P0!=0xff)
                 {
                  switch(P0)          //判開關
                   {
                     case 0xfe:{P2=0x06;sum=1;}break;
                     case 0xfd:{P2=0x5b;sum=2;}break;
                     case 0xfb:{P2=0x4f;sum=3;}break;
                     case 0xf7:{P2=0x66;sum=4;}break;
                     case 0xef:{P2=0x6d;sum=5;}break;
                     case 0xdf:{P2=0x7d;sum=6;}break;
                   }
                  if(P0!=0xff) goto ap1;
                }
                  TH0=15536/256;
                  TL0=15536%256;
                  do{}while(!TF0);
                  s++;
                  TF0=0;
                 }
               if(m==0) goto ap2;
              }
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

             ap1:
             P1=~P0;
             b=P2;           //把P2口字符賦值給參數b
             if(P0!=0xff)
              { r++;        //搶答次數
//鳴笛程序 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                for(a=0;a<sum;a++)
                 {
                   for(i=1;i<200;i++)
                    {
                      P37=~P37;         //P37為喇叭開關控制
                      for(j=0;j<=100;j++);
                    }
                   for(i=1;i<200;i++)
                   for(j=0;j<=100;j++);
                 }
//對應位亮閃編號5次 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                for(c=0;c<6;c++)
                 { for(j=0;j<=25000;j++);
                   P1=0x01;
                   for(j=0;j<=25000;j++);
                   P1=0x00;
                 }
                P1=~P0;
//答題倒計時 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                for(m=9;m>=0;m--)
                 {
                   P2=tab1[m];
                   TR0=1; TMOD=0x01;
                   for(s=1;s<=20;  s++)
                    {
                      while(P07==0)          //撥P07答題正確 顯示PASS
                       { P1=0x01;P2=0x73;for(j=0;j<50;j++);
                         P1=0x02;P2=0x77;for(j=0;j<50;j++);
                         P1=0x04;P2=0x6d;for(j=0;j<50;j++);
                         P1=0x08;P2=0x6d;for(j=0;j<50;j++);
                         if(P07==1)          //答題正確對應位加一分
                          { if(sum==1) d1=d1+1;
                            if(sum==2) d2=d2+1;
                            if(sum==3) d3=d3+1;
                            if(sum==4) d4=d4+1;
                            if(sum==5) d5=d5+1;
                            if(sum==6) d6=d6+1;
                            goto ap2;
                          }
                        }
                      while(P06==0)          //撥P06答題錯誤 顯示ff
                       {  P1=0xff;P2=0x71;for(j=0;j<50;j++);
                           if(P06==1) goto ap2;
                       }
                      TH0=15536/256;
                      TL0=15536%256;         //定時器初值
                      do{}while(!TF0);       //查詢等待定時

                      TF0=0;
                   }
                if(P0==0xff) goto ap2;       //開關撥回跳到判復位程序



            }
//判開關復位程序 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          ap2:
           while(P0!=0xff)
            { P1=~P0;                     //位選對應選手數碼管
              P2=b;                       //P2口輸出顯示對應編號
              if(P0==0xff) goto ap2;       //開關復位 返回主程序中斷點
            }
         }}
~~//
這個搶答器有跑馬,鳴笛,判違規,倒計時等功能,
需要的芯片有AT89c51/52,和一個74ls573(可選擇別的代替)
僅供大家參考,也歡迎各位指出程序中的不足,我也好改正。


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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人久久18免费网站麻豆 | 一区观看 | 亚洲国产一区二区在线 | a级片播放 | 欧美日韩国产高清 | 欧美一级黄色片免费观看 | 激情一区二区三区 | 日韩精品一区二区三区中文字幕 | 日韩第1页| 国产91久久久久蜜臀青青天草二 | 涩涩视频网站在线观看 | 91免费在线 | 国产激情一区二区三区 | 天天插天天射天天干 | 99精品欧美一区二区三区综合在线 | 国产精品毛片一区二区在线看 | 欧美一区二区三区四区视频 | 免费一区二区三区 | 一区二区三区四区不卡 | 一区二区三区四区电影 | 91精品久久久久 | 日韩视频专区 | 在线免费观看视频黄 | 日韩精品在线一区 | 毛片毛片毛片毛片 | 99久久久久久99国产精品免 | 亚洲欧美一区二区三区1000 | 伊人一区 | 欧美高清视频一区 | 久久久久久久av | 99精品欧美一区二区三区 | 精品乱码一区二区 | 久久99精品久久久久久国产越南 | 好姑娘影视在线观看高清 | 男女羞羞网站 | 亚洲免费视频网站 | 中文精品视频 | 国产传媒毛片精品视频第一次 | 精品日韩一区二区 | 欧美精品在线一区二区三区 | 视频二区在线观看 |