基于51单片机的八路抢答器仿真设计

发布者:乐呵的挑最新更新时间:2019-11-27 来源: 51hei关键字:51单片机  八路抢答器  仿真设计 手机看文章 扫描二维码
随时随地手机看文章

首先,裁判在右方按下开始按钮,蜂鸣器响起,抢答开始,初始时间为20s,若1-8位选手按下按钮,即抢答成功,由显示屏显示该选手号码,如果超过时间(20s)没人认抢答,则时间重置为20s,并此题作废,答题结束后,按下重置按钮,这时时间重置,下次抢答开始。


创新功能(*)在没有按下开始键时,按下修改时间按钮,则时间会减少1s,由于默认时间为20s,所以这个功能可以实现20s内时间的调整

仿真原理图如下

单片机源程序如下:

#include

#define uchar unsigned char

#define uint unsigned int

#define  max 20

uchar tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};


sbit d1=P2^4;

sbit d2=P2^5;

sbit x1=P2^6;

sbit x2=P2^7;


sbit k1=P1^0;

sbit k2=P1^1;

sbit k3=P1^2;

sbit k4=P1^3;

sbit k5=P1^4;

sbit k6=P1^5;

sbit k7=P1^6;

sbit k8=P1^7;


sbit zk1=P2^0;

sbit zk2=P2^1;


sbit buz=P2^2;


uchar d_num,cnt;

uchar x_flag;

void jianpan();

void init(void)

{

   TMOD=0X01;

   TL0=0XB0; 

   TH0=0X3C;

//   TR0=1;    

   ET0=1;     

   EA=1;

   d_num=max;

}


void delay(uint xms)

{

   uint x,y;

   for(x=xms;x>0;x--)

    for(y=110;y>0;y--);


}


void display()

{

        d1=0;         //位选端;

        P0=tab[d_num/10];//显示倒计时

        delay(5);

        d1=1;


        d2=0;

        P0=tab[d_num%10];

        delay(5);

        d2=1;


        x1=0;        //位选端

        P0=tab[x_flag/10];//显示选手号

        delay(5);

        x1=1;


        x2=0;

        P0=tab[x_flag%10];

        delay(5);

        x2=1;

}


void main()

{        init();

        while(1)

        { 

          jianpan();

          display();


        }        

}


void timer0(void) interrupt 1

   TL0=0XB0; //重装初值

   TH0=0X3C; 

   cnt++;

   if(cnt==20)//1 秒时间到

    {

       cnt=0;//计数清零

           d_num--;

           if(d_num==0)

          {

             d_num=max;


             TR0=0;        //关闭所有操作

                 }

           buz=0;        

           delay(20);

           buz=1;

           

     }   

}

void jianpan()


{             if(zk1==0&&x_flag==0)

                {

                         delay(5);

                         x_flag=0;


                         TR0=1;

                         

                }

                if(zk2==0&&TR0==0)

                {

                         delay(5);

                         if(zk2==0&&TR0==0)

                         {

                                 if(x_flag==0)

                                 {

                                   d_num--;                                //设置倒计时

                                   buz=0;

                                   delay(20);

                                    buz=1;  }


                                 if(d_num==5)

                                 d_num=max;

                                                  

                                 if(x_flag!=0) //选手显示清零

                                 {

                                 x_flag=0;

                                 d_num=max;        

                                 TR0=0;        

                                   buz=0;

                                   delay(20);

                                    buz=1;

                                      }


                                 while(!zk2)

                                 display();

                         }

                }


                

            if(k1==0&&TR0==1) 

                {

                         delay(5);

                         if(k1==0&&TR0==1)

                         {

                           x_flag=1;


                            TR0=0;

                                  }                 

                }



                if(k2==0&&TR0==1)

                {

                         delay(5);

                         if(k2==0&&TR0==1)

                         {x_flag=2;TR0=0;}                 

                         

                }


                if(k3==0&&TR0==1)

                {

                         delay(5);

                         if(k3==0&&TR0==1)

                         {x_flag=3;TR0=0;}                 

                         while(!k3)

                         display();

                }


                if(k4==0&&TR0==1)

                {

                          delay(5);

                         if(k4==0&&TR0==1)

                         {x_flag=4;TR0=0;}                 

                         

                }

                if(k5==0&&TR0==1)

                {

                         delay(5);

                         if(k5==0&&TR0==1)

[1] [2]
关键字:51单片机  八路抢答器  仿真设计 引用地址:基于51单片机的八路抢答器仿真设计

上一篇:单片机控制无刷电机初步调试成果和学习经历
下一篇:单片机8位LED数码管的静态显示课程设计说明书与仿真

推荐阅读最新更新时间:2024-11-10 19:47

基于51单片机的步进电机控制以及仿真
给你一段简单的程序代码,控制步进电机的,不过你要好好看看程序的编写,以适应你的硬件(主要是连线),你可以在实现这个的基础上实现你所说的目标,个人觉得你参考这个程序然后自己实现你所说的功能比较好: #include reg52.h unsigned char code F_Rotation ={0x08,0x10,0x20,0x40};//正转表格 unsigned char code B_Rotation ={0x40,0x20,0x10,0x08};//反转表格 void Delay(unsigned int i)//延时 { while(--i); } main() { unsigned char i; wh
[单片机]
基于<font color='red'>51单片机</font>的步进电机控制以及<font color='red'>仿真</font>
MCS-51单片机最小系统的组成部分及电路图介绍
  MCS-51单片机概述   MCS-51单片机是一种集成的电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的计算机系统。   51系列单片机的特点   -8位cpu   -片内带振荡器,频率范围为1.2MHz~12MHz   -片内带128B的数据存储器   -片内带4KB的程序存储器   -程序存储器的寻址空间为64KB   -片外数据存储器的寻址空间为64KB   -128个用户位寻址空间   -21个字节特殊功
[单片机]
MCS-<font color='red'>51单片机</font>最小系统的组成部分及电路图介绍
MCS-51单片机的内部结构介绍
1、8051单片机片内并行接口 2、MCS-51的内部资源 3、MCS-51的芯片引脚 4、单片机的工作方式 单片机的工作方式包括:复位方式、程序执行方式、单步执行方式、低功耗操作方式以及EPROM编程和校验方式。 1. 复位方式:经典的上电复位电路 2. 程序执行方式:(1)执行内部程序;(2)执行外部程序 3. 单步执行方式:用于调试程序和系统 4. 低功耗操作方式 5. 编程和校验
[单片机]
MCS-<font color='red'>51单片机</font>的内部结构介绍
51单片机延时程序的简单研究
应用单片机的时候,经常会遇到需要短时间延时的情况。需要的延时时间很短,一般都是几十到几百微妙(us)。有时候还需要很高的精度,比如用单片机驱动DS18B20的时候,误差容许的范围在十几us以内,不然很容易出错。这种情况下,用计时器往往有点小题大做。而在极端的情况下,计时器甚至已经全部派上了别的用途。这时就需要我们另想别的办法了。   以前用汇编语言写单片机程序的时候,这个问题还是相对容易解决的。比如用的是12MHz晶振的51,打算延时20us,只要用下面的代码,就可以满足一般的需要:     mov   r0, #09h loop:  djnz  r0, loop 51单片机的指令周期是晶振频率的1/12,也就是1us
[单片机]
51单片机的延时计算
前言 我使用51,STC这一类的单片机做控制好几年,一直是使用现成的程序,在其上修修改改,以达到需求动作目的即可。从来都是不求甚解。想法既是如此,会用即可,了解那么多做什么。 此次又在做一项目,里面用到I2C通讯。本来是直接复制粘贴了事,却没想对里面的一个小小的延时函数起了兴趣,由于本人是基础功底只有5战斗力的渣渣,写写画画了一天才搞了个大体明白。 以前总是在看其他博主的文章,默默潜水。然而此次,突然就忍不住想写篇文章发表一下费尽心思的微不足道的心得体会。 正文 void Delay10us() //@12.000MHz { unsigned char i; _nop_(); _nop_(); i = 27
[单片机]
<font color='red'>51单片机</font>的延时计算
简述8051单片机结构与原理
单片机的基本结构包括中央处理器(CPU) 、存储器、定时/计数器、输入输出接口、中断控制系统和时钟电路六部分。 一、基本组成 中央处理器(CPU) 包括运算器和控制器两部分,是单片机的核心。运算器可用于各种运算,控制器用于控制单片机各部分协调工作。 存储器 用于存放程序和原始数据。 时钟电路 时钟电路产生单片机运行的控制信号,控制单片机严格按时序执行指令。 定时/计数器:实现定时或计数功能。 输入输出接口(I/O)实现单片与其他设备之间的数据传送。 中断控制系统: 用于响应中断源的中断请求; 二、单片机引脚 双列直插式封装(DIP,Dual Inline Package) 方形封装(PLCC,Plastic
[单片机]
简述80<font color='red'>51单片机</font>结构与原理
自制51单片机常用头文件(LCD1602)
/*-------------------------------------------------------------------------- LCD1602.H The user function is C51. Copyright (c) 1988-2004 Keil Elektronik GmbH sum zhaojun All rights reserved. --------------------------------------------------------------------------*/ #ifndef __LCD1602_H__ #define __LCD1602_H__ /*连接线
[单片机]
机器人教程1:如何利用51单片机输出PWM波
1、理论知识 PWM这个功能在飞思卡尔、STM32等高档的单片机内部有专用的模块,用此类芯片实现PWM功能时只需要通过设置相应的寄存器就可实现周期和占空比的控制。但是如果要用51单片机的话,也是可以的,但是比较的麻烦。此时需要用到内部定时器来实现,可用两个定时器实现,也可以用一个定时器实现。 用两个定时器的方法是用定时器T0来控制频率,定时器T1来控制占空比。大致的的编程思路是这样的:T0定时器中断让一个I0口输出高电平,在这个定时器T0的中断当中起动定时器T1,而这个T1是让IO口输出低电平,这样改变定时器T0的初值就可以改变频率,改变定时器T1的初值就可以改变占空比。 下面重点介绍用一个定时器的实现PWM的方法。因为
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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