用51单片机制作4路抢答器

发布者:东土大唐88最新更新时间:2016-09-07 来源: eefocus关键字:51单片机  4路抢答器 手机看文章 扫描二维码
随时随地手机看文章
此抢答器具有限时抢答,超时无效的特点,并可以对主持人未喊开始而提前抢答的犯规情况作出判断。

由于用了单片机,所以电路很简单。懒得写译码程序,也不想做驱动电路。干脆直接用了一片74LS48译码驱动器来驱动数码管。

 

用51单片机制作4路抢答器 - 月下独酌 - 月下独酌的博客
 

 

呵呵,面包板上插一下,由于之前在Proteus中仿真过,所以直接就正常运行了~上一张实物图

左边的是STC89C52的最小系统版,P1口上接了8个LED,当时做流水灯的。直接拿来用了。P2口是显示输出,P3口接受按键。那个小的芯片就是74LS48啦~下方的是编程器+电源,STC的芯片就是编程方便,支持在线烧写,这么小巧的编程器~

 

用51单片机制作4路抢答器 - 月下独酌 - 月下独酌的博客

 

当然最重要的是程序,附上代码清单。写的比较烂,竟然上了100行,希望不要被大虾们骂得太惨>_<

 

 

#include 
#define uint unsigned char

//计时变量
uint s = 0, ms = 0;

//枚举类型:记录抢答器工作状态
enum Stat
{
    Idle = 0,    //空闲状态,比如正在读题
    Ready = 1,   //就绪状态,可以抢答
    Respond = 2, //响应状态,有人抢到了
}stat;

//时钟中断服务程序
void Timer() interrupt 1 using 1
{
    TH0=0x3C;
    TL0=0xBD;
    ms ++;
    s += ms /20;
    ms %= 20;
    s %= 60;
}

//重置时钟
void ResetTimer()
{
    EA = 1;   //允许CPU 中断
    ET0 = 1;  //定时器中断打开
    TMOD = 1; //设定时器为方式
    TR0 = 0;  //关定时器
    ms = 0;
    s = 0;
}

//优先编码(反向输入)
uint Encode(uint c)
{
    uint i, mask = 1;
    if(c == 0) return 0;
    for(i = 0; i < 8; i++)
    {
        if((c & (mask << i)) == 0) return i + 1;
    }
}

 

void main()
{
    uint led = 0xff; //对应P1口,指示灯
    uint disp = 15;  //对应P2口,数码管
    uint button;     //对应P3口,按键
    uint isFoul = 0; //是否犯规(或超时)
  const uint timeout = 5; //超时时间
  ResetTimer();
    while(1)
    {
        //设置状态指示灯,用于调试,实际应用中可以去掉
        if(stat == Idle) P0 = (~1);
        else if(stat == Ready) P0 = (~2);
        else if(stat == Respond) P0 = (~4);
        else stat = 0;

        //超时判断
        if(timeout - s == 0)
        {
            isFoul = 1;
            disp = 15;
            stat = Idle;
            ResetTimer();
        } 

        //读按键
        button = P3;

        //P3.5复位键按下
        if((button & 32) == 0)
        {
            disp = 15;
            led = 0xff;
            stat = Idle;
            isFoul = 0;
            ResetTimer();
        } 

        //P3.4开始键按下
        if((button & 16) == 0)
        {
            stat = Ready;
            P1 = 0;  //所有选手的灯闪烁,提示可以开始抢答
            TR0 = 1; //开始计时
        } 

        //P3.0-P3.3抢答键按下
        if((button & 15) != 15)
        {
            if(stat == Idle) isFoul = 1; //提前抢,犯规
            if(stat != Respond)          //正常抢答
            {
                led = (button & 15) + 240;
                disp = Encode(button & 15);
                stat = Respond;
            }
            ResetTimer();
        } 

        //显示
        if(isFoul) led &= 127; //犯规则点亮
        if(stat == Ready) disp = timeout - s;
        P1 = led;
        P2 = disp;
    }
}

关键字:51单片机  4路抢答器 引用地址:用51单片机制作4路抢答器

上一篇:51单片机蜂鸣器音乐简谱转换工具
下一篇:C51单片机中常用的头文件

推荐阅读最新更新时间:2024-03-16 15:08

51单片机写DS18B20的驱动
初始化操作方法:单片机先给总线一个高电平,略微延时,然后拉低总线,至少延时480us(我们取600us),然后拉高总线,等待15~60us的时间(我们取80us),此后DS18B20如果响应,则会发出0,拉低总线,否则为1,单片机检测是否响应的时间在60~240us之内,之后释放总线,程序如下: bit DS18B20_init()//初始化 { uchar i; bit flag_response=0; DQ=1; _nop_();_nop_(); DQ=0; delay_us(90); //延时600us DQ=1; delay_us(10); //延时80us for(i=0;i 15;i++)
[单片机]
基于MAX195转换器和AT89C51单片机实现应用接口的设计
MAX195是16位逐次逼近方式的ADC。它将高精度、高速度、低电源功耗(消耗电流仅10μA)的关闭方式等性能结合在一起。内部校准电路对线性度与偏置误差进行校正,所以无需外部调整便可达到全部额定的性能指标。电容性的DAC结构使之具有特有的85kbps跟踪/保持功能,变换时间仅需9.4μs。三态串行数据输出及引脚可选的单极性(0~VREF)或双极性(-VREF~+VREF)的输入范围使之可广泛应用于便携式仪表、医用信号采集及多传感器测量等系统中。 1 MAX195引脚及说明 MAX195有16个引脚,其排列如图1所示。 2 MAX195转换原理及时序 MAX195片内含有电容性的数字模拟变换器(DAC),可对模拟输入进行特有
[单片机]
基于MAX195转换器和AT89C<font color='red'>51单片机</font>实现应用接口的设计
使keil5支持51单片机
需要用到的工具:https://download.csdn.net/download/qq_33160790/10302877 PS:两个工具都是要用管理员身份运行。 keil5默认不支持51,51单片机的工程放到keil5会报错: keil5 --- Error: failed to execute 'G:keilC51BINC51.EXE' 安装方法: 1.运行c51v954a.exe,将路径选成之前keil5的安装路径。 2.使用keygen.exe破解License PS:管理员身份打开keil5 破解步骤: 将CID复制到破解机。 将生成的LIC拷贝至keil5。
[单片机]
使keil5支持<font color='red'>51单片机</font>
51单片机 数码动态显示
#include #include #define uchar unsigned char #define uint unsigned int #define SEG P0 sbit latch1=P2^7; //段驱动锁存信号 sbit latch2=P2^6; //位驱动锁存信号 uchar code DSY_CODE = { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f }; void DelayMS(uint x) { uchar t; while(x--) { for(t=12
[单片机]
基于51单片机的电力载波通信开关电路的制作
一、原理图: 二、C程序源代码 /* 此程序已经经本人亲自调试运行过,如有疑问,请联系 QQ:286288986 */ #include reg52.h //预定义头文件 #define uchar unsigned char //宏定义 sbit keyin=P3^3; //按键定义 sbit led=P3^5; //指示灯定义 uchar a; //接收数据记存器 void main() //主函数 { keyin=1; //按键口置1 led=1; //灭led灯 TMOD=0x20; //选择顶时器/计数器1中的方式2 SP=0x60; // 设置堆榨地址 TH1=0xfd; //波特率9600bit/
[单片机]
基于<font color='red'>51单片机</font>的电力载波通信开关电路的制作
51单片机的内部资源和最小系统解读
1、单片机内部资源 STC89C52:8KFLASH、512字节RAM、32个IO口、3个定时器、1个UART、8个中断源 (1)Flash(硬盘)——程序存储空间 —— 擦写10万次,断电数据不丢失,读写速度慢 (2)RAM(内存)——数据存储空间 —— 断电数据丢失,读写速度快,无限次使用 (3)SFR —— 特殊功能寄存器 2、单片机最小系统 最小系统:最少组件组成单片机可以工作的系统。 三要素: (1)、 电源电路:5V (2)、 晶振电路:11.0592MHZ、两个30PF (3)、 复位电路: P0:开漏输出,必须加上拉电阻 准双向口: 强推挽输出:电流驱动能力强 高阻态 上下拉电阻:上拉电路就是
[单片机]
<font color='red'>51单片机</font>的内部资源和最小系统解读
51单片机串口T1加看门狗程序
数码管部分的电路图 程序: #include reg52.h #define UCHAR unsigned char #define UINT unsigned int sfr WDT_CONTR = 0xe1; UCHAR table = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; UCHAR timer; UCHAR conter; void initserial(void) { timer='0'; conter=0; TMOD=0X20; SCON=0X50; TL
[单片机]
<font color='red'>51单片机</font>串口T1加看门狗程序
基于80C51单片机的智能小车设计
O 引言 在现有玩具电动车的基础上,加装光电检测器,实现对电动小汽车的速度、位置、运行状况的实时测量,并将测量数据传送至单片机进行处理,然后由单片机根据所检测的各种数据实现对电动车的智能控制。 1 直流调速系统采用PWM调速 直流调速系统采用晶闸管的直流斩波器与整流电路。晶闸管不受相位控制,而是工作在开关状态。当晶闸管被触发导通时,电源电压加到电动机上,当晶闸管关断时,直流电源与电动机断开,电动机经二极管续流,两端电压接近于零。脉冲宽度调制(Pulse Width Modulat-ion),简称PWM。脉冲周期不变。只改变晶闸管的导通时间,即通过改变脉冲宽度来进行直流调速。 脉宽调速也可通过单片机控制继电器的闭
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved