构建和谐论坛,杜绝灌水
8路抢答器仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit k0=P1^0; /*数码管段选*/
- sbit k1=P1^1;
- sbit k2=P1^2;
- sbit k3=P1^3;
- sbit k4=P1^4;
- sbit k5=P1^5;
- sbit k6=P1^6;
- sbit k7=P1^7;
- sbit wela0=P2^0; /*数码管位选*/
- sbit wela1=P2^2;
- sbit wela2=P2^3;
- sbit beep=P2^4; /*蜂鸣器*/
- sbit ks=P3^0; /*开始计时*/
- sbit tz=P3^1; /*停止计时*/
- sbit jiayi=P3^4; /*时间加1s*/
- sbit jianyi=P3^5; /*时间减1s*/
- sbit fw=P3^6; /*复位*/
- uchar qiangdanum=0xff;
- uchar code table[]=
- {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
- uchar ge=0,shi=0;
- uint num,time=30;
- void display(); /*显示函数*/
- void kys(); /*设置按键函数*/
- void kys2(); /*抢答按键函数*/
- void delay(unsigned int z) /*延迟函数*/
- {
- unsigned int x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- void intial()
- {
- TMOD=0X01; /*采用方式一,即十六位计数器*/
- TH0=(65536-50000)/256; /*设置初始值,50ms中断一次*/
- TL0=(65536-50000)%256;
- EA=1;ET0=1; /*开启总中断源,定时器中断*/
- }
- main()
- {
- intial(); /*初始化*/
- while(1)
- {
- display(); /*显示函数*/
- kys();
- if(TR0==1)
- {
- kys2();
- }
- }
- }
- void kys2() /*抢答按键函数*/
- {
- if(k0==0) /*开关0按下*/
- {
- delay(5);
- if(k0==0)
- {
- qiangdanum=1; /* 1号选手抢答成功,数码管显示1*/
- beep=1;
- delay(100);
- beep=0;
- TR0=0;
- time=60;
- }
- }
- if(k1==0) /*开关1按下*/
- {
- delay(5);
- if(k1==0)
- {
- qiangdanum=2; /* 2号选手抢答成功,数码管显示2*/
- beep=1;
- delay(100);
- beep=0;
- TR0=0; /*停止计数*/
- }
- }
- if(k2==0) /*开关2按下*/
- {
- delay(5);
- if(k2==0)
- {
- qiangdanum=3; /* 3号选手抢答成功,数码管显示3*/
- beep=1;
- delay(100);
- beep=0;
- TR0=0; /*停止计数*/
- time=60;
- }
- }
- if(k3==0) /*开关3按下*/
- {
- delay(5);
- if(k3==0)
- {
- qiangdanum=4; /* 4号选手抢答成功,数码管显示4*/
- beep=1;
- delay(100);
- beep=0;
- TR0=0; /*停止计数*/
- time=60;
- }
- }
- if(k4==0) /*开关4按下*/
- {
- delay(5);
- if(k4==0)
- {
- qiangdanum=5; /* 5号选手抢答成功,数码管显示5*/
- beep=1;
- delay(100);
- beep=0;
- TR0=0; /*停止计数*/
- time=60;
- }
- }
- if(k5==0) /*开关5按下*/
- {
- delay(5);
- if(k5==0)
- {
- qiangdanum=6; /* 6号选手抢答成功,数码管显示6*/
- beep=1;
- delay(100);
- beep=0;
- TR0=0; /*停止计数*/
- time=60;
- }
- }
- if(k6==0) /*开关6按下*/
- {
- delay(5);
- if(k6==0)
- {
- qiangdanum=7; /* 7号选手抢答成功,数码管显示7*/
- beep=1;
- delay(100);
- beep=0;
- TR0=0; /*停止计数*/
- time=60;
- }
- }
- if(k7==0) /*开关7按下*/
- {
- delay(5);
- if(k7==0)
- {
- qiangdanum=8; /* 8号选手抢答成功,数码管显示8*/
- beep=1;
- delay(100);
- beep=0;
- TR0=0; /*停止计数*/
- time=60;
- }
- }
- }
- void kys() /*设置按键函数*/
- {
- if(ks==0)
- {
- delay(5);
- if(ks==0)
- {
- TR0=1;
- }
- }
- if(tz==0)
- {
- delay(5);
- if(tz==0)
- TR0=0;
- }
- if(jiayi==0)
- {
- delay(5);
- if(jiayi==0)
- time++;
- while(!jiayi);
- }
- if(jianyi==0)
- {
- delay(5);
- if(jianyi==0)
- time--;
- while(!jianyi);
- }
- if(fw==0)
- {
- delay(5);
- if(fw==0)
- {
- time=30;
- qiangdanum=0xff;
- }
- }
- }
- void time0() interrupt 1 /*1秒定时函数,采用方式1重装*/
- {
- num++;
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
抢答器.rar
(107.38 KB, 下载次数: 37)
|