找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7522|回复: 6
打印 上一主题 下一主题
收起左侧

C51单片机16路抢答器设计

[复制链接]
跳转到指定楼层
楼主
一、 要求:

1、可供16组进行抢答。
2、具有定时抢答功能,并以倒计时方式现实,范围10-60秒,默认是59s,可以添加按键来设计答题时间
3、主持人控制,主持人控制抢答开始和结束。
4、抢答成功后显示抢答端序号和抢答时间,蜂鸣器响。
5、超过设定时间,无人抢答,本次抢答无效,报警,禁止抢答。
加注:12M晶振,数码管共阳
二、电路图

三、C51程序

//16路抢答器
//12M晶振
//P0---段码 ,P1---位码 ,P2---键盘接口

//调试:小代电子工作室
#include
#define uchar unsigned char
#define uint unsigned int
sbit FMQ=P3^7; //声音报警
sbit KS=P1^6; //开始按键
sbit DT4=P1^0; //第四位选、
sbit DT3=P1^1; //第三位选
sbit DT2=P1^2; //第二位选
sbit DT1=P1^3; //第一位选
uchar scan0;
uchar scan1;
uchar key; //键值
uchar keycode;
uint m;
uint a;
uchar hao=0,sec_dat=0,sec_data,time; //对时间参数定义类型
uchar BZ=0,BZ1=0,BZ2=0; //标志位
// 1 2 3 A 4 5 6 B 7 8 9 10 11 12 13 14
ucharx[16]={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77};//键值
uchar s[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90 };//数码管显示码 共阳
//uchar s[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//数码管显示码 共阴
//******************************
//延时函数
//*******************
void delay1ms(uint i)
{
uchar j;
while(i--)
{
for(j=0;j<125;j++){;} //1ms基准延迟程序
}
}
//****************************
//初始化函数
//****************************
void Init(){

TMOD=0x02; //定时器0,方式2
TH0=155; //定时器初值
TL0=155;
ET0=1; //开定时器中断
//TR0=1; //开定时器
EA=1; //总中断开关
KS=1; //开始按键
FMQ=0; //关蜂鸣器
key=17; //按键值初始化,非抢答序号,抢答序号为1-16.
a=10;
}
//******************
//定时器函数
//功能:定时器中断函数,对时间定时,100us中断一次
//参数:hao:100us;sec_dat:10ms;sec_data:1s
//********************
timer0()interrupt 1 using 1 //使用定时器0对时间计时
{
hao++; //参数hao加到10就是10ms,到100为10ms
if(hao==100){ //10ms
hao=0;
sec_dat++; //10ms sec_dat表示10ms
if(sec_dat==100){ //1s
sec_dat=0;
sec_data++; //sec_data表示1s
if(sec_data==50){TR0=0;BZ1=0;BZ=1;BZ2=0;}//抢答时间到,50s,关闭定时器,本次抢答无效
}
}
}
//*************************
//显示开始函数 参数1为时间
//***************************8
void disp(){
DT1=1;
DT2=0;
DT3=0;
DT4=0;
P0=s[(50-sec_data)/10];
// P1=0x08;
delay1ms(2);
DT1=0;
DT2=1;
DT3=0;
DT4=0;
P0=s[(50-sec_data)];
// P1=0x04;
delay1ms(2);
DT1=0;
DT2=0;
DT3=1;
DT4=0;
P0=s[0]; // - 共阳
//P0=0x40; // - 共阴
//P1=0x02;
delay1ms(2);

DT1=0;
DT2=0;
DT3=0;
DT4=1;
P0=s[0]; // - 共阳
//P0=0x40; // - 共阴
//P1=0x01;
delay1ms(2);
}
//*************************
//显示函数 参数1为时间,参数2为按键键值
//***************************8
void disp1(){
DT1=1;
DT2=0;
DT3=0;
DT4=0;
P0=s[(50-sec_data)/10];
//P1=0x08;
delay1ms(2);
DT1=0;
DT2=1;
DT3=0;
DT4=0;
P0=s[(50-sec_data)];
//P1=0x04;
delay1ms(2);

DT1=0;
DT2=0;
DT3=1;
DT4=0;
P0=s[(key+1)/10];
// P1=0x02;
delay1ms(2);
DT1=0;
DT2=0;
DT3=0;
DT4=1;
P0=s[(key+1)];
// P1=0x01;
delay1ms(2);
}
//************************************
//矩阵键盘扫描函数,返回按键值
//********************************
uchar scan() //扫描键值的子程序
{
P2=0x0f;
scan0=P1;
delay1ms(20);

if(scan0!=0x0f) //判键是否按下
{
scan0=P2;
if(scan0!=0x0f) //二次判键是否按下
{
P2=0xf0; //线反转法的核心
delay1ms(20);
scan1=P2;
keycode=scan0|scan1; //组合成键编码
for(m=0;m<16;m++)
{
if(keycode==x[m]) //查表得键值
{
key=m;
}
}
}
}
return(key);
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:66477 发表于 2014-9-24 22:47 | 只看该作者
楼主,程序有问题啊!求解决!!
回复

使用道具 举报

板凳
ID:1 发表于 2015-2-10 20:24 | 只看该作者
lh899306 发表于 2014-9-24 22:47
楼主,程序有问题啊!求解决!!

顶部改为 #include<reg52.h>
回复

使用道具 举报

地板
ID:216777 发表于 2017-7-3 14:35 | 只看该作者
谢谢分享
回复

使用道具 举报

5#
ID:216777 发表于 2017-7-3 14:59 | 只看该作者
谢谢共享
回复

使用道具 举报

6#
ID:164499 发表于 2017-7-4 08:44 | 只看该作者
太厉害把。。。
回复

使用道具 举报

7#
ID:89286 发表于 2017-7-4 12:59 | 只看该作者
thanks for sharing
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表