/***********************************************************
抢答器程序
***********************************************************/
#include <reg52.h>
#define uchar unsigned char //宏定义
#define uint unsigned int
uint disnum,num,i;
uchar count,temp;
sbit bell=P3^1; //蜂鸣器控制端口s
//sbit key=P3^0;
sbit wela1=P2^1;
sbit wela2=P2^0;
sbit s1=P3^5;
sbit s2=P3^6;
sbit s3=P3^7;
uchar code table[]=
{
0x81,0xE7,0x92,0xC2,0xE4,0xC8,0x88,0xE3,0x80,0xC0
};
uchar code table1[]=
{
0x88,0xEE,0x94,0xC4,0xE2,0xC1,0x81,0xEC,0x80,0xC0
};
/******************************************/
/* 延时子程序 */
/******************************************/
void delay(uchar x)
{
uchar a,b;
for(a=x;a>0;a--)
for(b=200;b>0;b--);
}
/******************************************/
/* 显示子程序 */
/******************************************/
void display(disnum)
{
uchar shi,ge;
shi=disnum/10;
ge=disnum%10;
P0=table[shi]; //送入段选信号
wela2=1;
wela1=0;
delay(5);
P0=table1[ge];
wela2=0;
wela1=1;
delay(5);
}
/******************************************/
/* 初始化程序 */
/******************************************/
void keyscan()
{
if(s2==0)
{
delay(5);
if(s2==0)
{
while(!s2);
disnum+=1;
if(disnum==99)
disnum=30;
}
}
if(s3==0)
{
delay(5);
if(s3==0)
{
while(!s3);
disnum-=1;
if(disnum==0)
disnum=30;
}
}
}
void init()
{
P1=0xff; //P1口清1
temp=P1;
disnum=30; //30秒到计时
EA=1;
TMOD=0x10;
ET1=1;
// TR1=1;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
// num=30;
}
/******************************************/
/* 主程序 */
/******************************************/
void main()
{
init(); //调用初始化程序
while(1)
{
keyscan();
display(disnum);
if(s1==0)
{
delay(5);
if(s1==0)
{
TR1=1;
while(1)
{
temp=P1;
if(temp==0xff)
{
display(disnum);
temp=P1; //判断之前,先把P1口的数据送给temp;
// while(temp!=0xff);// 如果 再有按键按下去,程序不起作用
}
//独立键盘扫描程序
if(temp!=0xff)//有键按下
{
delay(5);//软件延时消抖
temp=P1;
while(temp!=0xff)//再次确认有键按下
{
TR1=0;
temp=P1;
switch(temp)//判断哪个键按下
{
case 0xfe : disnum=1;
break;
case 0xfd : disnum=2;
break;
case 0xfb : disnum=3;
break;
case 0xf7 : disnum=4;
break;
/*case 0xef : disnum=5;
break;
case 0xdf : disnum=6;
break;
case 0xbf : disnum=7;
break;
case 0x7f : disnum=8;
break;*/
}
P0=table1[disnum];//显示所按下的键
wela2=0;
wela1=1;
bell=0; //开蜂鸣器
delay(500);
bell=1;
while(1);//进入死循环,将所按下的键显示并定格,防止有键再按下时将其覆盖;
}
}
}
}
}
}
}
void time() interrupt 3
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
count++;
if(count==20)
{
count=0;
disnum--;//30秒倒计时
if(disnum<=5&&disnum>0)
{bell=0;
delay(1000);
bell=1; //关闭蜂鸣器
}
if(disnum==0)
{
TR1=0;//关断定时器0
bell=0; //开蜂鸣器
for(i=0;i<600;i++)//循环调用显示0延时,
display(disnum);
bell=1; //关断蜂鸣器
while(1); //程序停止到这里
}
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
64、基于51单片机四路抢答器电路图及程序
共18个文件
bak:2个
uvopt:1个
schdoc:1个
需积分: 5 1 下载量 6 浏览量
2023-07-16
17:30:26
上传
评论 1
收藏 269KB RAR 举报
温馨提示
本资源内容概要: 这是基于51单片机的四路抢答器设计,包含了电路图源文件(Altiumdesigner软件打开)、C语言程序源代码(keil软件打开) 。 本资源适合人群: 单片机爱好者、电子类专业学生、电子diy爱好者。 本资源能学到什么: 可以通过查看电路学习电路设计原理,查看代码学习代码编写原理。 本资源使用建议: 建议使用者需要具备一定电子技术基础,掌握一些常用元器件原理,例如三极管、二极管、数码管、电容、稳压器等。了解C语言基础设计原理,能看懂基础的电路图,具备一定的电路图软件使用能力。
资源推荐
资源详情
资源评论
收起资源包目录
64、基于51单片机四路抢答器电路图及程序.rar (18个子文件)
64、基于51单片机四路抢答器电路图及程序
电路图
4路抢答器.SchDoc 139KB
4路抢答器.pcb 71KB
4路抢答器.PcbDoc 373KB
4路抢答器.sch 32KB
程序
MAIN 6KB
MAIN.hex 2KB
MAIN.uvproj 14KB
MAIN.uvopt 5KB
MAIN.LST 8KB
MAIN_uvopt.bak 56KB
MAIN.C 4KB
MAIN_uvproj.bak 0B
MAIN.plg 6KB
MAIN.uvgui.Administrator 84KB
MAIN.build_log.htm 1KB
MAIN.lnp 40B
MAIN.M51 10KB
MAIN.OBJ 7KB
共 18 条
- 1
资源评论
>行者<
- 粉丝: 212
- 资源: 135
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功