该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
改成开始前抢答蜂鸣器响,红灯亮#include
#define uint unsigned int
#define uchar unsigned char
sbit SW1=P1^0; //******
sbit SW2=P1^1; //* 八 *
sbit SW3=P1^2; //* 路 *
sbit SW4=P1^3; //* 抢 *
sbit SW5=P1^4; //* 答 *
sbit SW6=P1^5; //* 按 *
sbit SW7=P1^6; //* 钮 *
sbit SW8=P1^7; //******
sbit START=P2^3; //开始;
sbit RESET=P2^4; //复位;
sbit ADD=P2^5; //加一;
sbit DEC=P2^6; //减一;
sbit A=P2^7; //蜂鸣器;
sbit H1=P2^0; // 选手编号位 bai
sbit H2=P2^1; //剩余时间十位 shi
sbit H3=P2^2; // 剩余时间个位 ge
/*
显示部分:
段选:P0.0~P0.6;7段
位选:P2.0~P2.2;三位
注:共阳极LED
*/
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90,}; //数码管显示字符定义 对应0~9;
void keyscan(); //键盘扫描函数申明;
void display(); //显示函数申明
void delay(uint); //延时函数申明
void FUWEI();//复位函数申明
void qushu();//拆分任意两位数
uint input=30; //默认剩余时间30秒;
uchar ge,shi,bai=0,n=1,m=0,t=0,temp; //定义变量;
//***************************************************************//
//*********************>>>主函数开始<<
//***************************************************************//
void main()
{
TMOD=0x01;//设置定时器0为工作方式1.(M1M0为1)
TH0=(65536-50000)/256; //装初值。11.0592M晶振定时50ms数为45872.
TL0=(65536-50000)%6; //低位
EA=1; //开启总中断。
ET0=1; //开定时器0中断
/***************中断服务子程序每结束一次都回到TR0=1这点***********/
while(1) //主程序死循环,保证抢答器一直运行下去
{
keyscan();//*************************
qushu();//****依次扫描此3个函数***
display();//*************************
}
}
//系统复位函数
void FUWEI()
{
TR0=0; //关定时器
TH0=(65536-50000)/256; //重装初值。
TL0=(65536-50000)%6; //低8位
t=0; //中断函数计数清零
A=0;//***********
delay(500); //报警500毫秒
A=1;//***********
bai=0;//选手编号清零
input=30;//设置剩余时间
}
//系统显示函数
void display()
{
H1=0;//**************************************
P0=table[bai]; //********* 选手编号显示 *************
delay(1); //**************************************
H1=1; //关一位数码管,保证选手编号位不被干扰**
H2=0; //**************************************
P0=table[shi]; //********* 剩余时间十位显示 *********
delay(1); //**************************************
H2=1; //********* 关二位数码管 *************
H3=0; //**************************************
P0=table[ge]; //********* 剩余时间个位显示 *********
delay(1); //**************************************
H3=1; //********* 关三位数码管 *************
}
//拆分任意两位数函数
void qushu()
{
shi=input/10;//取整
ge=input;//取余
}
//键盘扫描函数
void keyscan()
{
//复位操作,无论何时,都可以复位,节省时间
if(RESET==0)
{
delay(200);//延时200毫秒,防止按键机械振动引起的误差
FUWEI();//系统复位
n=1;//复位后开启主持人其他权限
}
//n为1时,表示还没开始抢答,可以操作
if(n)
if(START==0)//开始抢答>>需要自锁<<
{
TR0=1; //开定时器
A=0;//*************
delay(500);//报警500毫秒*
A=1;//*************
m=1;//开启选手抢答权限
n=0;//自锁,开始后不检测此按钮,有效防止在选手答题时主持人误操作。
}
//调整时间函数,抢答前可操作。
if(n)
{
if(ADD==0)
{
delay(200); //防止按键抖动重复加一
input ; //时间加一
}
if(DEC==0)
{
delay(200);
input–;//时间减一
}
}
//主持人启动START按钮后,开始检查选手按钮。
if(m)
{
if(P1!=0xFF) //如果有选手抢答,则找出他的编号
{
temp=P1;
m=0;//自锁,此后不再检测选手抢答键,直到主持人启动START为止。
switch(temp)
{
case 0xFE:bai=1; //一号选手答题
break;
case 0xFD:bai=2; //二号选手答题
break;
case 0xFB:bai=3; //三号选手答题
break;
case 0xF7:bai=4; //四号选手答题
break;
case 0xEF:bai=5; //五号选手答题
break;
case 0xDF:bai=6; //六号选手答题
break;
case 0xBF:bai=7; //七号选手答题
break;
case 0x7F:bai=8; //八号选手答题
break;
}
TR0=0; //关定时器,剩余时间不再减少,显示剩余时间
}
}
}
//中断方式一服务程序。
void timer() interrupt 1
{
TH0=(65536-50000)/256;//重装初值。
TL0=(65536-50000)%6;
t ; //每累加一次,判断是否到20.
if(t==20) //如果到了20次,说明1秒时间到。
{
t=0; //然后把t清零重新再记20次。
input–; //减一秒
if(input==0) //如果没人回答,自动复位;
FUWEI(); //系统复位
qushu(); //刷新显示
}
}
//延时函数,利用系统计算时间延时,不占用计时器。
void delay(uint z)
{
uint x,y;
for(x=100;x>0;x–)
for(y=z;y>0;y–);
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/179947.html原文链接:https://javaforall.cn