人人范文网 范文大全

4路抢答器设计程序

发布时间:2020-03-03 16:43:54 来源:范文大全 收藏本文 下载本文 手机版

#include

unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,

//0~f显示表

0x99,0x92,0x82,0xf8,

0x80,0x90,0x88,0x83,

0xc6,0xa1,0x86,0x8e}; unsigned char code table0[]={0xf1,0xf2,0xf4,0xf8};

//P2口位选

unsigned char code table2[]={0xef,0xdf,0xbf,0x7f};

//P3口送行信号 unsigned char display[]={0,0,0,0}; //显示位 void sw1();

//子函数申明 void sw2(); void sw3(); void sw4(); void xianshi(); void init(); unsigned char temp,num2,x,x1,x2,a,count;

//变量声明 int num,num1; unsigned char key; unsigned char i,j; sbit P3_4=P3^4; sbit P3_5=P3^5; sbit P3_6=P3^6; sbit P3_7=P3^7; sbit k1=P1^0;

//位申明(时间加) sbit k2=P1^1;

//位申明(时间减) sbit k3=P1^2;

//位申明(开始) sbit k4=P1^3;

//位申明(复位) sbit sp=P1^4;

//蜂鸣器 sbit l1=P1^5;

//LED显示 sbit l2=P1^6;

//LED显示

void delay(unsigned char z)

//延时1ms子函数 {

unsigned char x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--); }

void init()

//初始化子函数 { a=0; TMOD=0x01;

//定时器T0工作方式设定

TH0=(65536-10000)/256; //装初值

TL0=(65536-10000)%256; EA=1;

//开定时器T0 ET0=1;

if(k1==0)

//判断时间加K1是否按下

{

delay(5);

//延时躲过抖动

if(k1==0)

//再次确认是否按下K1

{

num++;

//时间自加1

if(num==99)

//如果时间num=99,清零num

{

num=0;

}

num2=num;

//将num值赋值给num2

while(k1==0); //等待K1松手

}

}

if(k2==0)

//判断时间减K2是否按下

{

delay(5);

//延时躲过抖动

if(k2==0)

//再次确认是否按下K2

{

num--;

//时间自减1

if(num==-1) //如果时间num=-1,赋值num=99

{

num=99;

}

num2=num; //将num值赋值给num2

while(k2==0); //等待K2松手

}

}

if(k3==0)

//判断开始按钮K3是否按下

{

delay(5);

//延时躲过抖动

if(k3==0) //再次确认是否按下K3

{

x++;

//自加1

if(x==2) //假如x=2,清零x

{

x=0;

}

}

} }

void keyboad()

//按键检测子函数 { while(1)

{

P3=0xff;

//读引脚前需写入高电平

P3_4=0;

//置第一行线为低

temp=P3;

//P3口信息送入temp中

temp=temp & 0x0f; //屏蔽高四位,保留低四位

if (temp!=0x0f) //判断:假如列线有不为高的时候,执行if循环体

{

delay(5); //延时躲过抖动

temp=P3;

temp=temp & 0x0f;

if (temp!=0x0f)

{

temp=P3;

temp=temp & 0x0f; //判断是哪个键按下

switch(temp)

{

case 0x0e: //第一行第四个按下

{delay(5);num1=4;l2=0;xianshi();} //第一行第一个键按下

break;

case 0x0d:

//第一行第三个按下

{delay(5);num1=3;l2=0;xianshi();}

break;

case 0x0b:

//第一行第二个按下

{delay(5);num1=2;l2=0;xianshi();}

break;

case 0x07: //第一行第一个按下

{delay(5);num1=1;l2=0;xianshi();} break; //第一行第一个键按下

}

}

}

P3=0xff;

P3_5=0;

temp=P3;

temp=temp & 0x0f;

if (temp!=0x0f)

{

delay(5); //延时躲过抖动

temp=P3;

temp=temp & 0x0f;

if (temp!=0x0f)

{

temp=P3;

temp=temp & 0x0f;

switch(temp)

{

case 0x0e:

{delay(5);num1=8;l2=0;xianshi();} break;

case 0x0d:

{delay(5);num1=7;l2=0;xianshi();} break;

case 0x0b:

{delay(5);num1=6;l2=0;xianshi();} break;

case 0x07:

{delay(5);num1=5;l2=0;xianshi();} break;

}

}

}

P3=0xff;

P3_6=0;

temp=P3;

temp=temp & 0x0f;

if (temp!=0x0f)

{

delay(5); //延时躲过抖动

temp=P3;

temp=temp & 0x0f;

if (temp!=0x0f)

{

temp=P3;

temp=temp & 0x0f;

switch(temp)

{

case 0x0e:

{delay(5);num1=12;l2=0;xianshi();} break;

case 0x0d:

{delay(5);num1=11;l2=0;xianshi();} break;

case 0x0b:

{delay(5);num1=10;l2=0;xianshi();} break;

case 0x07:

{delay(5);num1=9;l2=0;xianshi();} break;

//第二行第四个键按下//第二行第三个键按下//第二行第二个键按下//第二行第一个键按下//第三行第四个键按下//第三行第三个键按下//第三行第二个键按下//第三行第一个键按下

}

}

}

P3=0xff;

P3_7=0;

temp=P3;

temp=temp & 0x0f;

if (temp!=0x0f)

{

delay(5); //延时躲过抖动

temp=P3;

temp=temp & 0x0f;

if (temp!=0x0f)

{

temp=P3;

temp=temp & 0x0f;

switch(temp)

{

case 0x0e:

{delay(5);num1=16;l2=0;xianshi();} break;

case 0x0d:

{delay(5);num1=15;l2=0;xianshi();} break;

case 0x0b:

{delay(5);num1=14;l2=0;xianshi();} break;

case 0x07:

{delay(5);num1=13;l2=0;xianshi();} break;

}

temp=P3;

P0=table[key];

}

}

} }

void xianshi() {

TR0=0;

//停止定时计数

num=0;

//倒计时num清零

sp=1;

//成功抢答,蜂鸣器叫

delay(100);

//延时一段时间

sp=0;

//关蜂鸣器

//第四行第四个键按下//第四行第三个键按下//第四行第二个键按下//第四行第一个键按下

while(1)

{

for(a=0;a

{

delay(5);

P2=table0[a];

P0=table[display[a]];

}

display[0]=num/10;

//倒计时显示0

display[1]=num%10;

display[2]=num1/10;

//显示抢答者号

display[3]=num1%10;

if(k4==0)

//判断复位键K4是否按下

{

num=num2;

//num2值赋值给num

num1=0;

//清零抢答者号显示

TR0=1;

//启动定时器TO

l1=1;

//D1,D2关闭

l2=1;

return;

}

} }

void main()

//主函数 {

l1=1;

//D1,D2关闭

l2=1;

sp=0;//初始化蜂鸣器

x=0;

num=num2=30;

//赋初值

while(1)

{

if(x==1)

//开始键按下

{

delay(5);

TR0=1;

//启动定时

while(1)

{

keyboad(); //调用按键检测子函数

if(k4==0) //判断复位键是否按下

{

l1=1; //D1,D2关闭

l2=1;

delay(5);

num=num2; //倒计时时间30秒赋值给num

TR0=1; //启动定时器T0

}

}

}

else

//开始键没有按下

{

for(a=0;a

//显示部分位选

{

delay(5);

P2=table0[a];

P0=table[display[a]];

}

display[0]=num/10; //倒计时显示0

display[1]=num%10;

display[2]=num1/10;

//显示抢答者号

display[3]=num1%10;

init();

//初始化

}

} }

void time0() interrupt 1 //定时器T0中断 {

TH0=(65536-10000)/256;

//重装初值

TL0=(65536-10000)%256; count++;

//中断次数记录

if(k4==0)

//复位键K4检测

{

num=num2;

TR0=1;

num1=0;

return;

}

for(a=0;a

{

delay(10);

P2=table0[a];

P0=table[display[a]];

} display[0]=num/10;

//倒计时显示0

display[1]=num%10;

display[2]=num1/10; //显示抢答者号

display[3]=num1%10;

if(count==100)

//1秒定时是否已到

{

count=0;

//清零记录

num--;

//显示倒计时自减一

if(num

//倒计时倒数6秒,D2亮,蜂鸣器报警

{

l1=~l1;

sp=1;

delay(100);

sp=0;

if(num==0)

//倒计时为0,D2亮,蜂鸣器报警

{

l1=0;

sp=1;delay(200);sp=0;

delay(100);

sp=1;delay(200);sp=0;

delay(100);

sp=1;delay(200);sp=0;

}

if(num==0)

{

while(1)

{

xianshi();

//调用延时子函数

if(k4==0) //假如复位键按下

{

l1=1;

//D1,D2灭

l2=1;

num=num2; //30秒倒计时赋值给num

TR0=1; //启动定时器T0

return;

}

}

}

} } x2++; if(x2==4) {

x2=0; } P3=table2[x2];

//分别给行线送低电?

抢答器~C51~带程序

51单片机4路抢答器的原理及C语言源程序

抢答器设计心得

简易抢答器设计

抢答器PLC设计

51单片机四路抢答器程序

他智能抢答器设计

多路抢答器的设计

多路智能抢答器设计

EDA四人抢答器设计

4路抢答器设计程序
《4路抢答器设计程序.doc》
将本文的Word文档下载到电脑,方便编辑。
推荐度:
点击下载文档
点击下载本文文档