用VHDL语言实现四人智力竞赛抢答器的设计,高分寻高人解答

用VHDL语言实现四人智力竞赛抢答器的设计,高分寻高人解答,第1张

各模块VHDL源代码

1、抢答鉴别模块FENG的VHDL源程序

--feng.vhd

LIBRARY IEEE

USE IEEE.STD_LOGIC_1164.ALL

ENTITY FENG IS

PORT(CP,CLR:IN STD_LOGIC

Q :OUT STD_LOGIC)

END FENG

ARCHITECTURE FENG_ARC OF FENG IS

BEGIN

PROCESS(CP,CLR)

BEGIN

IF CLR='0'THEN

Q<='0'

ELSIF CP'EVENT AND CP='0'没闷THEN

Q<='1'

END IF

END PROCESS

END FENG_ARC

2、片选信号产生模块悔睁SEL的VHDL源程序

--sel.vhd

LIBRARY IEEE

USE IEEE.STD_LOGIC_1164.ALL

ENTITY SEL IS

PORT(CLK:IN STD_LOGIC

a:OUT INTEGER RANGE 0 TO 7)

END SEL

ARCHITECTURE SEL_ARC OF SEL IS 片选信号产生模块SEL

BEGIN

PROCESS(CLK)

VARIABLE AA:INTEGER RANGE 0 TO 7

BEGIN

IF CLK'EVENT AND CLK='1'THEN

AA:=AA+1

END IF

A<=AA

END PROCESS

END SEL_ARC

3、锁存器模块LOCKB的VHDL源程序

-lockb.vhd

LIBRARY IEEE

USE IEEE.STD_LOGIC_1164.ALL

ENTITY LOCKB IS

PORT(D1,D2,D3,D4:IN STD_LOGIC

CLK,CLR:IN STD_LOGIC

Q1,Q2,Q3,Q4,ALM:OUT STD_LOGIC)

END LOCKB

ARCHITECTURE LOCK_ARC OF LOCKB IS

BEGIN

PROCESS(CLK)

BEGIN

IF CLR='0'THEN

Q1<='0'

Q2<='0'

Q3<='0'

Q4<='0'碧察岁

ALM<='0' 模块LOCKB

ELSIF CLK'EVENT AND CLK='1'THEN

Q1<=D1

Q2<=D2

Q3<=D3

Q4<=D4

ALM<='1'

END IF

END PROCESS

END LOCK_ARC

4、转换模块CH41A的VHDL源程序

--ch41a..vhd

LIBRARY IEEE

USE IEEE.STD_LOGIC_1164.ALL

ENTITY CH41A IS

PORT(D1,D2,D3,D4:IN STD_LOGIC

Q:OUT STD_LOGIC_VECTOR(3 DOWNTO 0))

END CH41A

ARCHITECTURE CH41_ARC OF CH41A IS 转换模块CH41A

BEGIN

PROCESS(D1,D2,D3,D4)

VARIABLE TMP:STD_LOGIC_VECTOR(3 DOWNTO 0)

BEGIN

TMP:=D1&D2&D3&D4

CASE TMP IS

WHEN "0111"=>Q<="0001"

WHEN "1011"=>Q<="0010"

WHEN "1101"=>Q<="0011"

WHEN "1110"=>Q<="0100"

WHEN OTHERS=>Q<="1111"

END CASE

END PROCESS

END CH41_ARC

5、3选1模块CH31A的VHDL源程序

--ch31a.vhd

LIBRARY IEEE

USE IEEE.STD_LOGIC_1164.ALL

ENTITY CH31A IS

PORT(SEL:IN STD_LOGIC_VECTOR(2 DOWNTO 0)

D1,D2,D3:IN STD_LOGIC_VECTOR(3 DOWNTO 0)

Q : OUT STD_LOGIC_VECTOR(3 DOWNTO 0))

END CH31A

ARCHITECTURE CH31_ARC OF CH31A IS

BEGIN

PROCESS(SEL,D1,D2,D3)

BEGIN

CASE SEL IS

WHEN "000"=>Q<=D1

WHEN "001"=>Q<=D2

WHEN "111"=>Q<=D3

WHEN OTHERS=>Q<="1111"

END CASE

END PROCESS

END CH31_ARC

6、倒计时模块COUNT的VHDL源程序

倒计时模块COUNT如图16-7所示,该模块实现答题时间的倒计时,在计满100s后送出声音提示。

--count.vhd

LIBRARY IEEE

USE IEEE.STD_LOGIC_1164.ALL

USE IEEE.STD_LOGIC_UNSIGNED.ALL

ENTITY COUNT IS

PORT(CLK,EN:IN STD_LOGIC倒计时 模块COUNT

H,L:OUT STD_LOGIC_VECTOR(3 DOWNTO 0)

SOUND:OUT STD_LOGIC)

END COUNT

ARCHITECTURE COUNT_ARC OF COUNT IS

BEGIN

PROCESS(CLK,EN)

VARIABLE HH,LL:STD_LOGIC_VECTOR(3 DOWNTO 0)

BEGIN

IF CLK'EVENT AND CLK='1'THEN

IF EN='1'THEN

IF LL=0 AND HH=0 THEN

SOUND<='1'

ELSIF LL=0 THEN

LL:="1001"

HH:=HH-1

ELSE

LL:=LL-1

END IF

ELSE

SOUND<='0'

HH:="1001"

LL:="1001"

END IF

END IF

H<=HH

L<=LL

END PROCESS

END COUNT_ARC

7、显示译码模块DISP的VHDL源程序

--disp.vhd

LIBRARY IEEE

USE IEEE.STD_LOGIC_1164.ALL

ENTITY DISP IS 显示译码模块DISP

PORT(D:IN STD_LOGIC_VECTOR(3 DOWNTO 0)

Q:OUT STD_LOGIC_VECTOR(6 DOWNTO 0))

END DISP

ARCHITECTURE DISP_ARC OF DISP IS

BEGIN

PROCESS(D)

BEGIN

CASE D IS

WHEN"0000"=>Q<="0111111"

WHEN"0001"=>Q<="0000110"

WHEN"0010"=>Q<="1011011"

WHEN"0011"=>Q<="1001111"

WHEN"0100"=>Q<="1100110"

WHEN"0101"=>Q<="1101101"

WHEN"0110"=>Q<="1111101"

WHEN"0111"=>Q<="0100111"

WHEN"1000"=>Q<="1111111"

WHEN"1001"=>Q<="1101111"

WHEN OTHERS=>Q<="0000000"

END CASE

END PROCESS

END DISP_ARC

第一章抢答器设计功能分析

1.1 数字抢答器的概述

对于抢答器我们大家来说都不陌生,它是用于很多竞赛场合,真正实现先抢先答,让最先抢到题的选手来回答问题。抢答器不仅考验选手的反应速度同时也要求选手具备足够的知识面和一定的勇气。选手们都站在同一个起跑线上,体现了公平公正的原则。

1.2 设计任务与要求

基本要求:

1. 给主持人设置一个开关,用来控制系统的清零(编号显示数码管灭灯)和抢答器的开始。

2. 抢答器具有数据锁存和显示的功能。抢答开始后,若有选手按动抢答器按钮,编号立即锁存,并在LED数码上显示选手的编号,同时扬声器给出音响提示。此外,要封锁输入电路,禁止其他选手抢答。

发挥部分:

1. 抢答器具有定时抢答的功能,且一次抢答的时间可以由主持人设定(如30秒)。当节目主持人启动“开始”键后,要求定时器立即减计时,并用显示器显示,同时扬声器发出短暂的声响,声响持续时间0.5秒左右。

2. 参加选手在设定的时间内抢答,抢答有效,定时器停止工作,显示器上显示选手的编号和抢答时刻的时间,并保持到主持人将系统清零为止。

3. 如果定时抢答的时间已到,却没有选手抢答时,本次抢答无效,系统短暂报警,并封锁输入电路,禁止选手超时后抢答,时间显示器上显示00。

4. 选手如果在主持人按开始键之前违规抢答,系统报警,LED显示违规选手号码和FF,直到主持人按下停止键。

第二章 抢答器方案论证

抢答器的实现方式有种多样,通过纯电子器件搭建电路实现,如优先编码器,锁存器,555定时器译码器等,纯电子器件实现没有软件参与,调试简单,但是它不易于扩展和修改,而且电路结构复杂,调试困难电子,电子器件管脚很多,实际搭建起来费时费力,焊接很容易出错。于是,我想到了用单片机实现。单片机体积小价格低,应用方便,稳定可靠。单片机将很多任务交给了软件编程去实现,大大简化了外围硬件电路,使外围电路的实现简单方便。由于单片机本身不具逗顷有软件编译测试的功能,我们需要借助其他软件编译,将编译好的程序“烧”入单片机内。睁册

在实际电路设计中,需要先通过仿真软件测试电路以及编译的程序,检查外围电路设计是否合理,软件编译是否正确,以及软件和硬件电路能否正常配合工作,能否准确的实现所设计的功能。如果测试通过,电路仿真没有问题能完全实现功能的话就可以实际的做板子的焊接工作了。在老师的指导下我选择了常用的单片机仿真软件proteus6.9以及keil 进行仿真。

第三章 硬件电路设计

3.1总体设计

根据抢答器的基本功能,可以设计出如下的单片机外围电路:

图3-1 总体设计

如图3-1,P3.0为开始抢答,P3.2为停止,P1.0-P1.7为八路抢答输入,数码管段选P0口,位选P2口低3位,蜂鸣器(用绿灯代替)输出为P3.6口。P3.2为时间加1调整,P3.3为时间减1调整。

3.2 外部振荡电路

图3-2 外部振荡电路

一般选用石英晶体振荡器。此电路在加电大约延迟10ms后振荡器起振,在XTAL2引脚产生幅度为3V左右的正弦波时钟信号,其振荡频率主要由石英晶振的频率确定。电路中两个电容 C1,C2的作用有两个:一是帮助振荡器起振二是对振荡器的频率进行微调。C1,C2的典型值为30PF。

3.3 复位电路的设计

单片机的第9脚RST为硬件复位端,只要将该端持续4个机器周期的高电平即可实现复位,复位后单片机的各状态都恢复到初始化状态,其电路图悉指宏如图4所示:

图3-3 复位电路

在方案中使用到了硬件复位和软件复位两种功能,由上面的硬件复位可使寄存器及存储器的值都恢复到初始值,而前面的功能提到了倒计时间需要有记忆功能,该功能实现的前提条件就是不能对单片机进行硬件复位,所以设定了软复位功能。软复位实际上就是当程序执行完毕之后,将程序指针通过一条跳转指令让它跳转到程序执行的起始地址。

3.1.4 显示电路的设计

显示电路使用了七段数码管7SEG-MPX4-CC,它是共阴极的,由高电平点亮。

图3-4 阴极七段数码管

4.1.5 按钮输入电路的设计

抢答器的输入按钮使用常开开关,

图3-5 抢答按键

这些常开开关组成了抢答按键,硬件电路简单,在程序设计上也不复杂,只要在程序中消除在按键过程中产生的“毛刺”现象就可以了。这里采用最常用的方法即延时法,其的原理为:因为“毛刺”脉冲一般持续时间短,约为几ms,而按键的时间一般远远大于这个时间,所以当单片机检测到有按键动静后再延时一段时间(这里取10ms)后再判断此电平是否保持原状态,如果是则为有效按键,否则无效。

3.1.6 发声

这里能利用程序来控制单片机P3.6口线反复输出高电平或低电平,即在该口线上产生一定频率的矩形波,接上扬声器就能发出一定频率的声音,再利用延时程序控制“高”“低”电平的持续时间,就能改变输出频率,从而改变音调,使扬声器发出不同的声音。

第四章 系统软件设计

4.1 程序系统结构图

硬件电路确定后,软件的编程要与硬件相匹配,软硬件才能结合完成所要实现的功能。由功能分析得到以下的软件结构图:

图4-1 软件系统结构图

4.2 程序流程图

整个程序主要由定时器T0、定时器T1、外部中断0和主程序构成。

定时器T0用于使扬声器发声,当需要响铃时,把响铃标志位置一,每次中断都对P3.7取反,扬声器发声,改变定时器初值,可改变扬声器频率。定时器程流程图如下:

图4-2 响铃程序流程图

定时器T1用于倒计时,每次中断为50ms,当计数标志为20时即为一秒,显示数字减一。其流程图如下:

图4-3 倒计时中断流程图

外部中断0用于调整倒计时时间,流程图如下:

图4-4 调整抢答时间流程图

主程序协调三个中断一起工作,实现抢答功能,其流程图如下:

图4-5 主程序流程图

附录:

程序代码:

P3.0为开始抢答,P3.1为停止,P1.0-P1.7为八路抢答输入,数码管段选P0口,位选P2的低三位口,蜂鸣器输出为P3.6口。

ORG 0000H

AJMP MAIN

ORG 0003H

AJMP INT0SUB

ORG 000BH

AJMP T0INT

ORG 001BH

AJMP T1INT

OK EQU 20H 抢答开始标志位

RING EQU 22H 响铃标志位

ORG 0040H

MAIN: MOV R1,#0FH初设抢答时间为15s

MOV R2,#0AH初设答题时间为10s

MOV TMOD,#11H设置未定时器/模式1

MOV TH0,#0F0H

MOV TL0,#0FFH越高发声频率越高,越尖

MOV TH1,#3CH

MOV TL1,#0B0H50ms为一次溢出中断

SETB EA

SETB ET0

SETB ET1

SETB EX0

SETB EX1允许四个中断,T0/T1/INT0/INT1

CLR OK

CLR RING

SETB TR1

SETB TR0一开始就运行定时器,以开始显示FFF.如果想重新计数,重置TH1/TL1就可以了

查询程序:

START: MOV R5,#0BH

MOV R4,#0BH

MOV R3,#0BH

ACALL DISPLAY未开始抢答时候显示FFF

JB P3.0,NEXT

ACALL DELAY

JB P3.0,NEXT去抖动,如果"开始键"按下就向下执行,否者跳到非法抢答查询

ACALL BARK按键发声

MOV A,R1

MOV R6,A送R1->R6,因为R1中保存了抢答时间

SETB OK抢答标志位,用于COUNT只程序中判断是否查询抢答

MOV R3,#0AH抢答只显示计时,灭号数

AJMP COUNT进入倒计时程序,"查询有效抢答的程序"在COUNT里面

NEXT:JNB P1.0,FALSE1

JNB P1.1,FALSE2

JNB P1.2,FALSE3

JNB P1.3,FALSE4

JNB P1.4,FALSE5

JNB P1.5,FALSE6

JNB P1.6,FALSE7

JNB P1.7,FALSE8

AJMP START

非法抢答处理程序:

FALSE1: ACALL BARK按键发声

MOV R3,#01H

AJMP ERROR

FALSE2: ACALL BARK

MOV R3,#02H

AJMP ERROR

FALSE3: ACALL BARK

MOV R3,#03H

AJMP ERROR

FALSE4: ACALL BARK

MOV R3,#04H

AJMP ERROR

FALSE5: ACALL BARK

MOV R3,#05H

AJMP ERROR

FALSE6: ACALL BARK

MOV R3,#06H

AJMP ERROR

FALSE7: ACALL BARK

MOV R3,#07H

AJMP ERROR

FALSE8: ACALL BARK

MOV R3,#08H

AJMP ERROR

倒计时程序(包括有效抢答程序):

COUNT: MOV R0,#00H重置定时器中断次数

MOV TH1,#3CH

MOV TL1,#0B0H; 重置定时器

RECOUNT: MOV A,R6 R6保存了倒计时的时间

MOV B,#0AH

DIV AB 除十分出个位/十位

MOV 30H,A 十位存于(30H)

MOV 31H,B 个位存于(31H)

MOV R5,30H 取十位

MOV R4,31H 取个位

MOV A,R6

CLR C

SUBB A,#07H

JNC LARGER 大于5s跳到LARGER,小于等于5s会提醒

MOV A,R0

CJNE A,#0AH,FULL1s中0.5s向下运行

CLR RING

AJMP CHECK

FULL:CJNE A,#14H,CHECK 1s时,响并显示号数并清R0,重新计时

SETB RING

MOV A,R6

JZ QUIT 计时完毕

MOV R0,#00H

DEC R6 一秒标志减1

AJMP CHECK

LARGER: MOV A,R0

CJNE A,#14H,CHECK 如果1s向下运行,否者跳到查"停/显示"

DEC R6 计时一秒R6自动减1

MOV R0,#00H

CHECK:JNB P3.1,QUIT 如按下停止键退出

ACALL DISPLAY

JNB P1.0,TRUE1

JNB P1.1,TRUE2

JNB P1.2,TRUE3

JNB P1.3,TRUE4

JNB P1.4,TRUE5

JNB P1.5,TRUE6

JNB P1.6,TRUE7

JNB P1.7,TRUE8

AJMP RECOUNT

QUIT: CLR OK 如果按下了"停止键"重新回到开始

CLR RING

ACALL BARK

AJMP START

正常抢答处理程序:

TRUE1: ACALL BARK按键发声

MOV A,R2

MOV R6,A 抢答时间R2送R6

MOV R3,#01H

CLR OK

AJMP LOOP2

TRUE2:ACALL BARK

MOV A,R2

MOV R6,A

MOV R3,#02H

CLR OK

AJMP LOOP2

TRUE3:ACALL BARK

MOV A,R2

MOV R6,A

MOV R3,#03H

CLR OK

AJMP LOOP2

TRUE4:ACALL BARK

MOV A,R2

MOV R6,A

MOV R3,#04H

CLR OK

AJMP LOOP2

TRUE5: ACALL BARK

MOV A,R2

MOV R6,A

MOV R3,#05H

CLR OK

AJMP LOOP2

TRUE6: ACALL BARK

MOV A,R2

MOV R6,A

MOV R3,#06H

CLR OK

AJMP LOOP2

TRUE7: ACALL BARK

MOV A,R2

MOV R6,A

MOV R3,#07H

CLR OK

AJMP LOOP2

TRUE8: ACALL BARK

MOV A,R2

MOV R6,A

MOV R3,#08H

CLR OK

LOOP2: AJMP DISPLAY 抢答后停止计时,等待返回

SETB RING

JNB P3.1 QUIT

AJMP LOOP2

犯规抢答程序:

ERROR: SETB RING犯规响铃

MOV R5,#0BH

MOV R4,#0BH 显示FF和犯规号数

LOOP3: ACALL DISPLAY

JNB P3.1 QUIT1 等待“停止”键按下

AJMP LOOP3

QUIT1: CLR RING

CLR OK

AJMP START

显示程序:

DISPLAY:MOV DPTR,#DAT1 查表显示程序,利用P0口做段选码口输出/P2低三位做位选码输出

MOV A,R5

MOVC A,@A+DPTR

MOV P2,#01H

MOV P0,A

ACALL DELAY

MOV DPTR,#DAT2

MOV A,R4

MOVC A,@A+DPTR

MOV P2,#02H

MOV P0,A

ACALL DELAY

MOV A,R3

MOVC A,@A+DPTR

MOV P2,#04H

MOV P0,A

ACALL DELAY

RET

DAT1:DB 00H,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,00H,71H

"灭","1","2","3","4","5","6","7","8","9","灭","F"

DAT2:DB 3FH, 06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,00H,71H

DELAY1: MOV 35H,#08H

LOOP0: ACALL DISPLAY

DJNZ 35H,LOOP0

RET

延时(显示和去抖动用到):

DELAY: MOV 32H,#12H

LOOP: MOV 33H,#0AFH

LOOP1: DJNZ 33H,LOOP1

DJNZ 32H,LOOP

RET

发声程序:

BARK: SETB RING

ACALL DELAY1

ACALL DELAY1

CLR RING 按键发声

RET

INT0(抢答时间R1调整程序):

INT0SUB:MOV A,R1

MOV B,#0AH

DIV AB

MOV R5,A

MOV R4,B

MOV R3,#0AH

ACALL DISPLAY;先在两个时间LED上显示R1

JNB P3.2,INC0P3.2为+1s键,如按下跳到INCO

JNB P3.3,DEC0P3.3为-1s键,如按下跳到DECO

JNB P3.4,BACK0P3.4为确定键,如按下跳到BACKO

AJMP INT0SUB

INC0: MOV A,R1

CJNE A,#63H,ADD0如果不是99,R2加1,如果加到99了,R1就置0,重新加起

MOV R1,#00H

ACALL DELAY1

AJMP INT0SUB

ADD0: INC R1

ACALL DELAY1

AJMP INT0SUB

DEC0: MOV A,R1

JZ SETR1如果R1为0, R1就置99,

DEC R1

ACALL DELAY1

AJMP INT0SUB

SETR1: MOV R1,#63H

ACALL DELAY1

AJMP INT0SUB

BACK0: RETI

TO溢出中断(响铃程序):

T0INT:MOV TH0,#0ECH

MOV TL0,#0FFH

JNB RING,OUT

CPL P3.6 RING标志位为1时候P3.6口不短取反使喇叭发出一定频率的声音

OUT: RETI

T1溢出中断(计时程序):

T1INT: MOV TH1,#3CH

MOV TL1,#0B0H

INC R0

RETI

END


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8281813.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-15
下一篇 2023-04-15

发表评论

登录后才能评论

评论列表(0条)

保存