❶ 怎么设计基于51单片机的八位抢答器课程设计用c语言
你的描述不详:下面我给出方法,自已参考:
1:主持人端有一个单片机设备 且设备有一个或多个按键,单个按键,那么就做成按键复用,如果是多个按键,那就可以按要求设置按键功能和数量。参赛队每队一个设备,如果不方便能过连线来通讯,就采用无线通讯,抢答端只需一个按键按键,同时在按键里或边上用指示灯来指示状诚。
2:逻辑,当主持人按下抢答键时,主持人端设备向8个参赛队发送抢答开始信号数据,参赛队8个设备向主持端应答,判断收到应答后,开始计时10秒,某一队按下按键时,这队会向主持端发送本队的编号即可,说到这里,后面的基本上都是一样的原理,就是收发数据,应答,判断数据类型和功能。即可达到你的要求。
❷ 设计抢答器的意义
❸ 单片机八人抢答器程序设计
;------------------------------------------
KAI BIT P3.7 ;开始
;------------------------------------------
ORG 0000H
JMP START
START:
;----------------------;下面是清零(复位)
MOV P0, #0C0H ;显示0
MOV P2, #255 ;熄灯
MOV R4, #0
;----------------------;下面等待按下"开始"键
KAISHI:
JB KAI, KAISHI ;没有按"开始",就循环
CALL DELAY ;延时
JB KAI, KAISHI ;消抖
JNB KAI, $ ;等待释放
;----------------------
MOV P0, #0CH ;显示P
WAIT: ;等待抢答
MOV A, P1
CPL A
JZ WAIT ;继续等待
;----------------------
XS: ;查找选手按键的位置
CPL A
MOV P2, A
JNB ACC.0, J0
JNB ACC.1, J1
JNB ACC.2, J2
JNB ACC.3, J3
JNB ACC.4, J4
JNB ACC.5, J5
JNB ACC.6, J6
; JMP J7
J7: INC R4
J6: INC R4
J5: INC R4
J4: INC R4
J3: INC R4
J2: INC R4
J1: INC R4
J0: INC R4
MOV A, R4
MOV DPTR, #D_TAB
MOVC A, @A + DPTR
MOV P0, A
;----------------------;下面等待按下复位键
W_FW:
JB KAI, W_FW ;没有按,则转
CALL DELAY ;延时
JB KAI, W_FW ;消抖
JNB KAI, $ ;等待释放
JMP START
;------------------------
D_TAB:
DB 0C0H,0F9H,0A4H,0B0H, 99H ;共阳极0-9
DB 92H, 82H,0F8H, 80H, 90H,0BFH ;-
;------------------------------------------
DELAY: ;延时约10ms
MOV R6, #20
DJNZ R7, $
DJNZ R6, $ - 2
RET
;==========================================
END
;以上程序已经调好。
❹ 求51单片机的8路抢答器,在普中开发板上实现
单片机源程序如下:
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define WHO P0
sbit player1=P1^0;
sbit player2=P1^1;
sbit player3=P1^2;
sbit player4=P1^3;
sbit Ensure=P3^7;
sbit beep=P1^6;
sbit LSA=P3^2;
sbit LSB=P3^3;
sbit LSC=P3^4;
uchar state=0;
uchar ssec=0;
uchar table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar OUT[]={0x71,0x77,0x38,0x38};
void delay(uint time)
{
uint x,y ;
for(x=time;x>0;x--)
for(y=130;y>0;y--);
}
void Delay2(uint i)
{
while(i--);
}
void Show(uchar content[])
{
uchar i;
for(i=0;i<4;i++)
{
switch(i) //位选,选择点亮的数码管,
{
case(0):
LSA=0;LSB=0;LSC=0; break;//显示第0位
case(1):
LSA=1;LSB=0;LSC=0; break;//显示第1位
case(2):
LSA=0;LSB=1;LSC=0; break;//显示第2位
case(3):
LSA=1;LSB=1;LSC=0; break;//显示第3位
}
P2=content[i];//发送段码
Delay2(100); //间隔一段时间扫描
P2=0x00;//消隐
}
}
void InitTimer0(void)
{
TMOD = 0x01;
TH0 = 0x0D8;
TL0 = 0x0F0;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void main()
{
Ensure=1;
while(1)
{
if(player1==0) //玩家1进入抢答状态
{
delay(10); //延时,按键消抖
if(player1==0) //再次判断是否进入抢答状态
{
if(state==0) //前方无人抢答状态
{
InitTimer0();
state=1; //将抢答状态置为1,防止其他玩家抢答
while(!player1) //抢答成功,蜂鸣器发声
{
beep=~beep;
delay(1);
}
WHO=table[1]; //数码管显示抢答成功的玩家编号
}
}
}
if(player2==0) //以下结构类似于玩家1
{
delay(10);
if(player2==0)
{
if(state==0)
{
InitTimer0();
state=1;
while(!player2)
{
beep=~beep;
delay(1);
}
WHO=table[2];
}
}
}
if(player3==0)
{
delay(10);
if(player3==0)
{
if(state==0)
{
InitTimer0();
state=1;
while(!player3)
{
beep=~beep;
delay(1);
}
WHO=table[3];
}
}
}
if(player4==0)
{
delay(10);
if(player4==0)
{
if(state==0)
{
InitTimer0();
state=1;
while(!player4)
{
beep=~beep;
delay(1);
}
WHO=table[4];
}
}
}
}
}
void Timer0() interrupt 1
{
TH0=(65536-45872)/255; //给定时器赋初值,定时50ms
TL0=(65536-45872)%255;
ssec++;
if(Ensure)
{
if(ssec>=100) //5s
{
EA=0;
while(1)
Show(OUT);
}
}
else
{
delay(10);
if(Ensure==0)
{
while(!Ensure);
Ensure=0;
if(ssec>=100)
{
EA=0;
}
}
}
}
❺ 抢答器电路图
aoe
等级:管理员
文章:3501
积分:5959
门派:少林派
注册:2001年10月10日楼主 QQ
--------------------------------------------------------------------------------
抢答器电路图问的人满多的
特收集一些到这里
21世纪什么最宝贵???
回帖!!!!!
----------------------------------------------
aoe是Age of Empires的缩写,俺的中文网名叫“帝国老手”,大家联系我的话叫我“帝国”就可以了。2006-9-23 3:43:56 USB接口的ISPRO热卖中
aoe
等级:管理员
文章:3501
积分:5959
门派:少林派
注册:2001年10月10日第 2 楼 QQ
--------------------------------------------------------------------------------
在各种知识竞赛,抢答器是少不了的,这里给大家提供一种制作抢答器的方法,有条件的朋友不妨做一个。
这个抢答器由单片机以及外围电路组成,由于采用单片机,使得外围电路非常简单,但是功能并不比一般的抢答器少。
如下图为抢答器的电路原理图,单片机AT90S1200的PB口的PB7~PB2为输入口,接抢答按键开关,当有某个按键按下时,对应口的电位跳低,被单片机检测到并执行相应的程序,比如让数码管显示或者控制音响电路发声等。PD口接数码管,用于显示哪个组抢到,并一数值方式显示出来。PB口的PB0通过电容接到门铃音乐集成电路的触发端,当有某一组抢到时发出声音。电路中,轻触开关SB为复位开关,按下SB,可以让系统复位。当一次抢答完毕以后,只有按下SB,让系统复位,在下一次抢答时,各个组的抢答按键才有用,否则,抢答按键没有作用。
本电路对元件没有什么特殊要求,按照图中标明的型号选用即可。电路中R10的数值由自己定,要求是使音乐片正常工作即可,因为音乐片并不是一直在工作,因此,我在制作时把R10省了,也不怎么样。音乐片采用叮咚门铃音乐片,要注意在音乐片上焊上一个NPN型三极管(三极管在图中我没有画出来),比如9013。注意要在稳压集成电路7805上加上散热片。
21世纪什么最宝贵???
回帖!!!!!
----------------------------------------------
aoe是Age of Empires的缩写,俺的中文网名叫“帝国老手”,大家联系我的话叫我“帝国”就可以了。2006-9-23 3:44:38 PC/MCU/CPLD三合一学习套件
aoe
等级:管理员
文章:3501
积分:5959
门派:少林派
注册:2001年10月10日第 3 楼 QQ
--------------------------------------------------------------------------------
图片
此主题相关图片如下:
此主题相关图片如下:
21世纪什么最宝贵???
回帖!!!!!
----------------------------------------------
aoe是Age of Empires的缩写,俺的中文网名叫“帝国老手”,大家联系我的话叫我“帝国”就可以了。2006-9-23 3:45:27 USB接口的ISPRO热卖中
aoe
等级:管理员
文章:3501
积分:5959
门派:少林派
注册:2001年10月10日第 4 楼 QQ
--------------------------------------------------------------------------------
由触发器构成的改进型抢答器
1.初步了解触发器的基本功能及特点。
2. 熟悉具有接收、保持、输出功能电路的基本分析方法。
3. 掌握触发器应用电路的分析方法。
4. 建立时序逻辑电路的基本概念。
器件:74LS00 1片,双四输入与非门74LS20 2片,按键式开关4个,指示灯(发光二极管)三只、510Ω电阻3个、1SΩ电阻4个、导线若干。
21世纪什么最宝贵???
回帖!!!!!
----------------------------------------------
aoe是Age of Empires的缩写,俺的中文网名叫“帝国老手”,大家联系我的话叫我“帝国”就可以了。2006-9-23 3:49:39 经典串口的ISPRO优惠中
aoe
等级:管理员
文章:3501
积分:5959
门派:少林派
注册:2001年10月10日第 5 楼 QQ
--------------------------------------------------------------------------------
电路图
此主题相关图片如下:
实训电路原理图如图所示。改进型抢答器电路减少了一个输入端,而在每一个输入端增加了两个与非门(图中的门4~门9),该电路作为抢答信号的接收、保持和输出的基本电路。S为手动清零控制开关,S1~S3为抢答按钮开关。
该电路具有如下功能:
(1)开关S作为总清零及允许抢答控制开关(可由主持人控制),当开关S被按下时抢答电路清零,松开后则允许抢答。输入抢答信号由抢答按钮开关S1~S3实现。
(2)若有抢答信号输入(开关S1~S3中的任何一个开关被按下)时,与之对应的指示灯被点亮。此时再按其他任何一个抢答开关均无效,指示灯仍“保持”第一个开关按下时所对应的状态不变。
电路中,6个二输入与非门采用两个74LS00,3个三输入与非门采用74LS20。
21世纪什么最宝贵???
回帖!!!!!
----------------------------------------------
aoe是Age of Empires的缩写,俺的中文网名叫“帝国老手”,大家联系我的话叫我“帝国”就可以了。2006-9-23 3:50:52 PC/MCU/CPLD三合一学习套件
aoe
等级:管理员
文章:3501
积分:5959
门派:少林派
注册:2001年10月10日第 6 楼 QQ
--------------------------------------------------------------------------------
出端的引脚编号。
2)连接电路
按图3.1连接电路。先在实训电路板上插接好IC器件。在插接器件时,要注意IC芯片的豁口方向(都朝左侧),同时要保证IC管脚与插座接触良好,管脚不能弯曲或折断。指示灯的正、负极不能接反。在通电前先用万用表检查各IC的电源接线是否正确。
3)电路调试
首先按抢答器功能进行操作,若电路满足要求,说明电路没有故障。若某些功能不能实现,就要设法查找并排除故障。排除故障可按信息流程的正向(由输入到输出)查找,也可按信息流程逆向(由输出到输入)查找。
例如:当有抢答信号输入时,观察对应指示灯是否点亮,若不亮,可用万用表(逻辑笔)分别测量相关与非门输入、输出端电平状态是否正确,由此检查线路的连接及芯片的好坏。
若抢答开关按下时指示灯亮,松开时又灭掉,说明电路不能保持,此时应检查与非门相互连接是否正确,直至排除全部故障为止。
4)电路功能试验
(1)按下清零开关S后,所有指示灯灭。
(2)选择开关S1~S3中的任何一个开关(如S1)按下,与之对应的指示灯(D1)应被点亮,此时再按其他开关均无效。
(3)按控制开关S,所有指示灯应全部熄灭。
(4)重复(2)和(3)步骤,依次检查各指示灯是否被点亮。
5)电路分析
分析图3.1实训电路,完成表3.1各项内容 ,表中H表示指示灯亮,L表示指示灯灭。如果不能正确分析,可以通过试验检测来完成。
21世纪什么最宝贵???
回帖!!!!!
----------------------------------------------
aoe是Age of Empires的缩写,俺的中文网名叫“帝国老手”,大家联系我的话叫我“帝国”就可以了。2006-9-23 3:51:39 超级51开发板套件,前卫实用超值
aoe
等级:管理员
文章:3501
积分:5959
门派:少林派
注册:2001年10月10日第 7 楼 QQ
--------------------------------------------------------------------------------
功能表
S S3 S2 S1
Q3 Q2 Q1 D3 D2 D1
L H H H
L H H L
L H L H
L L H H
H H H H
H H H L
H H L H
H L H H
21世纪什么最宝贵???
回帖!!!!!
----------------------------------------------
aoe是Age of Empires的缩写,俺的中文网名叫“帝国老手”,大家联系我的话叫我“帝国”就可以了。2006-9-23 3:51:54 经典串口的ISPRO优惠中
aoe
等级:管理员
文章:3501
积分:5959
门派:少林派
注册:2001年10月10日第 8 楼 QQ
--------------------------------------------------------------------------------
实训步骤与要求
1)检测与查阅器件
用数字集成电路测试仪检测所用的集成电路。通过查阅集成电路手册,标出图3.1中各集成电路输入、输实训总结与分析
(1)在第2章的实训(实训2)中,由于电路本身没有保持功能,所以抢答开关必须用手按住不动,指示灯才会点亮,若手松开指示灯就熄灭。这对输入抢答操作十分不便。在本实训中,通过在输入端接入两个首尾交叉连接的双输入与非门(如图3.1所示),解决了这一问题。实验证明,该电路能将输入抢答信号状态“保持”在其输出端不变。比如抢答开关S1按下时,与其连接的与非门5的输出端Q1变为高电平,使与非门1输出低电平,指示灯D1点亮;当开关S1松开后,与非门5的输出状态仍保持高电平不变,指示灯D1仍保持点亮状态。
(2)在图3.1中,将与非门4、5连接构成的电路既有接收功能同时又具有保持功能。在电路中可将与非门4、5连接构成的电路看成一个专门电路(虚框内电路),该电路能接收输入信号并按某种逻辑关系改变输出端状态。在一定条件下,该状态不会发生改变,即“保持”不变。
(3)这类具有接收、保持记忆和输出功能的电路简称为“触发器”。触发器有多种不同的功能和不同的电路形式。掌握触发器的电路原理、功能与电路特点是本章所要学习的主要内容。目前,各种触发器大多通过集成电路来实现。对这类集成电路的内部情况我们不必十分关心,因为我们学习数字电子技术课程的目的不是设计集成电路的内部电路。学习时,我们只需将集成电路触发器视为一个整体,掌握它所具有的功能、特点等外部特性,使我们能合理选择并正确使用各种集成电路触发器。
21世纪什么最宝贵???
回帖!!!!!
----------------------------------------------
aoe是Age of Empires的缩写,俺的中文网名叫“帝国老手”,大家联系我的话叫我“帝国”就可以了。2006-9-23 3:52:14 经典串口的ISPRO优惠中
aoe
等级:管理员
文章:3501
积分:5959
门派:少林派
注册:2001年10月10日第 9 楼 QQ
--------------------------------------------------------------------------------
一款八路抢答器
<script language="javascript" src="/AD/200608/4.js"></script>
本文介绍一款简单易制的八路抢答器电路,它由两只四D锁存器集成电路CD4042等组成。
一、工作原理
该八路抢答器电路原理如附图所示。IC1和IC2为四D锁存器CD4042,其D0、D1、D2、D3为输入端,Q0、Q1、Q2、Q3为输出端,POL为极性控制端,CP为脉冲输入端。当把POL接低电平时,时钟脉冲的上升沿到来时,电路锁存;时钟脉冲的下降沿到来时,电路传输数据。
K1~K8为抢答键,LEDl~LED8用作识别抢答键的显示。抢答开始前,CP端经R9接地为低电平,IC1、IC2的输入端D0~D3接地都置低电平,其Q0~Q3输出端也都输出低电平,LEDI~LED8不亮。抢答开始后,假设K1键最先被按下,IC1的D0端输入高电平,IC1的输出端Q0也输出高电平,发光二极管LED1点亮,指示第一路按键抢答成功。此时,R9两端产生压降,使IC1和IC2的脉冲输入端CP端都产生一个上升沿脉冲,此脉冲使IC1、IC2在K1键按下后的瞬间都产生了锁存作用,即:将锁存前IC1、IC2的输入端D0~D3的数据(ICI的D0端为高电平,其余都为低电平)传输到八个输出端Q0~Q3并锁存,即IC1的Q0端为高电平,其余都为低电平。此时若再按下K2~K8,电路将不再作任何反应,从而识别出八个抢答键谁最先被按下。
一次抢答结束后,主持人需按一下复位键K9,LED1熄灭,IC1、IC2复位,即可开始第二次抢答。
该抢答器的抢答键个数可以很方便地扩展,只要增加一只CD4042,并把其CP端接到R9的上端即可。
二、元器件选择
LEDl~LED8为红色发光二极管,K1~K9为轻触开关。
21世纪什么最宝贵???
回帖!!!!!
----------------------------------------------
aoe是Age of Empires的缩写,俺的中文网名叫“帝国老手”,大家联系我的话叫我“帝国”就可以了。2006-9-23 3:55:30 超级51开发板套件,前卫实用超值
aoe
等级:管理员
文章:3501
积分:5959
门派:少林派
注册:2001年10月10日第 10 楼 QQ
--------------------------------------------------------------------------------
此主题相关图片如下:
21世纪什么最宝贵???
回帖!!!!!
----------------------------------------------
aoe是Age of Empires的缩写,俺的中文网名叫“帝国老手”,大家联系我的话叫我“帝国”就可以了。2006-9-23 3:58:07 USB接口的ISPRO热卖中
❻ 单片机智力测验抢答器的设计
、 功能描述
所设计的抢答器允许多人参加。没有出题时,每个参赛队员的LED数码管都显示当前的积分值,初始积分值为“100”(也可自行设定)。在出题后,主持人按下“开始按钮”,表示计时开始,此时每个参赛者前面的红色发光二极管点亮,LED数码管显示秒计时。计时开始后,若有人按下“抢答按钮”时,则秒计时停止,此时LED数码管显示当前的积分值,先按下按钮的红灯保持亮的状态,其余3人的红灯全灭。抢答对错由主持人判定,“答对按钮”按下时加10分(也可自行设定),“答错按钮”按下时减10分,直到积分值减为0时为止。不论该队员获得的是加分还是减分,其LED数码管都要显示当前的新积分值,并闪烁5次,其余选手的LED数码管则保持不变,并回到未出题时的状态,重新开始。抢答开始后,计时达到T1秒之后均无人按下按钮,则本次抢答结束,进入未出题状态。超过T1秒有按钮按下时不起作用。在抢答未开始时,若有人按下按钮,则先按下按钮的红灯闪烁,并减10分(也可自行设定)作为惩罚。
❼ 51单片机抢答器
仿真图名称?是要问这两张图是用的什么仿真软件么?如果是那么答案就是Proteus。
❽ 单片机C51抢答器的原理图和程序 万分感谢 急!SOS
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
///数码管位选管脚定义
#define wei P0
///数码管段选管脚定义
#define an P2
///短延时时间宏定义
#define short_delay 1
///抢答开始标志位
#define start 0
#define not_start 1
///八组参赛者抢答按键
#define key0 P1^0
#define key1 P1^1
#define key2 P1^2
#define key3 P1^3
#define key4 P1^4
#define key5 P1^5
#define key6 P1^6
#define key7 P1^7
///主持人加分键
#define key8 P3^6
///主持人抢答开始按键
#define key9 P3^7
///主持人数码管位选管脚定义
sbit zhuchi_dis1=P3^0;
sbit zhuchi_dis2=P3^1;
///蜂鸣器输出管脚定义
sbit ring=P3^4;
uchar cnt=20;
uchar person=0;//主持台前抢答者编号显示
///数码管位码表
uchar wei_dis[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f};
///数码管断码表
uchar table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x40
};
volatile uchar fenshu1,fenshu2,fenshu3,fenshu4,fenshu5,fenshu6,fenshu7,fenshu8;//八组成员分数缓冲寄存器
uchar jishi_flag=1; //倒计时标志位
uchar start_flag=not_start;//开始抢答标志位
///*********************蜂鸣器初始化****************************///
void ring_init()
{
ring=0;
}
///*********************记分牌分数初始化****************************///
void init_fenshu()
{
fenshu1=0;
fenshu2=0;
fenshu3=0;
fenshu4=0;
fenshu5=0;
fenshu6=0;
fenshu7=0;
fenshu8=0;
}
///*********************定时器0初始化****************************///
void timer0_init()
{
TMOD=0x01;
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
ET0=1;//开定时器0中断
//TR0=1;//定时器0开始计数
}
///*********************外部中断0初始化****************************///
void int0_init()
{
EX0=1;//外部中断0使能
IT0=0;//负边沿触发方式
EA=1; //总中断使能
}
///*********************外部中断1初始化****************************///
void int1_init()
{
EX1=1;//外部中断0使能
IT1=0;//负边沿触发方式
EA=1; //总中断使能
}
///*********************设备初始化****************************///
void int_device()
{
timer0_init();
int0_init();
int1_init();
init_fenshu();
ring_init();
}
///*********************延时子函数****************************///
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
///*********************数码管显示子函数****************************///
void led_display(uchar z)
{
///*********************主持人****************************///
zhuchi_dis1=0;
an=table[z/10];
delay(short_delay);
zhuchi_dis1=1;
zhuchi_dis2=0;
an=table[z%10];
delay(short_delay);
zhuchi_dis2=1;
///*********************第一组****************************///
wei=wei_dis[0];
an=table[fenshu1/10];
delay(short_delay);
wei=wei_dis[1];
an=table[fenshu1%10];
delay(short_delay);
///*********************第二组****************************///
wei=wei_dis[2];
an=table[fenshu2/10];
delay(short_delay);
wei=wei_dis[3];
an=table[fenshu2%10];
delay(short_delay);
///*********************第三组****************************///
wei=wei_dis[4];
an=table[fenshu3/10];
delay(short_delay);
wei=wei_dis[5];
an=table[fenshu3%10];
delay(short_delay);
///*********************第四组****************************///
wei=wei_dis[6];
an=table[fenshu4/10];
delay(short_delay);
wei=wei_dis[7];
an=table[fenshu4%10];
delay(short_delay);
///*********************第五组****************************///
wei=wei_dis[8];
an=table[fenshu5/10];
delay(short_delay);
wei=wei_dis[9];
an=table[fenshu5%10];
delay(short_delay);
///*********************第六组****************************///
wei=wei_dis[10];
an=table[fenshu6/10];
delay(short_delay);
wei=wei_dis[11];
an=table[fenshu6%10];
delay(short_delay);
///*********************第七组****************************///
wei=wei_dis[12];
an=table[fenshu7/10];
delay(short_delay);
wei=wei_dis[13];
an=table[fenshu7%10];
delay(short_delay);
///*********************第八组****************************///
wei=wei_dis[14];
an=table[fenshu8/10];
delay(short_delay);
wei=wei_dis[15];
an=table[fenshu8%10];
delay(5);
}
///*********************主函数****************************///
void main()
{
//fenshu1=12;
uchar second=15;
int_device();
while(1)
{
if(start_flag==start)
TR0=1;
else
TR0=0;
if(jishi_flag)
{
if(cnt==0) //定时已达到一秒
{
cnt=20;
second--;
if(second<=0)
{
jishi_flag=0;
second=0;
}
}
led_display(second);
}
else
led_display(person);
}
}
///*********************外部中断0服务子函数****************************///
void int0() interrupt 0
{
if( start_flag==not_start)
ring=1;
if(start_flag==start)
ring=0;
switch(P1)
{
case 0xfe: {person=1;jishi_flag=0;} break;
case 0xfd: {person=2;jishi_flag=0;} break;
case 0xfb: {person=3;jishi_flag=0;} break;
case 0xf7: {person=4;jishi_flag=0;} break;
case 0xef: {person=5;jishi_flag=0;} break;
case 0xdf: {person=6;jishi_flag=0;} break;
case 0xbf: {person=7;jishi_flag=0;} break;
case 0x7f: {person=8;jishi_flag=0;} break;
//case 0xfd: person=2; break;
}
}
///*********************外部中断1服务子函数****************************///
void int1() interrupt 2
{
if(key8==0)
{
delay(300);
switch(person)
{
case 1:{fenshu1+=5;if(fenshu1>=99) fenshu1=0;}break;
case 2:{fenshu2+=5;if(fenshu2>=99) fenshu2=0;}break;
case 3:{fenshu3+=5;if(fenshu3>=99) fenshu3=0;}break;
case 4:{fenshu4+=5;if(fenshu4>=99) fenshu4=0;}break;
case 5:{fenshu5+=5;if(fenshu5>=99) fenshu5=0;}break;
case 6:{fenshu6+=5;if(fenshu6>=99) fenshu6=0;}break;
case 7:{fenshu7+=5;if(fenshu7>=99) fenshu7=0;}break;
case 8:{fenshu8+=5;if(fenshu8>=99) fenshu8=0;}break;
}
}
if(key9==0)
{
start_flag=start;
}
}
///*********************定时器0中断服务子函数****************************///
void timer0() interrupt 1
{
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
cnt--;
}
❾ 单片机八路抢答器程序
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,#30;初设抢答时间为30s
MOV R2,#60;初设答题时间为60s
MOV TMOD,#11H;设置未定时器/模式1
MOV TH0,#0F0H
MOV TL0,#0FFH;越高发声频率越高,越尖
MOV TH1,#3CH
MOV TL1,#0B0H;50ms为一次溢出中断
SETB EA
SETB ET0
SETB ET1
SETB EX0
SETB EX1;允许四个中断,T0/T1/INT0/INT1
CLR OK
CLR RING
SETB TR1
SETB TR0;一开始就运行定时器,以开始显示FFF.如果想重新计数,重置TH1/TL1就可以了
;=====查询程序=====
START: MOV R5,#0BH
MOV R4,#0BH
MOV R3,#0BH
ACALL DISPLAY;未开始抢答时候显示FFF
JB P3.0,NEXT;ddddddd
ACALL DELAY
JB P3.0,NEXT;去抖动,如果"开始键"按下就向下执行,否者跳到非法抢答查询
ACALL BARK;按键发声
MOV A,R1
MOV R6,A;送R1->R6,因为R1中保存了抢答时间
SETB OK;抢答标志位,用于COUNT只程序中判断是否查询抢答
MOV R7,#01H ;读抢答键数据信号标志,这里表示只读一次有用信号
MOV R3,#0AH;抢答只显示计时,灭号数
AJMP COUNT;进入倒计时程序,"查询有效抢答的程序"在COUNT里面
NEXT: JNB P1.0,FALSE1
JNB P1.1,FALSE2
JNB P1.2,FALSE3
JNB P1.3,FALSE4
JNB P1.4,FALSE5
JNB P1.5,FALSE6
JNB P1.6,FALSE7
JNB P1.7,FALSE8
AJMP START
;=====非法抢答处理程序=====
FALSE1: MOV R3,#01H
AJMP ERROR
FALSE2: MOV R3,#02H
AJMP ERROR
FALSE3: MOV R3,#03H
AJMP ERROR
FALSE4: MOV R3,#04H
AJMP ERROR
FALSE5: MOV R3,#05H
AJMP ERROR
FALSE6: MOV R3,#06H
AJMP ERROR
FALSE7: MOV R3,#07H
AJMP ERROR
FALSE8: MOV R3,#08H
AJMP ERROR
;=====INT0(抢答时间R1调整程序)=====
INT0SUB:MOV A,R1
MOV B,#0AH
DIV AB
MOV R5,A
MOV R4,B
MOV R3,#0AH
ACALL DISPLAY;先在两个时间LED上显示R1
JNB P3.4,INC0;P3.4为+1s键,如按下跳到INCO
JNB P3.5,DEC0;P3.5为-1s键,如按下跳到DECO
JNB P3.1,BACK0;P3.1为确定键,如按下跳到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.4,INC1
JNB P3.5,DEC1
JNB P3.1,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
;=====倒计时程序(抢答倒计时和回答倒计时都跳到改程序)=====
REPEAT:MOV A,R2 ;使用锦囊时重新计时
MOV R6,A
CLR RING
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 P3.1,QUIT;如按下停止键退出
JNB OK,CHECKK ;只在回答倒计时才有效
AJMP NEXTT
CHECKK:JNB P3.0,REPEAT ;判断是否使用锦囊
NEXTT: ACALL DISPLAY
JB OK,ACCOUT;如果是抢答倒计时,如是则查询抢答,否者跳过查询继续倒数(这里起到锁抢答作用)
AJMP RECOUNT
ACCOUT:
MOV A,36H
JNB ACC.0,TRUE1
JNB ACC.1,TRUE2
JNB ACC.2,TRUE3
JNB ACC.3,TRUE4
JNB ACC.4,TRUE5
JNB ACC.5,TRUE6
JNB ACC.6,TZ1
JNB ACC.7,TZ2
AJMP RECOUNT
TZ1:JMP TRUE7
TZ2:JMP TRUE8
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
TRUE7:ACALL BARK
MOV A,R2
MOV R6,A
MOV R3,#07H
CLR OK
AJMP COUNT
TRUE8:ACALL BARK
MOV A,R2
MOV R6,A
MOV R3,#08H
CLR OK
AJMP COUNT
;=====犯规抢答程序=====
ERROR: MOV R0,#00H
MOV TH1,#3CH
MOV TL1,#0B0H
MOV 34H,R3;犯规号数暂存与(34H)
HERE: MOV A,R0
CJNE A,#06H,FLASH;0.3s向下运行->灭并停响
CLR RING
MOV R3,#0AH
MOV R4,#0AH
MOV R5,#0AH;三灯全灭
AJMP CHECK1
FLASH: CJNE A,#0CH,CHECK1;下面是0.8s的情况,响并显示号数并清R0,重新计
SETB RING
MOV R0,#00H
MOV R3,34H;取回号数
MOV R5,#0BH
MOV R4,#0BH;显示FF和号数
AJMP CHECK1
CHECK1: JNB P3.1,QUIT1
ACALL DISPLAY
AJMP HERE
QUIT1: CLR RING
CLR OK
AJMP START
;=====显示程序=====
DISPLAY:MOV DPTR,#DAT1;查表显示程序,利用P0口做段选码口输出/P2低三位做位选码输出,
MOV A,R3
MOVC A,@A+DPTR
MOV P2,#0feH
MOV P0,A
ACALL DELAY2
MOV DPTR,#DAT2
MOV A,R5
MOVC A,@A+DPTR
MOV P2,#0fdH
MOV P0,A
ACALL DELAY2
MOV A,R4
MOVC A,@A+DPTR
MOV P2,#0fbH
MOV P0,A
ACALL DELAY2
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
;=====延时4236个机器周期(去抖动用到)=====
DELAY: MOV 32H,#12H
LOOP: MOV 33H,#0AFH
LOOP1: DJNZ 33H,LOOP1
DJNZ 32H,LOOP
RET
;=====延时4236个机器周期(显示用到)=====
DELAY2: MOV 32H,#43H
LOOP3: MOV 33H,#1EH
MOV A,R7 ;每隔60~70个机器周期读一次P1口,全为1时为无效数据,继续读,有一个不为1时,转到正常抢答处理
JNZ AAAA1 ;没读到有效数据时继续转到AAAA1
LOOP2: DJNZ 33H,LOOP2
DJNZ 32H,LOOP3
RET
;=====读抢答按键数据口程序=====
;由于在读抢答数据口的时候,单片机首先进入倒计时程序,再调用显示程序,最后才检测按键口
;然而在检测按键口时动态扫描要调用三次(4ms)延时程序.这样就会导致读数据口出现滞后,造成1号优先最高.8号最低.
;故采用在延时子程序中加了读数据口程序.保证了灵敏度和可靠性
AAAA1: MOV A,P1
CJNE A,#0FFH,AA1 ;当不全为1时的数据为有效数据
AA0: MOV 36H,A ;将有效数据送到36H暂存
AJMP LOOP2
AA1: DEC R7
AJMP AA0
;=====发声程序=====
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
❿ 抢答器所用单片机原型是什么
“抢答器”实际上就是一种简单的逻辑电路,可以通过应用现成的单片机通过编写程序简单实现而已。