求51单片机的控制的八路抢答器的程序

kuaidi.ping-jia.net  作者:佚名   更新日期:2024-08-07
求~51单片机的八路抢答器设计程序和原理图,PCB

ORG 0000H
M: MOV P1, #0FEH
MOV P3, #00H
JNB P2.0, C1
JNB P2.1, C2
JNB P2.2, C3
SJMP M
C1: MOV P3, #06H
SJMP S1
C2: MOV P3, #5BH
SJMP S1
C3: MOV P3, #4FH
SJMP S1
S1: NOP
SJMP S1
END
这个是我以前做过的三路的抢答器的 你可以稍加改动一下就能实现八路的 我只会这一部分 很久没有接触了 都忘的差不多了

#include#define uchar unsigned charuchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f};sbit rstkey=P2^2;sbit speaker=P2^0;void delay()//延时约400毫秒{uchar i,j;for(i=0;i<200;i++)for(j=0;j<250;j++);}main(){uchar i,key; P2=0xff; while(1) { i=0; P1=table[i]; while(1) { key=P3; if(key!=0)break; } switch(key) { case 0x01:i=1;break; case 0x02:i=2;break; case 0x04:i=3;break; case 0x08:i=4;break; case 0x10:i=5;break; case 0x20:i=6;break; case 0x40:i=7;break; case 0x80:i=8;break; default:break; } P1=table[i];//显示按下抢答器的号 P0=key;//显示按下键号的LED while(1) { if(rstkey==0)break;//主持人按下复位键则重新开始 speaker=~speaker;//否则蜂鸣器报警 delay(); } }}

OK EQU 20H;抢答开始标志位
RING EQU 22H;响铃标志位
ORG 0000H
AJMP MAIN
ORG 0003H
AJMP INT0SUB
ORG 000BH
AJMP T0INT
ORG 0013H
AJMP INT1SUB
ORG 001BH
AJMP T1INT
ORG 0040H
MAIN: MOV R1,#0FH
MOV R2,#0AH
MOV TMOD,#11H
MOV TH0,#0F0H
MOV TL0,#0FFH
MOV TH1,#3CH
MOV TL1,#0B0H;50ms为一次溢出中断
SETB EA
SETB ET0
SETB ET1
SETB EX0
SETB EX1
CLR OK
CLR RING
SETB TR1
SETB TR0
;=====查询程序=====
START: MOV R5,#0BH
MOV R4,#0BH
MOV R3,#0BH
ACALL DISPLAY
JB P1.0,NEXT
ACALL DELAY
JB P1.0,NEXT;去抖动,如果"开始键"按下就向下执行,否者跳到非法抢答查询
ACALL BARK;按键发声
MOV A,R1
MOV R6,A;送R1->R6,因为R1中保存了抢答时间
SETB OK;抢答标志位,用于COUNT只程序中判断是否查询抢答
MOV R3,#0AH;抢答只显示计时,灭号数
AJMP COUNT;进入倒计时程序,"查询有效抢答的程序"在COUNT里面
NEXT: JNB P1.1,FALSE1
JNB P1.2,FALSE2
JNB P1.3,FALSE3
JNB P1.4,FALSE4
JNB P1.5,FALSE5
JNB P1.6,FALSE6
AJMP START
;=====非法抢答处理程序=====
FALSE1: ACALL BARK
MOV R3,#01H
AJMP ERROR
FALSE2: ACALL BARK
MOV R3,#02H
AJMP ERROR
FALSE3: ACALL BARK
MOV R3,#03H
AJMP ERROR
FALSE4: ACALL BARK
MOV R3,#04H
AJMP ERROR
FALSE5: ACALL BARK
MOV R3,#05H
AJMP ERROR
FALSE6: ACALL BARK
MOV R3,#06H
AJMP ERROR
;=====INT0(抢答时间R1调整程序)=====
INT0SUB:MOV A,R1
MOV B,#0AH
DIV AB
MOV R5,A
MOV R4,B
MOV R3,#0AH
ACALL DISPLAY
JNB P3.2,INC0;P3.2为+1s键,如按下跳到INCO
JNB P3.3,DEC0;P3.3为-1s键,如按下跳到DECO
JNB P1.7,BACK0;P1.7为确定键,如按下跳到BACKO
AJMP INT0SUB
INC0: MOV A,R1
CJNE A,#63H,ADD0;如果不是99,R2加1,如果加到99了,R1就置0,重新加起。
MOV R1,#00H
ACALL DELAY1
AJMP INT0SUB
ADD0: INC R1
ACALL DELAY1
AJMP INT0SUB
DEC0: MOV A,R1
JZ SETR1;如果R1为0, R1就置99,
DEC R1
ACALL DELAY1
AJMP INT0SUB
SETR1: MOV R1,#63H
ACALL DELAY1
AJMP INT0SUB
BACK0: RETI
;=====INT1(回答时间R2调整程序)=====
INT1SUB:MOV A,R2
MOV B,#0AH
DIV AB
MOV R5,A
MOV R4,B
MOV R3,#0AH
ACALL DISPLAY
JNB P3.2,INC1
JNB P3.3,DEC1
JNB P1.7,BACK1
AJMP INT1SUB
INC1: MOV A,R2
CJNE A,#63H,ADD1
MOV R2,#00H
ACALL DELAY1
AJMP INT1SUB
ADD1: INC R2
ACALL DELAY1
AJMP INT1SUB
DEC1: MOV A,R2
JZ SETR2
DEC R2
ACALL DELAY1
AJMP INT1SUB
SETR2: MOV R2,#63H
ACALL DELAY1
AJMP INT1SUB
BACK1: RETI
;=====倒计时程序(抢答倒计时和回答倒计时都跳到改程序)=====
COUNT: MOV R0,#00H
MOV TH1,#3CH
MOV TL1,#0B0H
RECOUNT:MOV A,R6;R6保存了倒计时的时间,之前先将抢答时间或回答时间给R6
MOV B,#0AH
DIV AB;除十分出个位/十位
MOV 30H,A;十位存于(30H)
MOV 31H,B;个位存于(31H)
MOV R5,30H;取十位
MOV R4,31H;取个位
MOV A,R6
SUBB A,#07H
JNC LARGER;大于5s跳到LARGER,小于等于5s会提醒
MOV A,R0
CJNE A,#0AH,FULL;1s中0.5s向下运行
CLR RING
AJMP CHECK
FULL: CJNE A,#14H,CHECK;下面系1s的情况,响并显示号数并清R0,重新计时
SETB RING
MOV A,R6
JZ QUIT;计时完毕
MOV R0,#00H
DEC R6;一秒标志减1
AJMP CHECK
LARGER: MOV A,R0
CJNE A,#14H,CHECK;如果1s向下运行,否者跳到查"停/显示"
DEC R6;计时一秒R6自动减1
MOV R0,#00H
CHECK: JNB P1.7,QUIT;如按下停止键退出
ACALL DISPLAY
JB OK,ACCOUT;如果是抢答倒计时,如是则查询抢答,否者跳过查询继续倒数(这里起到锁抢答作用)
AJMP RECOUNT
ACCOUT: JNB P1.1,TRUE1
JNB P1.2,TRUE2
JNB P1.3,TRUE3
JNB P1.4,TRUE4
JNB P1.5,TRUE5
JNB P1.6,TRUE6
AJMP RECOUNT
QUIT: CLR OK;如果按下了"停止键"执行的程序
CLR RING
AJMP START
;=====正常抢答处理程序=====
TRUE1: ACALL BARK;按键发声
MOV A,R2
MOV R6,A;抢答时间R2送R6
MOV R3,#01H
CLR OK;因为答题的计时不再查询抢答,所以就锁了抢答
AJMP COUNT
TRUE2:ACALL BARK;
MOV A,R2
MOV R6,A
MOV R3,#02H
CLR OK
AJMP COUNT
TRUE3:ACALL BARK;
MOV A,R2
MOV R6,A
MOV R3,#03H
CLR OK
AJMP COUNT
TRUE4:ACALL BARK;
MOV A,R2
MOV R6,A
MOV R3,#04H
CLR OK
AJMP COUNT
TRUE5: ACALL BARK;
MOV A,R2
MOV R6,A
MOV R3,#05H
CLR OK
AJMP COUNT
TRUE6: ACALL BARK;
MOV A,R2
MOV R6,A
MOV R3,#06H
CLR OK
AJMP COUNT
;=====犯规抢答程序=====
ERROR: MOV R0,#00H
MOV TH1,#3CH
MOV TL1,#0B0H
MOV 34H,R3;犯规号数暂存与(34H)
HERE: MOV A,R0
CJNE A,#0AH,FLASH;0.5s向下运行->灭并停响
CLR RING
MOV R3,#0AH
MOV R4,#0AH
MOV R5,#0AH;三灯全灭
AJMP CHECK1
FLASH: CJNE A,#14H,CHECK1;下面系1s的情况,响并显示号数并清R0,重新计
SETB RING
MOV R0,#00H
MOV R3,34H;取回号数
MOV R5,#0BH
MOV R4,#0BH;显示FF和号数
AJMP CHECK1
CHECK1: JNB P1.7,QUIT1
ACALL DISPLAY
AJMP HERE
QUIT1: CLR RING
CLR OK
AJMP START
;=====显示程序=====
;入口参数:R5,R4,R3存入的分别为第一,二,三为数码所显示的位码
;出口参数:无
DISPLAY:MOV DPTR,#DAT1;查表显示程序,利用P0口做段选码口输出/P2低三位做位选码输出,
MOV A,R5
MOVC A,@A+DPTR
MOV P2,#01H
MOV P0,A
ACALL DELAY
MOV DPTR,#DAT2
MOV A,R4
MOVC A,@A+DPTR
MOV P2,#02H
MOV P0,A
ACALL DELAY
MOV A,R3
MOVC A,@A+DPTR
MOV P2,#04H
MOV P0,A
ACALL DELAY
RET
DAT1: DB 00H,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,00H,71H
;"灭","1","2","3","4","5","6","7","8","9","灭","F"
DAT2: DB 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,00H,71H
;第一个为零,其他与上相同,因为十位如果为零显示熄灭
;====加减时间延时(起到不会按下就加N个数)======
DELAY1: MOV 35H,#08H
LOOP0: ACALL DISPLAY
DJNZ 35H,LOOP0
RET
;=====延时(显示和去抖动用到)=====
DELAY: MOV 32H,#12H
LOOP: MOV 33H,#0AFH
LOOP1: DJNZ 33H,LOOP1
DJNZ 32H,LOOP
RET
;=====发声程序=====
BARK: SETB RING
ACALL DELAY1
ACALL DELAY1
CLR RING;按键发声
RET
;=====TO溢出中断(响铃程序)=====
T0INT:MOV TH0,#0ECH
MOV TL0,#0FFH
JNB RING,OUT
CPL P3.6 ;RING标志位为1时候P3.6口不短取反使喇叭发出一定频率的声音
OUT:RETI
;=====T1溢出中断(计时程序)=====
T1INT: MOV TH1,#3CH
MOV TL1,#0B0H
INC R0
RETI
END

我来帮帮你搞定

没人帮你,看来是分少了,呵呵!

可以用proteus仿真实现,
懂事电子设计 Vgz

  • 8位竞赛抢答器
    答:你好,8路抢答器我做出来了,选手编号1~8八个按键和清零显示和开始抢答两个功能键共10个按键,开始显示编号0,倒计时30s,然后按键开始抢答键开始倒计时,期间可以随时清零重新倒计时30s抢答,抢答过程只能有1位选手抢答并显示编号,抢答之后,时间停止,显示编号,其他选手抢答无效;等主持人按下清零后...
  • 基于单片机52八路抢答器的编程
    答:图看不太清楚,给你一个差不多的程序吧。include<reg51.h>#define uchar unsigned charuchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f};sbit rstkey=P3^7;main(){uchar i,key;while(1){P2=0xff;i=0;P0=table[i];while(1){key=P1;if(key!=0xff)break;}switc...
  • AT89S51单片机八路抢答器工作原理
    答:第二个文献:基于51单片机八路抢答器设计程序及电路图 基于51单片机八路抢答器设计程序及电路图 说明:本人的这个设计改进后解决了前一个版本中1号抢答优先的问题,并增加了锦囊的设置,当参赛选手在回答问题时要求使用锦囊,则主持人按下抢答开始键,计时重新开始。 ;八路抢答器电路请看下图是用ps仿真的,已经测试成功 <...
  • 求基于单片机的抢答器(六路或者八路)的抢答器 原理图 单片机代码
    答:网上搜的,你可以按照这个路径搜索去看全文首页›论坛›嵌入式/单片机论坛›51单片机基于单片机的八路抢答器设计论文 带英文介绍与汇编语言源码 只看楼主eyexin 楼主2018-4-11 15:57 查看8203 回复0基于AT89C51的八路抢答器摘要抢答器作为一种工具,已广泛应用于各种智力和知识竞赛场合。
  • 8路抢答器
    答:(二)、方案论证•方案一:基于单片机的抢答器电路•方案二:基于无线收发系统的抢答器设计•方案三:抢答器电路单片机的抢答器电路•51单片机为核心的八路抢答器,采用数字显示器显示,自动锁存显示结果,自动复位,根据不同的抢答输入信号,经过单片机的控制处理产生不同的与输入...
  • 求一个由AT89C52单片机控制的八路抢答器的C语言程序设计
    答:include<reg51.h>#define uchar unsigned charuchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f};sbit rstkey=P2^2;sbit speaker=P2^0;void delay()//延时约400毫秒{uchar i,j;for(i=0;i<200;i++)for(j=0;j<250;j++);}main(){uchar i,key; P2=0xff; while...
  • 求51单片机 八路抢答器的功能,使用方法,技术参数
    答:就是,自己就有面包板做好。自己写下操作方法就可以了、。哈哈
  • 求51单片机设定8人计时抢答器,要电路原理图和c语言程序?
    答:还要画图,分数太少了
  • 51单片机抢答器的原理?
    答:原理图:工作原理 抢答器由74LS148、74LS279、74LS48组成,LED显示器 开始时,当支持人按钮还未按是,CLR为0,所以输出Q1~Q4为0;放光二极管全为灭的,当主持人按钮按下时CLR为1,可以输入,谁先抢答,相应的谁的灯亮,利用74LS279和74LS148输出的是cp等于0,锁存其他的,不能使其他的输出。
  • 基于51单片机的抢答器设计属于电子信息工程领域吗?
    答:基于51单片机的抢答器设计属于电子信息工程领域。51单片机是一种经典的嵌入式微控制器,广泛应用于各种电子产品中。抢答器又是一种基于电子技术的教育器材,通过电子信号控制来实现对比赛或考试过程中的答题者进行快速抢答。因此,基于51单片机的抢答器设计需要涉及到电路设计、程序开发、通信协议等多个方面的...