单片机课程设计报告-基于单片机的八路抢答器(13页).doc

上传人:1595****071 文档编号:37140809 上传时间:2022-08-30 格式:DOC 页数:13 大小:338.50KB
返回 下载 相关 举报
单片机课程设计报告-基于单片机的八路抢答器(13页).doc_第1页
第1页 / 共13页
单片机课程设计报告-基于单片机的八路抢答器(13页).doc_第2页
第2页 / 共13页
点击查看更多>>
资源描述

《单片机课程设计报告-基于单片机的八路抢答器(13页).doc》由会员分享,可在线阅读,更多相关《单片机课程设计报告-基于单片机的八路抢答器(13页).doc(13页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、-单片机课程设计报告-基于单片机的八路抢答器-第 9 页单片机原理与应用技术课程设计报告基于单片机的八路抢答器专业班级:电气 143姓名:时 间:16.11.14 - 12.02指导教师:2016年12月2日 单片机课程设计任务书基于单片机控制的抢答器设计一 设计要求(一)基本功能1. 显示: 采用数码管可以显示抢答组别,同时蜂鸣器报警。2. 实现5组以上的抢答。(二)扩展功能1增加超前违规抢答警示功能2增加答题时间限制功能二计划完成时间 三周1第一周完成软件和硬件的整体设计。2第二周完成软件的具体设计和硬件的制作。3第三周完成软件和硬件的联合调试。五路抢答控制器设计要求:显示抢答组别同时蜂鸣

2、器报警。主要元件:数码管1块、按键7个、蜂鸣器1个 目 录1.摘要.12.引言.13.总体设计方案.1 3.1设计方案.1 3.2设计框图.1 3.3设计流程图.24.设计原理分析.3 4.1单片机最小系统.3 4.2电源电路.3 4.3蜂鸣器电路.4 4.4按键扫描电路.4 4.5数码管显示及驱动电路.5 4.6PCB布线注意问题.65. 总结.76.参考文献.87.附录.9 7.1原理图.9 7.2PCB图.10 7.3仿真图.11 7.4程序.12基于单片机控制的抢答器设计摘要:本文设计是以STC89C52RC单片机为核心进行的八路抢答器设计。我们采用0.56寸或0.36寸四位一体共阳数

3、码管进行显示抢答和计时情况,蜂鸣器进行报警,拥有抢答,复位,超前违规报警,设置抢答时间等多项功能。用74HC245进行段选和位选驱动(也可用三极管8550驱动位选),为避免接过多上拉电阻我用P3,P1口分别输出位选和段选信号,相比一般数字电路的抢答器具有结构简单、功能强大、可靠性好、实用性强等特点,对同类产品也具有布局更合理,材料更经济,可靠性更高,可扩展潜能更大等特点。关键词:STC89C52RC 四位一体共阳数码管 74HC245 八路抢答器引言我们注意一下就会发现我们生活中所用的大部分有电子产品中都会找到单片机的身影。手机、电话、计算器、家用电器、电子玩具、电脑以及鼠标等电子产品中都含有

4、单片机。 所谓单片机就是微型计算机,又称单片微控制器,英文缩写MCU,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。概括的讲:一块芯片就成了一台计算机。它最早是被用在工业控制领域,具体积小、质量轻、价格便宜等优点。为学习、应用和开发提供了便利条件。现在的一些电视综艺节目及许多竞赛中在做抢答时都会用到各式抢答器。因为在抢答中,只靠人的视觉或听觉是很难判断出哪一组或哪一个选手先抢答到或者提前抢答犯规及抢答时间的把握。因此在抢答过程中,为了更确切的知道哪一组或哪一位选手先抢答到题等问题,就必须要有一个抢答系统来完成这个任务。然而利用数字电路设计的抢答器很难满足现实需求,因此需

5、要单片机编程来设计抢答器。即使两组的抢答时间相差几微秒,也能轻松的分辨出哪一组或哪个选手先抢答到题的,还可以通过编程实现倒计时,违规,报警提示等现实需求。综合而言通过单片机编程实现的抢答器性价更好,更能适应时代的发展。本论文主要讨论用STC89C52单片机如何设计八路抢答器,并给出整个过程中需要注意的问题,解决方法和本次课程设计的思考。 3、总体设计方案3设计思路3.1设计方案(1) 基于stc89c52的多路抢答器设计方案比较多,但是原理和各模块的硬件电路都是一致的,在参考大量成熟硬件设计方案和多数c编程及汇编编程之后,经我们组讨论最终确定用C语言作为编程语言,根据四位一体共阳数码结构我们采

6、用P3口作为位控制和蜂鸣器及开始设置按键控制口,P1口为段控制口,P2口作为抢答按键控制口,并设计电源电路和单片机最小系统。软件方面主要根据硬件设计及任务要求进行编程。建议在不能确定程序和设计一定正确的条件下,一定要根据硬件大致电路先做出程序进行仿真,仿真确定没大问题再进行实物操作,不然将会出大问题。Stc89C52RC3.2设计框图数码管显示最小系统及电源电路抢答按键主持人按键图1设计框图3.3设计流程图开始初始化是否有抢答 否是否开始? 否 是 数码管显示倒计时有抢答是数码管显示蜂鸣器报警复位关电源结束图2设计流程图4、设计原理分析4.1单片机最小系统和复位按键图3(1)阻容复位时,电容推

7、荐为10uf,电阻10K; RC/RD+ 系列单片机RST 脚内部没下拉电阻,必须用此10K电阻。我们根据器材选用22uf有极性电容即C1有极性。RST是硬件复位端,只要将该端持续4个机器周期的高电平即可实现复位,只有当RST由高电平变低电平以后单片机才从0000H地址开始执行程序,其它寄存器也回到初始值,所以倒计时的设置复位就无法使用RST了,只能在程序中进行复位设计。(2)单片机必须在时钟的驱动下才能工作.在单片机内部有一个时钟振荡电路,需要外接一个振荡源就能产生一定的时钟信号送到单片机内部的各个单元,决定单片机的工作速度。晶振推荐用11.0592M ,电容无极性47pf。我们这里晶振用1

8、2M,C2、C3无极性电容30pf,时钟周期为十二分之一微秒,这也造成扫描时间上的一定误差,这也印证了无论使用多么先进的设备公平永远都是相对的。如果选用较大晶振一定要参考所用单片机官方资料,以免造成不便。(3)建议测试电路中先测试这一块,晶振脱焊能造成数码管显示不正确,C2、C3的作用是帮助起震和对振荡器的频率进行微调,若搞成有极性电容会使整个电路都不工作,c1接反可能会爆吧!R6电阻若低于4.7k会使复位键失效。4.2电源电路图4(1) 不少人为了省事就不做这部分电路了。确实有点鸡肋的感觉,事实上这部分电路对整个硬件电路安全至关重要,在相对复杂点的电路把电源电路和其它硬件电路做成两个独立的电

9、路,只有电源电路正常通电之后其它电路才可以通电,即各用一个自锁开关,LED灯控制指示电路通断,这样可以有效避免误操作造成的硬件电路损伤。4.3蜂鸣器电路图6上图中蜂鸣器采用PNP三极管驱动,在整体电路驱动中用的是74HC245驱动,由于信号不一致在仿真中要根据驱动不同修改关于蜂鸣器的程序。限流电阻一般选1k左右,我用的2K的,3002400欧姆都可以,PCB封装时注意三脚要留有足够距离。3.4按键扫描电路设计图7(1) 我们采用的是8个独立按键作为选手抢答按键,2个独立按键为开始键和设置键。Key7、key8复用减加键,可调范围为099。当选手过多时可以采用矩阵按键,这样可以减少I/O口的占用

10、。在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。这样,一个端口(如P2口)就可以构成1X8个按键,比之直接将端口线用于键盘多出了一倍,而直接用端口线则只能多出一键。我们生活中无论是抢答器还是其它的一些电子器件只要用到按键较多时都是采用矩阵式按键,当然采用按键越多(矩阵)编程就越复杂扫描时间就越长,所造成的误差就越大,对选手越不公平,一般情况使用者都会自动忽略,也不会影响使用,而作为开发者就需要思考如何让产品更好,一些问题也会时间的发展迎刃而解,比如新材料,新的设计思路的发现。(2) 为了让产品更具实用性可以在每个选手按键加上对应LED灯,方便确认几号选手是谁,

11、同样不要忘记加限流电阻,若让在倒计时中灯不会因独立按键弹起而熄灭可以用p0口控制LED灯亮灭。永远没有最好的产品只有更好的。4.5驱动及数码管显示电路图8(1)数码管动态显示接口是单片机中应用最为广泛的显示方式之一,动态驱动是将所有数码管的8个显示笔划“a,b,c,d,e,f,g,dp”的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会

12、亮。通过分时轮流控制各个数码管的的COM端,就使各个数码管轮流受控显示,这就是动态驱动。 在轮流显示过程中,每位数码管的点亮时间为12ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,这和我们电灯使用50hz交流电却看着是一直亮是同样的道理。动态显示的效果和静态显示效果是一样的,能够节省大量的I/O端口,而且功耗更低,只不过增加了软件方面的难度。各个数码管的段码都是P1口输出,即各个数码管输入的段码都是一样的,p3.3p3.6控制位选,因为要做实物,在连线时要以方便pcb布线为原则,软件编

13、程次之,尤其是单面板布线时。 (2)数码管显示如果出现乱码或不显示情况,数码光乱码有以下几种情况1. 程序动态扫描不对造成覆盖。2. .程序段选(位选)和实际段选(位选)不对应,位选不对应一般可以直接看出,段选就需要实际去仔细检查电路与程序进行排除或重新定义位选和段选。3. .换不同驱动如用PNP三极管代替245芯片做驱动而程序修改不对也会造成乱码。4. 焊接不好造成虚焊和脱焊,易造成某一笔画不显或某一个数码管不亮,这个还好排除。5. 如果用P0口的话不接上拉10k电阻或少接一个则会不显示或出现4的情况。6. 驱动没接好,如245芯片使能端或DIL接的不对,244单向输出接不好都会造成数码管不

14、显示。7. 数码共阳共阴错也会造成显示混乱或不显示8. 根据实际测试stc89C52RC段选不用驱动的情况可以点亮0.36寸,0.56寸共阳四位一体数码管,亮度基本一致,不能驱动两个0.56寸四位一体共阳数码管。9. 仿真时在确定其它均无问题后还出现全部都点亮,功能显示乱码,而下载到实际电路没有问题,有可能动画帧过快,在系统设置中更改。程序中延时时间过少也会形成扫描覆盖造成乱码。我做的过程大致就发现了这些数码显示问题。4.6部分原件注意问题和PCB布线问题(1)独立按键,我用的时候在库里直接用的,它是两短脚内部连在一起开始也没注意,最后又重新改了之后打印的。在这里要注意一下,越是简单的越容易出

15、错。图9(2)驱动芯片74HC245图10(3) 布线因为是单面板布线,布顶层和底层都可以,一般情况下做原理图连线时要考虑到PCB图布线,以PCB布线方便为为原则,这样可以在单层不线条件下有效的避免跳线,好多同学直接用原理图生产PCB图,跳线一大堆,不仅影响美观还容易焊接出错。(3) PCB布线先自动布线,线宽尽量粗一些,细了腐蚀容易断,看看自动布线电脑怎么布的线,再手动布一部分,再自动布,再手动布一部分一直到布完,最后在看着调整不满意的部分,我感觉这样布要比纯手动或纯自动布要好多。(4) PCB布线时要利用好原理图原件位置,大部分保持一致,当跳线不可避免时 在做原理图时就要计划好,比如跳线较

16、多时如何集中一部分去避免另一部分,再基于同类原件放一块的原则。总结经过这次单片机课程实习我发现了很多问题,第一我们所做的东西都是比较成熟的,就是这些东西为什么还是感到如此之难?这是一个值得思考的问题,假如我们从事相关方面的工作如怎么可能胜任,毕业即失业绝不是玩笑,多少年的东西年年如此,年年应付而不去思考用正确的方法解决学校学生都有责任。年年都有实习如果我们把年年实习的各种问题及解决方法和无法解决的甚至一些假想总结起来印成书册,把一些操作做成视频一起放到图书馆,这样就可以有效避免以上问题。虽然我们组把东西做出来了,但还有很多东西需要学习,有些还可以做的更好,更完善。这里感谢每一个指导老师的努力,

17、谢谢。参考文献1. 陈小忠、黄宁、赵小侠. 单片机接口实用子程序,【M】北京:人民邮电出版社,20052. 孙育才、孙华芳、王荣兴,单片机原理及其应用,【M】北京:电子工业出版社,20063. 周润景、袁伟亭、景晓松,Proteus在MCS-51&arm7系统中的应用百例,【M】北京:电子工业出版社,20064. 高峰. 单片微机应用系统设计及实用技术【M】.北京:机械工业出版社,20045.何书森、何华斌. 实用电子线路设计速成 【M】福州:福建科学技术出版社,20066.谭浩强.C程序设计(第四版)北京:清华大学出版社附录1原理图 2.PCB图3.仿真图4.程序1.#include 2.#

18、define uchar unsigned char 3.#define uint unsigned int /数码管段选定义 0 1 2 3 4 5 6 7 8 94. uchar code smg_du=0x05,0xdd,0x46,0x54,0x9c,0x34,0x24,0x5d,0x04,0x14,5. 0x0c,0xa4,0x27,0xc4,0x26,0x2e,0xff; /断码6. sbit smg_we1 = P33; 7. sbit smg_we2 = P34;8. sbit smg_we3 = P35;9. sbit smg_we4 = P36;10. sbit beep =

19、 P37; 11. uchar flag_start; 12. uchar flag_weigui; 13. uchar dis_smg4 = 0xc0,0xbf,0xa4,0xb0; 14. uchar smg_i = 4; 15. uchar miao,s_time=30; 16. uchar flag_num; 17. uchar menu_1 ; 18. bit flag_200ms = 1; 19. uchar flag_qd_en; 20. uchar i;21. /*数码管位选函数*/22. void smg_we_switch(uchar i)23. switch(i)24.

20、case 0: smg_we1 = 0; smg_we2 = 1; smg_we3 = 1; smg_we4 = 1; break;25. case 1: smg_we1 = 1; smg_we2 = 0; smg_we3 = 1; smg_we4 = 1; break;26. case 2: smg_we1 = 1; smg_we2 = 1; smg_we3 = 0; smg_we4 = 1; break;27. case 3: smg_we1 = 1; smg_we2 = 1; smg_we3 = 1; smg_we4 = 0; break;28. void delay_1ms(uint

21、q)29. uint i,j;30. for(i=0;iq;i+)31. for(j=0;j 1)80. menu_1 = 0;81. if(key_can1 = 9) 82. flag_start = 1;83. for(i=0;i2;i+)84. beep = beep;85. delay_1ms(20);86. if(key_can 9)87. if(menu_1 = 0)88. if(flag_qd_en = 0) 89. if(key_can = 1)90. flag_num = 1; 91. if(key_can = 2)92. flag_num = 2; 93. if(key_c

22、an = 3)94. flag_num = 3; 95. if(key_can = 4)96. flag_num = 4; 97. if(key_can = 5)98. flag_num = 5; 99. if(key_can = 6)100. flag_num = 6; 101. if(key_can = 7)102. flag_num = 7; 103. if(key_can = 8)104. flag_num = 8; 105. for(i=0;i= 99)115. s_time = 99;116. dis_smg0 = smg_dus_time % 10;117. dis_smg1 =

23、 smg_dus_time / 10 % 10;118. if(key_can = 7)119. if(s_time 3)120. s_time - ;121. miao = s_time;122. dis_smg0 = smg_dus_time % 10; 123. dis_smg1 = smg_dus_time / 10 % 10;124. /*倒计时处理*/125. void djs_dis() 126. static uchar value;127. if(flag_start = 1) & (flag_weigui = 0)128. value +;129. if(value = 5

24、) 130. value = 0;131. if(miao != 0)132. miao -; 133. if(miao = smg_i)142. i = 0;143. P1 = 0xff; 144. smg_we_switch(i);145. P1 = dis_smgi;146. /*定时器0初始化程序*/147. void time_init()148. EA = 1; 149. TMOD = 0X01; 150. ET0 = 1; 151. TR0 = 1; 152. /*主程序*/ 153. void main()154. static uchar value;155. beep =

25、0; 156. delay_1ms(100);157. P0 = P1 = P2 = P3 = 0XFF; 158. time_init(); 159. miao = s_time;160. while(1)161. if(flag_weigui = 0)162. key(); 163. key_1(); 164. if(key_can 20) | (key_can1 20)165. key_with(); 166. if(flag_200ms = 1)167. flag_200ms = 0;168. if(menu_1 = 0)169. dis_smg3 = smg_dumiao / 10 % 10;170. dis_smg2 = smg_dumiao % 10;171. dis_smg1 = 0xfe;172. dis_smg0 = smg_duflag_num;173. if(flag_weigui = 1) 174. dis_smg3 = smg_du15;175. dis_smg2 = smg_du15;176. if(value = 0) 177. value = 1;178. for(i=0;i= 100)191. value = 0;192. flag_200ms = 1;

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 小学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁