我是一名单片机的初学者,写这篇文章的目的是为了记录自己的学习过程。恰好这周老师让做一个关于抢答器的作业,索性将自己的作业发布出来请大佬指正。
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主那里看到,我就是调用他的代码,按照火良老师的话说,这叫代码的移植,嘿嘿