标题:
51单片机四路抢答器源码
[打印本页]
作者:
512713659
时间:
2018-5-11 23:50
标题:
51单片机四路抢答器源码
单片机源程序如下:
/**********************BST-M51实验开发板例程************************
* 平台:BST-M51 + Keil U4 + STC89C52
* 名称:本例程为一抢答器;其中主持人操控k3与k4两个按键。选手共2位,分别操控k1、k2中的一个按键。
当主持人按下抢答开始按键k3后,倒计时开始,计时5s。此后最先按下按键的选手号码将显示与数码管上。
后来按下的将无显示。
若五秒计时结束后,再按下按键也不会显示。
若主持人没有按开始键,就有选手抢答,则视为犯规。此时犯规的选手号码将被显示于数码管上
同时,蜂鸣器发出长笛声报警,数码管全亮。
而当主持人按下清零键K4后,一切状态均恢复,可以开始新一轮的抢答。
按键功能简介
k3抢答开始 k4 清零
k1、k2 分别为两个选手按键
* 晶振:11.0592MHZ
* 说明:免费开源,不提供源代码分析.
******************************************************************/
#include<reg51.h>
#define uchar unsigned char
#define dula P0 //段选信号的锁存器控制
#define wela P2 //位选信号的锁存器控制,这里只用到P2.4-P2.7
sbit beep=P2^3;
sbit k1 =P3^4;
sbit k2 =P3^5;
sbit k3 =P3^6;
sbit k4 =P3^7;
uchar key,j,k,daojishi=5,wei;
bit begin,end,clear,fangui;
uchar a0,b0=16;c0=16;d0=16;
unsigned int pp;
unsigned char code weitable[]={0x8f,0x4f,0x2f,0x1f};
//数码管各位的码表
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
void delay(unsigned char i)
{
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
void display1(uchar wei,uchar shu)//在任意一位显示任意的数字
{
wei=wei-1;
wela|=0xf0;//给P2.4-P2.7置1
P0=table[shu];
wela=wela&weitable[wei];//给P2需要显示的那一位置1,其他置0
delay(5);
}
void display(uchar a,uchar b,uchar c,uchar d)
{ //一次显示4个数字,且每位显示数字可自定。
display1(1,a);
display1(2,b);
display1(3,c);
display1(4,d);
}
void keyscan()
{
if(k1==0)
{
while(k1==0);
key= 1;
}
if(k2==0)
{
while(k2==0);
key=2;
}
if(k3==0)
{
while(k3==0);
begin =1;
}
if(k4==0)
{
while(k4==0);
clear = 1;
}
}
void main()
{
TMOD=0x01;
TH0=(65536-46080)/256;// 由于晶振为11.0592,故所记次数应为46080,计时器每隔50000微秒发起一次中断。
TL0=(65536-46080)%256;//46080的来历,为50000*11.0592/12
ET0=1;
EA=1;
a0=table[16];
beep =1;
P1=0xff;
begin=0;
key=0;
end = 0;
fangui = 0;
while(1)
{
keyscan();//按键扫描
if(begin)
{
if(!end)
TR0=1;//开始计时
if(pp==20)//定时1s
{
pp=0;
daojishi--;
}
if(key!=0)
{
a0=key;
end = 1;
daojishi = 0;
}
if(!daojishi)
{
TR0=0;
pp=0;
}
}
else
{
if(key!=0)
{
fangui=1;
a0 = key;
}
}
if(clear)
{
a0=0;key=0;begin=0;fangui=0;beep=1;daojishi=5;clear=0;
b0=16;c0=16;d0=16;P1=0xff;pp=0;end = 0;
}
d0 = daojishi;
display(a0,b0,c0,d0);
if(fangui)
{
beep=0;
P1=0x00;;
}
}
}
void time0() interrupt 1
{ TH0=(65536-46080)/256;
TL0=(65536-46080)%256;
pp++;
}
复制代码
所有资料51hei提供下载:
51单片机四路抢答器.rar
(18.12 KB, 下载次数: 50)
2018-5-11 23:50 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1