51单片机8位抢答器程序设计与原理图搭建

这篇具有很好参考价值的文章主要介绍了51单片机8位抢答器程序设计与原理图搭建。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

原理图整体

51单片机8位抢答器程序设计与原理图搭建

本设计利用51单片机中断函数来查询抢答位置,除了一般抢答器用到的基本元件外,还用到了74LS30(八路与非门)与74LS04(非门)。下面对原理图进行分块介绍

抢答按钮部分(注意非门接到AT89C52的P3.3 INT1触发)

51单片机8位抢答器程序设计与原理图搭建
51单片机8位抢答器程序设计与原理图搭建

led灯连接部分 (采用灌电流的形式,注意P0口上拉电阻与led线路上的保护电阻)

实际电路中,通常外界供电5V,led灯的压降为2V,工作电流为1-5mA,安全电阻通常在1-3KΩ

51单片机8位抢答器程序设计与原理图搭建

数码管连接部分

采用74HC573连接数码管,增加端口的驱动能力,也节约了端口

51单片机8位抢答器程序设计与原理图搭建
51单片机8位抢答器程序设计与原理图搭建

P3端口与蜂鸣器

蜂鸣器要保证供电,采用三极管增加驱动能力

51单片机8位抢答器程序设计与原理图搭建

程序流程图

51单片机8位抢答器程序设计与原理图搭建

C程序

#include <reg52.h>           //添加两类头文件
#include <intrins.h>
#define uchar unsigned char    //对两种关键字进行简化替换
#define uint unsigned int
#define led P0    //对端口名字进行替换
#define shuma P2  //有利于在替换不同封装时调整代码
#define button P1

bit flag1,flag2,flag3,flag4,liushui,setflag;   //变量的定义
sbit DUAN=P3^0;
sbit WEI=P3^1;
sbit BUZZ=P3^5;
sbit start=P3^4;
sbit set=P3^6;
sbit reset=P3^2;
uchar temp;
uchar count=1; 
uchar timecount; 
uchar numshow;  
uchar numget;  
uchar t;
uchar pro;
uchar changet=20;
uchar showt;
uchar code showcode[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴极0-9的段码
uchar code NO[2]={0x37,0x3f}; //显示字母NO的段码
uchar code HELLO[5]={0x76,0x79,0x38,0x38,0x3f};//显示HELLO的段码

void delay(uchar i);  //函数的定义
void shumashowcountdown(uchar num);
void shumashowget(uchar a);
void xiaochu();
void sound();
void showhello();
void showno();

void main()
{

    sound(); //开机叫一声
    EA=1;    //进行中断设置
    EX0=1; 
    EX1=0; 
    IT0=1;
    IT1=1; 
    PX0=1;
    PX1=1;
    while(1)
    {
        
    if(count==1)
    {flag1=1;}
    
    while(flag1)  //状态1 数码管显示HELLO等待进行复位
    {
     showhello();
    }
    
    
    xiaochu();
    sound(); 
    while(flag2)  //状态2 等待计时开始或者修改计时时间
    {
        led=0x00;
        xiaochu();    
        if(start==0)  //等待计时
        {
            EX0=1;
            flag2=0;
            flag3=1;
            flag4=0;
            EX1=1;
            ET0=1;
            TH0=0xd8;
            TL0=0xf0; // 每次定时器中断时间是10ms
            TR0=1;
            timecount=0;
            numshow=changet;
            shumashowcountdown(numshow);
            led=0xfe;
            liushui=0;
        }
        if(flag3==0)
        {
        delay(200);
        }
        if(set==0) //修改计时时间
        { 
            set=1;
            start=1;
            reset=1;
            setflag=1;
            EX0=0;
      EX1=0;
            led=0xaa;
            delay(200);
      while(setflag==1)
            {
                shumashowcountdown(changet);
                if(set==0)
                {
                    delay(10);
                    if(set==0)
                    {
                 setflag=0;
                 EX0=1;
         EX1=1;
                    set=1;
                    }
                }
                if(start==0)
                {
                    changet=changet-1;
                    led=_crol_(led,1);
                    delay(200);                
                }
                if(reset==0)
                {
                    changet=changet+1;
                    led=_cror_(led,1);
                    delay(200);
                }
            }        
        }
    }
    
    
    sound(); 
    while(flag3)  //状态3 开始进行倒计时
    {
        if(numshow!=0)
        {
        shumashowcountdown(numshow);
        }
        if(liushui==1)
        {
        led=_crol_(led,1);
            liushui=0;
        }
        if(numshow==0) //如果在规定时间内无人进行抢答
            {            //数码管显示NO
                ET0=0;
                EX1=0;
                showno();
            }
    }
    
    
    sound(); 
    while(flag4)  //状态4 显示抢答结果
    {
        led=temp;
        shumashowget(numget);
    }
    }
}


void delay(uchar i) //延时时间
{
    uchar j=250;
    uchar c=5;
    while(i--)
    {
        while(j--);
        
    }
}

void sound() //蜂鸣器发出声音
{
    BUZZ=0;
    delay(200);
    BUZZ=1;
}

void xiaochu() //对数码管进行消隐
{
    WEI=1;
    shuma=0xff;
    WEI=0;
    shuma=0x00;
    DUAN=1;
    shuma=0x00;
    DUAN=0;
}

void shumashowget(uchar a) //数码管显示抢答结果
{
    WEI=1;
    shuma=0x7f;
    WEI=0;
    DUAN=1;
    shuma=showcode[a];
    DUAN=0;
    delay(100);
}

void shumashowcountdown(uchar num) //数码管显示倒计时
{
    uchar a[2];
    a[1]=num%10;
    a[0]=num/10;
  
            WEI=1;
            shuma=0x7f;
            WEI=0;
            shuma=0x00;
        
            DUAN=1;
            shuma=showcode[a[1]];
            DUAN=0;
            shuma=0xff;
            delay(2);
    
        WEI=1;
            shuma=0xbf;
            WEI=0;
            shuma=0x00;
        
            DUAN=1;
            shuma=showcode[a[0]];
            DUAN=0;
            shuma=0xff;
            delay(2);
}


void int1rst() interrupt 0 //INT0的中断函数 用于reset恢复初始状态
{
    if(count==1)
    {flag1=0;
   count=0;    
    }
    flag2=1;
    flag3=0;
    flag4=0;
    xiaochu();
    IE1=0;
}

void timer() interrupt 1 //定时器T0中断函数 用于精确计秒
{
    timecount++;
    if(timecount==100)
    {
        numshow--;
        liushui=1;
        timecount=0;
    }
}

void int1grad() interrupt 2  //INT1的中断函数,用来检测哪个端口被按下
{
    temp=button;
    delay(2);
    if(temp==button)
    {
        if(temp==0xfe)
        {
            numget=1;
        }
        
        if(temp==0xfd)
        {
            numget=2;
        }
        
        if(temp==0xfb)
        {
            numget=3;
        }
        
        if(temp==0xf7)
        {
            numget=4;
        }
        
        if(temp==0xef)
        {
            numget=5;
        }
        
        if(temp==0xdf)
        {
            numget=6;
        }
        
        if(temp==0xbf)
        {
            numget=7;
        }
        
        if(temp==0x7f)
        {
            numget=8;
        }
        flag2=0;
        flag3=0;
        flag4=1;
        TR0=0;
        ET0=0;
        EX1=0;
    }
    
}

void showhello() //数码管显示HELLO
{
     pro=0xf7;
        for(t=0;t<5;t++)
        {
            WEI=1;
            shuma=pro;
            WEI=0;
            shuma=0x00;
        
            DUAN=1;
            shuma=HELLO[t];
            DUAN=0;
            shuma=0xff;
            delay(2);
            pro=_crol_(pro,1);
        }
}

void showno() //数码管显示NO
{
     if(showt==0)
     {
         sound(); 
         showt=1;
     }
     pro=0xbf;
        for(t=0;t<2;t++)
        {
            WEI=1;
            shuma=pro;
            WEI=0;
            shuma=0x00;
        
            DUAN=1;
            shuma=NO[t];
            DUAN=0;
            shuma=0xff;
            delay(2);
            pro=_crol_(pro,1);
        }
        led=0x00;
}

仿真效果

状态一 欢迎界面

51单片机8位抢答器程序设计与原理图搭建

状态二 修改计时时间与等待开始

51单片机8位抢答器程序设计与原理图搭建
51单片机8位抢答器程序设计与原理图搭建

状态三 抢答倒计时与无人应答报警

51单片机8位抢答器程序设计与原理图搭建
51单片机8位抢答器程序设计与原理图搭建

状态四 显示抢答结果

51单片机8位抢答器程序设计与原理图搭建

操作说明

上电后显示HELLO

按reset键进行等待

之后按START键进行倒计时开启抢答

状态二 在按led灯全亮的状态下,可以修改倒计时时间

按下set键后,led灯半亮

reset键增加时间

start键减少时间

修改后再次按下set键回到led灯全亮状态等待计时开始

无人应答或者抢答结束后按reset键可以回到状态二 等待下一次抢答开始文章来源地址https://www.toymoban.com/news/detail-474315.html

到了这里,关于51单片机8位抢答器程序设计与原理图搭建的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C51】基于51单片机的多路抢答器的设计与制作

        随着社会的进步和科技的发展,当今社会活动对电子设备的使用也越发依赖,此时抢答器也作为一种答题方式所需要的设备应运而生。抢答器的适用方面广泛,可用在当下各种答题节目,知识竞赛等活动之中。但随之而来的也有很多问题,当今市面上有的抢答器使用线

    2024年02月03日
    浏览(46)
  • 单片机设计_8路抢答器(AT89C51)

    想要更多项目私wo!!!         此电路由AT89C51最小系统、四位数码管、蜂鸣器电路和按键模块组成。 运行原理:         该抢答器电路可同时进行八路优先抢答。按键按下后,蜂鸣器发声,同时数码管 显示优先抢答者的号码,抢答成功后,再按按键,显示不会改变,除非

    2024年02月11日
    浏览(48)
  • 基于51单片机8位竞赛抢答器_倒计时可调+LED跑马灯

    (程序+proteus仿真+报告) Proteus仿真版本:proteus 7.8 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:Q006 资料下载链接 1、以单片机位核心,设计一个8位抢答器:同时供8名选手比赛,分别用6个按键表示; 2、无人抢答时,8个跑马灯循环点亮,数码管显示00; 3、设置一个

    2024年02月09日
    浏览(34)
  • proteus 仿真 at89c51 单片机八位抢答器,文末附源文件

    在网上没能容易地直接找到仿真文件,所以我把这个上传,希望对各位有所帮助。 倒是有不少好心人给出了图文教学和源代码,对他们表示感谢。我也是用这位老哥的代码和电路稍作了修改,感谢分享。 起初 led 数码管是熄灭的,按下 P2.1 的按钮 会将它们点亮,开始抢答。

    2024年02月09日
    浏览(45)
  • 【单片机项目实训】八路抢答器

    将单片机项目实训——8路抢答器分享出来,如有不足,敬请指出。 【实验图片】  【实验视频】 【项目实训】8路抢答器 目录 一、设计要求 二、方案选择 三、硬件电路设计 五、其他图片 六、资料链接 七、关于作者 八、后记         设计一个共8名选手参加的8路抢答器。

    2024年02月11日
    浏览(40)
  • STM32单片机的抢答器设计

    一.硬件方案          以STM32单片机为核心的八路抢答器采用了数字显示器LCD1602,自动锁存显示结果设计思想,它能根据不同的抢答输入信号,经过单片机的控制处理并产生不同的与输入信号相对应的输出信号,最后通过LCD1602显示,即使两组的抢答时间相差几微秒,也可分

    2024年02月11日
    浏览(40)
  • 基于单片机的八路抢答器的设计

    1.设计要求: 1.以单片机为核心,设计一个八位竞赛抢答器:同时供八名选手或八个代表队比赛,分别用八个按钮S0~S7表示。 2.设置一个系统清除和抢答控制开关S,开关由主持人控制。 3.抢答器具有锁存与显示功能。即选手按按钮,锁存相应的编号,并在优先抢答选手的编号

    2024年02月07日
    浏览(39)
  • 基于单片机16路多路抢答器仿真系统设计

    ** 单片机设计介绍,基于单片机16路多路抢答器仿真系统设计   基于单片机16路多路抢答器仿真系统的设计概要主要涵盖硬件设计、软件编程以及功能实现等方面。以下是针对该设计的详细概述: 一、系统概述 该设计旨在开发一个基于单片机的16路多路抢答器仿真系统,能

    2024年04月27日
    浏览(38)
  • 基于C语言的单片机八路抢答器课程设计

    1 、系统总体方案设计 本系统由硬件系统和软件系统组成。 硬件系统包括按键控制模块、中央处理AT89C51系统、指示灯显示模块、LED数码管显示模块和扬声器提示模块。 软件系统包括主程序、定时器0中断服务程序、定时器1中断服务程序、延时程序、按键程序和显示程序。 为

    2024年02月04日
    浏览(48)
  • 基于AVR128单片机抢答器proteus仿真设计

    一、系统方案 二、硬件设计 原理图如下: 三、单片机软件设计 1、首先是系统初始化 void timer0_init() //定时器初始化 { TCCR0=0x07; //普通模式,OC0不输出,1024分频 TCNT0=f_count; //初值,定时为10ms TIFR=0x01; //清中断标志位 TIMSK=0x01; //使能定时器0溢出中断 SREG|=0x80; //开启全局中断 }

    2024年02月11日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包