用51单片机制作4路抢答器
51单片机 4路抢答器
先说下我这个4路抢答器的功能:5个按键,第五个是复位。
第一个按键到第四个按键分别对应4个led 灯,只要1到4的其中任何一个按键按下,其对应的led灯就会亮,再按其他按键,不会有其他led灯亮。
第五个按键进行复位,开始下一轮抢答。
不多说直接上程序和protues仿真图如下:注意:我试了下,程序有点小问题,(编译是完全通过的)我也没改出来,毕竟小弟我也才学,有大神知道的话可以给我说说,,谢谢。
#include<reg51.h>//51头文件sbit key0 = P3^0;//定义key0,为P3^0引脚sbit key1 = P3^1;//定义key1,为P3^1引脚sbit key2 = P3^2;//定义key2,为P3^2引脚sbit key3 = P3^3;//定义key3,为P3^3引脚sbit key4 = P3^4;//定义key4,为P3^4引脚void main()//主函数{while(1)死循环{if(key0==0) {P1 = 0xfe;P3 = 0xf0;}//如果key0等于0,即闭合,led1亮,将其他三个按钮锁定为低电平else if(key1==0) {P1 = 0xfd;P3 = 0xf0;}//如果key0等于1,即闭合,led2亮,将其他三个按钮锁定为低电平else if(key2==0) {P1 = 0xfb;P3 = 0xf0;}//如果key0等于2,即闭合,led3亮,将其他三个按钮锁定为低电平else if(key3==0) {P1 = 0xf7;P3 = 0xf0;}//如果key0等于3,即闭合,led4亮,将其他三个按钮锁定为低电平if(key4==0) //复位按钮按下闭合,则复位{P1 = 0xff;P3 = 0xff;}}}。
基于单片机的四路抢答器
基于单片机的四路抢答器1.由于剩余4个引脚,所以可以扩展到8路2.矩阵键盘输入任意两位数倒计时初值一、功能要求以8051系列单片机为核心,设计一个4路竞赛抢答器。
具体功能要求如下:1、该抢答器最多可供4名选手参赛,用4个按钮S0~S3表示,设置一个系统复位和抢答控制开关S,由主持人控制。
2、当主持人启动“抢答开始”键后,定时器进行减计时,同时扬声器发出短暂的声响,参赛选手在设定的时间内进行抢答,抢答有效,定时器停止工作,LED显示器上显示选手的编号和抢答的时间并保持到主持人将系统清除为止;如规定的时间内无人抢答则蜂鸣器发声,计时器复位,为下一次计时做好准备。
3、抢答器具有定时抢答功能,且一次抢答的时间由主持人设定(如30秒)。
4、只有主持人的操作将电路复位后,方可结束上一次的抢答,为下一次抢答做好准备。
二.设计方案(1)倒计时用矩阵键盘输入,程序中用keycount来记录按下按键的次数,我只设置两次,只能输入两位数,多按下几次是没有效果的,相当于键盘自锁,之后单片机读取键值,缓存入一个两位的数组table【2】。
(2)采用的是3位led动态扫描的方式显示(3)中断扫描选手按键,选手按键用的用独立键盘,用与门接选手按键,当有人按下时,与门由高到低,产生下降沿而引起中断,单片机扫描独立键盘。
(4)蜂鸣器电路(5)开始按键和复位按键1-1主流程图1-2 外部中断扫描选手按键1-3 定时器中断电路图如下图由于仿真软件proteus不能用PnP仿真,所以去掉了PnP,直接用IO口驱动;真实是不行的。
#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit FUW=P3^5; //抢答键sbit CLR=P3^4; //清零,复位键sbit xuan1=P2^4;//选手1,2,3,4sbit xuan2=P2^5;sbit xuan3=P2^6;sbit xuan4=P2^7;sbit wei1=P2^0;//位选1,2,3,4sbit wei2=P2^1;sbit wei3=P2^2;sbit wei4=P2^3;sbit buz=P3^0;uchar code numtab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //共阳极uint table[3]={0,0,0};//倒计时缓存uchar keycount=0;uint time=0;uchar num=0;uint ge,shi;/***********延时函数*****************/void delayms(uint xms){uint i,j;for(i=xms;i>0;i--)for(j=110;j>0;j--);}/************蜂鸣器****************/void buzzer(){buz=0;delayms(50);buz=1;}/************报警部分独立按键扫描********************/ void kscan(){uchar sk;if(xuan1==0){delayms(10);if(xuan1==0){buzzer();sk=1;table[2]=sk;}}else if(xuan2==0){delayms(10);if(xuan2==0){buzzer();sk=2;table[2]=sk;}}else if(xuan3==0){delayms(10);if(xuan3==0){buzzer();sk=3;table[2]=sk;}}else if(xuan4==0){delayms(10);if(xuan4==0){buzzer();sk=4;table[2]=sk;}}}/**********矩阵键盘扫描***************/ void keyscan(){uint temp,key;P1=0xfe;//第一行为0temp=P1;temp=temp&0xf0;//与上11110000if((temp!=0xf0)&&(keycount<2))delayms(10);//去抖temp=P1;temp=temp&0xf0;if(temp!=0xf0){temp=P1;switch(temp){case 0xde:key=0;table[keycount]=key;keycount++;break;}while(temp!=0xf0){temp=P1;temp=temp&0xf0;}}}P1=0xfd;//第二行为0temp=P1;temp=temp&0xf0;//与上11110000if((temp!=0xf0)&&(keycount<2))delayms(10);//去抖temp=P1;temp=temp&0xf0;if(temp!=0xf0){temp=P1;switch(temp){case 0xed:key=1;table[keycount]=key;keycount++;break;case 0xdd:key=2;table[keycount]=key;keycount++;break;case 0xbd:key=3;table[keycount]=key;keycount++;break;}while(temp!=0xf0){temp=P1;temp=temp&0xf0;}}}P1=0xfb;//第三行为0temp=P1;temp=temp&0xf0;//与上11110000if((temp!=0xf0)&&(keycount<2)){delayms(10);//去抖temp=P1;temp=temp&0xf0;if(temp!=0xf0){temp=P1;switch(temp){case 0xeb:key=4;table[keycount]=key;keycount++;break;case 0xdb:key=5;table[keycount]=key;keycount++;break;case 0xbb:key=6;table[keycount]=key;keycount++;break;}while(temp!=0xf0){temp=P1;temp=temp&0xf0;}}}P1=0xf7;//第四行为0temp=P1;temp=temp&0xf0;//与上11110000if((temp!=0xf0)&&(keycount<2)){delayms(10);//去抖temp=P1;temp=temp&0xf0;if(temp!=0xf0){temp=P1;switch(temp){case 0xe7:key=7;table[keycount]=key;keycount++;break;case 0xd7:key=8;table[keycount]=key;keycount++;break;case 0xb7:key=9;table[keycount]=key;keycount++;break;}while(temp!=0xf0){temp=P1;temp=temp&0xf0;}}}}/********显示函数*********/ void display(){ge=time%10;shi=time/10;wei1=1;wei2=0;wei3=0;P0=numtab[shi];delayms(5);P0=0xff;wei1=0;wei2=1;wei3=0;P0=numtab[ge];delayms(5);P0=0xff;wei2=0;wei1=0;wei3=1;P0=numtab[table[2]];delayms(5);P0=0xff;wei3=0;}/****************主函数**********************/ main(){EA=1;TMOD=0x01;TH0=(65536-50000)/256;//定时50msTL0=(65536-50000)%256;ET0=1;EX0=1;IT0=1; //下降沿触发PX0=1;PT0=0;while(1){if(keycount<2){ keyscan();if(keycount==2){time=10*table[0]+table[1];}}if(keycount==2){display(); }/******按下开始抢答键********/if(FUW==0){delayms(10);if(FUW==0){TR0=1;while(!FUW);}}/********按下清零键*********/if(CLR==0){delayms(10);if(CLR==0){TR0=0;EX0=1;time=0;ge=0;shi=0;table[0]=0;table[1]=0;table[2]=0;keycount=0;while(!CLR);}}}}/**************定时器0中断******************/ void t0() interrupt 1{TH0=(65536-50000)/256;//定时50msTL0=(65536-50000)%256;num++;if(num==20){num=0;time--;if(time==0){TR0=0;}}}/*********外部中断0***********/void estern0() interrupt 0{uchar ks;EX0=0;//关掉中断,防止键盘抖动,多次中断,还有就是//只扫描第一次按键的选手,之后按键不扫描if(TR0==0||time==0){kscan();}else if(xuan1==0&&TR0==1 ){delayms(10);if(xuan1==0){ks=1;table[2]=ks;TR0=0;while(!xuan1);}}else if(xuan2==0&&TR0==1 ) {delayms(10);if(xuan2==0){ks=2;table[2]=ks;TR0=0;while(!xuan2);}}else if(xuan3==0&&TR0==1 ){delayms(10);if(xuan3==0){ks=3;table[2]=ks;TR0=0;while(!xuan3);}}else if(xuan4==0&&TR0==1 ){delayms(10);if(xuan4==0){ks=4;table[2]=ks;TR0=0;while(!xuan4);}}}。
四路抢答器的设计(C51)
case 0xf7: //键 4 按下:一号选手抢答处理 if(start_flag==0) //犯规操作处理 {
//
j[0]=1; display(); P3=0xf9; delay(200); P3=0xfb; break; } if(chaos_flag==1||qiang_flag==1) break; else { P3=0xef; sec=8; TR0=1; j[0]=1; buffer_zone(); display(); qiang_flag=1; } break;
/********显示函数***********/ void display() { temp=0xfe; for(k=0;k<8;k++) { P2=temp; P0=i[j[k]]; delay(2); temp=_crol_(temp,1); } } /*********函数初始化*********/ void inti0() { TMOD=0x01; TH0=(65535-50000)/256; TL0=(65525-50000)%256; EA=1; ET0=1; TR0=0; } /********中断函数**********/ void zd() interrupt 1 { TH0=(65535-50000)/256; TL0=(65525-50000)%256; m++; if(m==20) { m=0; sec--; buffer_zone(); if(sec<=0) { P3=0xf5; delay(400); P3=0xf7; TR0=0; j[0]=11; j[6]=11; j[7]=11; while(1); }
case 0xdf: //键 6 按下:三号选手抢答处理 if(start_flag==0) //犯规操作处理 { j[0]=3; display(); P3=0xf9; delay(200); P3=0xfb; break; } if(chaos_flag==1||qiang_flag==1) //超时或已有选手抢答处理 break; else { TR0=1; P3=0xbf; j[0]=3; display(); sec=8; // buffer_zone(); qiang_flag=1; } break; case 0xbf: //键 7 按下:四号选手抢答处理 if(start_flag==0) //犯规操作处理 { j[0]=4; display(); P3=0xf9; delay(110); P3=0xfb; break; } if(chaos_flag==1||qiang_flag==1) //超时或已有选手抢答处理 break; else { TR0=1; P3=0x7f; j[0]=4; display(); sec=8;
51单片机四路抢答器PROTEUS仿真报告(含C语言程序)
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、系统总体设计方案与实现框图采用六个独立式的键盘作为按键输入,当在开始后有按键按下时,就会有对应于这个按键的灯亮并且蜂鸣器响一声,其它按键再按也无效。
单片机课程设计四路抢答器
xxxxxx大学课程设计报告课程设计名称:单片机系统综合课程设计课程设计题目:四路抢答器院(系):专业:班级:学号:姓名:指导教师:完成日期:xxxxxx大学课程设计报告目录第1章总体设计方案 (1)1.1课程设计的内容和要求 (1)1.2课程设计原理 (1)1.3课程设计思路 (2)1.4实验环境 (2)第2章详细设计方案 (3)2.1硬件电路设计 (3)2.2主程序设计 (4)2.3功能模块的设计与实现独立式按键功能模块 (4)第3章调试及结果分析 (7)3.1调试步骤及方法 (7)3.2实验结果及分析 (7)参考文献 (8)附录一(源程序) (9)附录二(原理图) (13)附录三(元器件清单) (14)第1章总体设计方案1.1课程设计的内容和要求(1)课程设计内容:使用51单片机制作抢答器功能如下:①常规模式主持人按下抢答开始开关,数码管从10S开始倒计时,此时选手可以抢答,若有选手抢答,相应LED亮,单数码管显示其选手号,双数码管从30S开始进行答题倒计时,答题时间到则单数码管闪烁显示选手号5次,再回到初始状态,若时间到但没有人抢答则回到初始状态(所有灯灭,检测主持键是否按下)②违规模式主持人尚在念题还未按下抢答开始开关,某选手违规抢答,则单数码管闪烁显示其选手号5次后回到初始状态。
(2)课程设计要求:①认真完成课程设计任务;②通过老师现场验收;③交出完整的课程设计报告。
1.2 课程设计原理根据题目要求,设计中采用8031芯片、LED灯、数码管和一些独立式按键构成一个简易四路抢答器。
设计中由于数码管扫描延时比较长,采用单片机的内部定时器进行定时,并采用中断方式。
整个抢答器的工作原理是:在正常的供电状态下,开始抢答时利用单片机倒计时,并由单片机将所需要显示的数据送到LED显示器的输入口,当有键按下时则执行相应的键功能程序。
1.3 课程设计思路(1)提出方案根据设计要求,系统采用个独立式开关作为按键,通过单片机不停地扫描P1口来控制LED数码管的显示,当按下启动按键后,经单片机处理,输出控制信号,数码管从10开始进入减计时并在数码管上显示剩余时间,在有选手按下按键时,就会有对应于这个按键的编码在数码管上显示,同时蜂鸣器给出声响来提示主持人和选手;如果在10秒内没有选手抢答,则本次抢答无效,系统封锁输入电路,禁止选手超时抢答。
51单片机的四路电子抢答器设计
目录1设计要求与功能 (4)1.1设计基本要求 (4)2 硬件设计 (4)2.1控制系统及所需元件 (4)2.2抢答器显示模块 (5)2.3 电源方案的选择 (6)2.4 抢答器键盘的选择 (6)2.5蜂鸣器模块 (7)2.6外部振荡电路 (7)3 程序设计 (7)3.1程序流程图 (7)3.2系统的调试............................................... (9)3.3 焊接的问题及解决 (10)4总结 (10)附录C程序 (11)Word 资料一设计要求与功能1.1设计基本要求(1)抢答器同时供4名选手或4个代表队比赛使用,分别用4个按钮K1~K4表示。
(2)设置裁判开关k5和清零开关k6,该开关由主持人控制,当主持人按下k6,系统复位,预备抢答,当主持人按下总控制控制开关k5,开始抢答;(3)抢答器具有定时抢答功能,抢答时间为倒计时15秒。
当主持人启动“开始”键后,定时器进行减计时,同时扬声器发出短暂的提示声响,声响持续的时间0.5秒左右,当计时小于5秒后,每减少一秒,便报警一次以提示选手。
(4)抢答器具有锁存功能,参赛选手在设定的时间内进行抢答,抢答有效,蜂鸣器发声,计时停止,数码管上显示选手的编号和时间,选手相应的信号灯被点亮,其他选手再抢答时无效。
(5)如果定时时间已到,无人抢答,本次抢答无效,系统报警并禁止抢答。
等待下一轮抢答。
二硬件设计2.1控制系统及所需元件控制系统主要由单片机应用电路、存储器接口电路、显示接口电路组成。
其中单片机STC89C52是系统工作的核心,它主要负责控制各个部分协调工作。
所需元件:该系统的核心器件是STC89C52。
各口功能:P0.0-P0.3 是数码管的位选口;P2.0-P2.7是数码管的段选口,为其传送段选信号;P1.0-P1.3是4组抢答信号的输入口;P1.4、P1.5由裁判控制,分别是抢答开始\复位功能键;P1.6为蜂鸣器的控制口;P3.4-P3.7为选手信号灯输出口;在其外围接上电复位电路、数码管电路、LED发光二极管、按键电路及扬声器电路。
51单片机四路抢答器(LED灯,数码管显示,蜂鸣器提示音)C语言源程序
51单片机四路抢答器(LED灯,数码管显示,蜂鸣器提示音)C语言源程序2009-10-31 10:53其实就是在原有的基础上,加入数码管显示及蜂鸣器,当然根据自己的要求,适当使用单片机I/O口接线为:P0 P2 来控制数码管显示,其中P0为数码管显字控制,P2用来选择位(第几个数码管)P1用来控制8个LED灯P3,独立按键(可以根据需要修改)P3^5(找了一个没有用到的I/O口,当然,可以用键盘扫描的方式来实现,这样的话,可以实现4*4=16路的抢答器,了解原理,做相应修改即可。
#include <reg52.h>sbit key1=P3^0; //这里采用独立按键(4路)sbit key2=P3^1;sbit key3=P3^2;sbit key4=P3^3;sbit SPK=P3^5; //蜂鸣器,最好在ISP编程时先不接入,(我用的是杜邦线,可以设置跳线控制)void delay(unsigned int cnt){while(--cnt);}void speak(unsigned int j){unsigned int i;for(i=0;i<j;i++)//喇叭发声的时间循环,改变大小可以改变发声时间长短{delay(180);//参数决定发声的频率,估算值,自行修改到不刺耳的声调SPK=!SPK;}SPK=1; //喇叭蜂鸣器停止工作,叫一声即可。
}void main(){bit Flag;while(!Flag){if(!key1){P1=0xFE;Flag=1;speak(300);P2=0;P0=0x06;} //LED1,数码管1显示1,蜂鸣器叫else if(!key2){P1=0xFD;Flag=1;speak(300);P2=1;P0=0x5b;}//LED2,数码管2显示2,蜂鸣器叫else if(!key3){P1=0xFB;Flag=1;speak(300);P2=2;P0=0x4f;}//LED3,数码管3显示3,蜂鸣器叫else if(!key4){P1=0xF7;Flag=1;speak(300);P2=3;P0=0x66;}LED4,数码管4显示4,蜂鸣器叫}while(Flag);}测试完,手动复位即可,当然可设置相应的按键来控制标志:Flag,进行继续抢答。
基于MCS-51单片机的四路抢答器
【实例56】基于MCS-51单片机的四路抢答器1.显示程序void delay_20ms(void) //延时20msvoid max7219_reset(void) //初始化MAX7219void write_reg(uchar reg,uchar sdata) //写入命令void write_digit(uchar digit,uchar number)//显示数字void send_data(uchar byte) //MAX7219的驱动程序void display_time(void) //显示倒计时剩余时间2.按键扫描程序bit control_key(void) //检测主持人是否按键{if(KEY5==1) //如果KEY5为高说明没有按键return 1; //返回1,表示没有按键动作else //如果KEY5为低说明可能有按键动作delay_20ms(); //延时20ms,去抖动if(KEY5==1) //如果20ms后KEY5变为高电平是干扰return 1; //返回1else //如果20ms后仍为低电平确认有按键动作return 0; //返回0}子程序get_key_num()用于检测是否有参赛者按动答题按键。
程序代码如下:uchar get_key_num() //检测哪个参赛者按键{uchar key_state=0;key_state=P1;key_state&=0x0f; //读取P1口的低四位if(key_state==0x0f) //若均为高电平,说明无人按键return 0; //返回1else{key_state^=0xff;if(key_state&0x01) return 1; //如果KEY1被按下,返回1else if(key_state&0x02) return 2; //如果KEY2被按下,返回2else if(key_state&0x04) return 3; //如果KEY3被按下,返回3else return 4; /如果KEY4被按下,返回4}}子程序key_handle()用于对答题按键进行处理。
基于51单片机实现四路抢答器
/*功能:通过按键实现四路抢答器,并且通过数码管显示部分显示在主持人按下复位按钮后,开始下一轮的抢答。
*/#include<reg51.h>#define uchar unsigned char#define uint unsigned intuchar k;uchar code table1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};sbit kongzhi=P2^1;sbit key5=P3^4;//复位按钮sbit key1=P3^0;//抢答器1sbit key2=P3^1;//抢答器2sbit key3=P3^2;//抢答器3sbit key4=P3^3;//抢答器4void delayms(uint max)//延时函数{ uint i,j;for(i=max;i>0;i--)for(j=110;j>0;j--);}void main()//主函数{bit fak;//通过控制fak,使数码管保持最开始按下的数字P0=0x3f;//最开始,数码管显示0kongzhi=0;//数码管的公共端是低电平有效,由于使用的是PNP,故输入高电平。
while(!fak)//关键在此{if(!key1)//如果第一个按键按下,数码管显示1{P0=0x06;fak=1;}else if(!key2) //如果第二个按键按下,数码管显示2{P0=0x5b;fak=1;}else if(!key3) //如果第三个按键按下,数码管显示3{P0=0x4f;fak=1;}else if(!key4) //如果第四个按键按下,数码管显示4{P0=0x66;fak=1;}}while(fak){if(key5==0)//复位按钮的设定{P0=0x3f;fak=0;}}}。
创新性实验报告-基于51单片机的四路抢答器设计
山东科技大学电工电子实验教学中心
创新性实验结题报告
实验项目名称_基于51单片机的四路抢答器设计
__________
组长姓名学号_
手机 Email_
成员姓名_学号__
成员姓名__学号__
专业___班级__
指导教师及职称________
开课学期至_学年_学期
提交时间年月日
一、实验摘要
二、实验目的
三、实验场地及仪器、设备和材料:
四、实验内容
图1 四路抢答器实验原理图
开始按键接到单片机的P1.1口,复位按键接到单片机的P1.0口,四个抢答按键分别接
五、实验结果与分析
选手3抢答键按下发光二极管D4点亮,蜂鸣器报警,同时数码管显示3。
2、对实验现象、数据及观察结果的分析与讨论:
六、指导老师评语及得分:
七、中心意见:。
基于51单片机的四路抢答器设计
摘要 (I)Abstract (II)引言 (1)1系统概述 (2)1.1抢答器需求分析 (2)1.2 抢答器工作过程 (2)2 单片机功能简介 (3)2.1 STC89C51的功能 (3)2.1.1 STC89C51特殊功能寄存器 (3)2.2 STC89c51单片机的内部结构 (5)3 系统硬件电路的设计 (6)3.1 系统总电路如图 (6)3.2 最小系统的设计 (7)3.2.1 电源的设计 (7)3.2.2 时钟频率电路的设计 (7)3.2.3 复位电路的设计 (9)3.3 显示电路的设计 (11)3.3.1 数码管简介 (12)3.3.2 CD4511七段译码器简介 (12)3.4 按键电路的设计 (14)3.5 蜂鸣器设计 (15)3.6元器件焊接及调试 (17)4 系统软件的设计 (17)4.1 延时子程序 (19)4.2 显示子程序 (19)4.3 倒计时加按键扫描子程序 (19)4.4主程序及分析 (20)5 结论 (23)参考文献 (24)致谢 (25)附录 1 (26)附录2 (27)Contents Abstract....................................................... I I Introduction. (1)1 System overview (2)1.1 The analysis of responder needs (2)1.2 Responder work process (2)2 MCU features (3)2.1 STC89C51 (3)2.1.1 Special function register (3)2.2 The internal structure of STC89c51 (5)3 The design of circuit system (6)3.1 The circuit system (6)3.2 The design of minimum system (7)3.2.1 The design of power supply (7)3.2.2 The design of clock circuit (7)3.2.3 The design of reset circuit (9)3.3 The design of display circuit (11)3.3.1 Digital tube profile (12)3.3.2 The introduction of CD4511 (13)3.4 The design of key circuit (15)3.5 The design of buzzer (15)3.6 Components and welding debuggin g (17)4 The design of software (19)4.1 Delay subroutine (19)4.2 Display program (19)4.3 The countdown and keyboard scanning subroutine (19)4.4 Main program and analysis (20)5 Conclusions (23)References (24)Acknowledgement (25)Appendix 1 (26)Appendix 2 (27)基于51单片机的四路抢答器设计作者:吴新春,指导教师:刘平(山东农业大学讲师)【摘要】本文设计以STC89C51单片机为核心的四路抢答器。
基于51单片机智能抢答器的设计
基于51单片机智能抢答器的设计智能抢答器是一种集电子技术、语音技术、计算机技术于一体的智能化设备。
它具备自动抢答、语音提示、计时等功能,并可以实现多人同时抢答、成绩统计等多种功能。
其中,基于51单片机的智能抢答器是一种经济实用并且易于操作的设备。
本文就以此为例,对基于51单片机的智能抢答器进行设计。
一、设计方案51单片机智能抢答器的设计方案主要包括硬件和软件两部分内容。
硬件方面,需要设计信号输入部分、信号处理部分、语音提示部分、显示部分以及计时部分。
信号输入部分是指抢答信号的输入,需要考虑抢答按键与51单片机的连接方式以及按键防抖处理。
信号处理部分是指对抢答信号进行处理,需要实现自动抢答、多人抢答、成绩统计等功能。
语音提示部分是指用于提示答题情况的语音播报设备,需要考虑语音芯片的选择、接口连接等问题。
显示部分是指用于显示抢答结果的设备,需要考虑LED数码管的选择、连接方式等。
计时部分是指用于计时的设备,需要考虑时钟模块的选择、接口连接等问题。
软件方面,需要设计对抢答信号的处理程序和对语音提示、显示、计时等操作的控制程序。
对抢答信号的处理主要包括抢答的触发、抢答的判断和存储等功能。
语音提示、显示和计时等程序需要根据硬件方案设计相应的操作接口并编写控制程序。
二、电路设计(1)信号输入部分信号输入部分采用4个抢答按键,分别对应4个LED指示灯,用于表示抢答结果。
在抢答按键与51单片机之间加入一个电阻,可以起到按键的防抖作用。
例如,当按下按键时,由于机械原因,按键可能会反弹几次,这样就可能引起不必要的误操作。
加入电阻可以使按键的电平稳定,避免误操作。
信号处理部分通过对抢答信号的处理,实现自动抢答、多人抢答和成绩统计等功能。
采用中断方式来读取抢答信号。
当一个按键被按下后,51单片机通过中断程序自动判断抢答是否正确,并在LED指示灯上显示抢答正确与否。
如果抢答正确,则该按键所对应的LED点亮,如果抢答错误,则LED不亮。
单片机 四人抢答器 课程设计2
四人抢答器模拟试验♦设计目的:1.培养综合利用MCS-51单片机的软硬件知识进行程序设计的能力,解决一些实际问题。
2.进一步加深对MCS-51单片机内部结构和程序设计方法的理解。
3.提高建立程序文档、归纳总结的能力。
♦总体描述:1.功能描述:(1)记时,按要求记时20S,若需要可进行累加记时。
(2)显示抢答人的号码和当时的时间;若抢答时间小于20S,并且回答不正确,可继续抢答。
(3)警告:若20S到时,红灯亮,并显示无人抢答2.设计方案描述:用三个LED数码管分别显示抢答人号码和时间;有人抢答后,时间及号码均显示,但不再进行加时;给一个脉冲后,说明刚才强答的回答不正确,可继续抢答和累加记时,若到达20S后,显示最后一个抢答人的号码。
无人答对时,显示无人抢答。
♦硬件系统设计:1.所需设备:2.接线方式:(1)P1.0-P1.3分别接到四个开关1、2、3、4上,来分别表示1、2、3、4个选手号。
(2)P1.7接到红灯上,当20S到时加以警告。
(3)P3.2接脉冲按钮,以控制开始记时及继续记时。
♦软件系统设计:否是是是程序清单及注释:org 0000hajmp mainorg 0003hajmp start ;跳转到中断子程序org 000bhajmp time ;跳转到计时程序org 0030hmain: mov tmod,#1mov th0,#0b1hmov tl0,#0e0hmov ie, #83hsetb tr0 ;置位mov r3,#0mov r4,#0mov 30h,#0mov 31h,#0mov 32h,#0 ;初始化所用的寄存器和存储器disp: mov sp,5fh ;显示时间和号码程序mov a,#03h ;mov dptr,#0ff20hmovx @dptr,aloop: mov r5,#1mov r0,#30hmov a,r5loop1: mov dptr,#0ff21hmovx @dptr,amov dptr,#0ff22hmov a,@r0add a,#0ehmovc a,@a+pcmovx @dptr,aacall dlay ;调用子程序inc r0 ;寄存器加1mov a,r5jb acc.2,ld ;判断rl a ;a寄存器左移mov r5,aajmp loop1 ;跳转ld: sjmp looptable: db 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h,0c8h ;数据列表dlay: mov r7,#02hdl1: mov r6,#0ffhdl2: djnz r6,dl2djnz r7,dl1rettime: mov th0,#0b1h ;计时程序mov tl0,#0e0hpush psw ;标志入栈push acc ;累加器入栈mov a,#0fhorl p1,amov a,p1anl a,#0fhcjne a,#0,go_oninc r3cjne r3,#25,back ;判断是否相等mov r3,#0inc r4mov a,r4mov b,#10div abmov 31h,amov 30h,bcjne r4,#20,back ;判断是否相等cpl p1.7mov 32h,#10clr tr0 ;清零sjmp backgo_on: clr tr0jnb acc.0,two ;判断mov 32h,#01hsjmp back ;跳转two: jnb acc.1,threemov 32h,#02hsjmp backthree: jnb acc.2,fourmov 32h,#03hsjmp backfour: mov 32h,#04hback: pop accpop pswretistart: setb tr0retiend♦调试:♦自评分和收获体会:通过本次试验,是我更深一步的学习了单片机,加深了对单片机的结构的认识,增强了对单片机软硬件知识及汇编语言的应用能力,收获很大。
51单片机4X4抢答器源程序
/**********************************************程序名: 4X4抢答器.h作者: 风雪子郁时间: 2012/8/22邮箱:fxziyu@地址:四川信息职业技术学院(雪峰校区)**********************************************/#include <reg51.h>#define unchar unsigned char/*******位申明*******///P0口:数码管段输出//P2口:P2_0 - P2_4 数码管位输出//P3口:4x4矩阵键盘sbit k1=P1^0; //按钮:时间加sbit k2=P1^1; //按钮:时间减sbit k3=P1^2; //按钮:开始sbit k4=P1^3; //按钮:复位sbit sp=P1^4; //蜂鸣器sbit led1=P1^5; //LED:倒计时提醒sbit led2=P1^6; //LED:选手抢答/*****变量声明*******/unchar code table[]={ 0x3f,0x06,0x5b,0x4f, //0~f显示表0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};unchar code table0[]={0xfe,0xfd,0xfb,0xf7}; //P2口位选unchar display[]={0,0,0,0}; //显示位存储char num,num1; //num1时间unchar num2,start; //num2选手号,start =0未开始,=1抢答开始=2抢答结束/********延时函数********/void delay(unchar z) //延时1ms子函数{unchar x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}/*******蜂鸣函数********/void soud(unchar i,j){for(;j>0;j--){sp=~sp;delay(i);}}/********初始化函数*******/void init(){EA=1; //定时器T0初始化ET0=1;TMOD=0x01; //定时器T0工作方式设定TH0=(65536-50000)/256; //装初值TL0=(65536-50000)%256;TR0=0; //定时器关闭led1=led2=1; //关闭led指示灯start=0; //开始标记置零sp=0; //初始化蜂鸣器num1=30; //赋时间初值num2=0; //选手号置零}/******按键检测函数******/void key1() //功能按键检测子函数{if(k1==0) //判断时间加K1是否按下{delay(5); //延时躲过抖动if(k1==0) //再次确认是否按下K1{num1++; //时间自加1if(num1==99) num1=0; //如果时间num=99,清零numwhile(k1==0); //等待K1松手}}if(k2==0) //判断时间减K2是否按下{delay(5); //延时躲过抖动if(k2==0) //再次确认是否按下K2{num1--; //时间自减1if(num1==-1) num1=99; //如果时间num=-1,赋值num=99 while(k2==0); //等待K2松手}}if(k3==0) //判断开始按钮K3是否按下{delay(5); //延时躲过抖动if(k3==0) //再次确认是否按下K3{if(!start) soud(1,100); //蜂鸣器短鸣,if句为防止再按k3时反复鸣响start=1; //开始标致置1TR0=1;}}}void key2() //矩阵键盘检测子函数{unchar a,b,temp;P3=0xff; //读引脚前需写入高电平b=0x10;for(a=0;a<4;a++) //P3_4 - P3_7 行线端依次送入低电平{P3=~b; //置第a行线为低b<<=1;temp=P3; //P3口信息送入temp中temp=temp&0x0f; //屏蔽高四位,保留低四位if (temp!=0x0f) //判断:假如列线有不为高的时候,执行if循环体{delay(5); //延时躲过抖动temp=P3;temp=temp&0x0f;if (temp!=0x0f){switch(temp) //判断是哪个键按下{case 0x0e:num2=a*4+4;break; //第a行第四个按下case 0x0d:num2=a*4+3;break; //第a行第三个按下case 0x0b:num2=a*4+2;break; //第a行第二个按下case 0x07:num2=a*4+1;break; //第a行第一个按下}// TR0=0; //关中断,若要开启选手答题时间倒计时,注释掉本句开启下一句即可num1=60; //选手答题时间,默认60S,若要关闭选手答题时间倒计时,开启本句注释掉上一句即可start=2; //抢答结束led2=0; //抢答指示灯亮soud(1,100); //蜂鸣器短鸣delay(5);}}}}/******显示函数*******/void xianshi(){unchar a;for(a=0;a<4;a++) //位选{delay(5);P2=~table0[a];P0=~table[display[a]];}display[0]=num1/10; //倒计时显示display[1]=num1%10;display[2]=num2/10; //显示抢答者号display[3]=num2%10;}/*******主函数*******/void main(){init();while(1){if(start==0) key1(); //当未启动启动抢答时才检测功能按钮if(start==1) key2(); //当启动抢答时才能检测选手按钮if(k4==0) //判断复位键K4是否按下{delay(5); //延时躲过抖动if(k4==0) //再次确认是否按下K4{init();}}xianshi();}}/********中断*********/void time0() interrupt 1 //定时器T0中断{TF0=0;TMOD=0x01; //T0,方式1,12MHz晶振TH0=(65536-50000)/256;TL0=(65536-50000)%256;num++;if(num==20) //是否满1S{num=0;num1--;if(num1<6) soud(1,100);if(num1==0) {TR0=0;soud(5,100);start=2;led1=0;} }}。
单片机实现四路抢答器调试的方法
单片机实现四路抢答器调试的方法一、绪论单片机实现四路抢答器是一种常见的电子应用技术,广泛应用于各种竞赛、考试、培训等场合。
其基本功能是通过按钮或其他触发方式,实现对不同参赛者的答题速度和准确性的记录。
为了确保四路抢答器的正常运行和准确性,需要对其进行充分的调试。
本文将介绍单片机实现四路抢答器调试的方法及步骤,以帮助工程师或爱好者顺利完成调试工作。
二、单片机实现四路抢答器的基本原理单片机实现四路抢答器一般采用微处理器或微控制器作为控制核心,利用其强大的处理能力和丰富的外设接口,通过设置中断、定时器/计数器等功能,实现对四路抢答器的控制和监测。
四路抢答器的基本组成部分包括按钮输入模块、数字显示模块、音频提示模块等。
在调试过程中,需要依次测试和验证这些模块的功能,保证其正常工作。
三、单片机实现四路抢答器调试的方法1. 硬件连接调试首先需要进行硬件连接调试,确保四路抢答器的各模块连接正确、接触良好。
包括检查按钮与单片机的连接、数字显示模块与单片机的连接、音频提示模块与单片机的连接等。
同时检查电源线的接触情况,保证各部件能够正常供电。
2. 功能测试在硬件连接调试完成后,需要对各个功能模块进行测试。
包括测试按钮输入模块的响应速度和稳定性,测试数字显示模块的显示效果和准确性,测试音频提示模块的声音播放效果等。
通过这些功能测试,可以确保各模块的功能正常,能够满足四路抢答器的使用要求。
3. 系统集成测试在单个模块的功能测试完成后,需要进行系统集成测试,测试四路抢答器整体的运行情况。
包括测试四路抢答器对多路信号的处理能力、测试按键的抢答效果、测试多个抢答信号的协调工作等。
通过系统集成测试,可以发现各个模块之间的交互问题,及时进行调整和优化。
4. 软件程序调试需要进行软件程序调试。
针对单片机的程序代码进行单步调试,检查各个功能的实现情况和逻辑正确性,确保程序能够按预期运行。
需要对程序中可能出现的错误和异常情况进行充分测试,保证四路抢答器的稳定性和可靠性。
4路at89c51抢答器的设计c语言
4路AT89C51抢答器的设计(C语言)概述在各种答题活动中,抢答器是作为重要装备之一,用于检测谁首先按下按钮进行答题。
本文将介绍如何使用AT89C51单片机设计一款4路抢答器,并使用C语言进行编程。
设计原理抢答器的设计原理主要基于按键输入和信号处理。
当有参与者按下按钮进行抢答时,单片机将检测到该按钮按下的信号,并进行相应的处理,包括显示抢答者编号和记录答题结果等。
硬件连接以下是4路抢答器的硬件连接示意图:+-----------------+| || AT89C51 || |+-----+-----+-----+| |+----+--+ || Button1 +--++----+--+|+----+--+| Button2 |+----+--+|+----+--+| Button3 |+----+--+|+----+--+| Button4 |+----+--+程序设计初始化引脚和变量首先,需要初始化所使用的引脚和变量。
AT89C51的IO口用于连接按钮,需要将其配置为输入模式。
同时,定义一个变量用于记录当前的抢答者编号。
主循环主循环会不断扫描每个按钮的状态,当检测到有按钮按下时,记录抢答者编号并进行相应的处理。
按钮扫描函数按钮扫描函数用于检测按钮的状态。
当检测到按钮按下时,返回对应的编号。
在编写按钮扫描函数时,可以使用延时函数来确保稳定的检测结果。
显示抢答者编号函数显示抢答者编号函数用于将抢答者编号显示在LED灯或LCD屏幕上。
抢答者编号可以根据具体需求进行显示方式的设计,比如使用不同颜色的LED灯表示不同编号的抢答者。
记录答题结果函数记录答题结果函数用于记录每个抢答者的答题结果。
可以使用数组来存储每个抢答者的成绩或者答题情况。
中断处理在抢答器设计中,中断处理函数起着重要作用。
当检测到有按钮按下时,通过中断处理函数及时响应,并进行相应的处理。
总结本文介绍了使用AT89C51单片机设计4路抢答器的方法,并使用C语言进行编程。
基于51单片机的4路抢答器
电路图:/************************************************************** 4路抢答器,由主持人按下复位键开启抢答,对应选手最先按下按键后由数码管显示选手号码,点亮对应LED,蜂鸣器响,其他选手按键无效**************************************************************/ #include<reg52.h>#define uchar unsigned char#define uint unsigned intunsigned char code LED_DATE [] = //定义数码管段数组{0XC0, // 00XF9, // 10XA4, // 20XB0, // 30X99, // 40X92, // 50X82, // 60XF8, // 70X80, // 80X90, // 9unsigned char code LED_W [] = //定义数码管位数组{0X80, //第一个数码管位0X40, //第二个数码管位0X20, //第三个数码管位0X10, //第四个数码管位0X08, //第五个数码管位0X04, //第六个数码管位0X02, //第七个数码管位0X01 //第八个数码管位};sbit DS_HC595 =P1^5; //定义74HC595 I/O口sbit SHCP_HC595 =P1^6;sbit STCP_HC595 =P1^7;sbit K1=P3^2; //定义按键I/O口sbit K2=P3^3;sbit K3=P3^4;sbit K4=P1^2;sbit LED1=P2^4; //定义LED I/O口sbit LED2=P2^5;sbit LED3=P2^6;sbit LED4=P2^7;sbit BUZZ=P1^1; //定义蜂鸣器I/O 口void KEY();void Display();void Delay(uchar xms);void HC595(uchar V alue);uchar num=0;void main(){while(1){KEY();Display(); //数码管显示0}void KEY(){if(K1==0){Delay(10); //延时消抖if(K1==0) //再次判断{while(!K1); //按键松开检测while(1) //使用死循环,使其他选手按下按键后无效(下同){LED1=0; //使1号灯亮(下同)BUZZ=~BUZZ; //蜂鸣器响num=1; //显示1号Display();Delay(10);}}}if(K2==0){Delay(10);if(K2==0){while(!K2); //按键松开检测while(1){LED2=0;BUZZ=~BUZZ;num=2;Display();Delay(10);}}}if(K3==0){Delay(10);if(K3==0){while(!K3); //按键松开检测while(1){LED3=0;BUZZ=~BUZZ;num=3;Display();Delay(10);}}}if(K4==0){Delay(10);if(K4==0){while(!K4); //按键松开检测while(1){LED4=0;BUZZ=~BUZZ;num=4;Display();Delay(10);}}}}void Display() //显示函数,静态扫描{P0=LED_DATE[num]; //送段码HC595(LED_W[7]); //送位码}void HC595(uchar V alue) //74HC595驱动函数{uchar i=0;for(i=0;i<8;i++){DS_HC595=Value&0X01;SHCP_HC595=0;SHCP_HC595=1;Value>>=1;}STCP_HC595=0;STCP_HC595=1;}void Delay(uchar xms) //延时函数{uchar i,j;for(i=xms;i>0;i--)for(j=110;j>0;j--);}。
C51单片机四路抢答器
目录一、摘要 (3)二、方案设计 (4)2.1、设计要求 (4)2.2、总体法案设计 (4)三、硬件电路设计 (5)3.1、元器件简介 (5)3.2、独立式按键电路 (7)3.3、时钟电路设计 (6)3.4、指示灯电路设计 (7)四、制作以调试 (8)4.1系统程序设计 (8)4.2主程序流程图主程序流程图 (8)4.3程序清单 (9)五、心得与体会 (11)六、参考文献 (12)一、摘要单片机作为一种工具,现在已经广泛的应用于智力和只是竞赛场合。
本次设计是基于单片机51系列的理论知识综合运用AT89C52单片机设计的简易四路抢答器。
利用AT89C52单片机的外围接口来实现抢答系统,利用单片机的定时器/计数器计数和定时的原理,将软、硬件有机的结合起来,使得系统能正确的记时,发光二极管能正常的闪烁。
同时系统能够实现:在抢答过程中只有在主持人按下开始抢答键开始之后抢答才有效,如果在开始抢答之前抢答视为无效。
在抢答成功之后发光二极管会变成闪烁状态与提示选手开始回答问题。
同时还有主持人控制的系统复位键,以实现系统的复位。
还有按键锁定,在一个选手抢答成功或者法规状态下其他按键无效。
通过这次的设计,对51系列的单片机的运用有了更深一层次的了解,也提高了我们的动手能力,加深我们对单片机的映像,为我们以后的学习打下一定的基础。
二、方案设计2.1、设计要求(1)、总共4个按键,四个供四个选手用作“抢答”操作。
(2)、用1个发光二极管用作开始抢答的指示灯,用4个发光二极管分别显示4个选手的抢答状态。
(3)、开始抢答后,哪个选手抢答键最先按下,该选手的抢答指示灯点亮,表示抢答成功,此时其他选手再按键为无效,抢答成功后开始3秒计时,到时指示灯变为闪烁,以提示选手选手抢答后必须3秒内回答问题。
2.2、总体法案设计方案:依据课题要求,基于AT89C52单片机制作的抢答器,其最大的好处就是处理快,准确性高、可靠性好、控制功能强。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
用51单片机制作4路抢答器
此抢答器具有限时抢答,超时无效的特点,并可以对主持人未喊开始而提前抢答的犯规情况作出判断。
由于用了单片机,所以电路很简单。
懒得写译码程序,也不想做驱动电路。
干脆直接用了一片74LS48译码驱动器来驱动数码管。
呵呵,面包板上插一下,由于之前在Proteus中仿真过,所以直接就正常运
行了~上一张实物图
左边的是STC89C52的最小系统版,P1口上接了8个LED,当时做流水灯的。
直接拿来用了。
P2口是显示输出,P3口接受按键。
那个小的芯片就是
74LS48啦~下方的是编程器+电源,STC的芯片就是编程方便,支持在线烧写,这么小巧的编程器~
当然最重要的是程序,附上代码清单。
写的比较烂,竟然上了100行,希望不要被大虾们骂得太惨>_#include#defineuintunsignedchar
//计时变量uints= 0,ms= 0;
//枚举类型:记录抢答器工作状态enumStat{ Idle= 0,//空闲状态,比如正在读题Ready= 1,//就绪状态,可以抢答Respond= 2,//响应状态,有人抢到了}stat; //时钟中断服务程序voidTimer()interrupt1using1{ TH0=0x3C; TL0=0xBD; ms++; s+=ms/20; ms%= 20; s%= 60;}
//重置时钟voidResetTimer(){ EA= 1;//允许CPU中断ET0= 1;//定时器中断打开TMOD= 1;//设定时器为方式TR0= 0;//关定时器ms= 0; s= 0;}
//优先编码(反向输入)uintEncode(uintc){ uinti,mask= 1; if(c== 0)return0; for(i= 0;ivoidmain(){ uintled= 0xff;//对应P1口,指示灯uintdisp= 15;//对应P2口,数。