2.在控制机的“肚子”里。 它在整个设备中扮演着与人类思维相同的角色。 如果出现问题,整个设备就会瘫痪。 如今,这种单片机的应用领域非常广泛,如智能仪表、实时工业控制、通讯设备、导航系统、家用电器等,各种产品一旦使用了单片机,就可以对产品进行升级换代。 产品名称前经常使用“智能”这个形容词,比如智能洗衣机。 如今,一些工厂的技术人员或其他业余电子开发人员生产的一些产品,要么电路过于复杂,要么功能过于简单,很容易被抄袭。 原因可能是该产品没有使用微控制器或其他可编程逻辑器件。 在知识竞赛中,尤其是答题时,为了更准确地知道哪一组或哪个选手先回答了问题,就必须有一个系统来完成这项任务。如果急于回答,就靠人家的回答。
3.很难通过视觉(或听觉)来判断哪组(或哪位玩家)首先回答了问题。 利用单片机编程设计答录机可以解决上述问题。 即使两组的回答时间相差几微秒,也很容易分辨出哪组(或哪位玩家)先回答了问题。 本文主要介绍答录机的工作原理和设计,以及它的实际使用。 1.2 设计要求: 1、基本功能: 1、六方接听。 当接听有效时,相应的灯会亮起并有音乐提示; 2、每轮答题均需主持人按“开始”后,答题才有效; 3.当接听无效时,有相应的灯光和音乐提示; 2、扩展功能: 1、扩展到8路或更多; 2、答题倒计时提示; 3、每位选手的得分显示; 4、其他自行添加的功能; 2. 基本设计方案 2.1 单片机的选择 我选择STC89C52
4、单片机芯片原因如下: 1、设计过程中可能会出现很多问题,89C52可以重复编程; 2、它是80C51的增强版,其功能与我们学过的51单片机基本相同; 3、学校支持。 MCU开发板采用89C52。 相关教程很多,程序的测试和编程都很方便; 4、在机房拿取非常方便。 89C52微控制器是一款内置Flash的增强型RISC微控制器。 芯片上的Flash存储器附在用户的产品上,可以随时编程和重新编程,使用户的产品设计简单,升级方便。 89C52微控制器采用增强型RISC结构,使其具有高速处理能力。 它可以在一个时钟周期内执行复杂的指令,可以实现1MIPS/MHz的处理能力。 89C52单片机的工作电压为2.76.0V,可以实现
5、功耗优化。 89C52单片机广泛应用于计算机外围设备、工业实时控制、仪器仪表、通信设备、家用电器、航空航天设备等领域。 2.2 单片机的基本结构 MCS-52 的引脚说明: MCS-52 系列单片机中的 8032、8052 和 8752 均采用 40 引脚封装的双排直接 DIP 结构。 右图是他们的引脚配置。 40个引脚中,有两根正电源和地线,两根外部石英振荡器的时钟线,以及4个8位组中总共32个I/O端口,中断端口线是复用的与P3端口线。 具体引脚功能不再详细描述(详细请参考宋越《单片机原理与接口技术》)。 图2-2-1 STC89C52 引脚图 2.3 基本设计思想 因为之前做过单片机最小系统的电路,这次为了节省时间,在最小系统的板子旁边又焊了一个电路。一
6.当我看到这个问题时,我已经有了基本的想法。 我想轻松实现基本功能,但扩展起来并不困难,所以我选择扩展到8个通道和倒计时答题。 最小系统已包括手动复位电路、时钟电路、电源电路和89C52 I/O端口板。 这块板上空间不大,只能焊接一个蜂鸣器及其驱动电路。 另一块板上需要有8个按钮、8个LED灯和一个数码管,分别对应三个插座。 两块电路板之间的高低电平用两根导线连接。 2.4 相关功能设备的选择 整体电路需要开关:电源启动、主机启动和复位、以及8位答题选手的答题按钮。 考虑到电源需要长时间保持打开或关闭状态,所以采用了可以保持按下或不按下状态的开关。 同理,主机的“启动”和“未启动”也需要这样的切换。 8 位测验参赛者可供使用
7. 要接听按钮,只需使用 4 针按钮即可。 按下即可连接,松开即可断开连接。 8个LED灯显示选手答题状态,1个LED灯显示电源状态; 主持人说出“开始”后,数码管显示倒计时; 有源蜂鸣器,由NPN管驱动; 对于其他电容器和电阻器,请使用最小的系统。 三具体设计 3.1 硬件设计 如上所述,本电路部分采用了前面制作的单片机最小系统。 根据前面的思路,可以将电路放置在ISIS中,如下图所示: 图3.1 仿真电路 图3.2 ISIS中的软件设计 89C52可以模拟烧录程序的运行。 这样就可以先在Keil中编程,然后烧录看仿真结果,省时省力。 我用C语言来写程序。 详细程序及分析请参见附录。 3.3 模拟测试:在ISIS中加载hex文件后,即可开始模拟。
8、仿真结果如下图所示: 图 3.3 仿真测试结果 主机按下“开始”按钮后,数码管开始倒计时,从 9 到 0 递减一秒,即为答案倒计时,在数码管显示 0 之前,无论先按下 8 个开关中的哪一个,对应的灯都会亮起(因为无法进行模拟,所以蜂鸣器不会发声)。 当这个灯亮起时,无论怎么按其他开关,灯都不会改变。 它只是实现了回答问题的功能。 如果数码管到0而没有人回答,则回答无效。 此时,无论你如何回答,都不会有灯亮,实现倒计时功能。 当主机再次按下“Reset”按钮(与“Start”相同)时,数码管和LED熄灭,无人应答,从而实现清除功能。 四块电路板制作 4.1 元件清单 元件数量 STC89C52140PIC 底座 1 按钮 8 开关 2 LED 灯(
9.红色)9排针 38针数码管 1个蜂鸣器 1S9012133pF陶瓷电容 211.0592晶振 110uF电解电容 11k电阻 110k电阻 1个电源插座 1根电线 几块万能板 7*9CM14.2焊接 在实际焊接过程中,有很多地方其中元件和接线非常密集,例如8个按钮、8个LED灯、8针数码管和3针排座的焊接。 这需要很大的耐心。 一不小心,就会将排列密集的锡线焊接起来。 当它们结合在一起时,只能用焊枪将它们吸走并重新焊接。 还有一些问题,比如如何放置元件平整。 如果不平整,其他元件就很难放置; LED灯和数码管不能在高温下焊接太久,否则会被破坏,而且很难发现问题; 元器件的布局一定要提前算好,连接线都想好,否则就会走错一步,走错一步。 经过一下午的焊接,终于做出来了。五路功能测试
10. 调试测试 5.1. 测试使用5V电源线连接电脑供电。 首先使用开发板将程序烧录到89C52中,然后插入板上的IC插座。 连接剩余的电线并打开电源。 电源指示灯亮。 结果数码管不亮,按下答录机也不亮。 复位按钮不起作用,蜂鸣器不响。 5.2 调试是我遇到的问题以及解决的过程。 1、除电源键外,其他按键无反应,蜂鸣器不响。 仔细检查电路后发现是接口接触的问题,忘记将NPN管接在P0口上。 2、通电后,数码管不亮,可以实现答录机功能,但一旦按下按钮,蜂鸣器一直响。 后来发现是我程序的问题,在模拟上无法显示,于是我修改了程序。 3、通电后,可以实现接听功能,蜂鸣器也能正常工作,但是数码管显示乱码,而且还在每秒跳动。后来发现
11.程序有问题。 模拟程序上的数码管和我自己用的不一样。 我只能修改程序。 最后,经过一系列的调试和修改,终于实现了预期的功能。 六点感悟 经过一周的努力,我完成了设计任务。 通过这次课程设计,我重新认识到自学的重要性和学以致用的原则。 我在图书馆和网上查阅了大量的资料,也认识到了获取信息的重要作用。 通过这次答录机的设计,我重新拾起了以前学过的电子知识,而且我觉得这次设计让我在设计过程中巩固了所学、所学的知识与时俱进。 我受益匪浅。 在这次课程设计练习中,我无法独立完成很多事情,需要同学在很多方面的帮助。 我也深刻认识到自己的不足。 缺乏知识是一个大问题,我需要在编程上下功夫。
12.同时,因为我本次课程设计使用的是C语言,所以我也希望在学得更好之后,能够使用汇编语言来实现同样的功能。 另一个重要的一点是你不能依赖模拟软件。 且不说软件本身的诸多弊端,模拟结果也可能不正确,很容易被误导。 附录:电路板实物图: C 程序:#includeunsigned char flag,num1,num2 ;sbit a1=P30;/P3 端口开关 sbit a2=P31;sbit a3=P32;sbit a4=P33;sbit a5=P34;比特a6=P35;比特a7=P36;比特a8=P37;比特b1=P10; /P1 端口蜂鸣器 sbit b2=P11;sbit b3=P12;无符号
13. char码表=0x80,0xf9,0x4c,0x60,0x31,0x22,0x02,0xf0,0x00,0x20;/数码管显示 void display() P2=tablenum2;/P2口数码管 void init() num2=9 ; TMOD=0X01; TH0=(65536-45872)/256; TL0=(65536-45872)/256; EA=1; ET0=1; TR0=1; flag=1;/全局变量P0=0xff;/P0 LED灯b1=1; P2=0xff;无效延迟(int z)/延迟程序int i,j; for(i=0;iz;i+) for(
14. j=0;j110;j+);void main() init(); while(flag) if(a1=0) delay(100);/调用延时程序消除抖动 if(a1=0)/判断开关a1是否按下flag=0; P0=0xfe;/对应的LED灯亮 b1=0;/蜂鸣器响 while(!a1);/按下时继续响 b3=0; b1=1; if(a2=0 )/同样判断a2延迟(100); if(a2=0) 标志=0; P0=0xfd; b1=0; while(!a2); b1=1; if(a3=0)/同样判断a3延时(100); if(a3=0) 标志=0; P0=0xfb; b1=0
15.; while(!a3); b1=1; if(a4=0)/同样判断a4延时(100); if(a4=0) 标志=0; P0=0xf7; b1=0; while(!a4); b1=1; if(a5=0)/同样判断a5延时(10); if(a5=0) 标志=0; P0=0xef; b1=0; while(!a5); b1=1; if(a6=0)/同样判断a6延时(10); if(a6=0) 标志=0; P0=0xdf; b1=0; while(!a6); b1=1; if(a7=0 )/同样判断a7延迟(10); if(a7=0) 标志=0; P0=0
16. xbf; b1=0; while(!a7); b1=1; if(a8=0)/同样判断a8延时(10); if(a8=0) 标志=0; P0=0x7f; b1 = 0; while(!a8); b1=1; while(!flag) EA=0; if(P3!=0xff)/按下时无开关发声或亮灯 b1=0; b2=0; 延迟(50); 否则b1=1; void t0_time() 中断 1 TH0=(65536-45872)/256; TL0=(65536-45872)/256; 数字1+; if(num1=20) num1=0; 数字2-; 展示( ); if(num2=0) EA=0; 标志=0;