protues仿真图:
实物图:
单片机程序源码:
- /*******************************************************************************
- * 标题: 三路抢答器 *
- * 时间 2018年8月5日17:59:20 *
- * *
- * 实验说明:在10s的时间内,三位选手进行按键抢答,如果1号抢答,那么数码管将显示*
- 1号选手的号码。并且蜂鸣器响,以此类推。如果10s时间到,蜂鸣器响,选手 *
- 无法进行抢答 *
- ********************************************************************************
- * 实验心得:做法相对简单,注意共阴数码管还是共阳数码管 *
- ********************************************************************************/
- #include <reg52.h>
- //IO口定义
- #define GPIO_DIG P0
- #define GPIO_SHOW P2
- sbit LSA=P3^0;
- sbit beep=P1^5;
- sbit K1=P3^1;
- sbit K2=P1^0;
- sbit K3=P1^1;
- sbit K4=P1^2;
- //--定义全局变量--//
- typedef unsigned int u16;
- unsigned char code DIG_CODE[18]={
- 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0xff};
- //0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码
- unsigned int Ge=0;
- unsigned int Shi=1;
- unsigned int num=0;
- unsigned int Res=10;
- unsigned int flag=0;
- //全局函数
- void DigDisplay();
- void delay(u16 i)
- {
- while(i--);
- }
- void main()
- {
- TMOD = 0x01;
- TH0 = 0x3C;
- TL0 = 0x0B0;
- EA = 1;
- ET0 = 1;
- TR0 = 1;
- DigDisplay();
- }
- void DigDisplay()
- {
- unsigned char i;
- unsigned int j;
- while(1)
- {
- for(i=0;i<2;i++)
- {
- switch(i) //位选,选择点亮的数码管,
- {
- case(0):
- LSA=0;
- GPIO_DIG=DIG_CODE[Shi];//发送段码
- break;//显示第0位
- case(1):
- LSA=1;
- GPIO_DIG=DIG_CODE[Ge];//发送段码
- break;//显示第1位
- }
-
- /****************************************************************************/
- /*消隐函数要在数码管更新频率很快的条件下,才起作用,手动更换数码管位选完全达不到这么快的速度,因此在这种情况下也是没必要用消隐的 */
- j=10; //扫描间隔时间设定
- while(j--);
- GPIO_DIG=0x00;//消隐
- }
- if(K1==0)
- {
- Res=10;
- flag=0;
- }
- else if(K2==0)
- {
- GPIO_SHOW=~DIG_CODE[1];
- while(1)
- {
- beep=~beep;
- delay(10);
- if(K1==0)
- {
- Res=10;
- flag=0;
- GPIO_SHOW=~DIG_CODE[17];
- break;
- }
- }
- }
- else if(K3==0)
- {
- GPIO_SHOW=~DIG_CODE[2];
- while(1)
- {
- beep=~beep;
- delay(10);
- if(K1==0)
- {
- Res=10;
- flag=0;
- GPIO_SHOW=~DIG_CODE[17];
- break;
- }
- }
- }
- else if(K4==0)
- {
- GPIO_SHOW=~DIG_CODE[3];
- while(1)
- {
- beep=~beep;
- delay(10);
- if(K1==0)
- {
- Res=10;
- flag=0;
- GPIO_SHOW=~DIG_CODE[17];
- break;
- }
- }
- }
- }
- }
- void Int1() interrupt 1
- {
- TMOD = 0x01;
- TH0 = 0x3C;
- TL0 = 0x0B0;
- num++;
- if(num==20)
- {
- num=0;
- flag++;
- Res--;
- Ge=Res%10;
- Shi=Res/10;
- }
-
- if(flag==10)
- {
- while(1)
- {
- beep=~beep;
- delay(10);
- if(K1==0)
- {
- Res=10;
- flag=0;
- break;
- }
- }
- }
- }
复制代码
全部资料51hei下载地址:
三路抢答器.rar
(49.57 KB, 下载次数: 164)
|