文档库 最新最全的文档下载
当前位置:文档库 › 基于AW60十秒倒计时抢答器的设计

基于AW60十秒倒计时抢答器的设计

基于AW60十秒倒计时抢答器的设计
基于AW60十秒倒计时抢答器的设计

《电子系统设计与工程实践》期末实践数字抢答器

学院:_________________________ 专业:_________________________ 班级:_________________________ 姓名:_________________________ 学号:_________________________

年月日

基于AW60十秒倒计时抢答器的设计

摘要:本设计是以飞思卡尔公司的AW60HCS08单片机为核心设计的四路抢答器。本抢答器能实现四人抢答、倒计时10秒后就不能抢答、数码管显示抢答成功的按键及倒计时,在抢答成功和十秒倒计时结束时报警等功能。同时该抢答器是基于单片机设计出来的,因此很容易对抢答器的路数进行扩展,同时又避免了由门电路组合的数字抢答器随着路数的增加线路数目成倍增加的问题。与门电路搭建的抢答器相比,该抢答器不仅在结构上显得简单,而且在费用方面也略显优势。

Abstract: The Freescale's AW60HCS08 microcontroller is used as the core design of four way responder. The responder can achieve four vies to answer first, the countdown after 10 seconds cannot succeed in digital tube display vies to answer first vies to answer first, keys and the countdown, at the end of the vies to answer first success and ten seconds countdown alarm. The responder is based on single-chip design, so it is easy to extend ways of the responder, and the num of lines is increasing exponentially with the number increase of ways of the digital gate circuit. Compared to the responder builded by the gate circuit , the responder is not only simple in the structure, but also slightly better in terms of costs.

关键字:aw60、4人抢答、倒计时10s、数码管显示

Key words: aw60, four people vies to answer first, the countdown 10 s, digital tube display

1 设计要求

具体要求

(1)提供4路抢答键,编号分别为1、2、3、4,提供“开始”键,编号为“*”。(2)系统复位后,数码管显示“0000”并闪烁;按下“开始”键后,各抢答键才有效,数码管停止闪烁,并进行10s倒计时,计时时间在后两位数码管显示;若在10s内没有人抢答,则在计数为0后,显示“0000”并闪烁,直至“开始”键再次按下,重新计数;若在10s内有人按下抢答键,则停止计数,后两位数码管显示当前计数时间,第1位数码管显示抢答键编号,数码管闪烁,直至“开始”键再次按下,重新计数。

(3)每次按键或计时为0后通过蜂鸣器发出提示音。

系统功能

该系统能够按下开始键后数码管开始10s倒计时,当倒计时为零若没有抢答键按下则数码管显示0000,并闪烁蜂鸣器报警。若有一个或多个抢答键在倒计时结束前按下,则数码管第一位显示按下最先按下抢答键的编号,后两位数码管显示按下时的时间,其他显示0且闪烁蜂鸣器报警。当开始键再次按下的时候,系统恢复十秒倒计时状态,第一位数码管清零。

2 总体设计

2.1 系统工作原理

以下为系统的工作原理流程图(见图2),其中开始键为*键,1234抢答键

为键盘控制,由中断中的程序控制各种状态的实现,其工作原理为:接通电源后,

抢答器数码管显示“0000”并闪烁,直到主持人按下开始键,抢答器数码管变为

“0010”,同时抢答器的计时器开始进行10s 的倒计时;选手在定时时间内抢答

时,抢答器完成:优先判断、编号锁存、编号显示、时间显示、数码管闪烁、蜂

鸣器提示。若在正常的十秒抢答时间中没有人按下抢答键,则倒计时一直进行到

零,数码管显示0000并闪烁,同时蜂鸣器报警,当主持人再次按下开始键时数

码管恢复到0010开始新一轮抢答倒计时。

开始

初始化

开中断

LED 显示0000并闪烁

等待开始键*被按下

LED 开始10秒倒计时显示计数值

键盘检测是否在10秒内有人按1234键LED 记录第一位抢答者并闪烁

LED 减到0后显示0000并闪烁

同时蜂鸣器报警键盘检测是否按下开始键*

LED 重新赋值为0010

同时蜂鸣器关闭

是是

图1、系统工作原理流程图

3 硬件设计

3.1 硬件组成

本系统是以飞思卡尔公司的AW60HCS08单片机为核心设计的四路抢答器。其

主要的硬件部分由AW60的最小系统、电源模块、时钟模块、键盘模块以及蜂鸣

器等所组成(见图2)。其中电源模块为其他各个模块供电;LED 模块为显示模

块,包括显示10s 倒计时,抢答者编号,抢答时间,数码管闪烁;时钟模块为单

片机工作提供时钟,键盘模块提供抢答键1234,开始(复位)键,用来检测是

否有键发生,从而产生键盘中断交由单片机处理,单片机在对按键进行分析后控

制相应的数码管显示以及控制蜂鸣器报警。

Aw60单片机Led 模块

按键模块

电源模块蜂鸣器模块

图2、模块电路组成

3.2 单片机核心模块

本设计采用AW60HCS08单片机,S08是2004年左右推出8位MCU ,资源

丰富,功耗低,性价比很高,是08系列MCU 发展趋势,其性能与许多16位

MCU 相当。MC9S08AW60是低成本、高性能8位微处理器S08家族中的成员,

本次课程设计就是以该芯片为基础,来进行嵌入式的设计。

该单片机的主要性能:

(1)最高达40MHz 的CPU 工作频率和20Hz 的内部总线工作频率表;时钟源选项

包括晶振、谐振器、外部时钟或内部产生的时钟。

(2)相比HC08 CPU 指令集,S08 CPU 增加了BGND 指令。

(3)单线后台调试模式接口;增强的断点能力,允许单一的断点设置在线调试(在片内调试的模块增加了多于两个的断点)。

(4)内含32个中断/复位源;内含2KB的片内RAM;内含60KB的片内在线可编程Flash存储器,带有块保护和安全选项。

(5)可选的计算机正常操作(COP)复位;低电压检测和复位或中断;非法操作码检测与复位;非法地址检测与复位。

(6)ADC:多达16个通道,10位A/D转换器与自动比较功能;两个串行通信接口SCI模块与可选的13位中断;一个串行外设接口SPI模块;集成电路互连总线I2C模块运作高达100kbps的最高总线负载;8引脚键盘中断KBI模块。(7)定时器:1个2通道和1个6通道16位定时器/脉冲宽度调制器模板。具有输入、捕捉、输出比较、脉宽调制功能。

图3、最小系统图

3.3 显示和控制电路

本系统采用数码管显示抢答者编号和剩余时间,钜阵键盘用于抢答器的复位和抢答者的抢答。数码管显示原理简单,编程比较容易实现。矩阵键盘可以实现多种控制,便于扩展功能,同时又可节省大量的IO口,供单片机的其它功能应用。

图4、LED模块

图5、键盘模块

3.4电源模块

电路中需要大量引脚用来提供足够的电流容量。所有的电源引脚必须有适当的旁路电容,来抑制高频噪音。一些VDD和VSS引脚仅用于噪音旁路。图中的电源电路显示了一个典型的电源连接图。电源电路部分的电容构成滤波电路,可以改善系统的电磁兼容性,降低电源波动对系统的影响,增强电路工作稳定性。为标识系统通电与否,可以增加一个电源指示灯。注意那些仅连接电容的引脚,不要将它们直接连接电源电压。

图6、电源模块

3.5蜂鸣器

在单片机应用的设计上,很多方案都会用到蜂鸣器,大部分都是使用蜂鸣器来做提示或报警,比如按键按下、开始工作、工作结束或是故障等等由于蜂鸣器的工作电流一般比较大,以致于单片机的I/O口是无法直接驱动的,所以要利用放大电路来驱动,一般使用三极管来放大电流就可以了。

图7、蜂鸣器模块

3.6长距离传输模块

3.6.1限制数据长距离传输的因素

所谓“长线”,即指那些必须考虑传输延迟的连接线,并且长线的“长”是相对的,对于微秒级的数字电路来说,1米左右的连线要求当长线来看待;对10毫秒级的电路,几米长的连线才当作长线处理。信号在长线中传输时,不仅存在传输延迟,而且会使信号波形严重畸变,并引入一些有害的干扰。

采用长线传输后,一般总要发生如下问题:

1、外界电磁场通过传输线对信号产生的干扰

由于发送和接收设备之间存在的公共地线,因此各种干扰极易通过公共地线叠加在信号上,特别是现场的电磁干扰通过公共底线能很容易的导入接受设备。2、传输线分布电容

数据的传输实际上是对传输线分布电容充电和放电的过程,而充电的上升时间和放电的下降时间有所不同,会引起数据接受错误。

3、传输线存在的地的电位差

传输线间连接的公共地线,由于发送设备和接受设备往往使用各自的电源设备。是二者的电位可能不一致,从而信号地线中会产生电流。由于传输线电阻的存在,使地线两端产生电压降,即电位差。当发送设备想接收设备发送数据时,接受设备得到的电压信号与没有地电位差时得到的不同。当又用信号较小、而地电位差较大时,接受设备无法得到准确的信号,数据传输将无法进行。

4、传输线的负载阻抗与传输特性阻抗不匹配

当传输的负载阻抗与传输特性阻抗不匹配时,会在线路中产生多次发射,致使信号产生畸变,数据传输出现错误。

3.6.2长距离传输抗干扰措施

空间干扰包括静电场、高频电磁场以及磁场引起的干扰

主要的解决方法:

1、空间隔离:使敏感设备或信号线远离干扰,如大型动力设备及大变压器等。空间隔离的方法主要有变压器隔离、光电隔离、浮地屏蔽三种方式。

2、屏蔽:对敏感电路加屏蔽盒或对信号加屏蔽层,注意屏蔽层不能随意接地,必要时屏蔽层外还要有绝缘层。屏蔽主要用来解决电磁干扰,将电力线或磁力线的影响限定在某个范围之内或阻止他们进入某个范围。

3、电气布线:合理的选择信号线,并在实际施工中正确的敷设信号线来抑制干扰。

3.6.3长线传输模块

为了解决长线传输的问题,特别在电路中加入了长线传输模块。本模块是以NS公司的单片集成稳压器为核心,其能满足输入电压在7~40V之内,均能输出恒定的5V电压和3A电流,能够很好的解决百米范围内的长线传输问题。

图8、长线传输模块

4 程序设计

4.1 主程序设计

程序开始后初始化芯片,模块,变量,然后进行主循环,开始执行主程序,计时器开始10s倒数计时数码管显示状态为0010,执行过程中还可检测是否有抢答键,如果按下则计时停止后两位数码管显示时间,第一位数码管显示抢答编号,其他数码管均为零,蜂鸣器报警,再次按下开始复位键时,数码管显示0010进行倒计时。如果没有抢答键按下,则倒计时为零时数码管显示0000,并开始闪烁,蜂鸣器报警。

程序框图如下:

开始

关中断

初始化

开中断

数码管显示0000并闪烁

等待按下开始键

主循环

LED显示抢答者编号

及时间并闪烁

图7

4.2 子程序设计

中断函数设计

程序开始后初始化变量,然后关中断,开始键值检测及判断,若开始键(*

键)被按下,则LED 被重新赋值,同时计数器开始递减计数,每秒减1;若在

计数器数值减为0之前有1234被按下,则LED 记录显示最先按下抢答者的编号,

同时计数器保持当前数值不再递减并进行闪烁。若计时器10s 倒数计时结束后仍

未有键按下,则数码管显示状态为0000并闪烁,同时蜂鸣器报警,直到再次按

下开始键时,数码管显示0010进行倒计时。

中断函数流程图:

开始

结束

关中断

初始化

开中断

判断键值是否为*键

LED 上显示0000

并闪烁

计时数组赋处置

Flag=0判断计数值是否为0

是否

把该值在LED 上

显示并闪烁

图8、中断函数流程图

附录一:电路实物照片

图9、在开始键未按下时显示0000

图10、LED显示抢答者编号及按下时间

附录二:程序调试

图11、程序调试

图12、程序调试附录三:电路原理图

附录四:主要程序

主函数程序:

//-------------------------------------------------------------------------*

//工程名: timer *

//硬件连接:(1)PTD.0接指示灯*

// (2)MCU的串口与PC方的串口相连*

//程序描述: *

// (1)TPM1溢出中断,数码管显示分秒信息。

//目的: 学习定时器基本功能*

//说明: 无*

//------苏州大学飞思卡尔嵌入式系统研发中心2011年------*

//总头文件

#include "Includes.h"

void main(void)

{

//1 主程序使用的变量定义

//uint8 start=1;

//2 关总中断

DisableInterrupt(); //禁止总中断

//3 芯片初始化

MCUInit(); //芯片初始化

//4 模块初始化

Buzzer_DD=0xff;

LEDdata_D=0xff;

TPMinit(TPM_NUM_1); //定时器1初始化

LEDinit(); //数码管初始化

KBInit(); //键盘初始化

//5 内存初始化

//6 开放中断

EnableKBint(); //开键盘中断

EnabletimerInt(TPM_NUM_1); //开放定时器1溢出中断

EnableInterrupt(); //开放总中断

LEDshow(ledbuf);

//7系统复位后,数码管显示“0000 ”并闪烁;按下“开始”键后,各抢答

键才有效

//不断循环闪烁0000直到开始键(*键)被按下,跳出循环后开始计时do{

LEDdata=0xc0;

LEDcs1=0x03;

LEDcs2=0x0c;

Delay(10); //延时使数码管显示闪烁

LEDdata=0xff;Delay(1);

LEDdata=0xc0;

}while(start==0);

//7 主循环

while (1)

{

LEDshow(ledbuf);//正常显示计数器当前计数的值

}

}

中断函数程序:

//-------------------------------------------------------------------------*

// 文件名: isr.c *

// 说明: 中断处理函数文件*

//-------------------------------------------------------------------------*

//头文件

#include "isr.h"

//此处为用户新定义中断处理函数的存放处

//-------------------------------------------------------------------------*

//函数名: isrKeyBoard *

//功能: 扫描键盘,向串口发送键值和定义值*

//参数: 无*

//返回: 无*

//说明: 调用了KBScanN、SCISend1、KBInit函数*

//-------------------------------------------------------------------------* interrupt void isrKeyBoard(void)

{

uint8 value,KeyDef;

uint16 i;

for(i=0; i<1000; i++);

DisableInterrupt(); //关总中断

DisableKBint(); //屏蔽键盘中断

value = KBScanN(10); //扫描键值,存于value中

if(value!=0xFF)

{

KeyDef=KBDef(value);

if(KeyDef=='*')

{

flag=0; //键值按下标志位

start=1; //启动减数

Buzzer=0; //关闭蜂鸣器

//对数码管重新回到计时初值

ledbuf[0]='0';

ledbuf[1]='0';

ledbuf[2]='1';

ledbuf[3]='0';

num=11;

}

if(KeyDef!='*'&&num>0)

{

start=0;

//用flag来对数据进行锁存

if(flag==0)

{

flag=1;

}

}

}

KBInit(); //键盘初始化键盘中断

EnableKBint(); //开放键盘中断

EnableInterrupt() ; //开总中断

}

//-------------------------------------------------------------------------*

//函数名: isrT1Out *

//功能: 定时器1溢出中断处理函数,以秒为最小单位计时, *

//并清定时器1溢出标志位*

//参数: 无*

//返回: 无*

//说明: 无*

//-------------------------------------------------------------------------* interrupt void isrT1Out(void) //溢出时间0.5s

{

uint8 temp;

DisableInterrupt(); //禁止总中断

if(start==1)

{

//数码管显示数值每隔1s减1

if(num!=0)num--;

else num=0;

//判断数码管状态是否减到0,若没有则数码管减1显示

if(num!=0)

{

ledbuf[2]='0';

}

else {

//数码管则显示“0000”并闪烁

LEDdata=0xc0;

LEDcs1=0x03;

LEDcs2=0x0c;

Delay(7); //延时使数码管显示闪烁

LEDdata=0xff;

Delay(7);

LEDdata=0xc0;

//实现蜂鸣器的报警鸣叫

Buzzer=1;

Delay(30);

}

}

if(start==0)

{

//数码管则显示“0000”并闪烁

if(num>0)

{

//如果在10s内有键按下,则LED显示抢答者编号以及当前时间,并闪烁显示

LEDshow(ledbuf);

LEDcs1=0x03;

LEDcs2=0x0c;

Delay(3); //延时使数码管显示闪烁

LEDdata=0xff;Delay(3);

}

if(num==0)

{

//如果在10s内没有键按下,则LED显示0000并闪烁显示

LEDdata=0xc0;

LEDcs1=0x03;

LEDcs2=0x0c;

Delay(3); //延时使数码管显示闪烁

LEDdata=0xff;Delay(3);

LEDdata=0xc0;

}

}

TPM_MODH(1) = 0x7a;

TPM_MODL(1) = 0x12;

//清定时器1溢出标志位

temp = TPM_CSTR(1); //读取定时器1状态和控制寄存器TPM1SC

TPM_CSTR(1) &= ~(TPM1SC_TOF_MASK); //向定时器溢出标志位TOF写0

EnableInterrupt(); //开放总中断

}

//未定义的中断处理函数,本函数不能删除

interrupt void isrDummy(void)

{

}

//中断处理子程序类型定义

typedef void( *ISR_func_t)(void);

//中断矢量表,如果需要定义其它中断函数,请修改下表中的相应项目

const ISR_func_t ISR_vectors[] @0xFFCC =

{

isrDummy, //时基中断

isrDummy, //IIC中断

isrDummy, //ADC转换中断

isrKeyBoard, //键盘中断

isrDummy, //SCI2发送中断

isrDummy, //SCI2接收中断

isrDummy, //SCI2错误中断

isrDummy, //SCI1发送中断

isrDummy, //SCI1接收中断

isrDummy, //SCI1错误中断

isrDummy, //SPI中断

isrDummy, //TPM2溢出中断

isrDummy, //TPM2通道1输入捕捉/输出比较中断

isrDummy, //TPM2通道0输入捕捉/输出比较中断

isrT1Out, //TPM1溢出中断

isrDummy, //TPM1通道5输入捕捉/输出比较中断

isrDummy, //TPM1通道4输入捕捉/输出比较中断

isrDummy, //TPM1通道3输入捕捉/输出比较中断

isrDummy, //TPM1通道2输入捕捉/输出比较中断

isrDummy, //TPM1通道1输入捕捉/输出比较中断

isrDummy, //TPM1通道0输入捕捉/输出比较中断

isrDummy, //ICG的PLL锁相状态变化中断

isrDummy, //低电压检测中断

isrDummy, //IRQ引脚中断

isrDummy, //SWI指令中断

//RESET是特殊中断,其向量由开发环境直接设置(在本软件系统的Start08.o 文件中)

};

相关文档
相关文档 最新文档