资源描述
(完整word版)简易四路抢答器
单片机课程设计
预习报告
班 级: 建电141
姓 名: 付鹏鑫
学 号: 1412032031
设计题目: 四位竞赛抢答器系统设计
设计时间: 2016.01.03~01.07
评定成绩:
评定教师:
目录
摘要 2
一、任务分析: 3
二、总体方案: 4
2.1 可行方案 5
2.2 方案设计 5
三、硬件设计: 8
3.1 电路原理图 8
1.AT89C51简介 10
2.PCF8591简介 11
3.RESPACK8及RX8简介………………………………………………………….12
3.2 器件选择 14
四、软件设计: 15
4.1程序处理流程 15
4.2 程序流程图 15
4.3 程序介绍 17
五、调试过程: 22
5.1 调试步骤 22
六、参考文献: 23
摘要:抢答器作为一种工具,已广泛应用于各自智力与知识竞赛场合。本设计是基于C52单片机系统的四路抢答器。考虑到其限时回答功能,利用单片机的定时器/计数器定时和计数原理,将软件和硬件结合,使系统能准确计时,并使数码管正确的显示时间。用开关做键盘输出,扬声器做提示报警。同时系统能够实现抢答结果锁存、调整定时时长(用pcf8591实现A/D转换)以及手动复位功能。
关键字:AT89C51单片机、锁存、减计时、动态显示、报警
一、任务分析
1.1 设计要求以及需求分析
1、设计一个四位竞赛抢答单片机系统,可同时供4 名选手或4 个代表队参加比赛,每队设置单独的抢答按钮,编号为1、2、3、4,主要的需求是通过对按钮的设置实现每个小组的抢答
2、给节目主持人设置一个“抢答开始”控制开关,用来控制抢答开始,主要需求是通过对抢答按钮的设置实现抢答的开始
3、给节目主持人设置一个“系统清除”控制开关,用来控制系统清零主要需求是通过对系统清零按键的设置以实现系统的清除功能的实现
4、抢答器具有编号锁存、抢答计分、时间显示和声响提示等功能。
1)主持人按下“抢答开始”后,系统以减计时方式,显示抢答剩余时间。
2)如果抢答时间计时结束,却没有选手抢答时,本次抢答无效,系统报警提示(显示单音,持续2 秒);
3)抢答时间内,若有选手按动对应的抢答按钮,此对编号立即锁存,数码管上显示出队伍编号和此队累计分数,同时系统给出音响提示(显示单音,持续2 秒)。
4)在主持人启动“抢答开始”键前,选手提前抢答,抢答无效,系统报警提示(显示单音,持续2 秒)。主要需求是对系统报警功能实现以及对选手抢答按键和主持人按键的检测
5、抢答成功后,禁止其他选手抢答,优先抢答选手的编号一直保持到主持人将系统清零为止,主要实现数据锁存。
6、抢答器具有利用旋钮调整抢答时间功能,时间范围20 秒~50 秒,
主要需求是对抢答时间的准确设置
1.2 功能模块设置及其功能
(1)键盘输入模块:主要是实现选手的抢答以及主持人实现系统清零和抢答开始的功能;
(2)蜂鸣器报警模块:主要是实现提示和报警功能;
(3)旋钮调节模块:主要是实现对选手抢答时间设置的功能,通过PCF8591进行A/D转换改变计时器初值来实现;
(4)数码管显示模块:主要是实现选手抢答时间的显示以及选手的组别和答题分数的设置的功能
二、总体方案设计
方案一:抢答器系统采用中小规模集成电路,使用按钮作为开关,完成输入信号的触发。该方案不需要软件编程,只需要硬件电路不出错就可实现需要的功能。但是电路的结构复杂,不利于调试,成本较高,实现接线的时候会因导线连接混乱造成干扰和短路等故障。
方案二:采用现场可编程门列阵(FPGA)。FPGA可以给出很多逻辑单元,可以将想要实现的功能的电路应硬件语言描述出来,可以实现许多的复杂功能,比较灵活多变而在时序方面比单片机要好。但是该设计方式对数据的处理方式的速度要求不高,FPGA高速优势无法体现,同时芯片的引脚比较多,实物电路板布线复杂,加重实际焊接的工作,而且从成本方面来看,较为不经济。
方案三:抢答器系统由一块AT89C51单片机芯片为控制核心,通过PCF8951芯片实现电压输入模拟量的采集以及A/D转换实现向单片机数据的传输以控制减计时时间的控制,通过蜂鸣器发出报警信号,以及通过开关的闭合采集减计时、选手组好、分数和主持人输入信号的采集以在数码管上显示,性能良好,可靠性高,且成本相对较低。
从成本、性能、可靠性等多方面进行对比和论证,以及基于安全、法
律等因素和性价比最优原则,最终实施方案三
结合课题功能指标,利用学习过的AT89C51单片机作为控制核心。同时利用独立式键盘来实现选手的抢答功能以及主持人对抢答开始和系统清零的控制,同时用8 位的共阳极数码管显示队伍的编号、分数、以及减计时的时间,同时也用到了转换器PCF8951
显示电路
PCF8951模拟信号采集转换电路
报警电路
选手开关
AT89C52
主持人开关
系统总体框图(
各组成部分的作用和特点
PCF8591:通过对电压模拟信号的采集以及A/D转换,将数字量输出
送给单片机来控制减计时的时间;
AT89C52:处理键盘输入及控制数码管输入与报警电路
显示电路:显示倒计时、抢答队伍及其分数
报警电路:用于实现选手抢答和减计时结束却没有组别回答问题时的报警功能。
主持人/选手开关:通过键盘控制输入 C52的数据
三、硬件设计
3.1电路原理图
系统整体设计图
报警系统
数码管显示
开关按键
A/D转换电路
关键器件的介绍:
1.AT89C51简介
AT89C51是美国ATMEL公司生产的低电压,高性能CMOS8位单片机,片
内含4k bytes的可反复擦写的只读程序存储器(PEROM)和128 bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器(CPU)和Flash存储单元,功能强大,可灵活应用于各种控制领域。
主要性能参数:
·与MCS-51产品指令系统完全兼容
·4k字节可重擦写Flash闪速存储器
·1000次擦写周期
·全静态操作:0Hz-24MHz
·三级加密程序存储器
·128×8字节内部RAM
·32个可编程I/O口线
·2个16位定时/计数器
·5个中断源
·可编程串行UART通道
·低功耗空闲和掉电模式
2.PCF8591简介
PCF8591是8位A/D和D/A转换器,是单片、单电源低功耗 8 位 CMOS 数据采集器件,具有4个模拟输入、一个输出和一个串行I2C 总线接口。3个地址引脚A0、A1和A2用于编程硬件地址,允许将最多8个器件连接至I2C总线而不需要额外硬件。器件的地址、控制和数据通过两线双向I2C总线传输。器件功能包括多路复用模拟输入、片上跟踪和保持功能、8位模数转换和8位数模拟转换。最大转换速率取决于I2C总线的最高速率。
主要性能参数:
·单电源供电
·工作电压:2.5 V--6 V
·待机电流低
·I2C总线串行输入/输出
·通过3个硬件地址引脚编址
·采样速率取决于I2C总线速度
·4个模拟输入可编程为单端或差分输入
·自动增量通道选择
·模拟电压范围:VSS~ VDD
·片上跟踪与保持电路
·8位逐次逼近式A/D转换
·带一个模拟输出的乘法DAC
A/D和D/A转换的计算公式以及输入与输出关系图
时序图
PCF8591的数据传送服从I2C总线协议,总线上数据信号的传送由起始信号(S)开始,由终止信号(P)结束。
在SCL线为高电平期间,SDA线由高电平向低电平的变化表示起始信号,起始信号表示一次数据传送的开始,其后为寻址字节,来寻址被控的从机(本设计中取为40H),在寻址字节后为其应答位。再之后,是按指定读/写的数据字节与应答位。在数据传送结束以后主器件都必须发送停止信号。停止信号用在SCL
为高电平期间,SDA线由低电平向高电平的变化来表示。这便是一次完整的数据传送应答时序。
A/D转换的时序图
3、排阻RESPACK8 及RX8电阻块
RESPACK8用于P0口驱动,电流不够,加排阻增加电流
RX8用于单片机IO用作低电平输入时是提供灌电流,电阻大小的确定一般都是根据你的拉电阻的选择,因为漏极输出的IO内阻相当大,等效电路的电阻即为拉电阻,拉电流就是外接电源/拉电阻,一般的TTL电平驱动电流在20ma-25ma
5、独立按键的简介
共有六个键盘,其中1-4组按键用于实现组别选手的抢答按键
5号按键用于实现主持人设置抢答开始
6号按键用于实现主持人设置系统清零
3.2器件的选择
(1)键盘的选择:
由于只要实现四组抢答以及主持人使用的系统清零和抢答开始功能,故使用单独六个按键来实现功能以减少器件使用的成本,且能够实现完全的功能
(2)模拟器件的选取:
为了符合设计要求的规定,A/D转换器选择了采用I2C串行通信的PCF8591
(3)数码管的选取
由于通过PCF8591芯片采集的模拟量信号的输入电压最大为+5V,所
以八位数码管已基本满足需求,为了使P0口获得 更大的驱动能力,在此选择了共阳极数码管。
(4)I/O驱动能力分析:
与P1、P2、P3口相比,P0口的驱动能力较大,每位可驱动8个LSTTL输入,而P1、P2、P3口的每一位的驱动能力,只有P0口的一半。当P0口的某位为高电平时,可提供400uA的电流,当P0口的某位为低电平时,可提供3.2mA的灌电流。无论是P0口,还是P1、P2、P3口,想要获得较大的驱动能力,只能用低电平输出。
(5)电路结构的确定
独立的键盘作为人机接口,直接与单片机的P1口相连,单片机的P1口驱动能力相对较弱,但满足数码管驱动,用于驱动八个8段LED数码管, P3口低四位作为四个数码管的位选信号。P3.0、P3.1分别作为时钟线和信号线接口与PCF8591相接, P1.6用来接入蜂鸣器。
四、软件设计
4.1 程序处理流程
开始的时候先设置各存储器的地址以及控制字和IO口的设定
减计时设置完成以后,若主持人未按下【开始抢答】按键,却有 【1组】、【2组】、【3组】、【4组】中的某一组按下按键,则系统提示报警信号,发出2s的报警提示音;若主持人按下【开始抢答】按键,则进入减计时程序,此时若减计时结束,却没有组进行抢答,则系统提示报警信号,发出2s的报警提示音,然后支持人对系统设置【系统清零】,若在减计时结束之前有【1组】、【2组】、【3组】、【4组】中的某一组按下按键抢答,则在数码管上显示该组的成绩累计加分,并显示改组的组号,同时系统设置锁存,保存该组现有的得分,阻止其他组继续抢答,系统提示报警信号,发出2s的报警提示音
开始
4.2程序流程图
设置存储器存储地址
设置时间
主持人设置开始抢答
减计时
某组直接抢答
P1.0~P1.4=0
报警2S
N
报警2S
系统清零
显示组号和分数
加分
Y
报警2S
系统清零
4.3 程序介绍
(1)A/D转换
28
//--定义PCF8591的读写地址--//
#define WRITEADDR 0x90 //写地址
#define READADDR 0x91 //读地址
//--声明全局函数--//
void Pcf8591SendByte(unsigned char channel);
unsigned char Pcf8591ReadByte();
void Pcf8591DaConversion(unsigned char value);
* 函 数 名 : Pcf8591SendByte
* 函数功能 : 写入一个控制命令
* 输 入 : channel(转换通道)
* 输 出 : 无
*******************************************************************************/
void Pcf8591SendByte(unsigned char channel)
{
I2C_Start();
I2C_SendByte(WRITEADDR, 1); //发送写器件地址
I2C_SendByte(0x40|channel, 0); //发送控制寄存器
I2C_Stop();
}
/*******************************************************************************
* 函 数 名 : Pcf8591ReadByte
* 函数功能 : 读取一个转换值
* 输 入 : 无
* 输 出 : dat
*******************************************************************************/
unsigned char Pcf8591ReadByte()
{
unsigned char dat;
I2C_Start();
I2C_SendByte(READADDR, 1);//发送读器件地址
dat=I2C_ReadByte(); //读取数据
I2C_Stop(); //结束总线
return dat;
}
/*******************************************************************************
* 函 数 名 : Pcf8591DaConversion
* 函数功能 : PCF8591的输出端输出模拟量
* 输 入 : value(转换的数值)
* 输 出 : 无
*******************************************************************************/
void Pcf8591DaConversion(unsigned char value)
{
I2C_Start();
I2C_SendByte(WRITEADDR, 1);//发送写器件地址
I2C_SendByte(0x40, 1); //开启DA写到控制寄存器
I2C_SendByte(value, 0); //发送转换数值
I2C_Stop();
}
功能:PCF8591芯片通过对模拟输入电压的采集,然后对其进行A/D转换,通过信号线传给单片机已实现对减计时时间的设定
思路:减计时时间的设定与PCF8591采集到的模拟量输出电压的大小有关,PCF8591可以将其采集到的模拟量信号通过A/D转换转换成数字量信号从而达到控制减计时时间的功能
(2)开关检测
if(start == 0 || flag == 1)
{
ET0 = 1;
flag = 1;
if(m == 0)
{
flag = 0;
}
else if(m == 1)
{
beep_flag = 1;
}
if((flag1 == 0) && (flag2 == 0) &&(flag3 == 0) && (flag4 == 0)) //未有队伍抢答则倒计时
{
display(0, m);
}
}
if((key1 == 0 || flag1 == 1) && (flag2 == 0 && flag3 == 0 && flag4 == 0)) //队伍一抢答并且其他队伍未抢答
{
ET0 = 1;
if(flag == 1) //若已开始,则有效
{
flag1 = 1;
flag2 = 0;
flag3 = 0;
flag4 = 0;
display(1, score1);
ET0 = 0;
m = m1;
}
else //若未开始则启动蜂鸣器提醒
{
beep_flag = 1;
}
}
if((key2 == 0 || flag2 == 1) && (flag1 == 0 && flag3 == 0 && flag4 == 0)) //同上
{
ET0 = 1;
if(flag == 1)
{
flag2 = 1;
flag1 = 0;
flag3 = 0;
flag4 = 0;
display(2, score2);
ET0 = 0;
m = m1;
}
else
{
beep_flag = 1;
}
}
if((key3 == 0 || flag3 == 1) && (flag1 == 0 && flag2 == 0 && flag4 == 0)) //同上
{
ET0 = 1;
if(flag == 1)
{
flag3 = 1;
flag1 = 0;
flag2 = 0;
flag4 = 0;
display(3, score3);
ET0 = 0;
m = m1;
}
else
{
beep_flag = 1;
}
}
if((key4 == 0 || flag4 == 1) && (flag1 == 0 && flag2 == 0 && flag3 == 0)) //同上
{
ET0 = 1;
if(flag == 1)
{
flag4 = 1;
flag1 = 0;
flag2 = 0;
flag3 = 0;
display(4, score4);
ET0 = 0;
m = m1;
}
else
{
beep_flag = 1;
}
}
if(flag == 0)
{
display(0,0);
}
}
}
功能:通过按键的检测判断是否有人抢答或是主持人是否有按下按键设置抢答开始和系统清零
思路:通过对按键是否闭合的检测,检测出选手抢答和主持人按键开始和系统清零,从而实现对没对抢答以后队伍的显示和分数的显示,以及减计时的显示和主持人对系统的清零
(3)数码管对某队抢答和分数的显示
void display(unsigned char team, unsigned char m) //数码管显示程序
{
unsigned ms,mg;
ms = m / 10;
mg = m % 10;
if(team == 0)
{
data = 0x00;
weixuan1 = 0;
weixuan2 = 1;
weixuan3 = 1;
weixuan4 = 1;
Delay2ms();
weixuan1 = 1;
data = 0x00;
weixuan1 = 1;
weixuan2 = 0;
weixuan3 = 1;
weixuan4 = 1;
Delay2ms();
weixuan2 = 1;
data = table[ms];
weixuan1 = 1;
weixuan2 = 1;
weixuan3 = 0;
weixuan4 = 1;
Delay2ms();
weixuan3 = 1;
data = table[mg];
weixuan1 = 1;
weixuan2 = 1;
weixuan3 = 1;
weixuan4 = 0;
Delay2ms();
weixuan4 = 1;
}
else
{
data = table[team];
weixuan1 = 0;
weixuan2 = 1;
weixuan3 = 1;
weixua n4 = 1;
Delay2ms();
weixuan1 = 1;
data = 0x40;
weixuan1 = 1;
weixuan2 = 0;
weixuan3 = 1;
weixuan4 = 1;
Delay2ms();
weixuan2 = 1;
data = table[ms];
weixuan1 = 1;
weixuan2 = 1;
weixuan3 = 0;
weixuan4 = 1;
Delay2ms();
weixuan3 = 1;
data = table[mg];
weixuan1 = 1;
weixuan2 = 1;
weixuan3 = 1;
weixuan4 = 0;
Delay2ms();
weixuan4 = 1;
}
}
功能:通过对每一组开关按键的检测,实现该组的队伍和分数的检测
思路:通过对每一组开关按键的检测,设置处数码管的位选码和段码
,从而达到对该队成绩与队伍的显示
(4)报警显示
void Timer0_INT() interrupt 1 //中断服务函数
{
count++;
if(count==20) //count=20,计时一秒
{
count=0;
if(m != 0)
{
m--;
}
else
{
m = 0;
}
if(beep_flag == 1) //蜂鸣器标志位为1,启动蜂鸣器
{
beep = 1; //启动蜂鸣器
beep_count--; //蜂鸣器定时自减
if(beep_count == 0)
{
beep_count = 3;
beep = 0; //关蜂鸣器
beep_flag = 0; //清蜂鸣器标志位
ET0 = 0; //关定时器
m = m1;
}
}
}
}
功能:实现报警信号的发出
思路:通过前面按键的检测,调用报警子程序,当主持人没有按下按键,有人抢答时,系统报警;或主持人按下开始按键,却没有人抢答时,系统报警
五、调试过程
本次设计过程中,原理图的绘制主要使用了Proteus软件,程序的编辑使用的是Keil uVision5 软件。
课程设计的开始是对原理图进行绘制,然后则是程序的编写及调试。在程序的调试过程中我是分模块进行调试。
5.1调试步骤
(1)首先通过PCF8951对电压模拟量的采集,确定是否可以实现减计时的设定,以达到对减计时确切设定;
(2)然后跳入键盘检测子程序,确定哪个按键按下;
i)达到报警,则显示报警功能
ii)主持人设置抢答开始,系统清零的检测
iii)某组抢答功能的检测
iv)之前按键按下后应实现的功能,在数码管上得以显示
(3)设置之前的程序已调用延时功能,检查是否达到准确延时的功能
“Debug”下“Step”或用快捷方式()进行单步(进子程序)调试;通过对每个子程序的检验确定是否达到准确功能的实现,然后将所有子程序放在一起联调,从而确定是否对功能的完全实现
六、参考文献
[1]孙卫喜. 单片机在C语言串口通信中的应用解析[J]. 计算机技术与发展,2016,(07):160-163.
[2]周国运. 单片机C语言教学探索[J]. 计算机教育,2009,(22):63-65.
[3]张毅刚.单片机原理及应用[M].北京:高等教育出版社,2016
[4]康丽洁.基于单片机的8路抢答器简单设计[J].信息系统工程,2010,(2):78-80
展开阅读全文