📄 main.c
字号:
//*基于单片机的16路抢答器*//
//*动态数码管显示时间和编号*//
//*蜂鸣器报警
//*89s52,FBS=12MHz
//*电子信息与科学技术,广工,潘力
//*2008/03/15
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define DB P2
uchar key;
uint time=0;
uint count=20;
uint i;
bit FLAG0=0; //标志
sbit smg1 = P0^3;
sbit smg2 = P0^2;
sbit smg3 = P0^1;
sbit smg4 = P0^0;
sbit Beep = P0^7;
uchar code seven_seg[]={
0XF9,/*0*/
0X09,/*1*/
0XEA,/*2*/
0X6B,/*3*/
0X1B,/*4*/
0X73,/*5*/
0XF3,/*6*/
0X29,/*7*/
0XFB,/*8*/
0X7B,/*9*/
};
uint dcode(uchar k);
void Delay(uint n);
uchar kbscan(void);
void BEEP(unsigned int);
/*-----------------------------------------------------------------------------------
功能:主函数入口
名称:main
输入:无
输出:无
返回:无
-------------------------------------------------------------------------------------*/
void main(void)
{
TMOD=(TMOD & 0xf0) | 0x02; //T0工作模式是方式2
TH0=0x06; //定义初始值为0.06ms,计时0.256ms-0.06ms=0.25ms
TL0=0x06;
TR0=1; //开启T0计时
EA=1;
ET0=1;
BEEP(500);
while(1)
{
if(~(FLAG0)){
key=kbscan();
i=dcode(key);
}
smg1 = smg2 =smg3 =smg4 = 0;
DB = seven_seg[i%10];
smg1 = 1;
Delay(300);
smg1 = smg2 =smg3 =smg4 = 0;
DB = seven_seg[i/10];
smg2 = 1;
Delay(300);
smg1 = smg2 =smg3 =smg4 = 0;
DB = seven_seg[count%10];
smg3= 1;
Delay(300);
smg1 = smg2 =smg3 =smg4 = 0;
DB = seven_seg[count/10];
smg4= 1;
Delay(300);
}
}
/*-----------------------------------------------------------------------------------
功能:T0中断
名称:timer0
输入:
输出:无
返回:无
-------------------------------------------------------------------------------------*/
void timer0(void) interrupt 1 //T0中断
{
TH0=0x06;
TL0=0x06;
time++;
if(time==4000) //4000*0.25ms=1000ms=1s
{
time=0;
if(coutnt<10){
BEEP(1000);}
if(count==0){
FLAG0=1;
TR0=0;
BEEP(500);
}
else
count--;
}
}
/*-----------------------------------------------------------------------------------
功能:软件延时
名称:Delay
输入:t
输出:无
返回:无
-------------------------------------------------------------------------------------*/
void Delay(unsigned int t)
{
while(t--);
}
/*-----------------------------------------------------------------------------------
功能:蜂鸣器控制函数
名称:BEEP
输入:time
输出:无
返回:无
-------------------------------------------------------------------------------------*/
void BEEP(unsigned int time)
{
Beep=0;
Delay(time);
Beep=1;
}
/*-----------------------------------------------------------------------------------
功能:4*4键盘扫描
名称:kbscan
输入:无
输出:无
返回:0,键盘特征码
-------------------------------------------------------------------------------------*/
uchar kbscan(void)
{
uchar sccode,recode;
P1=0xf0;
if((P1&0xf0)!=0xf0)
{
Delay(10);
if((P1&0xf0)!=0xf0){
sccode=0xfe;
while((sccode&0x10)!=0)
{
P1=sccode;
if((P1&0xf0)!=0xf0)
{
recode=(P1&0xf0);
return(~((sccode&0X0f)|recode));
}
else
sccode=(sccode<<1)|0x01;
}
}
}
return(0);
}
/*-----------------------------------------------------------------------------------
功能:键盘译码
名称:kbscan
输入:key
输出:无
返回:num
-------------------------------------------------------------------------------------*/
uint dcode(uchar k)
{
uint num;
switch(k)
{
case 0x11:
num=1;
FLAG0=1;
break;
case 0x21:
num=2;
FLAG0=1;
break;
case 0x41:
num=3;
FLAG0=1;
break;
case 0x81:
num=4;
FLAG0=1;
break;
case 0x12:
num=5;
FLAG0=1;
break;
case 0x22:
num=6;
FLAG0=1;
break;
case 0x42:
num=7;
FLAG0=1;
break;
case 0x82:
num=8;
FLAG0=1;
break;
case 0x14:
num=9;
FLAG0=1;
break;
case 0x24:
num=10;
FLAG0=1;
break;
case 0x44:
num=11;
FLAG0=1;
break;
case 0x84:
num=12;
FLAG0=1;
break;
case 0x18:
num=13;
FLAG0=1;
break;
case 0x28:
num=14;
FLAG0=1;
break;
case 0x48:
num=15;
FLAG0=1;
break;
case 0x88:
num=16;
FLAG0=1;
break;
default:
break;
}
if(FLAG0)
{
TR0=0;
BEEP(500);
}
return(num);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -