您好,欢迎来到测品娱乐。
搜索
您的当前位置:首页4路抢答器设计程序

4路抢答器设计程序

来源:测品娱乐
#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<4;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<4;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<4;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) //倒计时倒数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]; //分别给行线送低电?

}

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- cepb.cn 版权所有 湘ICP备2022005869号-7

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务