八路抢答器概要.docx
《八路抢答器概要.docx》由会员分享,可在线阅读,更多相关《八路抢答器概要.docx(18页珍藏版)》请在冰豆网上搜索。
八路抢答器概要
微处理器原理与接口课程设计
设计题目:
八路抢答器
学院:
电子工程学院
年级:
专业:
姓名:
学号:
指导教师:
年月日
目录
课程设计项目八路抢答器的设计2
1设计内容及意义2
1.1设计内容概述2
1.2设计意义概述2
2整体设计原理及方案2
2.1整体设计原理2
2.2单片机方案选择3
2.3编程环境方案选择4
2.4键盘数码管控制方案选择6
3硬件电路图9
3.1总体硬件框图9
3.2硬件电路图9
4程序设计流程图10
4.1程序设计概述10
4.2程序流程图11
5实验结果及数据12
5.1结论12
问题及心得12
附录13
课程设计项目八路抢答器
1设计内容及意义
1.1设计内容概述
本项目利用按键及LED数码管实现由1名主持人和8个参赛队组成的8路抢答器系统。
具体功能:
当主持人按下抢答按键,参赛队在10秒钟内可以抢答。
如超过10秒则不能抢答。
如抢答成功,则显示抢答的队号。
如抢答成功必需在60秒内回答完成。
如超过时间则抢答无效,且显示无效指示。
如在60秒内回答完成(抢答队再次按下抢答按键表示回答完成)则抢答正确成功,且显示有效。
当主持人按下复位按键时,系统回到初始状态。
1.2设计意义概述
当今的社会竞争日益激烈,选拔人才,评选优胜,知识竞赛类的活动愈加频繁,在竞赛中往往分为几组参加。
为了准确、公正、直观的判断出第一抢答者,这就要有一种抢答设备作为裁判员,抢答器就是首选。
抢答器是一种应用非常广泛的设备,在各种竞赛、抢答场合中,它能迅速、客观的分辨出最先获得发言权的选手。
随着科技的发展,现在的抢答器有着数字化、智能化的方向发展,大多数抢答器均使用单片机或数字集成电路,并增加了许多新功能,如选手号码显示、抢按前或按后的计时、选手得分显示等功能。
2整体设计原理及方案
2.1整体设计原理
通过8051单片机对8279数码管键盘芯片进行控制和读取数据,接收8279的数据口地址以读取键盘键值,9键作为开始键,当9键按下时,则显示十秒倒计时进行抢答计时,当1-8键无人按下则代表无人抢答;当1-8键中有一键按下则代表选手抢答,显示选手号,延时两秒后,进入六十秒倒计时,利用外部中断回到初始状态,当60秒内没有利用外部中断,则代表抢答失效;当60秒内利用外部中断,则代表抢答成功。
2.2单片机方案选择
8051是一种8位元的单芯片微控制器,属于MCS-51单芯片的一种,由英特尔公司于1981年制造。
INTEL公司将MCS51的核心技术授权给了很多其它公司,所以有很多公司在做以8051为核心的单片机,如Atmel、飞利浦、深联华等公司,相继开发了功能更多、更强大的兼容产品。
8051单芯片是同步式的顺序逻辑系统,整个系统的工作完全是依赖系统内部的时脉信号,用以来产生各种动作周期及同步信号。
在8051单片机中已内建时钟产生器,在使用时只需接上石英晶体谐振器(或其它振荡子)及电容,就可以让系统产生正确的时钟信号。
8051单元
1)、微处理器:
i80c31,它的P1口、P3口皆对用户开放,供用户使用。
2)、时钟频率:
6.0MHz
3)、存储器:
程序存储器与数据存储器统一编址,最多可达64k,板载ROM(监控程序27C256)12k;RAM1(程序存储器6264)8k供用户下载实验程序,可扩展达32k;RAM2(数据存储器6264)8k供用户程序使用,可扩展达32k。
(RAM程序存储器与数据存储器不可同时扩至32k,具体与厂家联系)。
(见图1-1:
存储器组织图)。
在程序存储器中,0000H----2FFFH为监控程序存储器区,用户不可用,4000H----5FFFH为用户实验程序存储区,供用户下载实验程序。
数据存储器的范围为:
6000H----7FFFH,供用户实验程序使用。
注意:
因用户实验程序区位于4000H-----5FFFH,用户在编写实验程序时要注意,程序的起始地址应为4000H,所用的中断入口地址均应在原地址的基础上,加上4000H。
例如:
外部中断0的原中断入口为0003H,用户实验程序的外部中断0的中断程序入口为4003H,其他类推,见表1-1。
4)、可提供的对8051的基本实验
为了提高微机教学实验质量,提高实验效率,减轻主讲教师和实验教师的劳动强度,在该系统的实验板上,除微处理器外、程序存储器、数据存储器外,还增加了8255并行接口、8250串行控制器、8279键盘、显示控制器、8253可编程定时器、A/D、D/A转换、单脉冲、各种频率的脉冲发生器、输入、输出电路等模块,各部分电路既相互独立、又可灵活组合,能满足各类学校,不同层次微机实验与培训要求。
可提供的实验如下:
(1)、8051P1口输入、输出实验
(2)、简单的扩展输入、输出实验
(3)、8051定时器/计数器实验
(4)、8051外中断实验
(5)、8279键盘扫描、LED显示实验
(6)、8255并行口输入、输出实验
(7)、8253定时器/计数器实验
(8)、8259中断实验
(9)、串行口通讯实验
(10)、ADC0809A/D转换实验
(11)、DAC0832D/A转换实验
(12)、存储器扩展实验
(13)、交通灯控制实验
(14)、串行EEPROM读写实验
(15)、硬件看门狗电路实验
2.3编程环境方案选择
KeilC集成工具简介:
KeilC的编译器和链接器包括C51、A51、L51和BL51。
C51是C语言编译器,其功能是将C源代码编译生成可重新定位的目标模块;A51是汇编语言编译器,其功能是将汇编源代码编译生成可重新定位的目标模块;L51是链接/定位器,其功能是将汇编源代码和C源代码生成的可重定位的目标模块文件(.OBJ),与库文件链接、定位生成绝对目标文件;BL51也是链接/定位器,除了具有L51所有的功能之外,可以链接定位大于64KB的程序,还可用于RTX51实时多任务操作系统,而且具有代码域及域切换功能。
KeilC的LIB51库管理器可以把由汇编器、编译器创建的目标文件构建成目标库(.LIB),这些库是按规定格式排列的目标模块,可在以后被链接器所使用[]。
3.2.2KeilC的应用
在KeilC中,文件的管理采用的是项目(也叫工程)方式,而不是以前的单一文件方式。
工程管理器的功能:
对C51源程序、汇编源程序、头文件等文件统一管理;可以对文件进行分组。
如图3-2所示。
工程管理窗口内容及分布,与Windows的资源管理器相似。
图3-2KeilC51的工程管理器
1.项目的建立
(1)建立项目
选择Project菜单下的NewProject命令,创建新工程,在对话框中设定新工程的位置,输入新工程名字保存即可。
(2)选择CPU
在出现的为新工程选择CPU的界面,在“database”栏下选择所使用的CPU。
确定后,会弹出一“CopyStandard8051StartupCodetoProjectFolderandAddFiletoProject”信息,一般选择“是”即可。
2.给项目加入程序文件
加入的文件可以是C文件,也可以是汇编文件。
加入程序文件的过程如下。
(1)在项目管理器窗口中展开Target1文件夹,可以看到SourceGroup1。
(2)向SourceGroup1添加文件。
在SourceGroup1点击鼠标右键,会弹出一菜单,其中有一“AddFilestoGroup‘SourceGroup1’”命令,点击后会弹出一对话框,选择需要加入的程序文件,并且一次可以加入多个文件。
(3)移走项目:
在欲移走的文件上点击鼠标右键,会弹出一菜单,执行其中的“RemoveFile‘***’”命令即可。
(4)对文件分组:
可以按功能对项目管理器中的文件分成组,如图3-2所示。
先使用图3-3中的“ManageComponents”命令建立组,然后用鼠标直接在组之间移动文件即可。
图3-3项目添加文件和组件命令
3.项目的编译链接
设置输出.hex文件:
在Target1上点击鼠标右键,出现类似图4-9所示的菜单,点击执行“OptionsforTarget‘Target1’”命令,在弹出的会话界面选择“Output”标签,选中“CreateHEXFile”项即可。
编译链接方法:
使用Project菜单下的Buildtarget命令或RebuildalltargetFiles命令,或者直接点击工具栏中对应的按钮。
编译链接结果:
若有错误则不能通过,并且会在信息窗口给出相应的错误信息。
编译链接通过后,会产生xxx.hex目标文件。
2.4键盘数码管控制方案选择
8279是可编程的键盘、显示接口芯片.它既具有按键处理功能,又具有自动显示功能,在单片机系统中应用很广泛。
8279内部有键盘FIFO(先进先出堆栈)/传感器,双重功能的8*8=64BRAM,键盘控制部分可控制8*8=64个按键或8*8阵列方式的传感器。
该芯片能自动消抖并具有双键锁定保护功能。
显示RAM容量为16*8,即显示器最大配置可达16位LED数码显示。
(1)可同时进行键盘扫描及文字显示;
(2)键盘扫描模式(ScannedKeyboardMode);
(3)传感器扫描模式(ScannedSensorMode);
(4)激发输入模式(StrobeInputEntryMode);
(5)8乘8键盘FIFO(先进先出);
(6)具有接点消除抖动,2键锁定及N键依此读出模式;
(7)双排8位数或双排16位数的显示器;
(8)右边进入或左边进入。
16位字节显示存储器。
8279引脚说明
编辑
<1>DB0~DB7:
双向数据总线。
在CPU与8279间做数据与命令传送。
<2>CLK:
8279的系统时钟,100KHz为最佳选择。
<3>RESET:
复位输入线。
输入HI时可复位8279。
<4>CS:
芯片选择信号线。
当这个输入引脚为低电平时,可将命令写入8279或读取8279的数据。
<5>A0:
缓冲器地址选择线。
A0=0时,读写一般数据;A0=1时,读取状态标志位或写入命令。
<6>RD:
读取控制线。
RD=0时,8279输送数据到外部总线。
<7>WR:
写入控制线。
WR=0时,8279从外部总线接收数据。
<8>IRQ:
中断请求。
平常IRQ为LO,在键盘模式下,每次读取FIFO/SENSORRAM的数据时,IRQ变为HI,读取后转为LO;在传感器模式下,只要传感器一有变化,就会使IRQ变为HI,读取后转为LO。
<9>SL0~SL3:
扫描按键开关或传感器矩阵及显示器,可以是编码模式(16对1)或解码模式(4对1)。
<10>RL0~RL7:
键盘/传感器的返回线。
无按键被按时,返回线为HI;有按键被按时,该按键的返回线为LO。
在激发输入模式时,为8位的数据输入。
<11>SHIFT:
在键盘扫描模式时,引脚的输入状态会与其它按键的状态一同储存(在BIT6),内部有上拉电阻,未按时为HI,按时为LO。
<12>CNTL/STB:
在键盘扫描模式时,引脚的输入状态会与SHIFT以及其它按键的状态同一储存,内部有上拉电阻,未按时为HI,按时为LO。
在激发输入模式时,作为返回线8位数据的使能引脚。
<13>OUTA0~OUTA3:
动态扫描显示的输出口(高4位)。
<14>OUTB0~OUTB3:
动态扫描显示的输出口(低4位)。
<15>BD:
消隐输出线。
8279有三种工作方式:
键盘方式、显示方式和传感器方式。
(1)键盘方式
8279在键盘工作方式时,可设置为双键互锁方式和N键循回方式。
双键互锁方式:
若有两个或多个键同时按下时,
不管按键先后顺序如何,只能识别最后一个被释放的键,并把该键值送入FIFORAM中。
N键循回方式:
一次按下任意个键均可被识别,按键值按扫描次序被送入FIFORAM中。
(2)显示方式
8279的显示方式又可分为左端入口和右端入口方式。
显示数据只要写入显示RAM,则可由显示器显示出来,因此显示数据写入显示RAM的顺序,决定了显示的次序。
左端入口方式即显示位置从显示器最左端1位(最高位)开始,以后显示的字符逐个向右顺序排列;右端入口方式即显示位置从显示器最右端1位(最低位)开始,已显示的字符逐个向左移位。
但无论左右入口,后输入的总是显示在最右边。
(3)传感器方式
传感器方式是把传感器的开关状态送入传感器RAM中。
当CPU对传感器阵列扫描时,一旦发现传感器状态发生变化就发出中断请求(IRQ置1),中断响应后转入中断处理程序。
3硬件电路图
3.1总体硬件框图
3.2硬件电路图
8279硬件电路图如图所示:
4程序设计流程图
4.1程序设计概述
首先将8279初始化,允许外部中断0,然后判断键值是否为9,如果键值为9视为开始键,进入十秒倒计时,如果期间没有选手抢答,第一个红灯亮;如果期间有选手抢答,则显示选手号,显示两秒后,进入选手答题阶段,六十秒倒计时开始,倒计时完成后,会到初始状态,若期间不能完成答题,则第一个红灯亮,代表答题无效;若期间完成答题,则由外部中断给出信号,回到初始状态,并且第一个和第二个灯同时亮,代表答题成功。
4.2程序流程图
5实验结果及数据
首先数码管在初状态显示0,再按下开始键9键之后,开始10秒倒计时,十秒之内选手进行抢答,抢答失败则亮灯,抢答成功则显示选手号,进入六十秒倒计时,选手进行回答问题,如果回答正确,则按外部中断回到初状态,两灯均亮表示答题成功,如果六十秒结束没有回答完成,则回到初状态,红灯亮,答题无效。
5.1结论
此次设计完成了基本要求中的当主持人按下抢答按键,参赛队在10秒钟内可以抢答。
如超过10秒则不能抢答。
如抢答成功,则显示抢答的队号。
如抢答成功必需在60秒内回答完成。
当主持人按下复位按键时,系统回到初始状态。
问题及心得
此次设计,我研究与设计的课题为八路多功能抢答器,通过查资料和搜集有关的文献,培养了我的自学能力和动手能力。
由原先的被动的接受知识转换为主动的寻求知识,是我学习方法上的一个很大的突破。
在以往的传统的学习模式下,我可能会记住很多的书本知识,但是通过这次实验,我学会了如何将学到的知识转化为自己的东西,学会了怎么更好的处理知识和实践相结合的问题。
把握重点、攻克难关。
在设计过程中由于时间仓促有很多的地方存在一些不足之处,自己的实践经验还是比较缺乏,理论联系实际的能力还需要提高。
这次实验对于提高我们的素质和科学实验能力非常有益,为以后从事电子电路方面的设计,研制电子产品打下基础。
在此,我要感谢我的老师的指导和同学们的帮助,在老师的启发和指导下,我才能顺利完成这次的设计。
附录
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitP1_0=P1^0;
uintCON8279=0xCfE9;//8279控制口地址
uintDATA8279=0xCFE8;//8279数据口地址
ucharLED[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//段码表0~9
Ucharcode
keyval[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x10,0x11,0x12,0x13,0x18,0x19,0x1a,0x1b};
Ucharcode
SEG[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
chari;
intk,r=0;
inta;
voidinit_8279()
{
XBYTE[CON8279]=0x00;//设置8279工作方式
XBYTE[CON8279]=0xD1;//清除8279
while(XBYTE[CON8279]&0x80);//等待清除结束
XBYTE[DATA8279]=0x34;//设置8279分频系数
}
ucharReadKey()
{
if(XBYTE[0xCFE9]&0x07){
XBYTE[0xCFE9]=0x40;
i=XBYTE[0xCFE8];
}
return0;
}
voidDisplay(uchary)
{
XBYTE[0xCFE9]=0x80;
XBYTE[0xCFE8]=SEG[y];
}
voiddelay()
{
for(k=0;k<8000;k++)
{};
}
voiddelay1(uinttem)
{
uintii,jj;
for(ii=0;ii{
for(jj=0;jj<100;jj++);
}
}
voidDisplay60()
{
XBYTE[CON8279]=0x90;
XBYTE[DATA8279]=LED[1];
XBYTE[DATA8279]=LED[0];
init_8279();
XBYTE[CON8279]=0x90;
XBYTE[DATA8279]=LED[6];
XBYTE[DATA8279]=LED[0];
delay1(1000);
XBYTE[CON8279]=0x90;
for(k=5;k>=0;k--){
for(i=9;i>=0;i--){
XBYTE[CON8279]=0x90;
XBYTE[DATA8279]=LED[k];
XBYTE[DATA8279]=LED[i];
if(r==1)break;
delay1(900);
}if(r==1)break;
}
}
intDisplay10()
{
a=0;
XBYTE[CON8279]=0x90;
XBYTE[DATA8279]=LED[1];
XBYTE[DATA8279]=LED[0];
init_8279();
XBYTE[CON8279]=0x90;
XBYTE[DATA8279]=LED[0];
for(i=9;i>=0;i--){
XBYTE[CON8279]=0x90;
XBYTE[DATA8279]=LED[i];
if(XBYTE[0xCFE9]&0x07)
break;
delay1(900);
}if(i<=1)
a=1;
returna;
}
voidjianpan(){
Display(0);
}
voidmain(){
EX0=1;
IT0=1;
EA=1;
loop:
init_8279();
while
(1){
jianpan();
while(XBYTE[0xCFE9]&0x07)
{
jianpan();
ReadKey();
i=i-191;
while(i==9)
{P1=0xff;
Display10();
if(a==1){jianpan();P1=0xfe;a=0;gotoloop;}else
break;}
ReadKey();
i=i-191;
Display(i);
delay1(2000);
Display60();
if(r==0){jianpan();P1=0xfe;r=0;gotoloop;}else
r=0;
P1=0x00;
delay1(3000);
gotoloop;
}
}
}
intinterruptEx0()interrupt0
{
r=1;
}