资源描述
惠 州 学 院
数字电子技术课程
设计说明书
题 目:基于单片机(89C52)四人抢答器
系 部: 电子科学系
班 级: 09级电信二班
学生姓名:
学 号:
指导老师:
12月29日
智能四路抢答器
目录
一、 序言……………………………………………………2
二、 方案设计………………………………………………2
1、 方案比较……………………………………………2
2、 系统总体设计方案和实现框图……………………3
三、 理论分析…………………………………………………3
四、 电路设计…………………………………………………4
1、 按键部分………………………………………………4
2、 显示部分………………………………………………5
3、 总原理图………………………………………………6
五、 软件步骤图模块……………………………………………7
六、 结论…………………………………………………………8
七、 程序………………………………………………………9
一、序言
本设计要求能够在主持人按下开始键后,四个参赛者开始抢按自己按键,谁按键先按下,谁面前灯就会亮而且有对应提醒,当参赛者耗时太多时又会有对应提醒。依据设计要求,本系统采取独立式按键,经过单片机不停扫描按键来控制LED灯和蜂鸣器,并用定时器T0、T1来定超时时间,其中抢答定时时间能够由主持人随意修改。当超时时候让蜂鸣器响和点亮对应LED灯(T0用于参赛者回复问题定时,T1用于参赛者抢答时间选定)。
二、方案设计
1、方案比较
(1)、总体设计
方案一:采取可编程I/O口扩展芯片8155
8155作为单片机扩展接口能实现很多功效,不过这个系统并不复杂,用8155会浪费很多资源,而且8155要用P0和P2端口作为地址线对它进行读写,这么不仅浪费端口还使得编程变复杂。从节省资源和简化编程角度考虑,放弃了此方案。
方案二:直接采取AT89C51单片机
直接用单片机不仅编程被简化,还有效利用了各个端口。8051单片机资源完全够这个系统要求。所以最终选择了此方案。
(2)、模块
方案一:采取4*4矩阵键盘
此种键盘是常见按键扫描方法,不过本系统只需要六个按键,这么就会浪费十个,而且矩阵按键扫描要送数读数,对于编程很复杂,最终放弃了此方案。
方案二:采取独立式键盘
本系统只要8个按键就能够,用独立式键盘不仅节省端口还使编程变得简单。程序只要不停读数检验就行。所以,最终选择此方案。
2、系统总体设计方案和实现框图
抢答模块、修改抢答时间模块、主持人控制模块一共采取8个独立式键盘作为按键输入,当在主持人按下开始键后有参赛者按键按下时,就会有对应于这个按键灯亮而且蜂鸣器响一声,其它按键再按也无效。在要求时间以后如不清除,蜂鸣器就会一直响,超时LED会点亮,提醒已经到时间。框图图1。修改抢答时间是在按下了修改按键以后就会等候增量、减量输入以修改时间,直到再一次按下修改键以确定修改完成。
独立式按键部分
单片机处理
显示部分
按键扫描
图1
三、理论分析
51单片机端口上电是高电平,而且当外部没有输入时能自动弹跳到高电平,所以经过按键所接端口高低电平改变能够判定出哪个按键按下了。
独立按键
P1口电平改变
单片机识别
图2
四、电路设计
图3
1、按键扫描部分
单片机不停扫描P1口电平改变,当有按键按下时,对应I/O口会跳变为低电平,单片机检测到后,经过处理将作出对应显示。电路图1.
图4
2、显示部分
依据按键按下情况LED作出对应亮灭,蜂鸣器作出对应反应。
当开始键按下开启后,当S1按下时,则灯D1亮,并蜂鸣器响一声,假如超出要求时间,蜂鸣器一直响,并提醒超时LED灯被点亮。假如S1在限定时间内再次被按下,说明参赛者1已完成回复;当S2按下时,则灯D2亮,并蜂鸣器响一声,假如超出要求时间,蜂鸣器一直响,并提醒超时LED灯被点亮。假如S2在限定时间内再次被按下,说明参赛者2已完成回复;当S3按下时,则灯D3亮,并蜂鸣器响一声,假如超出要求时间,蜂鸣器一直响,并提醒超时LED灯被点亮。假如S3在限定时间内再次被按下,说明参赛者3已完成回复;当S4按下时,则灯D4亮,并蜂鸣器响一声,假如超出要求时间,蜂鸣器一直响,并提醒超时LED灯被点亮。假如S4在限定时间内再次被按下,说明参赛者4已完成回复;抢答完后能够按下主持人确实定键将其初始化。
总原理图图所表示:
五、软件模块
本系统用了定时器0和定时器1。
图5
六、结论
此次设计根据题目要求,基于单片机,利用较适宜控制算法,成功实现了抢答器基础功效。硬件原理结构简单,降低硬件成本和繁琐电路连接;软件设计方面,设计简单,可塑造性强,便于维护。所以选择使用单片机实现四人抢答器设计含有很强效益,能任意地修改抢答时间,使此抢答器适合在很多场所使用且成本低。经过此课程设计让我真正了解到了程序设计难点所在,难并不是程序框架搭建、理论上思索此方法是否可行、代码写入、调试其结果,真正难是在调试过程中,明明知道是有些问题,不过又无法锁定问题所在,造成结果是心理成就感受到抨击,反复对可能存在问题反复修改,一次又一次修改,可怕是代码越修越错,结果该不会来。折腾一段时间后,一不小心才发觉开始时候问题仅仅时很简单、愚蠢错误。从这程序设计过程中不停提醒我,必需步步为营,步步小心,耐心加细心即等于完美程序设计实现。
七、程序代码:
//实现功效:四人抢答器
/*1、只有主持人宣告开始抢答时,选手才能进行抢答,抢答有一定时间限制,超出一定时间就会出现报警声。
2、选手回复时必需在要求时间里面回复,不然就会出现报警声
3、数码管会显示时间
4、各通道要求:
5、抢答时间是能够设置*/
#include<reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit beep=P3^6;//making voice(低电平有效)
sbit LED1=P2^7;//competitor 1(低电平有效)
sbit ONE=P1^0;//(高电平有效)
sbit LED2=P2^6;//competitor 2(低电平有效)
sbit TWO=P1^1;//(高电平有效)
sbit LED3=P2^5;//competitor 3(低电平有效)
sbit THREE=P1^2;
sbit LED4=P2^1;//competitor 4
sbit FOUR=P1^3;
sbit LED5=P2^0;//host announced beging
sbit HOST=P1^5;//低电平有效
sbit OVER=P3^7;//overtime
sbit CHANG=P1^4;//change the overtime(低电平有效)
sbit UP=P1^6;//(低电平有效)
sbit DOWN=P1^7;//低电平有效
sbit LS138A = P2^2; //定义译码器输入端A 在 P2.2 管脚上
sbit LS138B = P2^3; //定义译码器输入端B 在 P2.3 管脚上
sbit LS138C = P2^4; //定义译码器输入端C 在 P2.4 管脚上
static uint max1=10,num1=20;
uint max,num,temp,tt=0,dd=0x00;//max用于表示选手抢答时间
//uint i,LedNumVal=1 ;
//uint LedOut[10];
unsigned char code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
void delay(uint x);
void display(uint Key_Val);
void change();
void press(void);
void time1_max();
void time0_num();
//unsigned long
uint LedOut[5],LedhdsjVal;
void display(uint Key_Val)
{
uchar i;
/********以下将键值送到LED数码管显示*************/
LedhdsjVal=Key_Val; //把键值送到LedhdsjVal变量中
LedOut[0]=Disp_Tab[LedhdsjVal%10000/1000];
LedOut[1]=Disp_Tab[LedhdsjVal%1000/100];//|0x80;
LedOut[2]=Disp_Tab[LedhdsjVal%100/10]; //十位
LedOut[3]=Disp_Tab[LedhdsjVal%10]; //个位
for(i=1; i<4; i++)
{
P0 = LedOut[i];
/* switch(i)
{ //138译码
case 0:LS138A=0; LS138B=0; LS138C=0; break;
case 1:LS138A=1; LS138B=0; LS138C=0; break;
case 2:LS138A=0; LS138B=1; LS138C=0; break;
case 3:LS138A=1; LS138B=1; LS138C=0; break;
}
delay(100); */
switch(i)
{ //138译码
case 0:LS138A=0; LS138B=0; LS138C=0; break;
case 1:LS138A=1; LS138B=0; LS138C=0; break;
case 2:LS138A=0; LS138B=1; LS138C=0; break;
case 3:LS138A=1; LS138B=1; LS138C=0; break;
}
delay(10);
// P0=0x00;
// LS138A=1; LS138B=0; LS138C=0;
}
}
//void time()//选手回复时间,时间不可更改
//{
/***********************************************************
purpose: 系统初始化
/**********************************************************/
void time1_max()
{
TMOD|= 0x11;
TH1 =(65536-50000)/256; //12.000
TL1 =(65536-50000)%256;
IE = 0x8A;
TR1 = 1;
}
void time0_num()
{
TMOD|= 0x11;
TH0 =(65536-50000)/256; //12.000
TL0 =(65536-50000)%256;
IE = 0x83;
TR0 = 1;
}
void delay(uint x)
{
uint y;
for(x;x>0;x--)
for(y=110;y>0;y--);
}
void change(void)
{
if(CHANG==0)
{
delay(5);
if(CHANG==0)
{
while(!CHANG);
delay(5);
while(!CHANG);
delay(100);
while(CHANG)
{
display(max1);
if(UP==0)
{
delay(5);
if(UP==0)
{
max1++;
delay(20);
while(!UP);
delay(5);
while(!UP);
}
}
if(DOWN==0)
{
delay(10);
if(DOWN==0)
{
max1--;
delay(20);
while(!DOWN);
delay(5);
while(!DOWN);
}
}
}
while(!CHANG);
delay(5);
while(!CHANG);
}
}
}
void press(void)
{
if(ONE==0)
{
delay(5);
if(ONE==0)
{
while(!ONE);
delay(50);
while(!ONE);
delay(50);
while(!ONE);
TR1=0;
LED1=0;
beep=0;
delay(250);
beep=1;
num =num1;
time0_num();
while(num&&ONE)
{
temp=num;
display(temp);
}
while(!ONE);
delay(5);
while(!ONE);
TR0=0;
if(num==0)
{
beep=0;
OVER=0;
delay(10);
}
while(HOST)
{ display(num); }
}
while(!HOST);
delay(10);
while(!HOST);
beep=1;
LED1=1;
LED5=1;
OVER=1;
}
}
void main()
{
while(1)
{
display(dd);
change();
if(HOST==0)
{
delay(5);
if(HOST==0)
{
max=max1;
time1_max();
LED5=0;
beep=0;
delay(250);
beep=1;
while(!HOST);
delay(5);
while(!HOST);
while(max&&ONE&&TWO&&THREE&&FOUR)
{
display(max);
}
press();
TR0=0;
if(max==0)
{
OVER=0;
beep=0;
while(HOST)
{
display(0);
}
LED5=1;
OVER=1;
beep=1;
while(!HOST);
delay(5);
while(!HOST);
// delay(10);
// while(!HOST);
}
}
}
}
}
/*************************************
[ t1 (1ms)中止] 中止
*************************************/
void T1zd(void) interrupt 3 //3定时器1中止号 1定时器0中止号 0外部中止1 2外部中止2 4串口中止
{
TH1 =(65536-50000)/256; //12.000
TL1 =(65536-50000)%256;
tt++;
if(tt==20)
{
max--;
tt=0;
}
}
void T1zdd(void) interrupt 1 //3定时器1中止号 1定时器0中止号 0外部中止1 2外部中止2 4串口中止
{
TH0 =(65536-50000)/256; //12.000
TL0 =(65536-50000)%256;
tt++;
if(tt==20)
{ num--;
tt=0;
}
}
展开阅读全文