这是我们单片机的一次设计程序,这个程序是基于普中科技的单片机开发板,能实现一个四路抢答器的功能,本人亲自在开发板上烧录,能正常运作,所以发出来让大家给我提些建议,因为本人现在的编程水平有限,所以让大家帮我改进改进。
单片机源程序如下:
- #include<reg51.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define WHO P0
-
- sbit player1=P1^0;
- sbit player2=P1^1;
- sbit player3=P1^2;
- sbit player4=P1^3;
- sbit Ensure=P3^7;
- sbit beep=P1^6;
- sbit LSA=P3^2;
- sbit LSB=P3^3;
- sbit LSC=P3^4;
-
- uchar state=0;
- uchar ssec=0;
- uchar table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
- uchar OUT[]={0x71,0x77,0x38,0x38};
-
- void delay(uint time)
- {
- uint x,y ;
- for(x=time;x>0;x--)
- for(y=130;y>0;y--);
- }
-
- void Delay2(uint i)
- {
- while(i--);
- }
-
- void Show(uchar content[])
- {
- uchar i;
- for(i=0;i<4;i++)
- {
- switch(i) //位选,选择点亮的数码管,
- {
- case(0):
- LSA=0;LSB=0;LSC=0; break;//显示第0位
- case(1):
- LSA=1;LSB=0;LSC=0; break;//显示第1位
- case(2):
- LSA=0;LSB=1;LSC=0; break;//显示第2位
- case(3):
- LSA=1;LSB=1;LSC=0; break;//显示第3位
- }
- P2=content[i];//发送段码
- Delay2(100); //间隔一段时间扫描
- P2=0x00;//消隐
- }
- }
-
- void InitTimer0(void)
- {
- TMOD = 0x01;
- TH0 = 0x0D8;
- TL0 = 0x0F0;
- EA = 1;
- ET0 = 1;
- TR0 = 1;
- }
-
- void main()
- {
- Ensure=1;
- while(1)
- {
- if(player1==0) //玩家1进入抢答状态
- {
- delay(10); //延时,按键消抖
- if(player1==0) //再次判断是否进入抢答状态
- {
- if(state==0) //前方无人抢答状态
- {
- InitTimer0();
- state=1; //将抢答状态置为1,防止其他玩家抢答
- while(!player1) //抢答成功,蜂鸣器发声
- {
- beep=~beep;
- delay(1);
- }
- WHO=table[1]; //数码管显示抢答成功的玩家编号
- }
- }
- }
- if(player2==0) //以下结构类似于玩家1
- {
- delay(10);
- if(player2==0)
- {
- if(state==0)
- {
- InitTimer0();
- state=1;
- while(!player2)
- {
- beep=~beep;
- delay(1);
- }
- WHO=table[2];
- }
- }
- }
- if(player3==0)
- {
- delay(10);
- if(player3==0)
- {
- if(state==0)
- {
- InitTimer0();
- state=1;
- while(!player3)
- {
- beep=~beep;
- delay(1);
- }
- WHO=table[3];
- }
- }
- }
- if(player4==0)
- {
- delay(10);
- if(player4==0)
- {
- if(state==0)
- {
- InitTimer0();
- state=1;
- while(!player4)
- {
- beep=~beep;
- delay(1);
- }
- WHO=table[4];
- }
- }
- }
- }
- }
-
- void Timer0() interrupt 1
- {
- TH0=(65536-45872)/255; //给定时器赋初值,定时50ms
- TL0=(65536-45872)%255;
- ssec++;
- if(Ensure)
- {
- if(ssec>=100) //5s
- {
- EA=0;
- while(1)
- Show(OUT);
- }
- }
- else
- {
- delay(10);
- if(Ensure==0)
- {
- while(!Ensure);
- Ensure=0;
- if(ssec>=100)
- {
- EA=0;
- }
- }
- }
- }
复制代码
所有资料51hei提供下载:
四路抢答器.docx
(24.28 KB, 下载次数: 26)
|