1 系统硬件设计
美国Microchip Technology公司推出的PIC16F87X中档系列单片机,片内含有A/D、PWM、EEPROM等丰富的接口模块和FLASH程序存储器。借助于PIC16F873片内的ADC模块,使用一条I/O引脚,可以实现多个按钮开关的数字量输入问题。以此原理制成的16路抢答器,电路设计有抢答按钮开关、状态指示灯、复位开关、一只蜂鸣器和两只数码管。
设计功能如下,通电后,状态指示灯点亮,并且同时发出持续1s的类似电话振铃的美妙声音,表示为抢答作好准备。每当主持人口头发出号令之后,哪个队先按下座位上的按钮开关,数码管就显示该队的编号。同时封锁其他按钮开关的活动,状态指示灯熄灭,并且同时发出持续1s的类似电话振铃的美妙声音,以声明此次抢答动作已经完成。在主持人确认后,按下复位按钮,状态指示灯重新点亮,并且同时发出持续1s的类似电话振铃的美妙声音,为下一次抢答作好准备。在理论上,利用PIC16F873片内的10位A/D转换器,去除一个无键按下的“空”状态,则最多可以区分1023个按键。正是由于利用了PIC16F873片内10位A/D转换器,才使本抢答器外围电路比较简单,实用性强,而且本抢答器很容易扩展成更多路抢答器。
如图1,本抢答器主要由按键电路、PIC16F873单片机、三态输出锁存器74LS373及数码管组成。R16、R17、K0组成单片机的复位电路,按键电路由R1-R15、K1-K16组成。PIC16F873单片机系统时钟由4MHz的石英晶体经其内部振荡器提供,内部ADC的参考电压分别为VDD和地,按键电路输出的电压由数据线AN0输入,由于软件可以完成译码,因此不需译码器。74LS373、数码管组成显示电路,R18-R33起到限流的作用。为了使各个电阻向标称值靠拢,R0-R17的取值如图1标注,能满足表1中按键位置与输出电压的关系。开机后,RC0-RC7输出“0”的七段码,RA1输出高电平,数码管个位显示0,接着,尺A1输出低电平,RA2输出高电平,数码管十位显示0,RA2再输出低电平。RA5输出高电平,状态指示灯LED亮,RA3输出500Hz、630Hz两种音频信号,这两种音频信号以10Hz的频率轮流切换,从而蜂鸣器就发出类似电话振铃的美妙声音,抢答器进入准备状态。当抢答时,某个按键按下,假如是K12,其他按键的活动被封锁,PIC16F873单片机内的A/D转换器将输入电压转化成10位二进制数,通过单片机处理,RA1输出高电平,RC0-RC7输出“2”的七段码,然后,RA1输出低电平,将74LS373(2)的输出码锁存,RA2输出高电平,RC0-RC7输出“1”的七段码,RA2再输出低电平,将74LS373(1)的输出码锁存,这样数码管就稳定地显示出“12”。同时,RA3输出持续1s的10Hz的频率轮流切换的500Hz、630Hz两种音频信号,蜂鸣器发出类似电话振铃的美妙声音,RA5再输出低电平,LED熄灭,以声明此次抢答动作已完成。在主持人确认后,按下复位按键,两位数码管显示“00”,状态指示灯LED亮,抢答器进入准备状态。
表1 按键位置与按键电路输出电压对应关系
按下的键
1
2
3
4
5
6
7
8
输出电压Vo
0
(1/16)VDD
(2/16)VDD
(3/16)VDD
(4/16)VDD
(5/16)VDD
(6/16)VDD
(7/16)VDD
转换结果
(取高8位)
0
10H
20H
30H
40H
50H
60H
70H
区分按键的
分水岭判别值
08H
18H
28H
38H
48H
58H
68H
按下的键
9
10
11
12
13
14
15
16
无键
输出电压
(8/16)VDD
(9/16)VDD
(10/16)VDD
(11/16)VDD
(12/16)VDD
(13/16)VDD
(14/16)VDD
(15/16)VDD
VDD
转换结果
(取高8位)
80H
90H
A0H
B0H
C0H
D0H
E0H
F0H
FFH
区分按键的
分水岭判别值
78H
88H
98H
A8H
B8H
C8H
D8H
E8H
F8H
2 软件设计
取ADC转换结果的高8位就已经满足本抢答器对分辨率的需要,将相邻两个状态的转换结果的平均值固定下来作为区分按键位置的判别值。例如,(FFH+F0H)/2=F8H,作为空闲状态的判别值,只要转换结果大于该值,即判为无键按下;又例如(10H+20H)/2=18H,作为K2的判别值,只要转换结果大于该值,即判断为K2按下。按键的扫描采用启动AD转换的方法来实现。每次扫描过程是从高到低,用各键判别值去衡量AD转化结果,以区分按下的是哪个键或无键按下,这样便于程序的编写。若无按键,继续扫描,若有键按下,取出AD转化结果,关闭AD转换,判别哪个键按下,并送显所按下键的编号,RA5输出低电平,熄灭状态指示灯,RA3送出持续1s 500Hz和630Hz以10Hz轮流切换的音频信号。500Hz的音频产生的方法如下,该信号对应的周期为2000us,该音频信号一个的周期之内,保持在高电平和低电平的时间都是1000us。
利用定时器/计数器TMR0模块产生该延时时间,分频比和初始值分别是1:8和131。同理,产生630Hz音频应该采用的分频比和初始值分别是1:8和157。这两个音频信号再以10Hz的频率轮流切换,从单片机的RA3口线上送出,也就是每个音频信号持续的时间是50ms。那么,对于500Hz来说,50ms之内包含的周期个数为25个,包含从低到高的电平切换次数为50次;对于630Hz来说,50ms之内包含的周期个数为31.5个,包含从低到高的电平切换次数为63次。发生1s需要轮流调用500Hz和630Hz产生的程序各10次。程序流程图如图2、图3、图4、图5所示。