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

標題: 單片機四位競賽搶答器系統(tǒng)Proteus仿真程序設(shè)計 [打印本頁]

作者: 終焉    時間: 2021-1-5 17:49
標題: 單片機四位競賽搶答器系統(tǒng)Proteus仿真程序設(shè)計
四位競賽搶答器系統(tǒng)設(shè)計
1、設(shè)計一個四位競賽搶答單片機系統(tǒng),可同時供 4 名選手或 4 個代表隊參加比賽,
每隊設(shè)置單獨的搶答按鈕,編號為 1、2、3、4;
2、給節(jié)目主持人設(shè)置一個“搶答開始”控制開關(guān),用來控制搶答開始;
3、給節(jié)目主持人設(shè)置一個“系統(tǒng)清除”控制開關(guān),用來控制系統(tǒng)清零;
4、搶答器具有編號鎖存、搶答計分、時間顯示和聲響提示等功能。
1)主持人按下“搶答開始”后,系統(tǒng)以減計時方式,顯示搶答剩余時間。
2)如果搶答時間計時結(jié)束,卻沒有選手搶答時,本次搶答無效,系統(tǒng)報警提示(顯
示單音,持續(xù) 2 秒);
3)搶答時間內(nèi),若有選手按動對應的搶答按鈕,此對編號立即鎖存,數(shù)碼管上顯
示出隊伍編號和此隊累計分數(shù),同時系統(tǒng)給出音響提示(顯示單音,持續(xù) 2 秒)。
4)在主持人啟動“搶答開始”鍵前,選手提前搶答,搶答無效,系統(tǒng)報警提示(顯
示單音,持續(xù) 2 秒)。
5、搶答成功后,禁止其他選手搶答,優(yōu)先搶答選手的編號一直保持到主持人將系
統(tǒng)清零為止;
6、搶答器具有利用旋鈕調(diào)整搶答時間功能,時間范圍 20 秒~50 秒。
  我們需要硬件操作,仿真圖中的顯示是根據(jù)我們用的試驗箱調(diào)整的,另外我加了正誤判斷。其中還是有一些小的問題要改的。(懶不想改了)
需要其他功能可以自己看著改。

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


單片機源程序如下:
  1. #include<reg52.h>
  2. #include<intrins.h>

  3. #define u8 unsigned char
  4. #define u16 unsigned int
  5. #define LED_xianshi P0   //數(shù)碼管顯示端口
  6. #define LED_wei P2  //位選
  7. #define KEY_COL P3  //P3口計時信號輸ru

  8. sbit start=P1^5;  //P1^5 開始搶答
  9. sbit clear=P1^4;  //清零信號

  10. sbit man1=P1^0;  //4人搶答口
  11. sbit man2=P1^1;
  12. sbit man3=P1^2;
  13. sbit man4=P1^3;

  14. sbit s1=P3^0;//對錯判斷
  15. sbit s2=P3^1;

  16. sbit k1=P2^0;//位選
  17. sbit k2=P2^1;
  18. sbit k3=P2^2;
  19. sbit k4=P2^3;

  20. char dc=0;

  21. int man=0;
  22. int score[4]={0,0,0,0}; //分數(shù)存儲開始為0
  23. int cont=0;
  24. int state=0;  //狀態(tài)

  25. int sec0=20;  //起始值
  26. int sec=20;   //調(diào)節(jié)后的值
  27. char ji=0;
  28. char si=0;
  29. sbit warningLED =P1^7;  //蜂鳴器聲響控制

  30. char biaozhi=0;

  31. //u8 code seg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00,0x40};
  32. u8 code seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x11,0xbf};
  33. unsigned int T0RH,T0RL,T1RH,T1RL;
  34. u8 duan[]={0x5f,0x5f,0x5f,0x40};
  35. u8 ad0;
  36. u8 KEY_up_flag=1;
  37. u8 KEY_use=0;

  38. char code dx516[3] _at_ 0x003b;

  39. u8 flag500ms=0;  //設(shè)置標志位
  40. u8 startflag=0;
  41. u8 warning=0;
  42. unsigned char GetADCValue(unsigned char chn);  //函數(shù)申明調(diào)用
  43. extern void I2CStart();
  44. extern void I2CStop();
  45. extern unsigned char I2CReadNAK();
  46. extern bit I2CWrite(unsigned char dat);
  47. unsigned char KEYscan();  //鍵盤掃描
  48. void reset_init();
  49. void KEYexe(u8 val);
  50. void Duanmove(u8 Movedir);
  51. void shanshuo();

  52. int scanduicuo();



  53. void delay2s()
  54. {
  55.         TMOD=0x11;
  56.         TH1=0x3c;
  57.         TL1=0xb0;
  58.         ET1=1;
  59.         TR1=1;
  60.         EA=1;
  61. }

  62. void delay(u16 t)
  63. {
  64.         while(t--);
  65. }

  66. void chushihua()
  67. {
  68.         TMOD=0x11;
  69.         TH0=0x3c;
  70.         TL0=0xb0;
  71.         EA=1;
  72.         ET0=1;
  73.         TR0=1;
  74. }

  75. void display()
  76. {
  77.                 k4=0;
  78.                 LED_xianshi=duan[0];
  79.                 delay(255);
  80.                 k4=1;
  81.                 LED_xianshi=0x00;
  82.                
  83.                 k3=0;
  84.                 LED_xianshi=duan[1];
  85.                 delay(255);
  86.                 k3=1;
  87.                 LED_xianshi=0x00;
  88.                
  89.                 k2=0;
  90.                 LED_xianshi=duan[2];
  91.                 delay(255);
  92.                 k2=1;
  93.                 LED_xianshi=0x00;
  94.                
  95.                 k1=0;
  96.                 LED_xianshi=duan[3];
  97.                 delay(255);
  98.                 k1=1;
  99.                 LED_xianshi=0x00;
  100. }

  101. void main()
  102. {


  103.        
  104.         chushihua();
  105.        
  106.         warningLED=0;
  107.        
  108.         while(1)
  109.         {
  110.                 k4=0;
  111.                 LED_xianshi=duan[0];
  112.                 delay(255);
  113.                 k4=1;
  114.                 LED_xianshi=0x00;
  115.                
  116.                 k3=0;
  117.                 LED_xianshi=duan[1];
  118.                 delay(255);
  119.                 k3=1;
  120.                 LED_xianshi=0x00;
  121.                
  122.                 k2=0;
  123.                 LED_xianshi=duan[2];
  124.                 delay(255);
  125.                 k2=1;
  126.                 LED_xianshi=0x00;
  127.                
  128.                 k1=0;
  129.                 LED_xianshi=duan[3];
  130.                 delay(255);
  131.                 k1=1;
  132.                 LED_xianshi=0x00;
  133.                
  134.                
  135.                 KEYscan();  //判斷是那個人按下
  136.                 if(state==0)    //在未開始時能進行的操作
  137.                 {
  138.                         ad0=GetADCValue(0);  //在未開始時可以設(shè)置倒計時初值;
  139.                         sec0=ad0*30/255+20;
  140.                        
  141.                         duan[3]=0xbf;
  142.                         duan[2]=0xbf;
  143.                         duan[1]=seg[sec0/10];
  144.                         duan[0]=seg[sec0%10];       
  145.                        
  146.                         delay(255);
  147.                        
  148.                         if(man!=0)
  149.                         {
  150.                                 man=0;
  151.                                 warning=1;
  152.                         }
  153.                        
  154.                         if(start==0)
  155.                         {
  156.                                 reset_init();//按下開始后倒計時 state標志位置1
  157.                                 state=1;
  158.                         }
  159.                 }
  160.                
  161.                 if(state==1)  //處于開始的狀態(tài)時
  162.                 {
  163.        
  164.                         if(man!=0)
  165.                         {
  166.                                 dc=0;
  167.                                 while(!dc)
  168.                                 {
  169.                                         scanduicuo();
  170.                                        
  171.                                         k4=0;
  172.                                         LED_xianshi=seg[man];
  173.                                         delay(255);
  174.                                         k4=1;
  175.                                         LED_xianshi=0x00;
  176.                                        
  177.                                         k3=0;
  178.                                         LED_xianshi=0xbf;
  179.                                         delay(255);
  180.                                         k3=1;
  181.                                         LED_xianshi=0x00;
  182.                                        
  183.                                         k2=0;
  184.                                         LED_xianshi=0xbf;
  185.                                         delay(255);
  186.                                         k2=1;
  187.                                         LED_xianshi=0x00;
  188.                                        
  189.                                         k1=0;
  190.                                         LED_xianshi=0xbf;
  191.                                         delay(255);
  192.                                         k1=1;
  193.                                         LED_xianshi=0x00;
  194.                                        
  195.                                         if(clear==0)
  196.                                         {
  197.                                                 state=2;
  198.                                                 break;
  199.                                         }
  200.                                 }
  201.                                 score[man-1]=score[man-1]+cont; //搶到后判斷對錯。對了加一分,錯了不加分
  202.                                 duan[3]=seg[man];
  203.                                 duan[2]=seg[17];
  204.                                 duan[1]=seg[score[man-1]/10%10];
  205.                                 duan[0]=seg[score[man-1]%10];
  206.                                
  207.                                 display();
  208.                                
  209.                                 state=2;
  210.                                 warning=1;
  211.                         }
  212.                         else
  213.                         {
  214.                                 if(flag500ms)
  215.                                 {
  216.                                         flag500ms=0;
  217.                                         sec--;
  218.                                         duan[3]=0xff;
  219.                                         duan[2]=0xff;
  220.                                         duan[1]=seg[sec/10%10];
  221.                                         duan[0]=seg[sec%10];
  222.                                         if(sec==0)
  223.                                         {
  224.                                                 warning=1;
  225.                                                 state=2;
  226.                                         }
  227.                                 }
  228.                         }
  229.                 }
  230.                 else if(state==2)
  231.                 {
  232.                         if(start==1)
  233.                         {
  234.                                 man=0x0000;
  235.                                 delay(255);
  236.                                 state=0;
  237.                         }
  238.                 }
  239.                 if(clear==0)
  240.                 {
  241.                         state=0;
  242.                         score[3]=0;
  243.                         score[2]=0;
  244.                         score[1]=0;
  245.                         score[0]=0;
  246.                         duan[3] = seg[17];
  247.                         duan[2] = seg[17];
  248.                         duan[1] = seg[17];
  249.                         duan[0] = seg[17];
  250.                        
  251.                         display();
  252.                        
  253.                         warningLED=0;
  254.                         delay(1000);
  255.                         while(!clear)  //直到清零狀態(tài)結(jié)束
  256.                         {
  257.                                 display();
  258.                         }
  259.                 }
  260.                 if(warning)
  261.                 {
  262.                         warning=0x0000;
  263.                         shanshuo();
  264.                 }
  265.         }
  266. }

  267. unsigned char GetADCValue(unsigned char chn)
  268. {
  269.         unsigned char val;

  270.         I2CStart();
  271.         if(!I2CWrite(0x48<<1))
  272.         {
  273.                 I2CStop();
  274.                 return 0;
  275.         }
  276.         I2CWrite(0x40 | chn);
  277.         I2CStart();
  278.         I2CWrite(0x48<<1 | 0x01);

  279.         val = I2CReadNAK();
  280.         I2CStop();

  281.         return val;
  282. }

  283. unsigned char KEYscan()
  284. {
  285.         if(man1==0)
  286.         {
  287.                 delay(1000);
  288.                 if(man1==0)
  289.                 {
  290.                         man=1;
  291.                 }
  292.         }
  293.         if(man2==0)
  294.         {
  295.                 delay(1000);
  296.                 if(man2==0)
  297.                 {
  298.                         man=2;
  299.                 }
  300.         }
  301.         if(man3==0)
  302.         {
  303.                 delay(1000);
  304.                 if(man3==0)
  305.                 {
  306.                         man=3;
  307.                 }
  308.         }
  309.         if(man4==0)
  310.         {
  311.                 delay(1000);
  312.                 if(man4==0)
  313.                 {
  314.                         man=4;
  315.                 }
  316.         }  //掃描誰按下的
  317.         if(start==1)
  318.         {
  319.                 state=0;
  320.         }
  321.         if(start==0)
  322.         {
  323.                 state==1;
  324.         }
  325.         if(clear==0)
  326.         {
  327.                 state==2;
  328.         }
  329. }

  330. void reset_init()
  331. {
  332.         sec=sec0;
  333.         duan[3] = 0;
  334.         duan[2] = 0;
  335.         duan[1] = seg[sec/10%10];
  336.         duan[0] = seg[sec%10];
  337.        
  338.         man=0;
  339.         flag500ms=0;
  340.         TH0=0x3c;
  341.         TL0=0xb0;
  342. }

  343. void shanshuo()
  344. {

  345.         warningLED=1;
  346.         delay2s();
  347.         while(warningLED)
  348.         {
  349.                 display();
  350.         }
  351.         if(warningLED==0 || si==0)
  352.         {
  353.                 TR1=0;
  354.                 ET1=0;
  355.         }
  356. }
  357. //定時
  358. void time() interrupt 1
  359. {       
  360.         TH0=0x3c;
  361. ……………………

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

所有資料51hei提供下載:
設(shè)計1.1.zip (165.13 KB, 下載次數(shù): 75)


作者: Chen1108    時間: 2021-5-15 18:49
我想知道這個break是怎么使用的

作者: qinsiwei    時間: 2021-12-25 14:07
Chen1108 發(fā)表于 2021-5-15 18:49
我想知道這個break是怎么使用的

這個程序那里有break





歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1