《单片机原理及应用》课程设计报告--基于单片机的8组抢答器设计

《单片机原理及应用》课程设计报告--基于单片机的8组抢答器设计本文简介:《单片机原理及应用》课程设计报告学院:源与动力工程学院__班级:______建电1001_____目录任务书1第一章方案设计2第二章硬件系统设计3第三章软件设计4第四章系统调试5小结6附录1:原理图7附录2:源程序8《单片机原理及应用》课程设计任务书题目:基于单片机的8组抢答器设计设计要求:(1)抢
《单片机原理及应用》课程设计报告--基于单片机的8组抢答器设计本文内容:
《单片机原理及应用》
课程设计报告
学
院:
源与动力工程学院__
班
级:______建电1001_____
目
录
任务书1
第一章方案设计2
第二章硬件系统设计3
第三章软件设计4
第四章系统调试5
小
结6
附录1:原理图7
附录2:源程序8
《单片机原理及应用》课程设计
任务书
题
目:基于单片机的8组抢答器设计
设计要求:(1)抢答人数为八组,即有八个抢答按键,以及主持人复位按钮。
(2)每次抢答有声音提示,提示显示抢答组号。
第一章
方案设计
主要设计内容如图所示
复位电路:当一轮进行完时,由主持人按下,下一轮开始,复位电路接P3.2口。
独立式按键键盘:用于输入高低电平,连接到P2口,由P2口检测电平的变化。
选手组别显示电路:有1位数码管组成,显示成功抢答选手编号。
蜂鸣电路:有选手抢答成功,P3.5口发出脉冲,使蜂鸣器发出声音。
蜂鸣电路
AT89C51
复位电路///主持人案件
选手组别显示电路
独立式按键键盘
第二章
硬件系统设计
一
单片机最小系统
微控制器采用AT89C51。AT89C51是美国ATMEL公司生产的与MCS-51系列单片机完全兼容的高性能CMOS
8位单片机,MCS-51系列单片机以其推出时间早、配套资源丰富、开发手段完善、性价比高等特点而得到了广泛的应用,是单片机的主流品种。
AT89C51的内部资源主要包括:
·与MCS--51
系列完全兼容的高性能8位CPU;
·4K字节可重复编程的Flash存储器;
·256字节的SRAM;
·4个8位的并行口,共32条I/O口线;
·3个16位的定时器/计数器;
·6个中断源,2个中断优先级的中断系统;
·一个全双工的串行口;
·内部振荡器;
·可编程串行通道
·低功耗的闲置和掉电模式
·片内振荡器和时钟电路
其最小系统主要包括复位电路等,如下图所示。
二
硬件电路设计说明
1
复位电路设计:本设计采用按键复位的方式进行复位,把SW1连接到P3.2,通过拨动SW1来改变高低电平,从而进行复位。
2独立式按键键盘设计:键盘接口中使用多少根I/O线,键盘中就有几个按键,键盘接口使用了8根I/O口线,该键盘就有8个按键,这种类型的键盘,其按键比较少,且键盘中各按键的工作互不干扰。因此可以根据实际需要对键盘中的按键灵活的编码。本设计将P2口连接到按键键盘,抢答时高低电平发生变化。
3
显示电路设计:利用ZLG7290进行数码管显示。将P3.0和SDA连接,P3.1和SCL连接,P3.7和/RST连接。
4
蜂鸣器电路设计:声音的频谱范围约在几十到几千赫兹,若能利用程序来控制单片机某个口线的“高”电平或低电平,则在该口线上就能产生一定频率的巨型波,接上喇叭就能发出一定频率的声音。本设计将蜂鸣器与P3.5口连接,在选手抢答时,驱动蜂鸣器工作。
第三章
软件设计
系统软件分为主程序、中断服务程序和子程序三部分。抢答器的电路设计需要两个循环,当没有准备好的时候不能抢答,这里需要一个循环,知道准备好之后才能进行下面的程序。第二个循环是选手的抢答循环,利用标志位来进行,当标志位为零时,则向下运行,进行显示电路和蜂鸣器的工作,若是标志位不为零,则一个一个的循环八个选手,直到
有人抢答为止。
第四章
系统调试
说明调试中遇到的问题集解决方案
1
程序编写完成运行没有错误后,进行了调试,但是第一次调试时什么效果都没有。我就考虑到不是程序上的错误,那就肯定是接线上的错误。查看了接线,果然是把P1口和P2口接反了。
2
修改接线之后,数码管不亮,经过老师讲解才知道,我们要想点亮数码管,必须使用ZLG7290。于是我在程序中又插入了这段程序,使数码管点亮。
3
修改完第二个错误之后,我的抢答器终于工作了,但是还是有问题,按键、LED灯、数码管显示效果不对应,总是反在里面。因为发现按动一号键是八号灯亮,而按动八号键是一号灯亮,在排除接线错误之后。我发现是在循环的那一部分出现了问题,把驱动LED的编码写反了,修正了之后抢答器终于正确工作了。
小
结
这次课程设计老师给我们安排了一个星期的时间,可以说是比较充裕的。虽然如此,我还是很用心的做设计程序,刚拿到题目,感觉太繁杂了,不知怎么下手,虽然这些知识以前都有接触过,但也只是分部分来接触,而这次的设计是要对前面几次实验的一个综合,真的很难。也翻阅了一些资料,到图书馆翻阅了很多资料,可是还是一片空白,于是也在网上参考一些个程序,然后自己事先编写好了程序,到了周一去到机房时候,把自己写的程序烧进去芯片里面,发现不行,才知是我把段码地址搞错了,所以不能在数码管上正常显示。通过运用单片机设计八路抢答器程设计,发现自己的很多不足,自己知识的很多漏洞,看到了自己的实践经验还是比较缺乏,理论联系实际的能力还急需提高。
附录1:原理图
附录2:源程序
OK
BIT
20H
KEY
EQU
30H
KEY1
BIT
P2.0
KEY2
BIT
P2.1
KEY3
BIT
P2.2
KEY4
BIT
P2.3
KEY5
BIT
P2.4
KEY6
BIT
P2.5
KEY7
BIT
P2.6
KEY8
BIT
P2.7
RING
BIT
P3.5
SDA
BIT
P3.0
SCL
BIT
P3.1
RST
BIT
P3.6
MTDEQU
63H
ZLG7290EQU70H
ACKBIT10H
SLADATA60H
SUBADATA61H
NUMBYTEDATA62H
ORG
000H
SJMP
MAIN
ORG
003H
LJMP
INT_0
ORG
030H
MAIN
:SETB
EA
SETB
EX0
SETB
IT0
CLR
OK
CLR
RING
LCALL
RE7290
DD:JNB
OK,$
D0:
MOV
A,P2
CJNE
A,#0FFH,D1
SJMP
D0
D1:
JB
ACC.0,D2
MOV
KEY,#1
MOV
P1,#0FEH
SETB
RING
SJMP
D9
D2:JB
ACC.1,D3
MOV
KEY,#2
MOV
P1,#0FDH
SETB
RING
SJMP
D9
D3:
JB
ACC.2,D4
MOV
KEY,#3
MOV
P1,#0FBH
SETB
RING
SJMP
D9
D4:JB
ACC.3,D5
MOV
KEY,#4
MOV
P1,#0F7H
SETB
RING
SJMP
D9
D5:JB
ACC.4,D6
MOV
KEY,#5
MOV
P1,#0EFH
SETB
RING
SJMP
D9
D6:
JB
ACC.5,D7
MOV
KEY,#6
MOV
P1,#0DFH
SETB
RING
SJMP
D9
D7:
JB
ACC.6,D8
MOV
KEY,#7
MOV
P1,#0BFH
SETB
RING
SJMP
D9
D8:
JB
ACC.7,D9
MOV
KEY,#8
MOV
P1,#07FH
SETB
RING
SJMP
D9
D9:
CLR
OK
MOV
66H,KEY
LCALL
LEDDISP
LJMP
DD
INT_0:SETB
OK
CLR
RING
MOV
P1,#0FFH
MOV
KEY,#0
MOV
66H,KEY
LCALL
LEDDISP
RETI
leddisp:push
psw
push
acc
setb
rs1
setb
rs0
mov
r0,#66H
mov
r4,#8
mov
r5,#60h
loop:
MOV
MTD,R5
MOV
MTD+1,@R0
MOV
SLA,#70H
MOV
SUBA,#07H
MOV
NUMBYTE,#02H
LCALL
IWRNBYTE
LCALL
DELY1
INC
R0
INC
R5
DJNZ
R4,LOOP
POP
ACC
POP
PSW
RET
re7290:
clr
rst
lcall
dely
setb
rst
lcall
dely
ret
dely
:mov
r7,#80H
min
:djnz
r7,ys500
ret
ys500
:lcall
ys500us
ljmp
min
ys500us:mov
r6,#80h
djnz
r6,$
ret
dely1
:mov
r7,#40h
djnz
r7,$
ret
;启动I2C总线子程序
START:
nop
nop
nop
SETB
SDA
NOP
SETB
SCL
;起始条件建立时间大于4.7us
NOP
NOP
NOP
NOP
NOP
CLR
SDA
NOP
;起始条件锁定时大于4us
NOP
NOP
NOP
NOP
CLR
SCL
;钳住总线,准备发数据
NOP
nop
nop
RET
;结束总线子程序
STOP:
NOP
NOP
NOP
CLR
SDA
NOP
SETB
SCL
;发送结束条件的时钟信号
NOP
;结束总线时间大于4us
NOP
NOP
NOP
NOP
SETB
SDA
;结束总线
NOP
;保证一个终止信号和起始信号的空闲时间大于4.7us
NOP
NOP
NOP
nop
nop
RET
;检查应答位子程序
;返回值,ACK=1时表示有应答
CACK:NOP
NOP
NOP
SETB
SDA
NOP
NOP
SETB
SCL
CLR
ACK
NOP
NOP
MOV
C,SDA
JC
CEND
SETB
ACK
;判断应答位
CEND:NOP
CLR
SCL
NOP
nop
nop
RET
;发送字节子程序
;字节数据放入ACC
;每发送一字节要调用一次CACK子程序,取应答位
WRBYTE:
MOV
R7,#08H
WLP:
RLC
A
;取数据位
JC
WR1
SJMP
WR0
;判断数据位
WLP1:
DJNZ
R7,WLP
NOP
RET
WR1:
SETB
SDA
;发送1
NOP
SETB
SCL
NOP
NOP
NOP
NOP
NOP
CLR
SCL
SJMP
WLP1
WR0:
CLR
SDA
;发送0
NOP
SETB
SCL
NOP
NOP
NOP
NOP
NOP
CLR
SCL
SJMP
WLP1
;向器件指定子地址写N字节数据
;入口参数:
器件从地址SLA、器件子地址SUBA
、发送数据缓冲区MTD、发送字节数NUMBYTE
;
占用:
A
、R0
、R1
、R3
、CY
IWRNBYTE:
MOV
A,NUMBYTE
MOV
R3,A
LCALL
START
;起动总线
MOV
A,SLA
LCALL
WRBYTE
;发送器件从地址
LCALL
CACK
JNB
ACK,RETWRN
;无应答则退出
MOV
A,SUBA
;指定子地址
LCALL
WRBYTE
LCALL
CACK
MOV
R1,#MTD
WRDA:
MOV
A,@R1
LCALL
WRBYTE
;开始写入数据
LCALL
CACK
JNB
ACK,IWRNBYTE
INC
R1
DJNZ
R3,WRDA
;判断写完没有
RETWRN:
LCALL
STOP
RET
END
第16页
共18页
