找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3252|回复: 1
打印 上一主题 下一主题
收起左侧

单片机为核心的8位竞赛抢答器仿真和源程序 倒计时剩余时间还未完成

[复制链接]
跳转到指定楼层
楼主
1) 抢答器同时供8名选手或8个代表队比赛,分别用8个按钮s1-s8表示;
2) 设置一个系统清除和抢答控制开关Key1Key2
3) 抢答器具有锁存与显示功能。即选手按下按钮,锁存相应编号,显示该选手编号至数码管,并且该编号保存至主持人按下清除键Key1清除为止。
4) 抢答器具有定时抢答功能,一次抢答设定的时间为30秒。主持人按下抢答控制开关Key2,抢答才能开始,启动定时器,并将倒数计时时间用数码管显示。若定时时间到,无人抢答,则该轮抢答结束,系统通过蜂鸣器报警,选手禁止抢答。
5) 选手在设定的时间内进行抢答,抢答有效,定时器停止工作,蜂鸣器报警,数码管显示选手编号及倒计时剩余时间,并保持到主持人将系统清除为止。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. #include <reg52.h>

  2. //共阴极数码管编码表 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. //延时函数
  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. //数码管显示驱动函数
  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. //开始键扫描函数
  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. //八位抢答键扫描函数
  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. //复位键扫描函数
  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. //主函数

  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. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
抢答.rar (67.64 KB, 下载次数: 67)



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:365098 发表于 2018-7-5 09:24 | 只看该作者
兄弟倒计时剩余时间显示不出来啊?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表