八路抢答器设计.docx
《八路抢答器设计.docx》由会员分享,可在线阅读,更多相关《八路抢答器设计.docx(19页珍藏版)》请在冰豆网上搜索。
八路抢答器设计
河北科技师范学院
单片机原理及应用课程设计
八路抢答器设计
学院名称:
机电工程学院
专业名称:
电气工程及其自动化
学生姓名:
辛家康
学生学号:
0413120318
指导教师:
蔺志鹏
2015年01月09日
1前言
此次设计提出了用80C51单片机为核心控制元件,设计一个简易的抢答器,本方案以80C51单片机作为主控核心,与数码管、蜂鸣器等构成八路抢答器,利用了单片机的延时电路、按键复位电路、时钟电路、定时/中断等电路,设计的八路抢答器具有倒计时和实时显示抢答选手的号码的特点,还有复位电路,使其再开始新的一轮的答题和比赛。
它的功能实现是比赛开始,主持人读完题之后按下总开关,倒计时开始,此时数码管开始进行30s的倒计时,是选手的思考时间,倒计时完后,才允许开始抢答,若有人答题,对应的会在数码管上显示出该选手的编号并由蜂鸣器发出声音,在30s倒计时内答题无效。
2总体方案设计
图2.1总体电路设计框图
总体程序设计思路图为如图2.1所示。
复位电路:
当一轮进行完时,由主持人按下,下一轮倒计时开始,复位电路接P3.3口。
独立式按键键盘:
用于输入高低电平,连接到P1口,由P1口检测电平的变化。
抢答器倒计时显示电路:
有三位数码管组成,前两位显示30s倒计时,由第三位显示成功抢答选手编号。
蜂鸣电路:
有选手抢答成功,P3.1口发出脉冲,使蜂鸣器发出声音。
3硬件电路设计
3.1单片机最小系统
微控制器采用AT89C51。
AT89C51是美国ATMEL公司生产的与MCS-51系列单片机完全兼容的高性能CMOS8位单片机,MCS-51系列单片机以其推出时间早、配套资源丰富、开发手段完善、性价比高等特点而得到了广泛的应用,是单片机的主流品种。
AT89C51的内部资源主要包括:
·与MCS--51系列完全兼容的高性能8位CPU;
·4K字节可重复编程的Flash存储器;
·256字节的SRAM;
·4个8位的并行口,共32条I/O口线;
·3个16位的定时器/计数器;
·6个中断源,2个中断优先级的中断系统;
·一个全双工的串行口;
·内部振荡器;
·可编程串行通道
·低功耗的闲置和掉电模式
·片内振荡器和时钟电路
其最小系统主要包括复位电路,时钟电路,如下图3.1所示。
图3.1单片机最小系统电路图
3.2硬件电路功能说明
(1)复位电路的设计
MCS-5l的复位输入引脚RST为MCS-51提供了初始化的手段,可以使程序从指定处开始执行,在MCS-5l的时钟电路工作后,只要RST引脚上出现超过两个机器周期以上的高电平时,即可产生复位的操作.只要RST保持高电平,则MCS-5l循环复位.只有当RST由高电平变低电平以后。
MCS-51才从0000H地址开始执行程序。
本系统采用按键复位方式的复位电路。
复位电路:
当一轮进行完时,由主持人按下,下一轮倒计时开始,如图3.2所示。
图3.2复位控制电路
(2)独立式按键键盘设计
键盘接口中使用多少根I/O线,键盘中就有几个按键,键盘接口使用了8根I/O口线,该键盘就有8个按键,这种类型的键盘,其按键比较少,且键盘中各按键的工作互不干扰。
因此可以根据实际需要对键盘中的按键灵活的编码。
最简单的编码方式就是根据I/O输入口所直接反映的相应按键,按下的状态进行编码,称按键直接状态码,对于这样编码的独立式键盘,CPU可以通过直接读取I/O口的状态来获取按键的直接状态编码值,根据这个值直接进行按键识别,这样形式的键盘结构简单,按键识别容易。
独立式键盘的缺点是需要占用比较多的I/O口线,当单片机应用系统键盘中需要的按键比较少或I/O口线比较富余时,可以采用这样类型的键盘。
独立式按键键盘:
用于输入高低电平,八位选手抢答时高低电平发生变化,如图3.3所示。
图3.3抢答按键部分
(3)数码管显示部分设计
LED动态显示是单片机中应用最为广泛的一种显示方式,其接口电路是把所有显示器的8个笔划段a-dp同名端并联在一起,而每一个显示器的公共极COM是各自独立地受I/O线控制,CPU的字段输出口送出字形码时,所有显示器由于同名端并连接收到相同的字形码,但究竟哪个显示器亮,则取决于COM端,而这一端是由I/O控制的,所以就可以自行决定何时显示哪一位了,在轮流点亮扫描过程中,每位显示器的点亮时间表是极为短暂的,但由于人的视觉暂留现象及发光二极管的余辉将就尽管实际上各位显示器并非间时点亮,但只要扫描速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感。
抢答器倒计时显示电路:
有三位数码管组成,前两位显示30s倒计时,第三位显示成功抢答选手编号,如图3.4所示。
图3.4显示控制部分图
(4)蜂鸣器电路设计
我们知道,声音的频谱范围约在几十到几千赫兹,若能利用程序来控制单片机某个口线的“高”电平或低电平,则在该口线上就能产生一定频率的巨型波,接上喇叭就能发出一定频率的声音,若再利用延时程序控制“高”“低”电平的持续时间,就能改变输出频率,从而改变音调,使喇叭发出不同的声音。
单片机通过内部定时器的操作实现交替变换的波形输出驱动扬声器发声,有选手抢答成功,使蜂鸣器发出声音,如图3.5所示。
图3.5蜂鸣器提示时间部分图
4系统软件设计
系统软件分为主程序、中断服务程序和子程序三部分
4.1主程序(主程序流程框图见图4.1)
图4.1主程序流程框图
主程序是系统上电或复位后首先要执行的程序,主程序主要完成系统的初始化、扫描显示、扫描键盘等工作。
程序流程如图4.1所示,对单片机进行初始化,包括设置堆栈、倒计时30S设置、定时器T0设置,外部中断设置,键盘扫描设置,初始化状态时显示000。
4.2倒计时30s子程序:
(定时器T0中断子程序框图如图4.2所示)
图4.2定时器T0中断子程序框图
首先要把累加器ACC和程序状态字PSW放入堆栈保护,然后进行倒计时的设置,设置为30S倒计时,先看看1S到没,如果到,倒计时自动减1,并在数码管显示,再判断倒计时的30s到没,没到继续倒计时并显示,倒计时计完为止,然后弹出累加器ACC与程序状态字PSW,中断退出,返回到中断入口处。
4.3外部中断T1中断子程序:
(外部T1中断子程序框图如图4.3所示)
图4.3外部T1中断子程序框图
外部中断T1中断时要先把累加器ACC和程序状态字PSW放入堆栈保护,然后把20H标志位置0,再调用显示程序,T0开始定时,T1停止,然后设置30S倒计时,设置之后弹出累加器ACC与程序状态字PSW,中断退出,返回到中断入口处。
4.4定时器T1中断子程序:
(定时器T1中断程序框图如图4.4所示)
图4.4定时器T1中断程序框图
定时器T1中断时要先把累加器ACC和程序状态字PSW放入堆栈保护,然后就是响铃,接上喇叭,利用延时程序控制“高”“低”电平的持续时间,就能改变输出频率,从而改变音调,使喇叭发出不同的声音。
设置之后弹出累加器ACC与程序状态字PSW,中断退出,返回到中断入口处。
4.5选手按键程序:
(键盘扫描程序框图如图4.5所示)
图4.5键盘扫描程序框图
键盘扫描时先判断20H单元和21H单元标志位是否为0,是的话说明允许键盘扫描,否的话即不允许键盘扫描,不允许扫描就返回调用,结束,允许扫描时开始扫描P1口看有没有选手按下答题键,按下时此口变为低电平0,如果没有选手按键,则判断P1口有没有扫描完,没有扫描完就继续扫描,扫面完没有选手按下就检查20H和21H
4.6数码管显示程序:
(显示子程序框图如图4.6所示)
图4.6显示子程序框图
进入显示子程序先把选手的号码显示于01数码管,然后是选手的答题时间十秒钟倒计时显示,把个位显示在02数码管上,把十位显示在04数码管上,同时把倒计时的数值减1后存在61H和62H中,判断倒计时是否结束到0,结束的话返回调用,倒计时没有结束即继续倒计时。
5总结
这次课程设计老师给我们安排了两个星期的时间,可以说是比较充裕的。
虽然如此,我还是很用心的做设计程序,刚拿到题目,感觉太繁杂了,不知怎么下手,虽然这些知识以前都有接触过,但也只是分部分来接触,而这次的设计是要对前面几次实验的一个综合,真的很难。
也翻阅了一些资料,到图书馆翻阅了很多资料,可是还是一片空白,于是也在网上参考一些个程序,然后自己事先编写好了程序,到了周一去到机房时候,把自己写的程序烧进去芯片里面,发现不行,才知是我把段码地址搞错了,所以不能在数码管上正常显示。
通过运用单片机设计八路抢答器程设计,发现自己的很多不足,自己知识的很多漏洞,看到了自己的实践经验还是比较缺乏,理论联系实际的能力还急需提高。
参考文献
[1]康华光,邹寿彬.电子技术基础(数字部分)(第五版).高等教育出版社,2005
[2]康华光,邹寿彬.电子技术基础(模拟部分)(第五版).高等教育出版社,2005
[3]李朝青.单片机原理及接口技术[M].北京:
北京航空航天大学出版社,2005
[4]朱勇.单片机原理与应用技术.清华大学出版社,2006
[5]张毅刚,彭喜元等.新编MCS-51单片机应用设计(第二版).哈尔滨工业大学出版社,2006
[6]潭博学,苗江静.集成电路原理及应用.北京:
电子工业出版社,2003
[7]王庆有.光电传感应用技术.机械工业出版社,2007
[8]高峰.单片微机应用系统设计及实用技术[M].北京:
机械工业出版社,2004
[9]楼然苗,李光飞.51系列单片机设计实例.北京航空航天大学出版社,2006
[10]何书森,何华斌.实用电子线路设计速成[M].福州:
福建科学技术出版社,2006
附录A系统原理图
附录B源程序
KEY_OPENEQU20H
KEYEQU21H
BOOLEQUP3.1
ORG0000H
LJMPMAIN
ORG000BH
LJMPT0
ORG0013H
LJMPINT1
ORG0001BH
LJMPT1
MAIN:
MOVSP,#70H
MOVR1,#60H
MOVR5,#20
MOVA,#0
MOV59H,A
MOVTMOD,#21H
MOVTH0,#3CH
MOVTL0,#0B0H
MOVTH1,#7FH
MOVTL1,#7FH
CLRBOOL
CLRKEY
SETBIT1
SETBET0
SETBET1
SETBEX1
SETBEA
CLRKEY_OPEN
WAIT:
LCALLKEY_SCAN
LCALLDISPLY
SJMPWAIT
T0:
PUSHACC
PUSHPSW
MOVTH0,#3CH
MOVTL0,#0B0H
DJNZR5,T0END
MOVR5,#10
MOVA,59H
DECA
CJNEA,#0,L1
CLRTR0
SETBKEY
L1:
MOV59H,A
MOVA,#10
MOVB,A
MOVA,59H
DIVAB
MOVR1,#62H
DAA
MOV@R1,A
DECR1
MOVA,B
MOV@R1,A
LCALLDISPLY
T0END:
POPPSW
POPACC
RETI
T1:
PUSHACC
PUSHPSW
MOVR0,#20
DJNZR0,L2
LJMPT1END
L2:
CPLBOOL
T1END:
POPPSW
POPACC
RETI
INT1:
PUSHACC
PUSHPSW
CLRKEY_OPEN
MOVP1,#0FFH
LCALLDISPLY
MOV60H,#0
MOV61H,#0
MOV62H,#0
SETBTR0
CLRTR1
CLRKEY
MOV59H,#31
POPACC
POPPSW
RETI
KEY_SCAN:
JNBKEY,KEYEND0
JBKEY_OPEN,KEYEND0
JNBP1.0,KEY1
JNBP1.1,KEY2
JNBP1.2,KEY3
JNBP1.3,KEY4
JNBP1.4,KEY5
JNBP1.5,KEY6
JNBP1.6,KEY7
JNBP1.7,KEY8
LJMPKEYEND0
KEY1:
MOV60H,#1
LJMPKEYEND
KEY2:
MOV60H,#2
LJMPKEYEND
KEY3:
MOV60H,#3
LJMPKEYEND
KEY4:
MOV60H,#4
LJMPKEYEND
KEY5:
MOV60H,#5
LJMPKEYEND
KEY6:
MOV60H,#6
LJMPKEYEND
KEY7:
MOV60H,#7
LJMPKEYEND
KEY8:
MOV60H,#8
KEYEND:
SETBKEY_OPEN
SETBTR1
KEYEND0:
MOVP1,#0FFH
RET
DELAY:
MOVR7,#100
DS2:
MOVR6,#100
DJNZR6,$
DJNZR7,DS2
RET
DISPLY:
MOVR4,#3
MOVR1,#60H
MOVR3,#01H
LOOP1:
MOVA,R3
MOVDPTR,#9002H
MOVX@DPTR,A
MOVDPTR,#TAB
MOVA,@R1
MOVCA,@A+DPTR
MOVDPTR,#9004H
MOVX@DPTR,A
LCALLDELAY1
INCR1
MOVA,R3
RLA
JBACC.3,L3
MOVR3,A
LJMPLOOP1
L3:
MOVA,#01H
MOVR1,#60H
MOVR3,A
RET
TAB:
DB3FH06H5BH4FH66H6DH7DH07H
DB7FH6FH77H7CH39H5EH79H71H
DELAY1:
MOVR7,#350
DJNZR7,$
RET