【单片机系列】基于51单片机的四路抢答器

2019-04-15 19:27发布

对于这在被单片机课程设计折磨的小伙伴们,这或许是一个不错的选择!简单方便,成本低廉首先声明,本设计由本人独立完成,代码原创的,在普中科技开发板上实验成功了。下面附上代码,由于都有注释,就不废话了,如果看不懂,可以连线调试一下(这是作为一个硬件生应该掌握的基本技能。可惜我不是。。。)或者可以留言回复哦!前方代码简单,大神请绕道,本人自身也很水,是到最后一周开始学习单片机的,并且花了半天的时间写出这家伙,无比鄙视自己ing。。。#include #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; } } } }