抢答器;按键理念;倒计时;四位数码管显示
时间:10-02
整理:3721RD
点击:
两年前开始学习单片机,也是从最简单的51开始。现在整理一些以前写的东西,给后来者学习,希望能帮到你们。有需要自己下载。
按键:1主持人;4选手
主持人键按下,数码管倒计时,直到有选手按键按下,显示选手按键,停止计时
- #include<reg52.h>
- #include<intrins.h>
- #define uint unsigned int
- #define uchar unsigned char
- #define LS P0 //段选
- sbit beep=P1^5; //蜂鸣器
- sbit LSA=P2^2; //位选
- sbit LSB=P2^3;
- sbit LSC=P2^4;
- sbit Key=P1^7; //键盘行扫,置零
- sbit Host=P1^3; //主持人键,0-按下
- sbit Player_1=P3^1; //1号选手键,0-按下
- sbit Player_2=P3^0; //2号选手键,0-按下
- sbit Player_3=P3^2; //3号选手键,0-按下
- sbit Player_4=P3^3; //4号选手键,0-按下
- //按键标志位 0-有效 1-无效
- uchar Host_flag=1;
- uchar P1_flag=1;
- uchar P2_flag=1;
- uchar P3_flag=1;
- uchar P4_flag=1;
- static uchar miaoH=6,miaoL=0;
- static uchar Player=0;
- uchar code DIG_CODE[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//显示空/0~9的值
- uchar T=0; //计算定时器循环次数
- void Delay(uchar t)
- {
- unsigned char a,b;
- for(;t>0;t--)
- for(b=13;b>0;b--)
- for(a=20;a>0;a--);
- }
- void Init()
- {
- Key=0; //键盘行扫,置零
-
- TMOD=0x01; //定时器0中断方式1
- //50ms
- TH0=(65536-50000)/256; //赋初值
- TL0=(65536-50000)%256;
- EA=1; //总中断打开
- ET0=1; //中断 定时器0打开
- IT0=1; //下降沿有效
- TR0=0; //定时器0未启动
- //50ms时间到,跳转到中断程序中
- }
- void Timer() interrupt 1
- {
- TH0=(65536-50000)/256; //定时T*50ms--T=20--1s
- TL0=(65536-50000)%256;
- T++;
- }
- void Clock()
- {
- uchar t=50;
- if(Host_flag==0) //倒计时状态
- {
- if(P1_flag==0)
- {
- Host_flag=1;
- Player=1;
- }
- else if(P2_flag==0)
- {
- Host_flag=1;
- Player=2;
- }
- else if(P3_flag==0)
- {
- Host_flag=1;
- Player=3;
- }
- else if(P4_flag==0)
- {
- Host_flag=1;
- Player=4;
- }
- else
- {
- if(T==20)
- {
- T=0;
- miaoL--;
- if(miaoH==0&&miaoL<=5) //倒计时五秒,蜂鸣器报警
- {
- for(;t>0;t--) //循环50次 延时长,数码管闪
- {
- beep=0;
- Delay(2);
- beep=1;
- Delay(2);
- }
- }
- if(miaoH!=0)
- {
- if(miaoL==-1)
- {
- miaoL=9;
- miaoH--;
- }
- }
- else
- {
- if(miaoL==-1)
- {
- miaoL=0;
- Host_flag=1;
- }
- }
- }
- }
- }
- else //问题时间
- {
- TR0=0; //定时器关闭
- T=0;
- }
- }
- void Key_Scan()
- {
- static uchar SaveHt=1; //保存主持人键状态 0-按下,1-弹起
- static uchar SaveP1=1; //保存一号选手键状态 0-按下,1-弹起
- static uchar SaveP2=1; //保存二号选手键状态 0-按下,1-弹起
- static uchar SaveP3=1; //保存三号选手键状态 0-按下,1-弹起
- static uchar SaveP4=1; //保存四号选手键状态 0-按下,1-弹起
- uchar Ht=1; //当前主持人键状态 弹起
- uchar P1=1; //当前一号选手按键状态 弹起
- uchar P2=1; //当前二号选手按键状态 弹起
- uchar P3=1; //当前三号选手按键状态 弹起
- uchar P4=1; //当前四号选手按键状态 弹起
- //获取各按键状态
- if(Host==0) //主持人键按下
- {
- Delay(1);
- if(Host==0)
- {
- Ht=0;
- }
- else
- {
- Ht=1;
- }
- }
- else
- {
- Ht=1;
- }
-
- if(Player_1==0) //一号选手键按下
- {
- Delay(1);
- if(Player_1==0)
- {
- P1=0;
- }
- else
- {
- P1=1;
- }
- }
- else
- {
- P1=1;
- }
-
- if(Player_2==0) //二号选手键按下
- {
- Delay(1);
- if(Player_2==0)
- {
- P2=0;
- }
- else
- {
- P2=1;
- }
- }
- else
- {
- P2=1;
- }
-
- if(Player_3==0) //三号选手键按下
- {
- Delay(1);
- if(Player_3==0)
- {
- P3=0;
- }
- else
- {
- P3=1;
- }
- }
- else
- {
- P3=1;
- }
-
- if(Player_4==0) //四号选手键按下
- {
- Delay(1);
- if(Player_4==0)
- {
- P4=0;
- }
- else
- {
- P4=1;
- }
- }
- else
- {
- P4=1;
- }
-
- //按键按下状态处理
- if(SaveHt!=Ht) //主持人键状态变化
- {
- if(Ht==0) //当前主持人键按下
- {
- if(Host_flag==1) //抢答开始
- {
- Host_flag=0;
-
- Player=0; //选手位
-
- miaoH=6;
- miaoL=0;
- TR0=1; //定时器启动
- P1_flag=1; //复位选手状态
- P2_flag=1;
- P3_flag=1;
- P4_flag=1;
- }
- }
- }
-
- if(SaveP1!=P1) //一号选手键状态变化
- {
- if(P1==0)
- {
- P1_flag=0;
- }
- }
-
- if(SaveP2!=P2) //二号选手键状态变化
- {
- if(P2==0)
- {
- P2_flag=0;
- }
- }
-
- if(SaveP3!=P3) //三号选手键状态变化
- {
- if(P3==0)
- {
- P3_flag=0;
- }
- }
-
- if(SaveP4!=P4)
- {
- if(P4==0)
- {
- P4_flag=0;
- }
- }
-
- SaveHt=Ht; //保存主持人键状态
- SaveP1=P1; //保存一号选手键状态
- SaveP2=P2; //保存二号选手键状态
- SaveP3=P3; //保存三号选手键状态
- SaveP4=P4; //保存四号选手键状态
- }
- void Display()
- {
- Clock();
- LSA=0;LSB=0;LSC=0; LS=DIG_CODE[miaoL]; Delay(1); LS=0x00;//秒针低位-加 消隐
- LSA=1;LSB=0;LSC=0; LS=DIG_CODE[miaoH]; Delay(1); LS=0x00;//秒针高位-加 消隐
- LSA=0;LSB=1;LSC=0; LS=0x40; Delay(1); LS=0x00; //-消隐
- LSA=1;LSB=1;LSC=0; LS=DIG_CODE[Player]; Delay(1); LS=0x00;//选手位
- }
- main()
- {
- Init(); //执行初始化
- while(1)
- {
- Key_Scan();
-
- Display();
- }
- }
不了解,围观一下。感谢分享
没有电路图吗
不好意思,
谢谢