⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 基于单片机的16路抢答器,动态数码管显示时间和编号,蜂鸣器报警
💻 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 + -