|
八路抢答器资料,下面是仿真图:
单片机源程序:
- /****************************************************************
- ******以单片机为核心,设计一个8位竞赛抢*******
- ******答器:同时供8名选手或8个代表队*************
- ******比赛,分别用8个按钮S0~S7表示。*************
- ******设置一个系统清除和抢答控制开关************
- ******S,开关由主持人控制。抢答器具有***********
- ******锁存与显示功能。即选手按按钮,************
- ******锁存相应的编号,并在优先抢答选************
- ******手的编号一直保持到主持人将系统************
- ******清除为止。
- ******抢答器具有定时抢答功能,且一次************
- ******抢答的时间由主持人设定(如30秒)**********
- ******。
- ******当主持人启动“开始”键后,定时************
- ******器进行减计时,同时扬声器发出短************
- ******暂的声响,声响持续的时间为0.5s左************
- ******右。
- ******参赛选手在设定的时间内进行抢答************
- ******,抢答有效,定时器停止工作,显************
- ******示器上显示选手的编号和抢答的时间*********
- ******,并保持到主持人将系统清除为止。*********
- ******如果定时时间已到,无人抢答,本次*********
- ******抢答无效,系统报警并禁止抢答,定*********
- ******时显示器上显示00。*********************************
- ******************************************************************/
- #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- uchar code Tab0[]= //用于74HC595扫描的数组
- {
- 0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80
- };
- unsigned char code LED_DATE [] = //共阳数码管的编码
- {
- 0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90
- };
- sbit Set_Rest =P3^0; //主持人设置时间和复位按键
- sbit Start_Jia =P3^1; //主持人开始和调整时间按键
- sbit S1 =P2^0; // 1号选手按键
- sbit S2 =P2^1; // 2号选手按键
- sbit S3 =P2^2; // 3号选手按键
- sbit S4 =P2^3; // 4号选手按键
- sbit S5 =P2^4; // 5号选手按键
- sbit S6 =P2^5; // 6号选手按键
- sbit S7 =P2^6; // 7号选手按键
- sbit S8 =P2^7; // 8号选手按键
- sbit BUZZ =P3^2;
- sbit DS =P1^5; //74HC595 I/O
- sbit SHCP =P1^6;
- sbit STCP =P1^7;
- uint Time_Alarm=500; //抢答时间,默认定时500ms
- uchar Player=0; //选手号码
- bit K1_bit=0; //K1标志位
- bit Start_bit=0; //开始标志位
- bit Set_bit=0; //设置标志位
- uchar Set0=0; //用于设置时间时显示闪烁控制
- bit Set1=0; //用于设置时间时显示闪烁控制
- void Delay_ms(uint xms); //延时
- void HC595(uchar Value); //74HC595驱动函数
- void Display(); //显示函数
- void Init();
- void KEY1();
- void KEY2(); //开始/加时间键函数
- void Player_KEY(); //选手抢答按键
- void main()
- {
- Init();
- while(1)
- {
- KEY1();
- KEY2();
- Player_KEY();
- Display();
- }
- }
- void Player_KEY() //选手抢答按键
- {
- if(Start_bit==1)
- {
- if(S1==0)
- {
- Delay_ms(10);
- if(S1==0)
- {
- Player=1;
- Start_bit=0;
- TR0=0;
- while(!S1);
- }
- }
- if(S2==0)
- {
- Delay_ms(10);
- if(S2==0)
- {
- Player=2;
- Start_bit=0;
- TR0=0;
- while(!S2);
- }
- }
- if(S3==0)
- {
- Delay_ms(10);
- if(S3==0)
- {
- Player=3;
- Start_bit=0;
- TR0=0;
- while(!S3);
- }
- }
- if(S4==0)
- {
- Delay_ms(10);
- if(S4==0)
- {
- Player=4;
- Start_bit=0;
- TR0=0;
- while(!S4);
- }
- }
- if(S5==0)
- {
- Delay_ms(10);
- if(S5==0)
- {
- Player=5;
- Start_bit=0;
- TR0=0;
- while(!S5);
- }
- }
- if(S6==0)
- {
- Delay_ms(10);
- if(S6==0)
- {
- Player=6;
- Start_bit=0;
- TR0=0;
- while(!S6);
- }
- }
- if(S7==0)
- {
- Delay_ms(10);
- if(S7==0)
- {
- Player=7;
- Start_bit=0;
- TR0=0;
- while(!S7);
- }
- }
- if(S8==0)
- {
- Delay_ms(10);
- if(S8==0)
- {
- Player=8;
- Start_bit=0;
- TR0=0;
- while(!S8);
- }
- }
-
- }
- }
- void KEY2() //开始/加时间键函数
- {
- if(Start_Jia==0)
- {
- Delay_ms(10);
- if(Start_Jia==0)
- {
- if(Set_bit==0)
- {
- if(Time_Alarm==0) //判断是否抢答结束
- {
- TR0=0;
- Time_Alarm=0;
- }
- else
- {
- TR0=~TR0;
- Start_bit=~Start_bit;
- }
- }
- else
- {
- Time_Alarm=(Time_Alarm+250);
- if(Time_Alarm>1500)
- {
- Time_Alarm=500;
- }
- }
- while(!Start_Jia);
- }
- }
- }
- void KEY1()
- {
- if(Set_Rest==0)
- {
- Delay_ms(100);
- if(Set_Rest==0)
- {
- Delay_ms(500); //判断长按还是短按
- if(Set_Rest==0)
- {
- Time_Alarm=500;
- TR0=0;
- TR1=0;
- Set_bit=0;
- Player=0;
- Start_bit=0;
- BUZZ=1;
- while(!Set_Rest);
- }
- else
- {
- if(Start_bit==0) //判断是否开始
- {
- Set_bit=~Set_bit;
- TR1=~TR1;
- }
- }
- }
- }
- }
- void Time_0() interrupt 1
- {
- TH0=0xfc; //定时器0定时1毫秒
- TL0=0x18;
- Time_Alarm--;
- if(Time_Alarm<=0)
- {
- TR0=0;
- Start_bit=0;
- BUZZ=0;
- }
- }
- void Time_1() interrupt 3
- {
- TH1=0x3c; //定时器1定时50ms
- TL1=0xb0;
- Set0++;
- if(Set0==10)
- {
- Set0=0;
- Set1=~Set1;
- }
- }
- void Display() //显示函数
- {
- uchar i=0;
- for(i=0;i<3;i++) //选手编号数码管前三位显示0
- {
- P0=LED_DATE[0]; //送段数据
- HC595(Tab0[i]); //送位数据
- Delay_ms(5); //延时
- P0=0XFF; //消隐
- }
- P0=LED_DATE[Player]; //数码管第4位显示选手编号,送段数据
- HC595(Tab0[3]); //送位数据
- Delay_ms(5); //延时
- P0=0XFF; //消隐
- if(Set_bit==0)
- {
- P0=LED_DATE[Time_Alarm/1000]; //显示定时时间千位
- HC595(Tab0[4]); //送位数据
- Delay_ms(5); //延时
- P0=0XFF; //消隐
- P0=LED_DATE[Time_Alarm%1000/100]; //显示定时时间百位
- HC595(Tab0[5]); //送位数据
- Delay_ms(5); //延时
- P0=0XFF; //消隐
- P0=LED_DATE[Time_Alarm%100/10]; //显示定时时间十位
- HC595(Tab0[6]); //送位数据
- Delay_ms(5); //延时
- P0=0XFF; //消隐
- P0=LED_DATE[Time_Alarm%10]; //显示定时时间个位
- HC595(Tab0[7]); //送位数据
- Delay_ms(5); //延时
- P0=0XFF; //消隐
- }
- if(Set_bit==1)
- {
- if(Set1==1)
- {
- P0=LED_DATE[Time_Alarm/1000]; //显示定时时间千位
- HC595(Tab0[4]); //送位数据
- Delay_ms(5); //延时
- P0=0XFF; //消隐
- P0=LED_DATE[Time_Alarm%1000/100]; //显示定时时间百位
- HC595(Tab0[5]); //送位数据
- Delay_ms(5); //延时
- P0=0XFF; //消隐
- P0=LED_DATE[Time_Alarm%100/10]; //显示定时时间十位
- HC595(Tab0[6]); //送位数据
- Delay_ms(5); //延时
- P0=0XFF; //消隐
- P0=LED_DATE[Time_Alarm%10]; //显示定时时间个位
- HC595(Tab0[7]); //送位数据
- Delay_ms(5); //延时
- P0=0XFF; //消隐
- }
- else
- {
- P0=0xff; //显示定时时间千位
-
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
proteus仿真工程文件和单片机源码下载:
51智能8路抢答器.rar
(97.65 KB, 下载次数: 166)
|
评分
-
查看全部评分
|