51单片机三路抢答器

2020-10-16来源: 51hei关键字:51单片机  三路抢答器

单片机程序源码:

/*******************************************************************************

*  标题:                           三路抢答器                                  *

*  时间                      2018年8月5日17:59:20                                                   *

*                                                                                                                                                           *

*  实验说明:在10s的时间内,三位选手进行按键抢答,如果1号抢答,那么数码管将显示*

1号选手的号码。并且蜂鸣器响,以此类推。如果10s时间到,蜂鸣器响,选手 *

无法进行抢答                                                                                    *                                                      

********************************************************************************

* 实验心得:做法相对简单,注意共阴数码管还是共阳数码管                                                             *

********************************************************************************/


#include


//IO口定义

#define GPIO_DIG P0

#define GPIO_SHOW P2


sbit LSA=P3^0;

sbit beep=P1^5;

sbit K1=P3^1;

sbit K2=P1^0;

sbit K3=P1^1;

sbit K4=P1^2;


//--定义全局变量--//

typedef unsigned int u16;

unsigned char code DIG_CODE[18]={

0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0xff};

//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码

unsigned int Ge=0;

unsigned int Shi=1;

unsigned int num=0;

unsigned int Res=10;

unsigned int flag=0;


//全局函数

void DigDisplay();


void delay(u16 i)

{

        while(i--);      

}


void main()

{

    TMOD = 0x01;

    TH0 = 0x3C;

    TL0 = 0x0B0;

    EA = 1;

    ET0 = 1;

    TR0 = 1;

        DigDisplay();



}



void DigDisplay()

{

        unsigned char i;

        unsigned int j;

        while(1)

        {

        for(i=0;i<2;i++)

        {

                switch(i)         //位选,选择点亮的数码管,

                {

                        case(0):

                                LSA=0;

                                GPIO_DIG=DIG_CODE[Shi];//发送段码

                                break;//显示第0位

                        case(1):

                                LSA=1;

                                GPIO_DIG=DIG_CODE[Ge];//发送段码

                                break;//显示第1位

                }

               

/****************************************************************************/

/*消隐函数要在数码管更新频率很快的条件下,才起作用,手动更换数码管位选完全达不到这么快的速度,因此在这种情况下也是没必要用消隐的  */

                j=10;                                                 //扫描间隔时间设定

                while(j--);        

                GPIO_DIG=0x00;//消隐

                }

        if(K1==0)

        {

                Res=10;

                flag=0;

        }


    else if(K2==0)

        {

                GPIO_SHOW=~DIG_CODE[1];

                while(1)

                {

                beep=~beep;

                delay(10);

                if(K1==0)

                {

                 Res=10;

                 flag=0;

                 GPIO_SHOW=~DIG_CODE[17];

                 break;        

                }

                }


        }


        else if(K3==0)

        {

                GPIO_SHOW=~DIG_CODE[2];

                while(1)

                {

                beep=~beep;

                delay(10);

                if(K1==0)

                {

                 Res=10;

                 flag=0;

                 GPIO_SHOW=~DIG_CODE[17];

                 break;

                }        

                }

        }


        else if(K4==0)

        {

                GPIO_SHOW=~DIG_CODE[3];

                while(1)

                {

                beep=~beep;

                delay(10);

                if(K1==0)

                {

                 Res=10;

                 flag=0;

                 GPIO_SHOW=~DIG_CODE[17];

                 break;

                }        

                }

        }


        }



}


void Int1() interrupt 1

{

        TMOD = 0x01;

    TH0 = 0x3C;

    TL0 = 0x0B0;

        num++;


        if(num==20)

        {

                num=0;

                flag++;

                Res--;

                Ge=Res%10;

                Shi=Res/10;               

        }

        

        if(flag==10)

        {

                while(1)

                {

                beep=~beep;

                delay(10);


                if(K1==0)

            {

                Res=10;

                flag=0;

                break;

[1] [2]
关键字:51单片机  三路抢答器 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic513359.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:stc89c51+ esp8266-01发微信消息,POST例程
下一篇:51单片机控制小车前后左右运动程序

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

51单片机控制+MAX7219+DS1302 电子钟
;   ***************************************************/#include <reg52.h>#include <intrins.h>   #define uchar unsigned char#define uint unsigned intsbit sclk=P1^0;sbit io=P1^1;sbit ce=P1^2;uchar time_data[]={13,6,4,17,21,51,30};//? ? ? ? ? ? ?uchar write_add[]={0x8c,0x8a,0x88
发表于 2020-09-16
51单片机控制两相四线步进电机
最近学习步进电机的驱动原理,照着教材自己实践了一下用ULN2003驱动28BYJ-48两相5线步进电机,可以正常转动。手头有一个旧光驱,拆开发现里面有三个电机,其中有一个控制激光头寻迹的两相四线步进电机,我就用51的单片机让它也转起来。一开始照葫芦画瓢用ULN2003驱动,结果发现无论如何也不行。原来ULN2003基本没输出电流,只能驱动有公共端的两相五线、两相六线步进电机,不能驱动2相4线步进电机。然后改用L293D驱动,可以转动。通过按钮控制正反转时发现,按键释放后,电机迅速发热,烫手。用万用表测量,发现电机A,A-或B,B-直接存在电位差!应该是按键释放时,IN1-IN4没有归零。找到问题,就容易解决了。修改程序,可以完美
发表于 2020-09-16
51单片机lcd1602d电子时钟设计
由于课程设计需要,本人做了一个基于51单片机控制的lcd1602d显示的电子时钟电子设计产品。可以显示万年历,星期。本来还想加上温湿度的检测,发现屏幕空间不够用了。。有需要可以再另外共享那个设计。第一次单片机源程序如下:#include<reg52.h>#define uint unsigned int#define uchar unsigned charsbit rs=P1^0;                                 
发表于 2020-09-16
<font color='red'>51单片机</font>lcd1602d电子时钟设计
KEIL-51单片机实现自定义bootloader,用于程序更新
本文原创作者: 少占鱼大神关于8051的bootloader实现方式一,基本硬件需求要实现IAP功能,需要51单片机可以在程序里修改代码空间的Flash,或者至少可以修改用户程序区的Flash,新出的51大部分都能满足这个要求二,空间划分一般bootloader位于单片机代码空间的起始地址,用户程序在后面。这个需要根据实际的需求来决定,bootloader功能简单,就少占用一些,bootloader功能复杂的就多占用一些。除此之外,一般还要根据Flash的页为界线划分。附带的工程模板里,bootloader使用0x0000-0x0fff区间,用户程序使用0x1000以后的空间。三,中断的处理51单片机的中断入口一般位于0地址
发表于 2020-09-16
KEIL-<font color='red'>51单片机</font>实现自定义bootloader,用于程序更新
P10点阵屏C51单片机程序
P10点阵屏C51程序1/4扫描,四扫下行,1路16行,数据低OE高(04-P16-08)适用于HUB12接口单色P10串口模式0,普通左移,亮度速度可调,6个IO口,用的STC8F1K08,最多231个字制作出来的实物图如下: 单片机源程序如下:#include <STC8.H>#include <intrins.h>#include <string.h>#define                DATA        P30   
发表于 2020-09-16
P10点阵屏C<font color='red'>51单片机</font>程序
51单片机制作电容电感测表
单片机源程序如下:#include "reg52.h"#include "intrins.h"//-------宏定义---------#define u8 unsigned char#define u16 unsigned int#define u32 unsigned long#define Cref 2200      //基准电容值(单位pF)#define LCD_DATA P0    //LCD数据口(8位)//-------I/O定义--------sbit LCD_BUSY = P0^7; //LCD忙信号sbit LCD
发表于 2020-09-15
<font color='red'>51单片机</font>制作电容电感测表
何立民专栏 单片机及嵌入式宝典

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

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