HEFEI UNIVERSITY
四路抢答器仿真设计
题 目 四路抢答器仿真设计 班 级 自动化(1)班 成 员 YCT 11050310**
PT 11050310** WW 11050310**
时 间 2014.5.19
四路抢答器仿真设计
四路抢答器仿真设计
目录
一、 前言 ........................................ 1 二、 方案设计 .................................... 1 三、 理论分析 .................................... 2 四、 电路设计 .................................... 2 1、晶体振荡器电路 .............................. 2 2、复位电路 .................................... 3 3、按键扫描部分 ................................ 3 4、 显示部分 ................................... 4 五、软件模块 ..................................... 6 六、系统组装调试 ................................. 8 七、总结 ......................................... 8 参考文献 ......................................... 9 附录 ............................................ 10
四路抢答器仿真设计
四路抢答器仿真设计
一、前言
本设计要求能够在主持人按下开始键后,四个参赛者开始抢按自己的按键,谁的按键先按下,谁面前的灯就会亮并且有相应的提示,当参赛者耗时太多时又会有相应的提示。根据设计的要求,本系统采用独立式按键,通过单片机不停的扫描按键来控制LED灯和蜂鸣器,并用定时器T0来定超时的时间,当超时的时候让蜂鸣器响。
二、方案设计
(1)、总体设计
方案一:采用可编程I/O口扩展芯片8255
8255作为单片机的扩展接口能实现很多功能,但是这个系统并不复杂,用8155会浪费很多的资源,而且8255要用P0和P2端口作为地址线对它进行读写,这样不仅浪费端口还使得编程变的复杂。从节省资源和简化编程的角度考虑,放弃了此方案。
方案二:直接采用AT89C52单片机
直接用单片机不仅编程被简化,还有效的利用了各个端口。8051单片机的资源完全够这个系统的要求。所以最终选择了此方案。 (2)、模块
方案一:采用4*4矩阵键盘
此种键盘是常用的按键扫描方法,但是本系统只需要六个按键,这样就会浪费十个,而且矩阵按键扫描要送数读数,对于编程很复杂,最终放弃了此方案。 方案二:采用独立式键盘
本系统只要六个按键就可以,用独立式键盘不仅节省端口还使编程变得简单。程序只要不停的读数检查就行。所以,最终选择此方案。
1
四路抢答器仿真设计
2、系统总体设计方案与实现框图
采用六个独立式的键盘作为按键输入,当在开始后有按键按下时,就会有对应于这个按键的灯亮并且蜂鸣器响一声,其它按键再按也无效。十秒之后如不清除,蜂鸣器就会一直响,提示已经到时间。框图如图1。
独立式按键部分 按键扫描 单片机处理 显示部分
图1
三、理论分析
51单片机的端口上电是高电平,而且当外部没有输入时能自动的弹跳到高电平,所以通过按键所接端口的高低电平变化可以判断出哪个按键按下了。
独立按键 P1口电平变化 单片机识别
图2
四、电路设计
1、晶体振荡器电路
晶体振荡器电路给数字钟提供一个频率稳定准确的12MHz的方波信号,可保证数字钟的走时准确及稳定。不管是指针式的电子钟还是数字显示的电子钟都使用了晶体荡器电路。本设计中的震荡电路如图3所示。
2
四路抢答器仿真设计
图3
2、复位电路
MCS-51单片机的复位是由外部的复位电路来实现的。上电复位电路是—种简单的复位电路,只要在RST复位引脚接一个电容到VCC,接一个电阻到地就可以了。上电复位是指在给系统上电时,复位电路通过电容加到RST复位引脚一个短暂的高电平信号,这个复位信号随着VCC对电容的充电过程而回落,所以RST引脚复位的高电平维持时间取决于电容的充电时间。为了保证系统安全可靠的复位,RST引脚的高电平信号必须维持足够长的时间。上电自动复位是通过外部复位电路的电容充电来实现的。只要Vcc的上升时间不超过1ms,就可以实现自动上电复位。电路如图4所示。
图4
3、按键扫描部分
单片机不停的扫描P1口的电平变化,当有按键按下时,对应的I/O口会跳
变为低电平,单片机检测到后,经过处理将作出相应的显示。电路如图5所示
3
四路抢答器仿真设计
图5
4、显示部分
根据按键按下的情况LED作出相应的亮灭,蜂鸣器作出相应的反应。当主持人按键按下启动后,当第一组按下时,则灯D1亮,并蜂鸣器响一声,数码管开从0、8、7......0计时,到零后蜂鸣器响两声,提示选手作答时间结束。开始下一轮抢答,如图6、图7所示。
图6
4
四路抢答器仿真设计
图7
5
四路抢答器仿真设计
五、软件模块
本系统用了定时器0,下图为程序流程图。
6
四路抢答器仿真设计
开始 初始化 开始键是否按下 1号是否按灯1亮,响声提示 二号是否按灯2亮,响声提示 三号是否按下 四号是否按下 灯3亮,响声提示 灯4亮,响声提示 延时十秒 清除键是否按下 蜂鸣器响 返回初始 图8
7
四路抢答器仿真设计
六、系统组装调试
在protues仿真界面中,选择系统所需的元器件,然后根据软件设计的内容把各元件与单片机对应的端口连接在一起,然后下载hex文件,运行后的结果如图9所示:
图9
七、总结
本次设计按照题目要求,基于单片机,利用较合适的控制算法,成功的实现了抢答器的基本功能。在这次仿真比赛中,我们也遇到了不少问题,特别是在模块化编程中经常编译通不过,但经过我们不断的调试和查询相关的资料,最终解决了问题,可以说通过这次的比赛,我们更加熟练的掌握模块化编程的技巧,同时也让我们体会到模块化编程的好处。同时,我们这次把51单片机中断功能也熟练的掌握了,我们发现当功能越多时,低速度单片机就有点繁忙了,所以我们打算学习速度快的单片机,如C8051、AVR.。在编程中,我们学会了一些编程技巧,同时我们也掌握了KEIL中编译常见错误的原因,为我们在以后编程中迅速排查错误打下了一定的基础。
8
四路抢答器仿真设计
参考文献
[1] 张毅刚主编. 单片机原理及应用.北京:高等教育出版,2004
[2] 求是科技编著. 单片机典型模块设计实例导航.第2版.北京:人民邮电出
版,2008
[3] 郭天祥编著.51单片机C语言教程.北京:电子工业出版社,2009 [4] 彭伟编著.单片机C语言程序设计实训100例.北京:电子工业出版社,2009 [5] 华中科技大学电子技术课程组编.康光华主编. 电子技术基础.模拟部分.
第2版.北京:高等教育出版,2006
9
四路抢答器仿真设计
附录
源程序
#include /*************全局变量*******************/ #define uint unsigned int #define uchar unsigned char sbit key1 = P1^0; sbit key2 = P1^1; sbit key3 = P1^2; sbit key4 = P1^3; sbit led1 = P2^0; sbit led2 = P2^1; sbit led3 = P2^2; sbit led4 = P2^3; sbit spk = P2^4; uchar num; uchar code p[]={ 0xc0,0x80, 0xd8,0x82, 0x92,0x99, 0xb0,0xa4, 0xf9,0xc0}; /***************函数声明*****************/ void delay(uint); void display(); /*****************主函数******************/ void main() { TMOD=0X01; //设置定时器0工作方式1 TH0=(65536-45872)/256; //装初值11.0592晶振定时为50ms 数位45872 TL0=(65536-45872)%256; EA=1; //开总中断 ET0=1; //开定时器0中断 TR0=0; //启动定时器0 while(1) { while(key1==0) //第一组按键被按下 { TR0=1; 10 四路抢答器仿真设计 led1=0; P0=0xf9; spk=0; delay(500); spk=1; display(); } while(key2==0) //第二组按键被按下 { TR0=1; led2=0; P0=0xa4; spk=0; delay(500); spk=1; display(); } while(key3==0) //第三组按键被按下 { TR0=1; led3=0; P0=0xb0; spk=0; delay(500); spk=1; display(); } while(key4==0) //第四组按键被按下 { TR0=1; led4=0; P0=0x99; spk=0; delay(500); spk=1; display(); } } } /************数码管显示***********/ void display() { 11 四路抢答器仿真设计 uint i=0,j; do { if(num==20) { num=0; P3=p[i++]; if(i==11) { j=i; i=0; P3=0xc0; } } } while(j<10); TR0=0; j=0; spk=0; delay(400); spk=1; delay(400); spk=0; delay(400); P0=0Xff; P2=0xff; P3=0xff; delay(100); } /**********毫秒延时***************/ void delay (uint xms) { uint i,j; for(i=xms;i>0;i--) for(j=110; j>0; j--); } /**********中断子程序***************/ void T0_time()interrupt 1 { TH0=(65536-45872)/256; //重装初值 TL0=(65536-45872)%256; num++; } 12 因篇幅问题不能全部显示,请点此查看更多更全内容