找回密码
 立即注册

QQ登录

只需一步,快速开始

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

分享一下我的51单片机抢答器代码

[复制链接]
跳转到指定楼层
楼主
ID:642928 发表于 2019-11-15 22:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 小米熊724 于 2019-11-15 23:05 编辑

#include<reg51.h>

#define uchar unsigned char

#define uint unsigned int

sbit key1=P1^0;sbit key2=P1^1;sbit key3=P1^2;sbit key4=P1^3;//选手1--4

sbit key5=P1^4;sbit key6=P1^5;sbit key7=P1^6;sbit key8=P1^7;//选手5--8

sbit d1=P0^0;sbit d2=P0^1;sbit d3=P0^2;sbit d4=P0^3;//选手指示灯1--4

sbit d5=P0^4;sbit d6=P0^5;sbit d7=P0^6;sbit d8=P0^7;    //        5--8

sbit alarm=P3^1;//蜂鸣器控制端

uchar code display[10]={0x81,0xcf,0x92,0x86,0xcc,0xa4,0xa0,0x8f,0x80,0x84};//共阳 0---9

bit flag=0;//是否允许抢答标志,初始 【不允许】

bit flag1=1;//是否允许扫描按键标记,初始【允许】

uchar counter,time=10;//计数器,10s抢答倒计时

//==========================================================延时函数=================================================

void delay1m(uint k)

{

uint j;

while(k--)

for(j=0;j<121;j++);

}

//===========================================================定时器,外中断初始化函数================================

void init_function()

{

TMOD=0x01;    //定时器T0,工作于方式1

TH0=(65535-50000)/256;    //定时50ms

TL0=(65535-50000)%256;   

TR0=0;    //启动T0     

IT0=IT1=1;//外部中断负跳变触发

ET0=EX0=EX1=EA=1;//允许T0,外部中断0,1中断,开总中断

}

//================================================T0中断服务函数 ====================================================

void time0() interrupt 1   

{

TH0=(65535-50000)/256;    //定时50ms

TL0=(65535-50000)%256 ;   

counter++;   

}

//===================================================响一声=========================================================

void speak1()

{

alarm=1;

delay1m(300);

alarm=0;

}

//===================================================响两声=========================================================

void speak2()

{

alarm=1;

delay1m(200);

alarm=0;

delay1m(200);

alarm=1;

delay1m(200);

alarm=0;

}

void main()

{

delay1m(500);//延时检测led,蜂鸣器

P0=0x00;alarm=0;//关led,蜂鸣器

init_function();//初始化函数

P2=display[0];//初始显示 0

while(1)

{

while(flag1)

{

if(flag)//正常抢答

{

if    (!key1){flag1=0;TR0=0;speak1();P2=display[1];while(flag1==0){d1=1;delay1m(300);d1=0;delay1m(300);}}//显示1,蜂鸣器叫,对应的led亮

else if(!key2){flag1=0;TR0=0;speak1();P2=display[2];while(flag1==0){d2=1;delay1m(300);d2=0;delay1m(300);}}//显示2,蜂鸣器叫

else if(!key3){flag1=0;TR0=0;speak1();P2=display[3];while(flag1==0){d3=1;delay1m(300);d3=0;delay1m(300);}}//显示3,蜂鸣器叫

else if(!key4){flag1=0;TR0=0;speak1();P2=display[4];while(flag1==0){d4=1;delay1m(300);d4=0;delay1m(300);}}//显示4,蜂鸣器叫

else if(!key5){flag1=0;TR0=0;speak1();P2=display[5];while(flag1==0){d5=1;delay1m(300);d5=0;delay1m(300);}}//显示5,蜂鸣器叫

else if(!key6){flag1=0;TR0=0;speak1();P2=display[6];while(flag1==0){d6=1;delay1m(300);d6=0;delay1m(300);}}//显示6,蜂鸣器叫

else if(!key7){flag1=0;TR0=0;speak1();P2=display[7];while(flag1==0){d7=1;delay1m(300);d7=0;delay1m(300);}}//显示7,蜂鸣器叫

else if(!key8){flag1=0;TR0=0;speak1();P2=display[8];while(flag1==0){d8=1;delay1m(300);d8=0;delay1m(300);}}//显示8,蜂鸣器叫

else

{

if(counter>=20)//1S时间到

{

counter=0;time--;

if(time==0)//10S到

{

TR0=0;P2=display[time];speak1();//显示0

flag=0;//抢答的时间内没人抢答,必须等待重新开始

}

P2=display[time];

}

}

}

else//犯规抢答

{

if    (!key1){flag1=0;TR0=0;speak2();P2=display[1];while(flag1==0){d1=1;delay1m(100);d1=0;delay1m(100);}}//数码管显示1,蜂鸣器叫

else if(!key2){flag1=0;TR0=0;speak2();P2=display[2];while(flag1==0){d2=1;delay1m(100);d2=0;delay1m(100);}}//数码管显示2,蜂鸣器叫

else if(!key3){flag1=0;TR0=0;speak2();P2=display[3];while(flag1==0){d3=1;delay1m(100);d3=0;delay1m(100);}}//数码管显示3,蜂鸣器叫

else if(!key4){flag1=0;TR0=0;speak2();P2=display[4];while(flag1==0){d4=1;delay1m(100);d4=0;delay1m(100);}}//数码管显示4,蜂鸣器叫

else if(!key5){flag1=0;TR0=0;speak2();P2=display[5];while(flag1==0){d5=1;delay1m(100);d5=0;delay1m(100);}}//数码管显示5,蜂鸣器叫

else if(!key6){flag1=0;TR0=0;speak2();P2=display[6];while(flag1==0){d6=1;delay1m(100);d6=0;delay1m(100);}}//数码管显示6,蜂鸣器叫

else if(!key7){flag1=0;TR0=0;speak2();P2=display[7];while(flag1==0){d7=1;delay1m(100);d7=0;delay1m(100);}}//数码管显示7,蜂鸣器叫

else if(!key8){flag1=0;TR0=0;speak2();P2=display[8];while(flag1==0){d8=1;delay1m(100);d8=0;delay1m(100);}}//数码管显示8,蜂鸣器叫

}

}

}

}

//==========================================================外部中断0中断函数,开始===================================

void extern_int0() interrupt 0

{

if(P2==display[0])//数码管显示0时开始键才响应

{

flag=flag1=1;//允许抢答,允许响应按键

time=10;

P0=0x00;//灯都灭掉

alarm=0;//关蜂鸣器

TR0=1;//倒计时,开定时器

}

}

//==========================================================外部中断1中断函数,停止===================================

void extern_int1() interrupt 2

{

flag1=1;//允许抢答,

flag=0;// 不允许响应按键

TR0=0;//关定时器

P0=0x00;//灯都灭掉

alarm=0;//关蜂鸣器

P2=display[0];//显示0

}

daima.rar

27.9 KB, 下载次数: 18, 下载积分: 黑币 -5

直接在Keil里面使用

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

使用道具 举报

沙发
ID:807168 发表于 2020-7-24 10:10 来自手机 | 只看该作者
程序不完整吧
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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