基于51单片机的六路抢答器Protues仿真筹划

[复制链接]
发表于 2026-2-26 00:13:35 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
目次
一、筹划配景
二、实现功能
三、仿真演示
四、源步伐(部门)


一、筹划配景

        比年来随着科技的飞速发展,单片机的应用正在不停的走向深入。本文论述了基于51单片机的六路抢答器筹划。本筹划中,51单片机充当了焦点控制器的脚色,通过IO口与各个功能模块相毗连。按键模块负责检测到场者的抢答动作,当有人按下抢答按钮时,会通过IO口电平的变革关照单片机,单片机遇记载按键的序次,并通过数码管表现当前的抢答效果。
        为了包管抢答过程的正确性和公平性,筹划中还须要思量到以下因素。起首,按键模块须要具备快速相应和高可靠性,以确保抢答者的动作可以或许被正确地捕获到。其次,表现屏模块须要可以或许及时更新抢答效果,并表现相应的信息,比如到场者的编号和抢答时间。末了,在电路毗连方面,须要注意各个模块之间的线路结构,以克制信号干扰和电气标题。
       软件体系采取C语言编写步伐,包罗表现步伐,定时制止服务,延时步伐等,并在KEIL5中调试运行,硬件体系利用PROTEUS8.13强盛的功能来实现,简朴切易于观察,在仿真中就可以观察到实际的工作状态。
二、实现功能

        以51单片机为控制焦点,筹划一种六路抢答器。整个体系包罗MCU、晶振电路、时钟电路、蜂鸣器控制电路、指示灯控制电路、译码电路、独立按键电路、矩阵键盘以及数码管表现电路等。可具体实现以下功能:
     (1)设定矩阵键盘的6个键作为6位选手的抢答按键,键的编号即选手编号,为1~6号;设定1个独立按键作为抢答开始键;选择四位数码管作为倒计时、选手编号表现;选择蜂鸣器作为正常抢答和犯规抢答的提示。
     (2)只有当裁判按下开始键时才可以进入正常抢答,否则属于犯规抢答。抢答完毕,或计时时间到,制止抢答。当裁判按下抢答开始键时,开始抢答,计时器开始倒计时,10秒倒计期间,如有抢答,则制止计时,数码管表现选手号;若倒计时竣事时无人抢答,则制止抢答。
     (3)正常抢答时,有效抢答指示灯亮起,蜂鸣器播放音乐1,低位数码管数码管表现抢答选手的编号,高位数码管开始60s倒计时,60s时间到,数码管表现0-00。违规抢答时,无效抢答指示灯亮起,蜂鸣器播放音乐2,低位数码管表现违规抢答选手编号,高位数码管表现抢答倒计时时间10s。
三、仿真演示

未运行仿真时,数码管不表现。

运行仿真后,进入预备界面,数码管表现0-10。

按下启动按键,进入抢答界面,开始10秒抢答倒计时。

在抢答倒计时范围内,按下序号为1~6的选手抢答按键,抢答有效指示灯亮起,蜂鸣器播放《两只老虎》的旋律,低位数码管上表现抢答选手序号,高位数码管开始60s倒计时。

当裁判未按下开始键时,如有选手抢答视为犯规抢答,抢答无效指示灯亮起,蜂鸣器播放《粉刷匠》的旋律,低位数码管表现犯规选手的编号,高位数码管表现10。

正常抢答还是犯规抢答竣事后,按下复位按钮规复到预备界面,以便举行下一次抢答。


四、源步伐(部门)

  1. #include "reg52.h"
  2. #include "delay.h"
  3. #include "smg.h"
  4. #include "timer.h"
  5. sbit Beep = P1^5;        //六位选手
  6. sbit key1 = P1^1;       
  7. sbit key2 = P1^2;
  8. sbit key3 = P1^3;
  9. sbit key4 = P1^4;
  10. sbit key5 = P1^5;       
  11. sbit key6 = P1^6;
  12. sbit EffectLED = P2^6;  //抢答有效指示灯
  13. sbit UeffectLED = P2^7; //抢答无效指示灯
  14. sbit start_stop = P3^1;        //抢答按钮
  15. sbit L1 = P1^7;
  16. sbit L2 = P1^6;
  17. sbit R1 = P1^3;
  18. sbit R2 = P1^2;
  19. sbit R3 = P1^1;
  20. sbit R4 = P1^0;
  21. //**《两只老虎》
  22. uint8 code  x0[]={1+7,2+7,3+7,1+7,1+7,2+7,3+7,1+7,3+7,4+7,5+7,3+7,4+7,5+7,5+7,6+7,5+7,4+7,3+7,1+7,5+7,6+7,5+7,4+7,3+7,1+7,1+7,5,1+7,1+7,5,1+7};
  23. uint8 code  y0[]={4,4,4,4,4,4,4,4,4,4,8,4,4,8,3,1,3,1,4,4,3,1,3,1,4,4,4,4,8,4,4,8};
  24. //**《粉刷匠》
  25. uint8 code  x1[]={5+7,3+7,5+7,3+7,5+7,3+7,1+7,2+7,4+7,3+7,2+7,5+7,5+7,3+7,5+7,3+7,5+7,3+7,1+7,2+7,4+7,3+7,2+7,1+7,2+7,
  26.                                         2+7,4+7,4+7,3+7,1+7,5+7,2+7,4+7,3+7,2+7,5+7,5+7,3+7,5+7,3+7,5+7,3+7,1+7,2+7,4+7,3+7,2+7,1+7};
  27. uint8 code  y1[]={4,4,4,4,4,4,8,4,4,4,4,16,4,4,4,4,4,4,8,4,4,4,4,16,4,4,4,4,4,4,8,4,4,4,4,16,4,4,4,4,4,4,8,4,4,4,4,16};
  28.         //以下定义低中高共21个音阶的定时参数,通过定时器来实现不同音频的输出
  29. uint8 code ti[21][2]={
  30.         {0xf8,0x8c},{0xf9,0x5c},{0xfa,0x14},{0xfa,0x67},{0xfb,0x04},{0xfb,0x90},{0xfc,0x0c},  //低音
  31.         {0xfc,0x44},{0xfc,0xb6},{0xfd,0x09},{0xfd,0x34},{0xfd,0x82},{0xfd,0xc8},{0xfe,0x06},  //中音
  32.         {0xfe,0x22},{0xfe,0x56},{0xfe,0x8c},{0xfe,0x9a},{0xfe,0xc1},{0xfe,0xe4},{0xff,0x03}}; //高音
  33. uint8 th,tl,i;
  34. _bool action = 0;
  35. _bool key1_flag = 0;
  36. _bool key2_flag = 0;
  37. _bool key3_flag = 0;
  38. _bool key4_flag = 0;
  39. _bool key5_flag = 0;
  40. _bool key6_flag = 0;
  41. _bool start_stop_flag = 0; //抢答标志位
  42. _bool cntflag=0;
  43. uint8 second = 10;        //时间
  44. uint8 timer0_count = 0;        //定时器1计数值
  45. uint8 number = 0; //队号
  46. uint8 number_display = 0;        //队号显示
  47. uint8 a = 0xff;        //按键值
  48.        
  49. uint8 key_scan8(void);
  50. void start_stop_keyscan(void);
  51. void music1(void);//演奏《两只老虎》
  52. void music2(void);//演奏《粉刷匠》
  53. void keycheckdown(void);                                /* 反转法键盘扫描 */
  54. /*-----------------------------------------------------------
  55. 主函数
  56. ------------------------------------------------------------*/
  57. void SMG_delay(uint8 t)
  58. {
  59.         while(t--)
  60.         {
  61.            display(number_display,second);       
  62.         }
  63. }
  64. void main()
  65. {
  66.         ConfigTimer();//定时器初始化
  67.         while(1)
  68.         {
  69.                 start_stop_keyscan();//开始按键
  70.                 keycheckdown();
  71.     if(key_scan8()&&action==0&&cntflag==0)
  72.                 {      
  73.                         UeffectLED=0;       
  74.                         EffectLED=1;
  75.                         music2();
  76.                         cntflag=1;
  77.                 }
  78.                 while(action)//按下开始键为1,抢答结束为0
  79.                 {
  80.                         keycheckdown();
  81.                         if(cntflag==1)
  82.                         {
  83.                           number_display=0;
  84.                                 cntflag=0;
  85.                         }
  86.                         while(!key_scan8())        //无队抢答
  87.                         {
  88.                                 keycheckdown();
  89.                                 display(number_display,second);
  90.                                 if(second == 0)
  91.                                 {
  92.                                         break;
  93.                                 }
  94.                         }
  95.                         if(number_display)//有队抢答
  96.                         {
  97.                                 EffectLED=0;
  98.         UeffectLED=1;       
  99.                                 second=60;
  100.         music1();
  101.                         }
  102.                         while(number_display)
  103.                         {
  104.                                 display(number_display,second);
  105.                                 TR0 = 1;
  106.                                 if(second == 0)
  107.                                 {
  108.                                         break;
  109.                                 }
  110.                         }
  111.                         TR0 = 0;//时间到
  112.                         display(number_display,second);
  113.                         action = 0;//抢答结束
  114.                         break;
  115.                 }
  116.                 display(number_display,second);       
  117.         }
  118. }
  119. void music1(void)//演奏《两只老虎》
  120. {
  121.         for(i=0;i<14;i++)
  122.         {
  123.                 th=ti[x0[i]-1][0];
  124.                 tl=ti[x0[i]-1][1];
  125.                 TH1=th;
  126.                 TL1=tl;
  127.                 TR1=1;
  128.     SMG_delay(y0[i]*10);
  129.                 TR1=0;
  130.         }
  131. }
  132. void music2(void)//演奏《粉刷匠》
  133. {
  134.         for(i=0;i<12;i++)
  135.         {
  136.                 th=ti[x1[i]-1][0];
  137.                 tl=ti[x1[i]-1][1];
  138.                 TH1=th;
  139.                 TL1=tl;
  140.                 TR1=1;
  141.                 SMG_delay(y1[i]*9);
  142.                 TR1=0;
  143.         }
  144. }
  145. /*-----------------------------------------------------------
  146. 中断服务函数
  147. ------------------------------------------------------------*/
  148. void timer0() interrupt 1
  149. {
  150.         TH0 = (65536-50000)/256; //50ms
  151.         TL0 = (65536-50000)%256;       
  152.         timer0_count ++;
  153.         if(timer0_count == 20)//1s
  154.         {
  155.                 timer0_count = 0;
  156.                 second--;        //10s倒计时
  157.                 if(second == 0)//计时结束
  158.                 {
  159.                         TR0 = 0;
  160.                         number_display = 0;
  161.                         action = 0;
  162.                 }
  163.         }       
  164. }
  165. /*-----------------------------------------------------------
  166. 开始键扫描函数
  167. ------------------------------------------------------------*/
  168. void start_stop_keyscan(void)
  169. {
  170.         if(start_stop == 0)
  171.         {
  172.                 SMG_delay(8);
  173.                 if((start_stop == 0)&&(!start_stop_flag))
  174.                 {
  175.                         start_stop_flag = 1;
  176.                         action = 1;
  177.                         TR0 = 1;
  178.                 }
  179.                 while(start_stop == 0){display(number_display,second);}               
  180.                
  181.         }
  182.         else
  183.         {
  184.                 start_stop_flag = 0;       
  185.         }
  186. }
  187. void keycheckdown()               
  188. {
  189.         L1=0;L2=1;
  190.         R1=R2=R3=R4=1;
  191.         if(R1==0)
  192.         {
  193.                 while(R1==0)
  194.                 {
  195.       display(number_display,second);               
  196.                 }
  197.     a=1;
  198.         }
  199.         else if(R2==0)
  200.         {
  201.                 while(R2==0)
  202.                 {
  203.                    display(number_display,second);               
  204.                 }
  205.     a=2;
  206.         }       
  207.         else if(R3==0)
  208.         {
  209.                 while(R3==0)
  210.                 {
  211.        display(number_display,second);               
  212.                 }
  213.                 a=3;
  214.         }
  215.         else if(R4==0)
  216.         {
  217.                 while(R4==0)
  218.                 {
  219.        display(number_display,second);               
  220.                 }
  221.     a=0x4;
  222.         }
  223.        
  224.         L2=0;L1=1;
  225.         R1=R2=R3=R4=1;
  226.         if(R1==0)
  227.         {
  228.                 while(R1==0)
  229.                 {
  230.        display(number_display,second);               
  231.                 }
  232.     a=0x5;
  233.         }
  234.         else if(R2==0)
  235.         {
  236.                 while(R2==0)
  237.                 {
  238.        display(number_display,second);                       
  239.                 }
  240.     a=0x6;
  241.         }       
  242.         else if(R3==0)
  243.         {
  244.                 while(R3==0)
  245.                 {
  246.        display(number_display,second);                       
  247.                 }
  248.                 a=0x7;
  249.         }
  250.         else if(R4==0)
  251.         {
  252.                 while(R4==0)
  253.                 {
  254.        display(number_display,second);               
  255.                 }
  256.     a=0x8;
  257.         }
  258. }
  259. /*-----------------------------------------------------------
  260. 六位抢答键扫描函数
  261. ------------------------------------------------------------*/
  262. uint8 key_scan8(void)
  263. {
  264.         if((a == 1)&&(!key1_flag))
  265.         {
  266.                 key1_flag = 1;
  267.                 number  = 1;
  268.                 number_display = number;
  269.         }
  270.         else
  271.         {
  272.                 key1_flag = 0;
  273.                 number  = 0;       
  274.         }
  275.         if((a == 2)&&(!key2_flag))
  276.         {
  277.                 key2_flag = 1;
  278.                 number  = 2;
  279.                 number_display = number;
  280.         }
  281.         else
  282.         {
  283.                 key2_flag = 0;
  284.                 number  = 0;       
  285.         }
  286.         if((a == 3)&&(!key3_flag))
  287.         {
  288.                 key3_flag = 1;
  289.                 number  = 3;
  290.                 number_display = number;
  291.         }
  292.         else
  293.         {
  294.                 key3_flag = 0;
  295.                 number  = 0;       
  296.         }
  297.        
  298.         if((a == 0x4)&&(!key4_flag))
  299.         {
  300.                 key4_flag = 1;
  301.                 number  = 4;
  302.                 number_display = number;
  303.         }
  304.         else
  305.         {
  306.                 key4_flag = 0;
  307.                 number  = 0;       
  308.         }
  309.        
  310.         if((a == 0x5)&&(!key5_flag))
  311.         {
  312.                 key5_flag = 1;
  313.                 number  = 5;
  314.                 number_display = number;
  315.         }
  316.         else
  317.         {
  318.                 key5_flag = 0;
  319.                 number  = 0;       
  320.         }               
  321.         if((a == 0x6)&&(!key6_flag))
  322.         {
  323.                 key6_flag = 1;
  324.                 number  = 6;
  325.                 number_display = number;
  326.         }
  327.         else
  328.         {
  329.                 key6_flag = 0;
  330.                 number  = 0;       
  331.         }       
  332.        
  333.         if(number_display != 0)       
  334.         {
  335.                 return 1;
  336.         }
  337.         else
  338.         {
  339.                 return 0;
  340.         }       
  341. }
  342. void Timer1Service() interrupt 3 /* T0中断服务程序 */
  343. {
  344.          Beep=~Beep;
  345.          TH1=th;
  346.          TL1=tl;
  347. }
复制代码
仿真源文件及源步伐百度网盘链接:https://pan.baidu.com/s/1baNdNosxDLxHD96VyCc8uw 
提取码:it38 
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表