標(biāo)題: 單片機(jī)為核心的8位競(jìng)賽搶答器仿真和源程序 倒計(jì)時(shí)剩余時(shí)間還未完成 [打印本頁(yè)]

作者: 781151973    時(shí)間: 2018-7-1 16:49
標(biāo)題: 單片機(jī)為核心的8位競(jìng)賽搶答器仿真和源程序 倒計(jì)時(shí)剩余時(shí)間還未完成
1) 搶答器同時(shí)供8名選手或8個(gè)代表隊(duì)比賽,分別用8個(gè)按鈕s1-s8表示;
2) 設(shè)置一個(gè)系統(tǒng)清除和搶答控制開關(guān)Key1Key2。
3) 搶答器具有鎖存與顯示功能。即選手按下按鈕,鎖存相應(yīng)編號(hào),顯示該選手編號(hào)至數(shù)碼管,并且該編號(hào)保存至主持人按下清除鍵Key1清除為止。
4) 搶答器具有定時(shí)搶答功能,一次搶答設(shè)定的時(shí)間為30秒。主持人按下?lián)尨鹂刂崎_關(guān)Key2,搶答才能開始,啟動(dòng)定時(shí)器,并將倒數(shù)計(jì)時(shí)時(shí)間用數(shù)碼管顯示。若定時(shí)時(shí)間到,無(wú)人搶答,則該輪搶答結(jié)束,系統(tǒng)通過蜂鳴器報(bào)警,選手禁止搶答。
5) 選手在設(shè)定的時(shí)間內(nèi)進(jìn)行搶答,搶答有效,定時(shí)器停止工作,蜂鳴器報(bào)警,數(shù)碼管顯示選手編號(hào)及倒計(jì)時(shí)剩余時(shí)間,并保持到主持人將系統(tǒng)清除為止。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機(jī)源程序如下:
  1. #include <reg52.h>

  2. //共陰極數(shù)碼管編碼表 0 - f顯示
  3. unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,
  4. 0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,
  5. 0x39,0x5e,0x79,0x71};

  6. //變量定義
  7. sbit start_stop = P3^6;
  8. sbit reset = P3^7;
  9. sbit LE =P3^0;
  10. sbit key1 = P1^0;
  11. sbit key2 = P1^1;
  12. sbit key3 = P1^2;
  13. sbit key4 = P1^3;
  14. sbit key5 = P1^4;
  15. sbit key6 = P1^5;
  16. sbit key7 = P1^6;
  17. sbit key8 = P1^7;
  18. sbit state = P3^4;
  19. sbit start=P3^1;

  20. bit start_stop_flag = 0;
  21. bit key1_flag = 0;
  22. bit key2_flag = 0;
  23. bit key3_flag = 0;
  24. bit key4_flag = 0;
  25. bit key5_flag = 0;
  26. bit key6_flag = 0;
  27. bit key7_flag = 0;
  28. bit key8_flag = 0;
  29. bit reset_flag = 0;
  30. bit action = 0;
  31. bit start_flag=0;

  32. unsigned char second = 15;
  33. unsigned char timer0_count = 0;
  34. unsigned char number = 0;
  35. unsigned char number_display = 0;

  36. //延時(shí)函數(shù)
  37. void delay(unsigned int z)
  38. {
  39.         unsigned int x,y;
  40.         for(x=z;x>0;x--)
  41.                 for(y=110;y>0;y--);
  42. }

  43. void Play(unsigned char t)
  44. {
  45.     unsigned char i;
  46.     for(i=0;i<100;i++)
  47.    {
  48.     state=~state;
  49.         delay(t);
  50.         }
  51.         state=0;
  52. }

  53. //數(shù)碼管顯示驅(qū)動(dòng)函數(shù)
  54. void display(unsigned char number,unsigned char second)
  55. {
  56.         unsigned char second_first,second_second;
  57.         second_first = second / 10;
  58.         second_second = second % 10;
  59.         
  60.         P2 = 0xfe;
  61.         P0 = table[number];
  62.         delay(1);
  63.         
  64.         P2 = 0xfb;
  65.         P0 = table[second_first];
  66.         delay(1);
  67.         
  68.         P2 = 0xf7;
  69.         P0 = table[second_second];
  70.         delay(1);        
  71. }

  72. //開始鍵掃描函數(shù)
  73. void start_stop_keyscan()
  74. {
  75.         if(start_stop == 0)
  76.         {
  77.                 delay(8);
  78.                 if((start_stop == 0)&&(!start_stop_flag))
  79.                 {
  80.                         start_stop_flag = 1;
  81.                         action  = 1;
  82.                         TR0 = 1;
  83.                         //state =0;
  84.                         Play(1);
  85.                 }
  86.         }
  87.         else
  88.         {
  89.                 start_stop_flag = 0;        
  90.         }        
  91. }

  92. //八位搶答鍵掃描函數(shù)
  93. unsigned char key_scan8()
  94. {
  95.         if(key1 == 0)
  96.         {
  97.                 delay(8);
  98.                 if((key1 == 0)&&(!key1_flag))
  99.                 {
  100.                         key1_flag = 1;
  101.                         number  = 1;
  102.                         number_display = number;
  103.                         Play(2);
  104.                         LE=0;
  105.                 }
  106.         }
  107.         else
  108.         {
  109.                 key1_flag = 0;
  110.                 number  = 0;        
  111.         }
  112.         
  113.         if(key2 == 0)
  114.         {
  115.                 delay(8);
  116.                 if((key2 == 0)&&(!key2_flag))
  117.                 {
  118.                         key2_flag = 1;
  119.                         number  = 2;
  120.                         number_display = number;
  121.                         Play(2);
  122.                         LE=0;
  123.                 }
  124.         }
  125.         else
  126.         {
  127.                 key2_flag = 0;
  128.                 number  = 0;        
  129.         }
  130.         
  131.         if(key3 == 0)
  132.         {
  133.                 delay(8);
  134.                 if((key3 == 0)&&(!key3_flag))
  135.                 {
  136.                         key3_flag = 1;
  137.                         number  = 3;
  138.                         number_display = number;
  139.                         Play(2);
  140.                         LE=0;
  141.                 }
  142.         }
  143.         else
  144.         {
  145.                 key3_flag = 0;
  146.                 number  = 0;        
  147.         }
  148.         
  149.         if(key4 == 0)
  150.         {
  151.                 delay(8);
  152.                 if((key4 == 0)&&(!key4_flag))
  153.                 {
  154.                         key4_flag = 1;
  155.                         number  = 4;
  156.                         number_display = number;
  157.                         Play(2);
  158.                         LE=0;
  159.                 }
  160.         }
  161.         else
  162.         {
  163.                 key4_flag = 0;
  164.                 number  = 0;        
  165.         }
  166.         
  167.         if(key5 == 0)
  168.         {
  169.                 delay(8);
  170.                 if((key5 == 0)&&(!key5_flag))
  171.                 {
  172.                         key5_flag = 1;
  173.                         number  = 5;
  174.                         number_display = number;
  175.                         Play(2);
  176.                         LE=0;
  177.                 }
  178.         }
  179.         else
  180.         {
  181.                 key5_flag = 0;
  182.                 number  = 0;        
  183.         }
  184.         
  185.         if(key6 == 0)
  186.         {
  187.                 delay(8);
  188.                 if((key6 == 0)&&(!key6_flag))
  189.                 {
  190.                         key6_flag = 1;
  191.                         number  = 6;
  192.                         number_display = number;
  193.                         Play(2);
  194.                         LE=0;
  195.                 }
  196.         }
  197.         else
  198.         {
  199.                 key6_flag = 0;
  200.                 number  = 0;        
  201.         }
  202.         
  203.         if(key7 == 0)
  204.         {
  205.                 delay(8);
  206.                 if((key7 == 0)&&(!key7_flag))
  207.                 {
  208.                         key7_flag = 1;
  209.                         number  = 7;
  210.                         number_display = number;
  211.                         Play(2);
  212.                         LE=0;
  213.                 }
  214.         }
  215.         else
  216.         {
  217.                 key7_flag = 0;
  218.                 number  = 0;        
  219.         }
  220.         
  221.         if(key8 == 0)
  222.         {
  223.                 delay(8);
  224.                 if((key8 == 0)&&(!key8_flag))
  225.                 {
  226.                         key8_flag = 1;
  227.                         number  = 8;
  228.                         number_display = number;
  229.                         Play(2);
  230.                         LE=0;
  231.                 }
  232.         }
  233.         else
  234.         {
  235.                 key8_flag = 0;
  236.                 number  = 0;        
  237.         }
  238.                                                         
  239.         if(number_display != 0)        
  240.         {
  241.                 return 1;
  242.         }
  243.         else
  244.         {
  245.                 return 0;
  246.         }        
  247.         
  248. }

  249. //復(fù)位鍵掃描函數(shù)
  250. void reset_keyscan()
  251. {
  252.         if(reset == 0)
  253.         {
  254.                 delay(8);
  255.                 if((reset == 0)&&(!reset_flag))
  256.                 {        second=15;
  257.                         reset_flag = 1;
  258.                         number_display = 0;
  259.                         LE = 1;
  260.                         //state = 1;
  261.                 }
  262.         }
  263.         else
  264.         {
  265.                 reset_flag = 0;
  266.         }        
  267. }
  268.          

  269. //主函數(shù)

  270. void main()
  271. {
  272.         TMOD=0x01;
  273.     TH0=0x3C;
  274.         TL0=0xB0;
  275.         EA=1;
  276.         ET0=1;
  277.         TR0=0;
  278.         
  279.         while(1)
  280.         {        while((start == 0)&&(!start_flag))
  281.          {        start_stop_keyscan();
  282.                 reset_keyscan();
  283.                 while(action)
  284.                 {
  285.                         while(!key_scan8())
  286.                         {
  287.                                 display(number_display,second);
  288.                                 if(second == 0)
  289.                                 {
  290. ……………………

  291. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
搶答.rar (67.64 KB, 下載次數(shù): 67)




作者: zyt123456    時(shí)間: 2018-7-5 09:24
兄弟倒計(jì)時(shí)剩余時(shí)間顯示不出來(lái)?




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