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

標題: 四路競賽搶答器論文+Proteus仿真+單片機程序 [打印本頁]

作者: 時刻清醒    時間: 2017-5-30 15:31
標題: 四路競賽搶答器論文+Proteus仿真+單片機程序
這是我做了兩個星期的畢業設計,四路競賽搶答器,
附件里面包含了仿真圖可直接下載打開
還有程序哦,請各位大神進行指教吧

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載):


搶答器的設計論文:


單片機源程序如下:
  1. #include<reg51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. char s;
  5. uchar num=0;
  6. char time=20;        //搶答時間
  7. char datitime=30;        //答題限時時間
  8. uint tt,t1;        //T0,T1定時器定一秒時
  9. bit flag,s_flag=1,b_flag,fall_flag;        //標志位
  10. bit K_startcountflag,K_timecountflag;        //時間調整標志位
  11. sbit K0=P3^0;
  12. sbit beep=P3^7;         //蜂鳴器輸出口
  13. sbit rled=P3^1;                //指示燈輸出口
  14. sbit K1=P1^0;               
  15. sbit K2=P1^1;
  16. sbit K3=P1^2;
  17. sbit K4=P1^3;
  18. sbit K_Time=P3^2;        //答題計時鍵
  19. sbit K_startcount=P3^3;        //開始搶答時間調整鍵
  20. sbit K_timecount=P3^4;        //答題計時時間調整鍵
  21. void delay(uchar ms)
  22. {
  23.         uchar y;
  24.         for(;ms>0;ms--)
  25.                 for(y=120;y>0;y--);
  26. }
  27. uchar code tabledu[]={0x3f,0x06,0x5b,0x4f,
  28. 0x66,0x6d,0x7d,0x07,
  29. 0x7f,0x6f,0x77,0x7c,
  30. 0x39,0x5e,0x79,0x71
  31. };
  32. uchar code tablewe[]={0XFE,0XFD,0XFB,0XF7};
  33. void T0_Init(void)
  34. {
  35.         TMOD=0X01;
  36.         TH0=(65536-2000)/256;
  37.         TL0=(65536-2000)%256;
  38.         TH1=(65536-2000)/256;
  39.         TL1=(65536-2000)%256;
  40.         ET0=1;
  41.         ET1=1;
  42.         EA=1;
  43.         P0=0;
  44. }
  45. void Key_Scan(void)                //開始鍵掃描
  46. {
  47.         if(K0==0)
  48.         {
  49.                 delay(10);
  50.                 if(K0==0)
  51.                 {
  52.                         while(!K0);
  53.                         TR0=1;
  54.                         s=time;
  55.                         tt=0;
  56.                         flag=1;
  57.                         s_flag=1;
  58.                         b_flag=1;
  59.                         num=0;
  60.                         beep=1;
  61.                         rled=1;
  62.                         fall_flag=0;        //清除違規標志位
  63.                         K_startcountflag=0;
  64.                         K_timecountflag=0;
  65.                 }
  66.         }
  67. }
  68. void Scan(void)                //四路熱鍵掃描(哪個鍵先按下,哪個優先級最高)
  69. {
  70.         if(K1==0)
  71.         {
  72.                 delay(10);
  73.                 if(K1==0)
  74.                 {
  75.                         while(!K1);
  76.                         num=1;                //數碼管顯示1號"1"
  77.                         TR0=0;                //關閉定時器0,時間停止
  78.                         TR1=1;                //打開定時器1,使揚聲器響一聲
  79.                         s_flag=0;        //關閉開始鍵標志位,使再按其他三個鍵不會響應
  80.                 }
  81.         }
  82.         if(K2==0)                        //下面三個鍵的處理同上
  83.         {
  84.                 delay(10);
  85.                 if(K2==0)
  86.                 {
  87.                         while(!K2);
  88.                         num=2;               
  89.                         TR0=0;
  90.                         TR1=1;
  91.                         s_flag=0;        //重要
  92.                 }
  93.         }
  94.         if(K3==0)
  95.         {
  96.                 delay(10);
  97.                 if(K3==0)
  98.                 {
  99.                         while(!K3);
  100.                         num=3;
  101.                         TR0=0;
  102.                         TR1=1;
  103.                         s_flag=0;
  104.                 }
  105.         }
  106.         if(K4==0)
  107.         {
  108.                 delay(10);
  109.                 if(K4==0)
  110.                 {
  111.                         while(!K4);
  112.                         num=4;
  113.                         TR0=0;
  114.                         TR1=1;
  115.                         s_flag=0;
  116.                 }
  117.         }
  118. }
  119. void display(void)
  120. {
  121.         if(flag==1)                //開始鍵按下,開始計時搶答
  122.         {
  123.                 if(num!=0)        //如果有人搶答,則顯示相應的幾號
  124.                 {
  125.                         P0=tabledu[num];        //顯示幾號搶到了
  126.                         P2=tablewe[0];
  127.                         delay(2);
  128.                         P0=0;
  129.                         P2=0XFF;
  130.                 }
  131.                 else                //否則沒人搶答,則前面不顯示幾號
  132.                 {
  133.                         P0=0;               
  134.                         P2=0XFF;
  135.                 }
  136.                 P0=tabledu[s/10];                //下面為顯示搶答倒計時
  137.                 P2=tablewe[2];
  138.                 delay(2);
  139.                 P0=0;
  140.                 P2=0XFF;
  141.                 P0=tabledu[s%10];
  142.                 P2=tablewe[3];
  143.                 delay(2);
  144.                 P2=0XFF;
  145.                 P0=0;
  146.         }
  147.         else        //如果開始鍵沒有按下,則顯示F FF(若有違規者,則顯示違規號碼及 FF)或時間調整
  148.         {
  149.                 if(fall_flag==1)        //違規顯示
  150.                 {
  151.                         if(num!=0)
  152.                         {
  153.                                 P0=tabledu[num];        //顯示幾號違規了
  154.                                 P2=tablewe[0];
  155.                                 delay(2);
  156.                                 P0=0;
  157.                                 P2=0XFF;
  158.                                 P0=tabledu[15];                //下面顯示 FF,表示違規了
  159.                                 P2=tablewe[2];
  160.                                 delay(2);
  161.                                 P0=0;                //消隱
  162.                                 P2=0XFF;
  163.                                 P0=tabledu[15];
  164.                                 P2=tablewe[3];
  165.                                 delay(2);
  166.                                 P0=0;
  167.                                 P2=0XFF;
  168.                         }
  169.                         else               
  170.                         {
  171.                                 P0=0;               
  172.                                 P2=0XFF;
  173.                         }
  174.                 }
  175.                 else        //沒有人違規才顯示調整時間
  176.                 {
  177.                         if(K_startcountflag==1)
  178.                         {
  179.                                 P0=0X6D;                //第一位數碼管顯示"5(S)"(表示搶答時間調整)
  180.                                 P2=tablewe[0];
  181.                                 delay(2);
  182.                                 P0=0;
  183.                                 P2=0XFF;
  184.                                 P0=tabledu[time/10];        //下面顯示調整的搶答時間
  185.                                 P2=tablewe[2];
  186.                                 delay(2);
  187.                                 P0=0;
  188.                                 P2=0XFF;
  189.                                 P0=tabledu[time%10];
  190.                                 P2=tablewe[3];
  191.                                 delay(2);
  192.                                 P0=0;
  193.                                 P2=0XFF;
  194.                         }
  195.                         else if(K_timecountflag==1)
  196.                         {
  197.                                 P0=0X07;        //第一位與第二位數碼管合起來顯示"T",表示答題時間調整
  198.                                 P2=tablewe[0];
  199.                                 delay(2);
  200.                                 P0=0;
  201.                                 P2=0XFF;
  202.                                 P0=0X31;
  203.                                 P2=tablewe[1];
  204.                                 delay(2);
  205.                                 P0=0;
  206.                                 P2=0XFF;
  207.                                 P0=tabledu[datitime/10];
  208.                                 P2=tablewe[2];
  209.                                 delay(2);
  210.                                 P0=0;
  211.                                 P2=0XFF;
  212.                                 P0=tabledu[datitime%10];
  213.                                 P2=tablewe[3];
  214.                                 delay(2);
  215.                                 P0=0;
  216.                                 P2=0XFF;
  217.                         }
  218.                         else                //否則顯示F FF
  219.                         {
  220.                                 P0=tabledu[15];
  221.                                 P2=tablewe[0];
  222.                                 delay(2);
  223.                                 P0=0;
  224.                                 P0=tabledu[15];
  225.                                 P2=tablewe[2];
  226.                                 delay(2);
  227.                                 P0=0;                //消隱
  228.                                 P2=0XFF;
  229.                                 P0=tabledu[15];
  230.                                 P2=tablewe[3];
  231.                                 delay(2);
  232.                                 P0=0;
  233.                                 P2=0XFF;
  234.                         }        
  235.                 }        
  236.         }
  237. }
  238. void Time_Scan(void)                //調整時間鍵掃描
  239. {
  240.         if(K_startcount==0)                //搶答時間調整
  241.         {
  242.                 delay(10);
  243.                 if(K_startcount==0)        
  244.                 {
  245.                         while(!K_startcount);
  246.                         time++;                        
  247.                         if(time==50)
  248.                         {
  249.                                 time=20;
  250.                         }
  251.                         K_startcountflag=1;        //將搶答時間標志位置1
  252.                         K_timecountflag=0;        //同時關閉答題時間標志位
  253.                 }
  254.         }
  255.         if(K_timecount==0)                //答題時間調整
  256.         {
  257.                 delay(10);
  258.                 if(K_timecount==0)
  259.                 {
  260.                         while(!K_timecount);
  261.                         datitime++;
  262.                         if(datitime==60)
  263.                         {
  264.                                 datitime=30;
  265.                         }
  266.                         K_timecountflag=1;
  267.                         K_startcountflag=0;
  268.                 }
  269.         }
  270. }
  271. void main(void)
  272. {
  273.         T0_Init();
  274.         while(1)
  275.         {
  276.                 Key_Scan();                //開始鍵掃描
  277.                 if((flag==0)&(s_flag==1))        //當開始鍵沒按下及沒有人違規時才可進行時間調整
  278.                 {
  279.                         Time_Scan();
  280.                 }
  281.                 if((flag==1)&(s_flag==0))//當開始鍵按下及有人搶答才進行開始回答計時倒計時
  282.                 {
  283.                         if(K_Time==0)
  284.                         {
  285.                                 delay(10);
  286.                                 if(K_Time==0)
  287.                                 {
  288.                                         while(!K_Time);
  289.                                         s=datitime;
  290.                                         TR0=1;
  291.                                         tt=0;
  292.                                         TR1=1;
  293.                                 }
  294.                         }
  295.                 }        
  296.                 if((flag==0)&(s_flag==1))        //違規
  297.                 {
  298.                         Scan();
  299.                         if(num!=0)                //開始鍵沒有按下時,有人按下了搶答器,則置違規標志位
  300.                         {
  301.                                 fall_flag=1;
  302.                                 rled=0;
  303.                         }
  304.                 }
  305.                 if((flag==1)&(s_flag==1))        //如果開始鍵按下且搶答鍵沒有人按下,則進行八路搶答鍵掃描
  306.                 {
  307.                         Scan();
  308.                 }        
  309.                 display();                //顯示到數碼管上
  310.         }
  311. }
  312. void timer0(void) interrupt 1
  313. {
  314.         TH0=(65536-2000)/256;        //2ms
  315.         TL0=(65536-2000)%256;
  316.         if(b_flag)        //開始(START)鍵按下,嘟一聲(長1秒),表示開始搶答
  317.         {
  318.                 beep=~beep;
  319.         }
  320.         else
  321.         beep=1;
  322.         if(s<5)        //搶答時間快到報警,隔1秒響一聲且紅燈閃爍,響三聲
  323.         {
  324.                 if(s%2==0)
  325.                 {
  326.                         b_flag=1;
  327. ……………………

  328. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
四路競賽搶答器編程程序.zip (168.37 KB, 下載次數: 295)




作者: jie951    時間: 2017-6-3 19:00
棒,真好!!!!
作者: faridzled    時間: 2017-6-4 04:56
thanks for sharing
作者: 15091657234    時間: 2017-6-7 15:53
很好…感謝分享
作者: 老B123    時間: 2017-12-3 18:31
非常感謝 分享
作者: 我一笑而過    時間: 2018-11-5 09:21
要花多少幣才能下載完???
作者: 569443505    時間: 2020-12-28 14:30
10,12,13,14這幾個引腳得開關是干嘛得?
作者: Chen1108    時間: 2021-5-11 20:09
求大佬指教一下怎么把時間改成計分數

作者: zouwu    時間: 2022-5-10 09:47
怎么把里面的串口改成at89c52的型號啊 有大佬知道嗎
作者: 852852    時間: 2024-5-17 12:57
膜拜大佬!!!




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 欧美一区2区三区4区公司二百 | 成人免费网站www网站高清 | 精品蜜桃一区二区三区 | 91精品在线播放 | 欧美日韩在线免费观看 | 看a网站 | 欧美最猛黑人xxxx黑人 | 国产一区二区三区免费观看在线 | 午夜影院污 | 国产一区二区精品自拍 | 亚洲成人激情在线观看 | 免费在线播放黄色 | 欧美中文字幕一区 | 成人国产精品视频 | 中文字幕一区二区三区四区 | 欧美精品1区2区 | 自拍亚洲| 人人九九精| 久久久国产一区二区三区 | 在线欧美亚洲 | 国产免费一区二区 | 国产精品久久欧美久久一区 | 午夜影视免费片在线观看 | 中文字幕在线中文 | 亚洲色综合| 日韩一区不卡 | 国产精品福利在线观看 | 成人h动漫精品一区二区器材 | 一级黄色日本片 | 欧洲一级毛片 | 精品一区二区三区四区在线 | 91精品国产乱码麻豆白嫩 | 欧美成人黄色小说 | 国产美女视频一区 | 手机在线观看 | 国产高清精品一区 | 久久精品男人的天堂 | 国产区一区二区三区 | 丝袜久久 | 91嫩草精品 | 在线看无码的免费网站 |