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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 19478|回復: 8
收起左側

四路搶答器電路圖與單片機源程序

[復制鏈接]
ID:63146 發表于 2018-5-27 08:33 | 顯示全部樓層 |閱讀模式
電路原理圖如下:

proutes

proutes


四路搶答器電路設計 設計指標: 基本功能 可同時供 4 名選手參賽,其編號分別是 1 到 4,各用一個搶答按鈕

單片機源碼:
  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.                
  148. }
  149. void Time_Scan(void)                //調整時間鍵掃描
  150. {
  151.         if(K_startcount==0)                //搶答時間調整
  152.         {
  153.                 delay(10);
  154.                 if(K_startcount==0)      
  155.                 {
  156.                         while(!K_startcount);
  157.                         time++;                       
  158.                         if(time==50)
  159.                         {
  160.                                 time=20;
  161.                         }
  162.                         K_startcountflag=1;        //將搶答時間標志位置1
  163.                         K_timecountflag=0;        //同時關閉答題時間標志位
  164.                 }
  165.         }
  166.         if(K_timecount==0)                //答題時間調整
  167.         {
  168.                 delay(10);
  169.                 if(K_timecount==0)
  170.                 {
  171.                         while(!K_timecount);
  172.                         datitime++;
  173.                         if(datitime==60)
  174.                         {
  175.                                 datitime=30;
  176.                         }
  177.                         K_timecountflag=1;
  178.                         K_startcountflag=0;
  179.                 }
  180.         }
  181. }
  182. void main(void)
  183. {
  184.         T0_Init();
  185.         while(1)
  186.         {
  187.                 Key_Scan();                //開始鍵掃描
  188.                 if((flag==0)&(s_flag==1))        //當開始鍵沒按下及沒有人違規時才可進行時間調整
  189.                 {
  190.                         Time_Scan();
  191.                 }
  192.                 if((flag==1)&(s_flag==0))//當開始鍵按下及有人搶答才進行開始回答計時倒計時
  193.                 {
  194.                         if(K_Time==0)
  195.                         {
  196.                                 delay(10);
  197.                                 if(K_Time==0)
  198.                                 {
  199.                                         while(!K_Time);
  200.                                         s=datitime;
  201.                                         TR0=1;
  202.                                         tt=0;
  203.                                         TR1=1;
  204.                                 }
  205.                         }
  206.                 }      
  207.                 if((flag==0)&(s_flag==1))        //違規
  208.                 {
  209.                         Scan();
  210.                         if(num!=0)                //開始鍵沒有按下時,有人按下了搶答器,則置違規標志位
  211.                         {
  212.                                 fall_flag=1;
  213.                                 rled=0;
  214.                         }
  215.                 }
  216.                 if((flag==1)&(s_flag==1))        //如果開始鍵按下且搶答鍵沒有人按下,則進行八路搶答鍵掃描
  217.                 {
  218.                         Scan();
  219.                 }      
  220.                 display();                //顯示到數碼管上
  221.         }
  222. }
  223. void timer0(void) interrupt 1
  224. {
  225.         TH0=(65536-2000)/256;        //2ms
  226.         TL0=(65536-2000)%256;
  227.         if(b_flag)        //開始(START)鍵按下,嘟一聲(長1秒),表示開始搶答
  228.         {
  229.                 beep=~beep;
  230.         }
  231.         else
  232.         beep=1;
  233.         if(s<5)        //搶答時間快到報警,隔1秒響一聲且紅燈閃爍,響三聲
  234.         {
  235.                 if(s%2==0)
  236.                 {
  237.                         b_flag=1;
  238.                         rled=0;      
  239.                 }
  240.                 else
  241.                 {
  242.                         b_flag=0;
  243.                         rled=1;
  244.                 }
  245.         }
  246.         tt++;      
  247.         if(tt==500)                //1秒
  248.         {
  249.                 tt=0;
  250.                 s--;
  251.                 b_flag=0;        //關閉開始鍵按下響一秒的嘟聲
  252.                 if(s==-1)
  253.                 {
  254.                         s=20;      
  255.                         TR0=0;
  256.                         flag=0;        //顯示F FF
  257.                         s_flag=1;
  258.                         num=0;
  259.                         rled=1;
  260.                 }
  261.         }
  262. }
  263. void timer1(void) interrupt 3        //定時器1處理有人按下搶答器嘟一聲(長1秒)
  264. {
  265.         TH1=(65536-2000)/256;
  266.         TL1=(65536-2000)%256;
  267.         beep=~beep;
  268.         t1++;
  269.         if(t1==500)
  270.         {
  271.                 t1=0;
  272.                 TR1=0;
  273.         }
  274. }
復制代碼




回復

使用道具 舉報

ID:433370 發表于 2018-12-1 19:33 | 顯示全部樓層
很好,很有幫助
回復

使用道具 舉報

ID:489600 發表于 2019-3-13 18:50 | 顯示全部樓層
我復制仿真之后數碼管亂碼
回復

使用道具 舉報

ID:492353 發表于 2019-3-17 00:37 | 顯示全部樓層
lilili171 發表于 2019-3-13 18:50
我復制仿真之后數碼管亂碼

請問 亂碼這個問題有解決嗎 同樣的問題
回復

使用道具 舉報

ID:492353 發表于 2019-3-17 00:38 | 顯示全部樓層
請問 晶體管亂碼是 什么原因造成的
回復

使用道具 舉報

ID:542113 發表于 2019-5-19 15:51 來自觸屏版 | 顯示全部樓層
lilili171 發表于 2019-3-13 18:50
我復制仿真之后數碼管亂碼

數碼管是共陰極還是共陽極
回復

使用道具 舉報

ID:782689 發表于 2020-6-21 18:58 | 顯示全部樓層
請問亂碼問題有人解決了嗎
回復

使用道具 舉報

ID:785439 發表于 2020-6-21 22:57 | 顯示全部樓層
亂碼問題有人解決了嗎?
回復

使用道具 舉報

ID:974727 發表于 2021-10-26 10:02 | 顯示全部樓層
我的也是亂碼,害,不知道這么解決
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美一区二区三区四区五区无卡码 | 中文字幕1区2区3区 日韩在线视频免费观看 | 中文无吗 | 亚洲 自拍 另类 欧美 丝袜 | 国产精品久久 | 亚洲免费观看 | 国产成人精品在线 | 在线a视频网站 | 国产精品一区二区av | 亚洲一区二区三区视频免费观看 | 国产伦一区二区三区四区 | 精品国产区 | 午夜视频在线观看网站 | 精品国产欧美一区二区 | 中文字幕一区在线观看视频 | 播放一级黄色片 | japan21xxxxhd美女| 国产精品久久久亚洲 | 日本福利视频免费观看 | 午夜黄色| 夜夜爽99久久国产综合精品女不卡 | 一级无毛片 | 91精品导航 | 久久久久一区二区三区 | 国产视频一区在线 | 一区二区三区四区在线视频 | 免费观看一级特黄欧美大片 | 亚洲成av| 亚洲一区黄色 | 国产高清视频在线播放 | 久久久久久九九九九九九 | 日韩一区二区三区在线观看 | 久久久国产精品一区 | 91精品国产91久久久 | 99精品视频在线 | 天天拍天天射 | 亚洲在线一区二区三区 | 午夜免费福利影院 | 成人免费观看男女羞羞视频 | 国产欧美日韩精品一区二区三区 | 欧州一区|