找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 13411|回复: 7
收起左侧

单片机设计-八路抢答器(C语言)

  [复制链接]
ID:328014 发表于 2018-7-1 04:37 | 显示全部楼层 |阅读模式

一  绪论3
二  基本设计方案4
三  具体设计5
四  电路板的制作7
五  电路功能测试与调试7
六  心得体会8
附录9
一  绪论
1.1单片机抢答器的背景
二十世纪跨越了三个“电”的时代,即电气时代、电子时代和现已进入的电脑时代。不过,这种电脑,通常是指个人计算机,简称PC机。它由主机、键盘、显示器等组成。还有一类计算机,大多数人却不怎么熟悉。这种计算机就是把智能赋予各种机械的单片机(亦称微控制器)。顾名思义,这种计算机的最小系统只用了一片集成电路,即可进行简单运算和控制。因为它体积小,通常都藏在被控机械的“肚子”里。它在整个装置中,起着有如人类头脑的作用,它出了毛病,整个装置就瘫痪了。现在,这种单片机的使用领域已十分广泛,如智能仪表、实时工控、通讯设备、导航系统、家用电器等。各种产品一旦用上了单片机,就能起到使产品升级换代的功效,常在产品名称前冠以形容词——“智能型”,如智能型洗衣机等。现在有些工厂的技术人员或其它业余电子开发者搞出来的某些产品,不是电路太复杂,就是功能太简单且极易被仿制。究其原因,可能就卡在产品未使用单片机或其它可编程逻辑器件上。
在知识竞赛中,特别是做抢答题时,在抢答过程中,为了更确切的知道哪一组或哪一位选手先抢答到题,必须要有一个系统来完成这个任务。若在抢答中,只靠人的视觉(或者是听觉)是很难判断出哪一组(或哪一个选手)先抢答到题的。利用单片机编程来设计抢答器,可以使以上问题得以解决,即使两组的抢答时间相差几微秒,也能轻松的分辨出哪一组(或哪个选手)先抢答到题的。本文主要介绍了抢答器的工作原理及设计,以及它的实际用途。  
1.2设计要求:




    • 基本功能:
  • 六路抢答,抢答有效时相应的灯亮,并有音乐提示;
  • 每轮抢答需主持人按“开始”后,抢答才有效;
  • 抢答无效时,有相应的灯及音乐提示;
    • 扩展功能:
  • 扩展到8路或以上;
  • 抢答倒计时提示;
  • 各路的参赛者有得分显示;
  • 其他自行增加的功能;
二  基本设计方案
2.1  单片机的选择
我选择STC89C52单片机芯片的理由如下:
1、在设计过程中可能会出现很多问题,89C52可重复烧程序;
2、是80C51的增强型,功能与我们所学的51单片机基本相同;
3、学校配套发的单片机开发板用的就是89C52,有很多相关教程,程序的测试与烧写都十分方便;
4、器材室很方便就能领到。
89C52单片机,是增强型RISC内载Flash的单片机,芯片上的Flash存储器附在用户的产品中,可随时编程,再编程,使用户的产品设计容易,更新换代方便。89C52单片机采用增强的RISC结构,使其具有高速处理能力,在一个时钟周期内可执行复杂的指令,每MHz可实现1MIPS的处理能力。89C52单片机工作电压为2.7~6.0V,可以实现耗电最优化。89C52的单片机广泛应用于计算机外部设备,工业实时控制,仪器仪表,通讯设备,家用电器,宇航设备等各个领域.
2.2单片机的基本结构  
MCS-52的引脚说明:
MCS-52系列单片机中的8032、8052及8752均采用40Pin封装的双列直接DIP结构,右图是它们的引脚配置,40个引脚中,正电源和地线两根,外置石英振荡器的时钟线两根,4组8位共32个I/O口,中断口线与P3口线复用。 具体引脚功能不做赘述了(详细请参见《单片机原理与接口技术》宋跃)。
图2-2-1 STC89C52的引脚图
2.3基本设计思路
              因为之前做过单片机最小系统的电路,这次为了节约时间,采取在最小系统的板旁边再焊一块电路。
              一看到项目我的基本思路就差不多了,我要实现基本功能好说,倒是拓展不太难,于是选择了拓展到8路和抢答倒计时。最小系统已经包括了手动复位电路,时钟电路,电源电路和89C52的I/O口排插,这块板上可以用的地方不多,只能焊一个蜂鸣器及其驱动电路了。在另一块板上需要有8个按键、8个LED灯和一个数码管,并分别对应三个插排。两块电路板之间高低电平用两根导线连通。
2.4相关功能器材的选择
              整体电路需要开关的地方:电源的启动,主持人的开始与复位,8名抢答选手用的抢答按钮。
              考虑到电源需长时间保持开启或断开状态,故采用可保持按下或不按下状态的开关。同理主持人的“开始”和“未开始”也需要这样的开关。8名抢答选手用的抢答按钮,只需用4脚的按键即可,按下即接通,松开就断路。
              8个LED灯来显示选手的抢答状况,1个LED灯用来显示电源的状况;一个数码管来显示主持人说“开始”后的倒计时;一个有源蜂鸣器,用一个NPN管来驱动;其他电容和电阻用最小系统的。
三  具体设计
3.1硬件设计
              如上所述,该电路部分电路采用之前做出来的单片机最小系统,根据前面的思路可以在ISIS中摆出电路,如下图所示:
图3.1 仿真电路图
3.2软件设计
              在ISIS中的89C52可以仿真烧录程序运行,这样可以先在Keil中编程然后烧录看仿真结果,省时省力。
我采用C语言编写程序,详细程序及分析请看附录。
3.3仿真测试
在ISIS中调入hex文件后即可开始仿真,仿真结果如下图所示:
图3.3 仿真测试结果
              主持人按下“开始”按钮后,数码管开始倒计时,从9到0一秒减一下,也就是抢答倒计时,在数码管显示0之前,8个开关无论哪一个先按下,对应的灯就会亮(蜂鸣器没响,因为仿真不出来),当这个灯亮起后,不论其他的开关怎样按都不能改变灯亮的情况,也就是实现了抢答的功能。如果数码管减到0了都没人抢答,则抢答作废,这时无论再怎样抢答都不会有灯亮,实现抢答倒计时的功能。在主持人再次按下“复位”按钮(和“开始”是同一个)时,数码管和LED都熄灭,同时所有人都不能抢答,实现清零功能。
四  电路板的制作
4.1元件清单
元件
数量
STC89C52
1
40PIC座
1
按键
8
开关
2
LED灯(红)
9
排针
3
8管脚数码管
1
蜂鸣器
1
S9012
1
33pF瓷片电容
2
11.0592晶振
1
10uF电解电容
1
1k电阻
1
10k电阻
1
电源插口
1
导线
若干
万用板7*9CM
1
4.2焊接
              在实际焊接过程中,有很多地方元件以及走线十分密集,如8个按键、8个LED灯、8脚数码管和3个排针的焊接,这需要十分的耐心,稍不注意就将排布密集的锡线焊到了一起,只能用锡枪吸走重新焊。
              还有一些问题如元件如何摆放平整,如果不平整其他元件难以放得下;LED灯和数码管不能用高温焊太久,否则会毁掉,到时候很难检查出问题;元件的排版必须事先计算好,连走线都要想好,不然一步错步步错。
              经过一个下午的焊接,最终还是将它做出来了。
五  电路功能测试与调试
5.1测试
              测试采用5V电源线接电脑供电,先用开发板将程序烧录进89C52,然后插入到板上的IC座,将剩余的线连好后开启电源,电源指示灯亮,结果数码管不亮,按抢答器也不亮,复位键也无任何作用,蜂鸣器也不响。
5.2调试
              一下是我遇到的问题及解决的过程。
              1、除电源键外,其他键都无反应,蜂鸣器也不响。仔细检查电路后,我发现是接口接触的问题,而且我NPN管忘了接P0口。
              2、通电后,数码管不亮,能实现抢答器的功能,但一旦按下按键蜂鸣器一直响。后来发现是我程序我的问题,仿真上显示不出来,于是我修改程序。
              3、通电后,能实现抢答的功能,蜂鸣器也能正常工作了,但是数码管显示乱码,还是一秒一跳。后来我发现本身程序有一点问题,仿真程序上的数码管和我自己用的数码管不同,只能修改程序。
              最后,经过一系列的调试与修改后,终于实现了预期功能。
六  心得体会
              经过一个星期的努力,我完成了设计任务,通过此次设计,我重新认识到了自学的重要性,以及学以致用的道理。我在图书馆以及网上查阅了大量的资料,同时也认识到了查阅信息的重要作用。通过此次的抢答器的设计,让我重新拾起了以前所学习的电子知识,及我觉得此次设计让我更加巩固了所学的知识并在设计的过程中学会了与时俱进,让我受益匪浅。这一次设计的练习,很多事情我都不可以独立完成,很多方面都需要同学的帮助,我也深刻认识到自己的不足,知识的欠缺问题很大,需要在编程方面大下功夫。同时因为我这次设计用的是C语言,也希望自己学的更好了以后,能用汇编语言来实现同样的功能。还有一点很重要,不能依赖仿真软件,软件本身有很多弊端不说,仿真出来的结果也不一定正确,很容易被误导,
附录
电路板实物图:


单片机源程序如下:
  1. #include<reg51.h>
  2. unsigned char flag,num1,num2;
  3. sbit a1=P3^0;//P3口开关
  4. sbit a2=P3^1;
  5. sbit a3=P3^2;
  6. sbit a4=P3^3;
  7. sbit a5=P3^4;
  8. sbit a6=P3^5;
  9. sbit a7=P3^6;
  10. sbit a8=P3^7;
  11. sbit b1=P1^0;//P1口蜂鸣器
  12. sbit b2=P1^1;
  13. sbit b3=P1^2;
  14. unsigned char code table[]={0x80,0xf9,0x4c,0x60,0x31,0x22,0x02,0xf0,0x00,0x20};//数码管显示
  15. void display()
  16. {
  17. P2=table[num2]; //P2口数码管
  18. }
  19. void init()
  20. {
  21. num2=9;
  22. TMOD=0X01;
  23. TH0=(65536-45872)/256;
  24. TL0=(65536-45872)/256;
  25. EA=1;
  26. ET0=1;
  27. TR0=1;
  28. flag=1;//全局变量
  29. P0=0xff;//P0口LED灯
  30. b1=1;
  31. P2=0xff;
  32. }
  33. void delay(int z)//延时程序
  34. {
  35.   int i,j;
  36.   for(i=0;i<z;i++)
  37.     for(j=0;j<110;j++);
  38. }
  39. void main()
  40. {
  41. init();
  42. while(flag)
  43. {
  44.    if(a1==0)
  45.    {
  46.      delay(100);//调用延时程序消除抖动
  47.      if(a1==0)//判断开关a1是否按下
  48.      {
  49.        flag=0;
  50.        P0=0xfe;//对应LED灯亮
  51.        b1=0;//蜂鸣器响
  52.        while(!a1);//按住时持续响
  53.        b3=0;
  54.        b1=1;
  55.       }
  56.    }
  57.    if(a2==0)//同理判断a2
  58.    {
  59.      delay(100);
  60.      if(a2==0)
  61.      {
  62.        flag=0;
  63.        P0=0xfd;
  64.        b1=0;
  65.        while(!a2);
  66.        b1=1;
  67.       }
  68.     }
  69.    if(a3==0)//同理判断a3
  70.    {
  71.      delay(100);
  72.      if(a3==0)
  73.      {
  74.        flag=0;
  75.        P0=0xfb;
  76.        b1=0;
  77.        while(!a3);
  78.        b1=1;
  79.       }
  80.     }
  81.    if(a4==0)//同理判断a4
  82.    {
  83.      delay(100);
  84.      if(a4==0)
  85.      {
  86.        flag=0;
  87.        P0=0xf7;
  88.        b1=0;
  89.        while(!a4);
  90.        b1=1;
  91.       }
  92.     }
  93.    if(a5==0)//同理判断a5
  94.    {
  95.      delay(10);
  96.      if(a5==0)
  97.      {
  98.        flag=0;
  99.        P0=0xef;
  100.        b1=0;
  101.        while(!a5);
  102.        b1=1;
  103.       }
  104.     }
  105.    if(a6==0)//同理判断a6
  106.    {
  107.      delay(10);
  108.      if(a6==0)
  109.      {
  110.        flag=0;
  111.        P0=0xdf;
  112.        b1=0;
  113.        while(!a6);
  114.        b1=1;
  115.       }
  116.     }
  117.    if(a7==0)//同理判断a7
  118.    {
  119.      delay(10);
  120.      if(a7==0)
  121.      {
  122.        flag=0;
  123.        P0=0xbf;
  124.        b1=0;
  125.        while(!a7);
  126.        b1=1;
  127.       }
  128.     }
  129.    if(a8==0)//同理判断a8
  130.    {
  131.      delay(10);
  132.      if(a8==0)
  133.      {
  134.        flag=0;
  135.        P0=0x7f;
  136.        b1=0;
  137.        while(!a8);
  138.        b1=1;
  139.       }
  140.     }
  141. }
  142. while(!flag)
  143. {

  144.    EA=0;

  145.   if(P3!=0xff)//没有开关按下时不响也不亮
  146.   {
  147.     b1=0;   b2=0;
  148.     delay(50);
  149.   }
  150.   else b1=1;
  151.   }
  152. ……………………

  153. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

Word文档下载:
单片机课程设计-八路抢答器(C语言).doc (573.5 KB, 下载次数: 195)

评分

参与人数 1黑币 +10 收起 理由
admin + 10 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:313328 发表于 2018-7-1 20:40 | 显示全部楼层
好用,感谢
回复

使用道具 举报

ID:407230 发表于 2018-10-11 15:24 | 显示全部楼层
不错,参考一下,赚分下载
回复

使用道具 举报

ID:791170 发表于 2020-6-27 18:23 | 显示全部楼层
可以参考一下
回复

使用道具 举报

ID:791373 发表于 2020-6-29 15:17 来自手机 | 显示全部楼层
feiji666 发表于 2018-7-1 20:40
好用,感谢

那个复位键怎么没用,请教一下
回复

使用道具 举报

ID:730471 发表于 2020-12-17 14:10 来自手机 | 显示全部楼层
复位键按下没有反应,请问是怎么回事?
回复

使用道具 举报

ID:837614 发表于 2021-10-8 15:47 | 显示全部楼层
复位键没反应,请问怎么改程序
回复

使用道具 举报

ID:837614 发表于 2021-10-12 09:06 | 显示全部楼层
大家有会改复位电路的吗?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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