欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2355|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

單片機數(shù)字電子搶答器程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:573960 發(fā)表于 2019-6-28 10:50 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
用八路搶答器實現(xiàn) 1、4、6按下后,裁判鍵按下不能復(fù)位。 1、4、6的復(fù)位需要關(guān)斷電源開關(guān)后約20秒 少于20秒重新開電源時,仍顯示146 2、3、5、8、0正常 7無法自鎖。

單片機源程序如下:
  1. #include <reg51.h>                          
  2. #define LED P2  //宏定義,使用LED代替P3口(相當(dāng)于LED=P3)
  3. #define uchar unsigned char        //用uchar代替unsigned char方便操作
  4. #define uint unsigned int
  5. sbit beep=P2^7;//蜂鳴器
  6. sbit BG=P3^7;//指示燈

  7. sbit key4=P1^0;//按鍵D
  8. sbit key2=P1^1;//按鍵B
  9. sbit key1=P1^2;//按鍵A
  10. sbit key3=P1^3;//按鍵C

  11. bit time_over=0;//倒計時結(jié)束標(biāo)記                                                                  
  12. bit WARNING=0;//倒數(shù)十秒控制變量
  13. bit INT_ON=0;//中斷標(biāo)記
  14. bit key_down=0;//鍵盤輔助變量
  15. uchar RIGHT=0xff;//按鍵暫存器          

  16. uchar CONT=0;         //定時器輔助變量
  17. uchar res_time=0;//時間
  18. uchar set_time=30;

  19. uchar leds[17]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,
  20.                                 0x90,0x88,0x83,0xa7,0xa1,0x86,0x8e,0xff};

  21. /*------------------time ms延時函數(shù)-----------------*/
  22. void delay_ms(uint time)
  23. {
  24.         uchar tres;
  25.         for(;time>0;time--)
  26.         {
  27.                 tres=150;
  28.                 while(tres--);
  29.         }
  30. }         
  31. //外部中斷1初始化程序
  32. void Init_Sys() //中斷初始化函數(shù)
  33. {
  34.         TCON=0x00;        //外部中斷1低電平觸發(fā)
  35.         TMOD=0X01;   //定時器0方式1                          
  36.         IE=0x86;        //開啟外部中斷1,定時器中斷0,及總中斷        10000110B
  37.         IP=0X04;        //外部中斷優(yōu)先級高于定時器
  38.         CONT=0;                //時間清零
  39.         res_time=0;  
  40. }   
  41. //外部中斷1處理程序
  42. void  exint1_int() interrupt 2 using 0
  43. {         
  44.         uchar t=200;                                                                   
  45.         EA=0;//關(guān)中斷
  46.         TR0=0;//關(guān)定時器
  47.         WARNING=0;//關(guān)警告
  48.         while(t--)beep=0;//軟件延時,消除抖動
  49.         RIGHT=P0; //獲得按鍵值   
  50.         INT_ON=1; //標(biāo)記中斷                  
  51. }
  52. //定時器0中斷處理程序
  53. void count_int() interrupt 1 using 1
  54. {       
  55.         TH0=0X4C;//重新裝載
  56.         TL0=0X00;  
  57.         CONT++;
  58.         if(CONT==20)
  59.         {
  60.                 CONT=0;
  61.                 if(res_time==0)time_over=1;
  62.                 res_time--;            
  63.         }
  64. }            
  65. //遙控按鍵掃描程序
  66. uchar key_scan(void)
  67. {                                  
  68.         P1=0xff;
  69.         if(key1==1||key2==1||key3==1||key4==1)
  70.         {
  71.                 if(!key_down)
  72.                 {         
  73.                         delay_ms(10);                //延時
  74.                         key_down=1;                        //限制
  75.                         if(key1==1)return 1;//按鍵A
  76.                         if(key2==1)return 2;//按鍵B
  77.                         if(key3==1)return 3;//按鍵C
  78.                         if(key4==1)return 4;//按鍵D
  79.                 }
  80.                 else return 0;                                 
  81.         }
  82.         else if(key_down)key_down=0;//消除限制  
  83.         return 0; //未獲得任何按鍵       
  84. }          
  85. uchar juder(void)
  86. {                          
  87.         switch(RIGHT)
  88.         {
  89.                 case 0xff:return 0;
  90.                 case 0xfe:return 1;
  91.                 case 0xfd:return 2;
  92.                 case 0xfb:return 3;
  93.                 case 0xf7:return 4;         
  94.                 case 0xef:return 5;
  95.                 case 0xdf:return 6;
  96.                 case 0xbf:return 7;
  97.                 case 0x7f:return 8;
  98.                 default:return 14;//E,錯誤       
  99.         }
  100. }
  101. //顯示答案
  102. void show_answer(void)
  103. {
  104.         uchar ti=0;
  105.         uchar key=0;
  106.         while(1)
  107.         {
  108.                 key=key_scan();
  109.                 if(ti==100){BG=!BG;ti=0;}
  110.                 if(key!=0)
  111.                 {
  112.                         LED=leds[key+9];//顯示答案
  113.                         BG=1;//滅燈
  114.                         break;
  115.                 }
  116.                 ti++;
  117.                 delay_ms(1);
  118.         }
  119. }
  120. void BELL(uchar times)
  121. {
  122.         while(times--)
  123.         {
  124.                 beep=0;
  125.                 delay_ms(100);
  126.                 beep=1;
  127.                 delay_ms(100);
  128.         }
  129. }
  130. //清除顯示
  131. void clear(void)
  132. {
  133.         EA=0;          //關(guān)掉計時器
  134.         beep=0;          //開蜂鳴器
  135.         WARNING=0;        //清警告標(biāo)記
  136.         time_over=0;//清溢出標(biāo)記   
  137.         TR0=0;          //關(guān)定時器         
  138.         INT_ON=0;//清除中斷標(biāo)記
  139.         TL0=0X00;//初始值設(shè)置
  140.         TH0=0X4C;
  141.         CONT=0;
  142.         res_time=set_time;//賦初始值
  143.         delay_ms(100);
  144.         LED=leds[16];//清屏,同時關(guān)蜂鳴器  
  145.         BG=1;//關(guān)燈
  146. }
  147. void debug(void)//處理犯規(guī)隊,顯示犯規(guī)隊隊號
  148. {                          
  149.         RIGHT=P0;//獲得犯規(guī)隊的地址
  150.         LED=leds[juder()];//顯示隊號
  151.         BELL(4);         
  152. }
  153. //開啟搶答器
  154. //1普通模式
  155. //0倒計時模式
  156. void start(uchar type)
  157. {
  158.         bit alarm=1;//提示音                            
  159.         uchar key=0;          
  160.         res_time=set_time;//獲取初始值
  161.         while(1)
  162.         {       
  163.                 key=key_scan();//掃描鍵盤
  164.                 if(key!=0)
  165.                 {             
  166.                         switch(key)
  167.                         {
  168.                                 case 1://顯示答案
  169.                                 {
  170.                                         clear();//清除
  171.                                         show_answer();
  172.                                         break;
  173.                                 }
  174.                                 case 2://開始搶答
  175.                                 {                                                          
  176.                                         if(P0!=0XFF)
  177.                                         {
  178.                                                 debug();//處理犯規(guī)
  179.                                                 break;
  180.                                         }           
  181.                                         if(!type)TR0=1;        //倒計時方式  
  182.                                         else                         //普通方式
  183.                                         {
  184.                                                 clear();
  185.                                                 BG=0;//開燈指示
  186.                                         }
  187.                                         EA=1;//使能中斷          
  188.                                         break;
  189.                                 }
  190.                                 case 3:clear();break;//清除
  191.                                 case 4:return;//返回
  192.                         }                         
  193.                 }
  194.                 if(TR0==1)//倒計時
  195.                 {                                      
  196.                         if(CONT==0&&BG)
  197.                         {                  
  198.                                 if(res_time>=10)LED=leds[res_time/10];                                                  
  199.                                 BG=0;//每秒鐘閃爍一次
  200.                                 if(WARNING)alarm=0;//最后十秒          
  201.                         }
  202.                         if(CONT==10&&!BG)
  203.                         {                         
  204.                                 BG=1;                                                 
  205.                                 if(WARNING)alarm=1;//最后十秒
  206.                                 else LED=leds[res_time%10];//顯示個位數(shù)據(jù);
  207.                         }                                                                    
  208.                         if(res_time<10)//最后十秒標(biāo)記
  209.                         {
  210.                                 WARNING=1;
  211.                                 LED=leds[res_time];
  212.                         }  
  213.                         beep=alarm;
  214.                         delay_ms(5);      
  215.                 }
  216.                 if(time_over) //倒計時結(jié)束處理
  217.                 {
  218.                         clear();
  219.                         LED=leds[0];
  220.                         time_over=0;
  221.                         BELL(3);
  222.                 }  
  223.                 if(INT_ON)//有選手按下
  224.                 {
  225.                         TR0=0;//關(guān)定時器  
  226.                         beep=0;//開提示音
  227.                         BG=1;//關(guān)燈
  228.                         delay_ms(100);
  229.                         INT_ON=0;
  230.                         LED=leds[juder()];//顯示選手號
  231.                 }                                    
  232.         }
  233. }                                                    
  234. void main()
  235. {          
  236.         bit set=0;//設(shè)置狀態(tài)標(biāo)記
  237.         bit model=1; //模式標(biāo)記
  238.         uchar key;
  239.         Init_Sys();//初始化外部中斷        1 捕獲按鍵輸入
  240.         P0=0XFF;
  241.         TR0=1;//開啟定時器0                          
  242.         while(1)//死循環(huán)
  243.         {          
  244.                 key=key_scan();
  245.                 if(key!=0)
  246.                 {  
  247.                         if(!model)switch(key)
  248.                         {
  249.                                 case 1:
  250.                                 {                          
  251.                                         set=1;
  252.                                         set_time+=10;
  253.                                         if(set_time>90)set_time=10;
  254.                                         break;
  255.                                 }
  256.                                 case 3:
  257.                                 {
  258.                                         set=1;
  259.                                         if(set_time>10)set_time-=10;//范圍限制
  260.                                         else set_time=90;
  261.                                         break;
  262.                                 }   
  263.                         }
  264.                         if(key==2)
  265.                         {
  266.                                 start(model);//開始搶答
  267.                                 set=0;//非設(shè)置狀態(tài)
  268.                         }
  269.                         if(key==4)
  270.                         {
  271.                                 model=!model;//模式切換
  272.                                 set=0;                 //非設(shè)置狀態(tài)
  273.                         }
  274.                 }
  275.                 if(model)LED=leds[14];
  276.                 else
  277.                 {
  278.                         if(set)LED=leds[set_time/10];//顯示設(shè)置時間
  279.                         else LED=leds[15];
  280.                 }                                                                     
  281.         }
  282. }
復(fù)制代碼

所有資料51hei提供下載:
搶答器.rar (1.01 MB, 下載次數(shù): 7)


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

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表