单片机源程序如下:
- /**********************BST-M51实验开发板例程************************
- * 平台:BST-M51 + Keil U4 + STC89C52
- * 名称:本例程为一抢答器;其中主持人操控k3与k4两个按键。选手共2位,分别操控k1、k2中的一个按键。
- 当主持人按下抢答开始按键k3后,倒计时开始,计时5s。此后最先按下按键的选手号码将显示与数码管上。
- 后来按下的将无显示。
- 若五秒计时结束后,再按下按键也不会显示。
- 若主持人没有按开始键,就有选手抢答,则视为犯规。此时犯规的选手号码将被显示于数码管上
- 同时,蜂鸣器发出长笛声报警,数码管全亮。
- 而当主持人按下清零键K4后,一切状态均恢复,可以开始新一轮的抢答。
- 按键功能简介
- k3抢答开始 k4 清零
- k1、k2 分别为两个选手按键
- * 晶振:11.0592MHZ
- * 说明:免费开源,不提供源代码分析.
- ******************************************************************/
- #include<reg51.h>
- #define uchar unsigned char
- #define dula P0 //段选信号的锁存器控制
- #define wela P2 //位选信号的锁存器控制,这里只用到P2.4-P2.7
- sbit beep=P2^3;
- sbit k1 =P3^4;
- sbit k2 =P3^5;
- sbit k3 =P3^6;
- sbit k4 =P3^7;
- uchar key,j,k,daojishi=5,wei;
- bit begin,end,clear,fangui;
- uchar a0,b0=16;c0=16;d0=16;
- unsigned int pp;
- unsigned char code weitable[]={0x8f,0x4f,0x2f,0x1f};
- //数码管各位的码表
- unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
- 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
- void delay(unsigned char i)
- {
- for(j=i;j>0;j--)
- for(k=125;k>0;k--);
- }
- void display1(uchar wei,uchar shu)//在任意一位显示任意的数字
- {
- wei=wei-1;
- wela|=0xf0;//给P2.4-P2.7置1
- P0=table[shu];
- wela=wela&weitable[wei];//给P2需要显示的那一位置1,其他置0
- delay(5);
- }
- void display(uchar a,uchar b,uchar c,uchar d)
- { //一次显示4个数字,且每位显示数字可自定。
- display1(1,a);
- display1(2,b);
- display1(3,c);
- display1(4,d);
- }
- void keyscan()
- {
- if(k1==0)
- {
- while(k1==0);
- key= 1;
- }
- if(k2==0)
- {
- while(k2==0);
- key=2;
- }
- if(k3==0)
- {
- while(k3==0);
- begin =1;
- }
- if(k4==0)
- {
- while(k4==0);
- clear = 1;
- }
- }
- void main()
- {
- TMOD=0x01;
-
- TH0=(65536-46080)/256;// 由于晶振为11.0592,故所记次数应为46080,计时器每隔50000微秒发起一次中断。
- TL0=(65536-46080)%256;//46080的来历,为50000*11.0592/12
- ET0=1;
- EA=1;
- a0=table[16];
- beep =1;
- P1=0xff;
- begin=0;
- key=0;
- end = 0;
- fangui = 0;
- while(1)
- {
- keyscan();//按键扫描
- if(begin)
- {
- if(!end)
- TR0=1;//开始计时
- if(pp==20)//定时1s
- {
- pp=0;
- daojishi--;
- }
- if(key!=0)
- {
- a0=key;
- end = 1;
- daojishi = 0;
- }
- if(!daojishi)
- {
- TR0=0;
- pp=0;
- }
- }
- else
- {
- if(key!=0)
- {
- fangui=1;
- a0 = key;
- }
- }
- if(clear)
- {
- a0=0;key=0;begin=0;fangui=0;beep=1;daojishi=5;clear=0;
- b0=16;c0=16;d0=16;P1=0xff;pp=0;end = 0;
- }
- d0 = daojishi;
- display(a0,b0,c0,d0);
- if(fangui)
- {
- beep=0;
- P1=0x00;;
- }
- }
- }
- void time0() interrupt 1
- { TH0=(65536-46080)/256;
- TL0=(65536-46080)%256;
- pp++;
- }
复制代码
所有资料51hei提供下载:
51单片机四路抢答器.rar
(18.12 KB, 下载次数: 50)
|