其他分享
首页 > 其他分享> > 基于51单片机的抢答器设计

基于51单片机的抢答器设计

作者:互联网

    我是一名单片机的初学者,写这篇文章的目的是为了记录自己的学习过程。恰好这周老师让做一个关于抢答器的作业,索性将自己的作业发布出来请大佬指正。

PS:我的单片机是跟着B站上,江科大自化协  UP主学的,所以代码风格和他很像,有些代码跟他的一样。

1、这是main文件

     该文件的功能是使KEY1,2,3为抢答功能KEY4的作用是裁判。开始裁判按下按键计时20秒开始,如果这时KEY1,2,3中有一名选手按下后蜂鸣器响一声,同时LCD显示屏中就会显示他的编号且计时暂停,其他选手按下自己的按键屏幕中也不显示。直至裁判按下KEY4后重新开始下一局。

#include <REGX52.H>
#include "LCD1602.h"
#include "Buzzer.h"
#include "Key.h"
#include "Timer0.h"
#include "Delay.h"


unsigned char KeyNum;
unsigned char Sec=0;    //定义计时器,秒
unsigned char People;
int a=1;

void main()
{
    LCD_Init();
    Timer0Init();
    LCD_ShowString(1,1,"Time:");//上电显示静态字符串
    LCD_ShowString(2,1,"People:________");
    TR0=0;                      //定时器停止    
    
    while(1)
    {
        KeyNum=Key();        //获取独立按键键码
        if(KeyNum<=3)
        {
            if(a==1)
            {
                if(KeyNum==1)            //如果K1按键按下
                    {
                        TR0=0;              //定时器停止
                        Buzzer_Time(100);
                        LCD_ShowString(2,8,"1 answer");
                        a++;
                    }
                if(KeyNum==2)//如果K2按键按下
                    {
                        TR0=0;              //定时器停止
                        Buzzer_Time(100);
                        LCD_ShowString(2,8,"2 answer");
                        a++;
                    }
                if(KeyNum==3)//如果K3按键按下
                    {
                        TR0=0;              //定时器停止
                        Buzzer_Time(100);
                        LCD_ShowString(2,8,"3 answer");
                        a++;
                    }
            }
        }
        if(KeyNum==4)//如果裁判 K4按键按下
            {
                TR0=1;          //定时器开始
                Buzzer_Time(100);
                Sec=0;    //计数器清零
                a=1;    //a复位
                LCD_ShowNum(1,6,Sec,2);
                LCD_ShowString(2,1,"People:________");
            }
            
    }
}

//60秒计时器,60s计时结束后蜂鸣器提示
void Timer0_Routine() interrupt 1
{
    static unsigned int T0Count;
    TL0 = 0x18;            //设置定时初值
    TH0 = 0xFC;            //设置定时初值
    T0Count++;
    if(T0Count>=1000)    //定时器分频,1s
    {
        T0Count=0;
        Sec++;            //1秒到,Sec自增
        LCD_ShowNum(1,6,Sec,2);
        if(Sec>=20)        //20秒计时
        {
            while(1)
            {
                Delay(10);            //使蜂鸣器顿挫
                Buzzer_Time(50);    //60秒计时,蜂鸣器响
            }
            Sec=0;        //过后Sec清零
        }
    }
}

2、文章中调用的头文件,可以在B站UP主那里看到,我就是调用他的代码,按照火良老师的话说,这叫代码的移植,嘿嘿
            

标签:蜂鸣器,51,按下,单片机,LCD,Sec,计时,include,抢答器
来源: https://blog.csdn.net/qq_56668497/article/details/121778275