完美抢答器仿真图与程序文件
- 格式:doc
- 大小:179.00 KB
- 文档页数:12
基于51单片机的8路抢答器摘要此次设计提出了用AT89C51单片机为核心控制元件,设计一个简易的抢答器,本方案以AT89C51单片机作为主控核心,与晶振、数码管、蜂鸣器等构成八路抢答器,利用了单片机的延时电路、按键复位电路、时钟电路、定时/中断等电路,设计的八路抢答器具有实时显示抢答选手的号码和抢答时间的特点,还有复位电路,使其再开始新的一轮的答题和比赛,同时还利用C语言编程,使其实现一些基本的功能。
本设计的系统实用性强、判断精确、操作简单、扩展功能强。
它的功能实现是比赛开始,主持人读完题之后按下总开关,即计时开始,此时数码管开始进行30s的倒计时,直到有一个选手抢答时,对应的会在数码管上显示出该选手的编号和抢答所用的时间,同时蜂鸣器也会发出声音,以提示有人抢答本题,如果在规定的60s时间内没有做出抢答,则此题作废,即开始重新一轮的抢答。
在抢答和回答时间的最后5s,蜂鸣器都会给予报警提示。
关键词:单片机、AT89C51、抢答器、编码器、计数器、触发器、定时器目录引言------------------------------------------------------------------------------------------------------------- 3 绪论------------------------------------------------------------------------------------------------------------- 4 第1章系统设计内容--------------------------------------------------------------------------------- 4 1.1 系统设计依据------------------------------------------------------------------------------------------- 4 1.2 设计任务和要求------------------------------------------------------- 4 1.3 设计目的------------------------------------------------------------------------------------------------- 4第2章硬件设计-------------------------------------------------------------------------------------- 5 2.1 单片机控制原理---------------------------------------------------------------------------------------- 5 2.2 抢答器的原理------------------------------------------------------------------------------------------- 5 2.2.1 原理框图---------------------------------------------------------------------------------------------- 6 2.3 功能模块电路------------------------------------------------------------------------------------------- 6 2.3.1 晶振复位及开始抢答电路------------------------------------------------------------------------ 6 2.3.2 选手抢答键(矩阵式键盘)--------------------------------------------------------------------- 8 2.3.3.显示与显示驱动电路------------------------------------------------------------------------------ 8 2.3.4 蜂鸣器音频输出电路------------------------------------------------------------------------------ 9 第3章软件设计---------------------------------------------------------------------------------------- 10 3.1程序设计-------------------------------------------------------------------------------------------------- 10 3.1.1 系统流程图------------------------------------------------------------------------------------------- 10 3.1.2 显示抢答违规流程图------------------------------------------------- 10 3.1.3 抢答成功流程图----------------------------------------------------- 10 第4章系统调试-------------------------------------------------------- 11第5章总结------------------------------------------------------------ 11附录一程序代码---------------------------------------------------------- 12 附录二仿真电路原理图---------------------------------------------------- 16参考文献----------------------------------------------------------------- 16·引言随着电子技术的飞速发展,基于单片机的控制系统已经广泛应用于工业、农业、电力、电子、智能楼宇等行业。
摘要竞赛抢答器是由AT89C52单片机控制的,有八路选手抢答的只能抢答器,该抢答器由四部分组成,主持人按键部分,选手按键部分,显示部分和蜂鸣器部分。
该抢答器设有抢答倒计时,在规定倒计时内有人抢答则显示倒计时会停止,没有人抢答则倒计时完毕蜂鸣器响提示主持人抢答无效,以此实现抢答功能。
本文将详细介绍设计过程和实现的功能。
关键词:AT89C52单片机,抢答器,倒计时1 任务提出与方案论证1.1 设计要求1、能实现8位选手抢答。
2、主持人控制抢答的开始和清零。
3、一位选手抢答后另外的选手抢答无效。
4、主持人或选手按下按键时伴随蜂鸣器的响声。
5、主持人按下抢答开始按钮后伴随着抢答到家时开始计时15秒。
6、当主持人按下抢答且倒计时显示到0仍无人抢答时蜂鸣器持续响2秒钟。
1.2 系统设计方案论证1.2.1 方案设计方案一:采用模数电设计,包括优先编码电路、锁存电路、译码电路将参赛选手的输入信号显示在数码管上,用控制电路和主持人开关启动报警电路,以上两部分为主题电路,通过定时电路和译码电路将秒脉冲产生的信号在数码管上输出实现即时功能,构成扩展电路。
其总体框图如下:图1 模数抢答器系统框图方案二:采用A T89C52单片机为核心控制单元,利用软件编程达到控制抢答的目的,利用了单片机的延时电路,按键电路,控制电路等设计的抢答器具有显示抢答选手的和抢答时间的功能,还有清零按键可以开始新一轮的抢答,且功能强大。
1.2.2 方案论证选择上述两个方案都能实现抢答器的抢答功能,但是方案一组成电路很多,线路布置起来很复杂,可靠性不高,功能也很简单,特别是当抢答路数较多时实现起来更加困难。
方案二相比较起来实现起来比较简单,线路较少,而且软件实现调试比较简单,所以本设计我选择方案二,即采用AT89C52单片机来实现抢答器的设计。
2 总体设计本设计总体能实现八路抢答及倒计时等功能。
通过改变软件程序来达到预期的目的。
2.1 硬件设计与实现总体框图图2 系统总体框图2.2 软件程序流程图图3 抢答器系统程序流程图3 详细设计及仿真3.1硬件电路设计3.1.1 主控芯片的介绍本设计采用的是A T89C52单片机,A T89C52是美国Atmel公司生产的低电压、高性能CMOS 8位单片机,片内含8KB的可反复檫写的程序存储器和12B的随机存取数据存储器(RAM),器件采用Atmel公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内配置通用8位中央处理器(CPU)和Flash存储单元,功能强大的AT89C52单片机可灵活应用于各种控制领域。
设计一个16路智力抢答器要求:具有定时功能,有倒计时10秒报警,有防作弊处理。
其电路图如下图所示:附带程序如下:程序如下:Qdqi.c#include<reg52.h>#include"keyboard.h"#include"1602xs.h"#include"fmq.h" //蜂鸣器#include"delay.h"#define unint unsigned int#define unchar unsigned charsbitks=P1^0;sbitkz=P1^1;unint Flag=1,k;unint a=10,b=0,c=60,d=0;unchar key board;/************************************************定时器初始化子程序*************************************************/void Init_Timer(){TMOD |= 0x11; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响TH0=(65535-50000)/256; //给定初值,这里使用定时器最大值从0开始计数一直到65535溢出TL0=(65535-50000)%256;TH1=(65535-50000)/256; //给定初值,这里使用定时器最大值从0开始计数一直到65535溢出TL1=(65535-50000)%256;EA=1; //总中断打开ET0=1;ET1=1; //定时器中断打开// TR0=1; //定时器开关打开}/******************************************************************//* 主函数*//******************************************************************/void main(){init();Init_Timer();while(1){keyboard=getkey();if(ks) //开始抢题之前防抢答{if(key scan()==0xff){writechar(0x80+2,"waiting!!!");}//防作弊if(key scan()!=0xff){k=getkey();display2(0x80+0x40+4,k);fmq1();while(1);}}if(!ks) //开始抢题{TR0=1; //定时器中断打开// Flag=0;write_com(0x01);writechar(0x80+2,"Countdown:");while(key scan()==0xff) //没有人抢答{display2(0x80+0x40+5,a);if(a==0){TR0=0;display2(0x80+0x40+5,a);fmq();while(1);}}while(key scan()!=0xff){TR1=1;k=getkey();Flag=0;write_com(0x01);writechar(0x80+2,"Num: time:");while(!Flag){display2(0x80+0x40+4,k);display2(0x80+0x40+12,c);if(c==0){fmq1();while(1);}if(!kz){TR1=0;}}}// jianpan();}}}void Timer0_isr(void) interrupt 1 using 1{TH0=(65535-50000)/256; //重新赋值TL0=(65535-50000)%256;b++;if(b==20){b=0;a--;}}void Timer1_isr(void) interrupt 3 using 1{TH1=(65535-50000)/256; //重新赋值TL1=(65535-50000)%256;d++;if(d==20){d=0;c--;}}Keyboard.c/*-----------------------------------------------矩阵键盘实验程序通过反转法循环扫描矩阵键盘------------------------------------------------*/#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#include"keyboard.h"#include"delay.h"unsigned char const EL[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//0-Fuchargetkey(){ucharkey,k;key=key scan(); //调用键盘扫描,switch(key){case 0xee:k=0;break;//0按下相应的键显示相对应的码值case 0xde:k=1;break;//1 按下相应的键显示相对应的码值case 0xbe:k=2;break;//2case 0x7e:k=3;break;//3case 0xed:k=4;break;//4case 0xdd:k=5;break;//5case 0xbd:k=6;break;//6case 0x7d:k=7;break;//7case 0xeb:k=8;break;//8case 0xdb:k=9;break;//9case 0xbb:k=10;break;//acase 0x7b:k=11;break;//bcase 0xe7:k=12;break;//ccase 0xd7:k=13;break;//dcase 0xb7:k=14;break;//ecase 0x77:k=15;break;//fcase 0xff:k=16;break;//g}return k;}/*------------------------------------------------键盘扫描程序------------------------------------------------*/ucharkeyscan(void) //键盘扫描函数,使用行列反转扫描法{ucharcord_h,cord_l;//行列值中间变量P3=0x0f; //行线输出全为0cord_h=P3&0x0f; //读入列线值if(cord_h!=0x0f) //先检测有无按键按下{delay(100); //去抖if(cord_h!=0x0f){cord_h=P3&0x0f; //读入列线值P3=cord_h|0xf0; //输出当前列线值cord_l=P3&0xf0; //读入行线值return(cord_h+cord_l);//键盘最后组合码值}}return(0xff); //返回该值}1602xs.c#include"reg52.h"#include"delay.h"#include"1602xs.h"sbitlcden=P2^6;sbitlcdrs=P2^4;sbitlcdwr=P2^5;void write_com(uchar com) //写指令{lcdwr=0;lcdrs=0;P0=com;delay_mS(1);lcden=1;delay_mS(1);lcden=0;}void write_data(uchar date) //写数据{lcdrs=1;P0=date;delay_mS(1);lcden=1;delay_mS(1);lcden=0;}/********************************0x80+add 第二行地址0~150x80+0x40+add 第一行地址0~15数字:0x30+字母:需查表*********************************/void init() //初始化{lcden=0;write_com(0x38);write_com(0x0c);write_com(0x06);write_com(0x01); //清屏指令}/*writechar("Please input ps");*/void writechar(ucharadd,uchar *s) //写入一个字符串{write_com(add);while(*s){write_data(*s);delay_mS(1);*s++;}}void writechar1(ucharadd,uchar a1,uchar a2,uchar a3,uchar a4) //写入一个字符串{write_com(add);write_data(a1);write_data(a2);write_data(a3);write_data(a4);}void display1(ucharadd,uint date) //显示字符及位置{//ucharbai,shi,ge;//bai=date/100;//shi=date%100/10;//ge=date%10;write_com(add);write_data(0x30+date);//write_data(0x30+shi);//write_data(0x30+ge);write_data(0x6d);write_data(0x41);}void display2(ucharadd,uchar date) //显示字符及位置{ucharshi,ge;shi=date/10;ge=date%10;write_com(add);// write_data(date);write_data(0x30+shi);write_data(0x30+ge);//write_data(0x25);}Delay.c#include"delay.h"void delay(unsigned intcnt){while(--cnt);}/******1mS y anshi*******/void delay_mS(unsigned int z){uintx,y;for(x=z;x>0;x--)for(y=125;y>0;y--);}Fmq.c//在实际电路中我没有按蜂鸣器#include<reg52.h>#include"fmq.h"#include"delay.h"/*************端口定义*********/sbit SPK=P1^2; //定义喇叭端口//unsigned int k1=1,k2=1;void fmq(){unsigned inti;for(i=0;i<150;i++)//喇叭发声的时间循环,改变大小可以改变发声时间长短{delay(600); //参数决定发声的频率,估算值,可以自行更改参数并SPK=!SPK;}// SPK=1; //喇叭停止工作,间歇的时间,可更改// delay(50000);}void fmq1(){unsigned inti,j;for(j=0;j<5;j++){for(i=0;i<200;i++)//喇叭发声的时间循环,改变大小可以改变发声时间长短{delay(300); //参数决定发声的频率,估算值,可以自行更改参数并SPK=!SPK;}SPK=1; //喇叭停止工作,间歇的时间,可更改delay(90000);}}。
作品名称:八路抢答器组员:贾利伟、吴小勇、湛亚熙一、功能说明二、原理图说明1.数码管连接电路/********************************************数码管动态扫描处理程序(所有动态扫描显示共用)************************************************/void shumasm(uchar m,int n){int gewei,shiwei,baiwei;gewei=n%10;shiwei=n/10%10;baiwei=n/100;P0=m;//取显示数据,段码P2=0xef; //取第一位delay(20); //扫描间隙延时,时间太长会闪烁,太短会造成重影P0=LED[baiwei]; P2=0xdf;delay(20);P0=LED[shiwei]; P2=0xbf;delay(20);P0=LED[gewei]; P2=0x7f;delay(20);}2、按键机发光二极管连接图三、程序说明#include<reg52.h> //包含单片机寄存器的头文件#define uchar unsigned char#define uint unsigned intuchar LED[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //共阳数码管:0-9uchar LED_num[]={0x40,0X79,0X24,0X30,0X19,0X12,0X02,0X78,0X00},num_mark=0;//共阳数码管:选手编号显示:0. 1.-8. ,num_mark用来标记最近一次抢答成功选手编号char num=0;//标记选手编号int score[9]={9,0,0,0,0,0,0,0,0};//score[0]用来寄存抢答时间限制限制标记位qdtime的值int dtime=120,qdtime,second,count;//答题时间标记位dtime、抢答时间限制限制标记位qdtime、抢答\答题倒计时标记位second、以及计数标记位countuchar qdtime_2=3,END_mark=0;//选手相关区sbit LED01=P1^0;sbit LED02=P1^1;sbit LED03=P1^2;sbit LED04=P1^3;sbit LED05=P1^4;sbit LED06=P1^5;sbit LED07=P1^6;sbit LED08=P1^7; //选手抢答“监视灯”sbit K1=P1^0;sbit K2=P1^1;sbit K3=P1^2;sbit K4=P1^3;sbit K5=P1^4;sbit K6=P1^5;sbit K7=P1^6;sbit K8=P1^7; //选手抢答按钮uchar K[]={0,0,0,0,0,0,0,0,0};//选手按钮按下标记位,按下后便标记为1 //主持人相关区sbit REST=P3^2;sbit END=P3^2;sbit B_score=P3^3;//分数调节按钮sbit last=P3^4;sbit next=P3^5;sbit KS1=P3^6;sbit KS2=P3^7;//主持人用功能开关,其中P3^2口两用,sbit ADD10=P2^0;sbit MIN10=P2^1;sbit ADD1=P2^2;sbit MIN1=P2^3;//主持人用功能开关,用于所有加减调节uchar ks1=0,ks2=0;//抢答和答题开关标记位//sbit BeepIO=P3^0;void delaynms(unsigned int j);//j毫秒延时void delay(uint i);//i微妙延时void BEEP();//提示音void BEEP2();//警告音void BEEP3();//void shumasm(uchar m,int n);void main(){ uint j;//用来构成循环TMOD=0x11;//T0设置为16位定时方式TH0=0x3c;TL0=0xb0;//50msIE= 0x82; //允许T0中断TR0=0; //关闭定时开关while(1){ while(1){ LED01=1;LED02=1;LED03=1;LED04=1;LED05=1;LED06=1;LED07=1;LED08=1;//监视灯初始化为灭if(KS1==0) {ks1=1;break;}//开始抢答倒计时if(KS2==0) {ks2=1;break;}//开始答题倒计时if(ADD1==0) {delaynms(20); if(ADD1==0) dtime++;if(dtime>=1000) dtime=0;}//答题时间调整if(MIN1==0) {delaynms(20); if(MIN1==0) dtime--;if(dtime<0) dtime=999;}if(ADD10==0) {delaynms(20); if(ADD10==0) dtime=dtime+10;if(dtime>=1000) dtime=0;}if(MIN10==0) {delaynms(20); if(MIN10==0) dtime=dtime-10;if(dtime<0) dtime=999;}shumasm(LED[qdtime_2],dtime);//数码管动态扫描4位if(B_score==0){ delaynms(20);if(B_score==0)while(1){ if(B_score==0){ delaynms(20);if(B_score==0) break;}//再次按下B_score退出分数调节shumasm(LED_num[num],score[num]); //数码管动态扫描4位,显示选手编号和对应分数if(next==0){ delaynms(20);if(next==0) num++; if(num==9) num=0;}//显示下一位选手编号和对应分数if(last==0){ delaynms(20);if(last==0) num--; if(num<0) num=8;}//显示上一位选手编号和对应分数if(REST==0) {delaynms(20); if(REST==0) score[num]=0; }//将当前选手分数清零if(ADD1==0) {delaynms(20); if(ADD1==0) score[num]++;if(score[num]>=1000) score[num]=0;}//调节数码管上对应选手分数,分数范围0-999if(MIN1==0) {delaynms(20); if(MIN1==0) score[num]--;if(score[num]<0) score[num]=999;}if(ADD10==0) {delaynms(20); if(ADD10==0)score[num]=score[num]+10;if(score[num]>=1000) score[num]=0;}if(MIN10==0) {delaynms(20); if(MIN10==0)score[num]=score[num]-10;if(score[num]<0) score[num]=999;}}}}if(ks1==1) //开始抢答倒计时{ ks1=0;TR0=1;//开始倒计时count=0;//计数标记位归零second=qdtime_2;P2=0xef;//选通最低位K[1]=0;K[2]=0;K[3]=0;K[4]=0;K[5]=0;K[6]=0;K[7]=0;K[8]=0;//选手按钮按下标记位归零while(1){P0=LED[second];if(second==0) {TR0=0;P0=LED[0];break;}if(second<=4) BEEP();//提示抢答快要开始if(K1==0&&K[1]==0) {LED01=0;K[1]=1;}//选手监视,并用红灯标记犯规选手if(K2==0&&K[2]==0) {LED02=0;K[2]=1;}if(K3==0&&K[3]==0) {LED03=0;K[3]=1;}if(K4==0&&K[4]==0) {LED04=0;K[4]=1;}if(K5==0&&K[5]==0) {LED05=0;K[5]=1;}if(K6==0&&K[6]==0) {LED06=0;K[6]=1;}if(K7==0&&K[7]==0) {LED07=0;K[7]=1;}if(K8==0&&K[8]==0) {LED08=0;K[8]=1;}if(END==0) {delaynms(10); if(END==0) { END_mark=1;break;}}//可按结束键随时结束抢答环节}if(END_mark==1) {END_mark=0;continue;}//若结束键按下则结束抢答环节if(K[1]==1&&K[2]==1&&K[3]==1&&K[4]==1&&K[5]==1&&K[6]==1&&K[7]==1&&K[8]==1) //若所有选手均犯规则报警一段时间后自动结束本次抢答{ for(j=0;j<22;j++)BEEP2();continue;}qdtime=score[0];count=0;//计数标记位归零second=qdtime;num_mark=0;while(1){ if(END==0) {delaynms(10); if(END==0) {END_mark=1;break;}}switch((uchar)!(K1||K[1])*1+(uchar)!(K2||K[2])*3+(uchar)!(K3||K[3])*5+(uchar)!(K4||K[4])*10+(uc har)!(K5||K[5])*20+(uchar)!(K6||K[6])*40+(uchar)!(K7||K[7])*80+(uchar)!(K8||K[8])*160){case 1: num_mark=1;break;case 3: num_mark=2;break;case 5: num_mark=3;break;case 10: num_mark=4;break;case 20: num_mark=5;break;case 40: num_mark=6;break;case 80: num_mark=7;break;case 160:num_mark=8;break;}if(num_mark!=0) break;//有人抢答成功则结束抢答if(qdtime!=0)//抢答时间不为999秒时则启动抢答倒计时{ if(second<=6) BEEP();TR0=1;shumasm(LED[num_mark],second);if(second==0) {TR0=0;break;}}}while(1){ if(END_mark==1) {END_mark=0;break;}P2=0xef;P0=LED[num_mark];if(num_mark!=0) BEEP3();//提示抢答成功else BEEP2(); //警告音if(END==0) {delaynms(10); if(END==0) break;}//可按结束键继续下一轮抢答或进入答题}}else if(ks2==1) //开始答题倒计时{ ks2=0;TR0=1;num=num_mark;//将抢答成功选手编号给numcount=0;//计数标记位归零second=dtime;while(1){ shumasm(0xff,second);//即用后三位显示答题倒计时if(second<10) BEEP();//提示答题时间将到if(second==0){ TR0=0;break;}if(END==0) {delaynms(10); if(END==0) {END_mark=1;break;}}//可按结束键随时结束答题}while(1){ shumasm(LED_num[num],score[num]); //数码管动态扫描4位,进入抢答成功选手分数调节if(END==0) {delaynms(10); if(END==0) break;}//可按结束键继续下一轮抢答或进入答题if(ADD1==0) {delaynms(20); if(ADD1==0) score[num]++;if(score[num]>=1000) score[num]=0;}//调节数码管上对应选手分数,分数范围0-999 if(MIN1==0) {delaynms(20); if(MIN1==0) score[num]--;if(score[num]<0) score[num]=999;}if(ADD10==0) {delaynms(20); if(ADD10==0)score[num]=score[num]+10;if(score[num]>=1000) score[num]=0;}if(MIN10==0) {delaynms(20); if(MIN10==0)score[num]=score[num]-10;if(score[num]<0) score[num]=999;}}}}}/******************************************延时函数**********************************************/void delaynms(unsigned int j)//j毫秒延时{ unsigned int i,k;for(k=0;k<j;k++)for(i=0;i<1000;i++) ;}void delay(uint i)//i微妙延时{ while(i--) ;}/****************************************************用来进行答题倒计时和抢答倒计时******************************************************/void Timer0(void) interrupt 1{TH0=0x3c; //重新赋值50msTL0=0xb0;count++;if(count==20){ count=0;second--;}}/************************************************************蜂鸣器发音程序区**************************************************************/void BEEP()//提示音{unsigned int i;for(i=0;i<100;i++)//喇叭发声的时间循环{delay(100); //参数决定发声的频率,估算值BeepIO=!BeepIO;}BeepIO=1; //喇叭停止工作,间歇的时间delay(5000);}void BEEP2()//警告音{ unsigned int i;for(i=0;i<400;i++)//喇叭发声的时间循环{BeepIO=0;delay(40); //参数决定发声的频率,估算值BeepIO=1;delay(30);}delay(12500);//喇叭停止工作,间歇的时间}void BEEP3()//抢答成功提示音{ unsigned int i;for(i=0;i<400;i++)//喇叭发声的时间循环{BeepIO=0;delay(25); //参数决定发声的频率BeepIO=1;delay(25);}delay(20000);//喇叭停止工作,间歇的时间}/********************************************数码管动态扫描处理程序************************************************/ void shumasm(uchar m,int n){int gewei,shiwei,baiwei;gewei=n%10;shiwei=n/10%10;baiwei=n/100;P0=m;//取显示数据,段码P2=0xef; //取第一位delay(20); //扫描间隙延时P0=LED[baiwei]; P2=0xdf;delay(20);P0=LED[shiwei]; P2=0xbf;delay(20);P0=LED[gewei]; P2=0x7f;delay(20);}。
HEFEI UNIVERSITY四路抢答器仿真设计题目四路抢答器仿真设计班级自动化(1)班成员 YCT 11050310**PT 11050310**WW 11050310**时间 2014.5.19四路抢答器仿真设计目录一、前言 (1)二、方案设计 (1)三、理论分析 (2)四、电路设计 (2)1、晶体振荡器电路 (2)2、复位电路 (3)3、按键扫描部分 (3)4、显示部分 (4)五、软件模块 (6)六、系统组装调试 (8)七、总结 (8)参考文献 (9)附录 (10)四路抢答器仿真设计一、前言本设计要求能够在主持人按下开始键后,四个参赛者开始抢按自己的按键,谁的按键先按下,谁面前的灯就会亮并且有相应的提示,当参赛者耗时太多时又会有相应的提示。
根据设计的要求,本系统采用独立式按键,通过单片机不停的扫描按键来控制LED灯和蜂鸣器,并用定时器T0来定超时的时间,当超时的时候让蜂鸣器响。
二、方案设计(1)、总体设计方案一:采用可编程I/O口扩展芯片82558255作为单片机的扩展接口能实现很多功能,但是这个系统并不复杂,用8155会浪费很多的资源,而且8255要用P0和P2端口作为地址线对它进行读写,这样不仅浪费端口还使得编程变的复杂。
从节省资源和简化编程的角度考虑,放弃了此方案。
方案二:直接采用AT89C52单片机直接用单片机不仅编程被简化,还有效的利用了各个端口。
8051单片机的资源完全够这个系统的要求。
所以最终选择了此方案。
(2)、模块方案一:采用4*4矩阵键盘此种键盘是常用的按键扫描方法,但是本系统只需要六个按键,这样就会浪费十个,而且矩阵按键扫描要送数读数,对于编程很复杂,最终放弃了此方案。
方案二:采用独立式键盘本系统只要六个按键就可以,用独立式键盘不仅节省端口还使编程变得简单。
程序只要不停的读数检查就行。
所以,最终选择此方案。
2、系统总体设计方案与实现框图采用六个独立式的键盘作为按键输入,当在开始后有按键按下时,就会有对应于这个按键的灯亮并且蜂鸣器响一声,其它按键再按也无效。
应用科学学院电子系统课程设计姓名:周康学号:24号专业班级:嵌入式10指导教师:朱水金设计题目:八路抢答器完成时间:2013年07月01日电子系统课程设计摘要数字抢答器由主体电路与扩展电路组成。
用控制电路和主持人开关启动报警电路,以上两部分组成主体电路。
通过定时电路和译码电路将秒脉冲产生的信号在显示器上输出实现计时功能,构成扩展电路。
经过布线、焊接、调试等工作后数字抢答器成形。
单片机体积小价格低,应用方便,稳定可靠。
单片机系统的硬件结构给予了抢答系统“身躯”,而单片机的应用程序赋予了其新的“生命”,使其在传统的抢答器面前具有电路简单、成本低、运行可靠等特色。
关键字:抢答电路报警电路倒计时电路- 1 -目录第一章八路抢答器的概述及制作要求 (4)1.1 数字抢答器的概述 (4)1.2 设计任务与要求 (4)第二章单片机芯片的选择及抢答器方案 (5)2.1 单片机芯片的选择 (5)2.2 模块性能分析 (7)第三章硬件电路设计 (8)3.1 总体设计 (8)3.2 外部振荡电路 (9)3.3 复位电路的设计 (9)3.4 显示电路的设计 (9)3.5 按钮输入电路的设计 (9)3.6 报警电路的设计 (9)第四章系统软件设计 (12)4.1 抢答器流程图 (12)4.2 抢答器程序 (12)第五章产品的样品 (25)4.1 实物图 (12)4.2 PCB版图 (12)4.1 实物焊接图 (12)结束语 (25)参考文献 (28)引言:单片机的发展史单片机诞生于20世纪70年代末,经历了SCM、MCU、SoC三大阶段。
1.SCM即单片微型计算机(Single Chip Microcomputer)阶段,主要是寻求最佳的单片形态嵌入式系统的最佳体系结构。
“创新模式”获得成功,奠定了SCM与通用计算机完全不同的发展道路。
在开创嵌式系统独立发展道路上,Intel公司功不可没。
2.MCU即微控制器(Micro Controller Unit)阶段,主要的技术发展方向是:不断扩展满足嵌入式应用时,对象系统要求的各种外围电路与接口电路,突显其对象的智能化控制能力。
四人智力竞赛抢答器一、设计目的1.掌握四人智力竞赛抢答器电路的设计、组装与调试方法。
2.熟悉数字集成电路的设计和使用方法。
二、设计任务与要求1、设计任务设计一台可供4名选手参加比赛的智力竞赛抢答器。
用数字显示抢答倒计时间,由“9”倒计到“0”时,无人抢答,蜂鸣器连续响1秒。
选手抢答时,数码显示选手组号,同时蜂鸣器响1秒,倒计时停止。
2、设计要求(1)4名选手编号为:1,2,3,4。
各有一个抢答按钮,按钮的编号与选手的编号对应,也分别为1,2,3,4。
(2)给主持人设置一个控制按钮,用来控制系统清零(抢答显示数码管灭灯)和抢答的开始。
(3)抢答器具有数据锁存和显示的功能。
抢答开始后,若有选手按动抢答按钮,该选手编号立即锁存,并在抢答显示器上显示该编号,同时扬声器给出音响提示,封锁输入编码电路,禁止其他选手抢答。
抢答选手的编号一直保持到主持人将系统清零为止。
(4)抢答器具有定时(9秒)抢答的功能。
当主持人按下开始按钮后,定时器开始倒计时,定时显示器显示倒计时间,若无人抢答,倒计时结束时,扬声器响,音响持续1秒。
参赛选手在设定时间(9秒)内抢答有效,抢答成功,扬声器响,音响持续1秒,同时定时器停止倒计时,抢答显示器上显示选手的编号,定时显示器上显示剩余抢答时间,并保持到主持人将系统清零为止。
(5)如果抢答定时已到,却没有选手抢答时,本次抢答无效。
系统扬声器报警(音响持续1秒),并封锁输入编码电路,禁止选手超时后抢答,时间显示器显示0。
(6)可用石英晶体振荡器或者555定时器产生频率为1H z的脉冲信号,作为定时计数器的CP 信号。
三、四人智力竞赛抢答器电路原理及设计 1、设计方案抢答器具有锁存、定时、显示和报警功能。
即当抢答开始后,选手抢答按动按钮,锁存器锁存相应的选手编码,同时用LED 数码管把选手的编码显示出来,并且开始抢答时间的倒计时,同时用LED 数码管把选手的所剩抢答时间显示出来。
而在选手按键抢答以及抢答时间倒计时到时的时候都有报警以提醒主持人和选手。
课程设计题目:基于单片机的智能八路抢答器设计一、设计项目简介1. 设计意义及目的抢答器在现实生活中应用广泛,比如在各类娱乐节目中,像中央电视台的幸运52,开心辞典,因此做一个抢答器是具有现实意义的。
抢答器具有人数限制,我们选择做八路抢答器。
当某人抢答时,能够显示他的,限定他的答题时间,别人不能抢答,主持人要有启动和清空的权利。
八路抢答器在抢答过程中,为了知道哪一组或哪一位选手先答题,必须要设计一个系统来完成这个任务。
如果在抢答中,靠视觉是很难判断出哪组先答题。
利用单片机系统来设计抢答器,使以上问题得以解决,即使两组的抢答时间相差几微秒,也可分辨出哪组优先答题。
抢答组数可以在八组以任意使用,本系统采用AT89S52单片机作为核心,控制系统的四个模块分别为:单片机最小系统、显示模块、显示驱动模块、抢答开关模块。
2. 系统功能描述设计一个具有特定功能的抢答器。
该抢答器上电或按键复位后能自动显示系统提示符“P.”,进入准备工作状态。
主持人按下开始按钮后,抢答开始并限定时间30S;10S无人抢答,蜂鸣器发出音响;主持人按下开始按钮之前有人按下抢答器,抢答违规,显示器显示违规台号,违规指示灯亮,其它按钮不起作用;正常抢答,显示器显示台号,蜂鸣器发出音响,其它抢答按钮无效;正常抢答下,从按下抢答按钮开始30S,答完按钮没按下,则作超时处理,超时处理时,违规指示灯亮,数码管显示违规台号。
蜂鸣器发出音响;各台数字显示的消除,蜂鸣器音响及违规指示灯的关断,都要通过主持人按复位按钮。
3. 设计达到目标我们在要求的基础上拓展了一些功能,比如增加倒数剩下5S的时候每秒响一声,最后一声比较悠长,以提示选手抢答或者回答时间将尽,还将抢答按键和答完按键做在了同一个按键上,抢答之后选手答完题目再次按下该抢答按键即是答完,使剩余时间与台号定格。
总体上我们达到了:按该抢答器上电或按键复位后能自动显示系统提示符“P.”,进入准备工作状态。
主持人按下开始按钮后,抢答开始并限定时间30S;10S无人抢答,蜂鸣器发出音响;最后5S倒计时蜂鸣器每秒响一声提示,最后一声比较悠长,提示抢答时间到;主持人按下开始按钮之前有人按下抢答器,抢答违规,显示器显示违规台号,违规指示灯亮,其它按钮不起作用;正常抢答,显示器显示台号,蜂鸣器发出音响,其它抢答按钮无效;正常抢答下,从按下抢答按钮开始30S,答完按钮没按下,则作超时处理,超时处理时,违规指示灯亮,数码管显示违规台号,和抢答期间一样,回答期间最后5S倒计时蜂鸣器每秒响一声提示,最后一声比较悠长,提示回答时间到;答完按钮设置在抢答按键上,再次按下抢答按键即是答完,此时蜂鸣器响一声,时间定格在答完题目之后剩下的时间;各台数字显示的消除,蜂鸣器音响及违规指示灯的关断,都要通过主持人按复位按钮。
二、系统硬件设计1. 系统设计方案(1)利用译码芯片先根据74LS148的优先功能,确定了先抢答到的选手的编码号,再根据74LS279的锁存功能,将其信号保持下来,并实现了锁定功能,将选手的编码锁定。
再者,根据74LS48的译码功能,将74LS279锁定的数字编译成二进制,将信号送到显示器中。
这样就实现了抢答功能。
原理框图如图1所示。
图 1 原理框图(2)利用单片机可以利用单片机的定时/计数器进行计时,设定抢答时间和答题时间;可以利用单片机的I/O口线接按键,通过按键按下后,所接口线电平的变化来判断那位选手按下键。
我选择利用单片机做抢答器。
1、仿真图2、程序/****************************************************************************** ********* 操作非常简单* 主持人先按键,然后有30s的时间,等待选手按键* 选手在30s按键,就显示选手的号数,及30s的回答倒计时* 此时,其他选手按键无效,* 只有抢答选手按键,才停止,并显示锁定* 最后,按复位,进行新一轮抢答******************************************************************************* *******/#include"reg52.h"#include"intrins.h"#include"absacc.h"#define uchar unsigned char#define uint unsigned int#define ulong unsigned long/* 定义定时器T0和T1时间常数和方式控制字 */#define v_th0 0x3c#define v_tl0 0xb0#define v_tmod 0x11sbit P30=P3^0;sbit P36=P3^6;sbit P32=P3^2;sbit P31=P3^1;uchar led_buf[8];//显示缓冲数组uchar code dispcode[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x0c};//段码数组uchar keyzhi;uint m,time,time2;void delay(uint a) //延时程序{while(a--);}void led() //违规指示灯亮程序{P32=0;delay(2000);delay(2000);}void ring() //蜂鸣器程序{P36=0;delay(10000);P36=1;}void ledk() //P.显示程序{uchar dmask=0x01; //位控码初始化uchar pos;for(pos=0;pos<3;pos++){P2=dmask; //位控码输出到位控口P0=dispcode[10]; //取显示段码并输出到段控口delay(200);dmask=_crol_(dmask,1); //位控码左移一位}}void led_buf_auto_flush(void) reentrant //显示缓冲区更新函数{led_buf[0]=m; //获得选手的led_buf[1]=time/10; //获得秒十位led_buf[2]=time%10; //获得秒的个位}void timer0(void) interrupt 1 //定时器t0中断服务函数,选用定时器0工作方式为1 {uchar j;static uchar click=0;TH0=v_th0;TL1=v_tl0; //设置初始值50ms为循环20次为1ms,12MHz++click;if(click==20) //定时器0定时中断次数{--time;click=0;if((time==20)&&(j=0xff)){ring();}if((time<=5)&&(time!=0)&&(j=0xff)){ring();}if((time==0)&&(j=0xff)){ring();delay(1000);ring();}led_buf_auto_flush(); //LED显示缓冲区时间值更新}}void timer1(void) interrupt 3 //选用定时器1工作方式为1{uchar j;static uchar click=0; //定时器0定时中断次数TH1=v_th0;TL1=v_tl0; //设置初始值50ms为循环20次为1ms,12MHz++click;if(click==20){--time2;click=0;if((time2<=5)&&(time2!=0)&&(j!=0xff)){ring();}if((time2==0)&&(j!=0xff)){ring();delay(1000);ring();TR1=0;P32=0;}}time=time2;led_buf_auto_flush(); //LED显示缓冲区时间值更新}void put_on_leds(void) //显示输出函数{uchar dmask=0x01; //位控码初始化uchar pos;for(pos=0;pos<4;pos++){P2=dmask; //位控码输出到位控口P0=dispcode[led_buf[pos]]; //取显示段码并输出到段控口delay(100); //延时delay(100);dmask=_crol_(dmask,1); //修改未控码}}void init_sys(void) //进行初始化并接受用户的初始化时间设置{TMOD=v_tmod;TH0=v_th0;TL0=v_tl0;TH1=v_th0;TL1=v_tl0; //设置时间初值TR0=0;EA=1;ET0=1;TR1=0;ET1=1; //开启中断,关闭定时器}uchar keychuli() //处理与键盘相连的P1口的容,作为键值{uchar k;k=P1; //P1口容送Kreturn(k); //返回键值}uchar key()//键盘扫描函数,函数返回值即键值{uchar keyzhi,keyzhii; //电子钟键盘按键键值临时存放keyzhi=keychuli(); //调P1口处理函数if(keyzhi!=0xff) //有键动作延时去抖动,否则函数返回{delay(100); //再次调P1口处理函数if(keyzhi!=0xff) //真正有键按下,取键值并暂存{keyzhii=keyzhi;while(keyzhi!=0xff) //判按键是否释放,没有释放延时去抖动等待释放{put_on_leds();put_on_leds();keyzhi=keychuli();}keyzhi=keyzhii; //按键释放后恢复按键键值}}return(keyzhi); //返回按键键值}void main() //主函数调用init_sys()函数对系统初始化,调用put_on_leds()函数{uchar j;uchar c=1; //C 1,2,3 1:无人违规合法抢答,2:有人违规,3: 允许答完uchar keyzhiii;while(1){keyzhiii=key(); //调键盘扫描函数得到按键键码ledk(); //调P.程序if(P30==0) //主持人是否按下启动键delay(100);if(P30==0){c=1;break;}if(keyzhiii!=0xff){c=2;led();break;}}init_sys(); //调用init_sys()函数对系统初始化time=30;time2=30;TR0=1; //开定时器0while(1){put_on_leds(); //调显示函数delay(100); //调延时函数if(c==1) //判断有没有违规{keyzhiii=key(); //调键盘扫描函数得到按键键码j=keyzhiii;}if(c==3){keyzhiii=key(); //调键盘扫描函数得到按键键码}if(time==0){while(1){TR0=0;put_on_leds();delay(100);}}if(c==1||c==2)switch(keyzhiii) //按键功能控制{case 0xfe: //1号选手抢答,抢答时间设定为三十秒{m=1;if(c==1){ring(); //有人正常按下,蜂鸣器发出声音TR1=1; //开定时器1,关定时器0TR0=0;c=3;keyzhiii=0xff;}if(c==2) //有人违规{TR1=0;time=0;}led_buf_auto_flush();put_on_leds();break;}case 0xfd: //2号选手抢答{m=2;if(c==1){ring(); //有人正常按下,蜂鸣器发出声音TR1=1; //开定时器1,关定时器0TR0=0;c=3;keyzhiii=0xff;}if(c==2) //有人违规{TR1=0;time=0;}led_buf_auto_flush();put_on_leds();break;}case 0xfb: //3号选手抢答{m=3;if(c==1){ring(); //有人正常按下,蜂鸣器发出声音TR1=1; //开定时器1,关定时器0TR0=0;c=3;keyzhiii=0xff;}if(c==2) //有人违规{TR1=0;time=0;}led_buf_auto_flush();put_on_leds();break;}case 0xf7: //4号选手抢答{m=4;if(c==1){ring(); //有人正常按下,蜂鸣器发出声音TR1=1; //开定时器1,关定时器0TR0=0;c=3;keyzhiii=0xff;}if(c==2) //有人违规{TR1=0;time=0;}led_buf_auto_flush();put_on_leds();break;}case 0xef: //5号选手抢答{m=5;if(c==1){ring(); //有人正常按下,蜂鸣器发出声音TR1=1; //开定时器1,关定时器0TR0=0;c=3;keyzhiii=0xff;}if(c==2) //有人违规{TR1=0;time=0;}led_buf_auto_flush();put_on_leds();break;}case 0xdf: //6号选手抢答{m=6;if(c==1){ring(); //有人正常按下,蜂鸣器发出声音TR1=1; //开定时器1,关定时器0TR0=0;c=3;keyzhiii=0xff;}if(c==2) //有人违规{TR1=0;time=0;}led_buf_auto_flush();put_on_leds();break;}case 0xbf: //7号选手抢答{m=7;if(c==1){ring(); //有人正常按下,蜂鸣器发出声音TR1=1; //开定时器1,关定时器0TR0=0;c=3;keyzhiii=0xff;}if(c==2) //有人违规{TR1=0;time=0;}led_buf_auto_flush();put_on_leds();break;}case 0x7f: //8号选手抢答{m=8;if(c==1){ring(); //有人正常按下,蜂鸣器发出声音TR1=1; //开定时器1,关定时器0TR0=0;c=3;keyzhiii=0xff;}if(c==2) //有人违规{TR1=0;time=0;}led_buf_auto_flush();put_on_leds();break;}}if(c==3) //无人违规,等待答完{TR1=1;TR0=0;if(j==keyzhiii){ring(); //有人答完,蜂鸣器发出声音TR1=0;TR0=0;while(1){led_buf_auto_flush();put_on_leds();}}}led_buf_auto_flush();put_on_leds();}}。