项目三 基于stc89c52系列单片机十六路抢答器

前言:作者想要帮助一些童鞋和爱好者进行项目构建,但自知能力有限,不喜可论,创作不易,勿喷。
发送模块代码

#include<reg52.h>
#include<intrins.h>
#include "uart.h"

sfr ISP_DATA  = 0xe2;		// 数据寄存器
sfr ISP_ADDRH = 0xe3;		// 地址寄存器高八位
sfr ISP_ADDRL = 0xe4;		// 地址寄存器低八位
sfr ISP_CMD   = 0xe5;		// 命令寄存器
sfr ISP_TRIG  = 0xe6;		// 命令触发寄存器
sfr ISP_CONTR = 0xe7;		// 命令寄存器

sfr T2MOD  = 0xC9;
#define Yes		1
#define No		0
/********测试WIFI是否启动**********/
int WIFItest_boot=0;
/********WIFI串口接收数据缓存**********/
unsigned char xdata WIFI_receive[45]; 
unsigned char xdata IP_receive[11];
/********WIFI串口接收计数器**********/
unsigned char WIFIDATA_count;
bit xx_flag;  //手机连接标志 
bit flag2s = 0; 

sbit P10 = P1^0;
sbit P11 = P1^1;
sbit P12 = P1^2;
sbit P13 = P1^3;
sbit P14 = P1^4;
sbit P15 = P1^5;
sbit P16 = P1^6;
sbit P17 = P1^7;

sbit P20 = P2^0;
sbit P21 = P2^1;
sbit P22 = P2^2;
sbit P23 = P2^3;
sbit P24 = P2^4;
sbit P25 = P2^5;
sbit P26 = P2^6;
sbit P27 = P2^7;












unsigned char H_buff[5];
unsigned char moshi=0;
unsigned char jibie=0;
unsigned char count = 0;



extern bit Start18B20();
extern bit Get18B20Temp(int *temp);
extern void InitLcd1602();
extern void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str);
extern void LcdWriteCmd(unsigned char cmd);
extern void LcdSetCursor(unsigned char x, unsigned char y);
extern void LcdWriteDat(unsigned char dat);

void ConfigPWM(unsigned int fr, unsigned char dc);
void ClosePWM();
void wendu_chuli();

/*****************************************************************************
延迟函数
/****************************************************************************/
void Delay_Ms (unsigned int a)
{
	unsigned int i;
	while( a-- != 0)
	{
		for(i = 0; i < 600; i++);
	}
}


void Key_set_scan()
{
			if(P10 == 0)
			{
		
					Send_String("AT+CIPSEND=0,8\r\n");	  	// 多路连接时:AT+CIPSEND=<id>,<length>
					delaynms(60);						  	// <length>	数据长度
				Send_String("Dowm:P10\n");
					delaynms(10);
			}
			if(P11 == 0)
			{
				while(P11 == 0);
					Send_String("AT+CIPSEND=0,8\r\n");	  	// 多路连接时:AT+CIPSEND=<id>,<length>
					delaynms(60);						  	// <length>	数据长度
					Send_String("Dowm:P11\n");
					delaynms(10);
			}
			if(P12 == 0)
			{

					Send_String("AT+CIPSEND=0,8\r\n");	  	// 多路连接时:AT+CIPSEND=<id>,<length>
					delaynms(60);						  	// <length>	数据长度
					Send_String("Dowm:P12\n");
					delaynms(10);
			}
			if(P13 == 0)
			{
		
					Send_String("AT+CIPSEND=0,8\r\n");	  	// 多路连接时:AT+CIPSEND=<id>,<length>
					delaynms(60);						  	// <length>	数据长度
					Send_String("Dowm:P13\n");
					delaynms(10);
			}
			if(P14 == 0)
			{
			
					Send_String("AT+CIPSEND=0,8\r\n");	  	// 多路连接时:AT+CIPSEND=<id>,<length>
					delaynms(60);						  	// <length>	数据长度
					Send_String("Dowm:P14\n");
					delaynms(10);
			}
			if(P15 == 0)
			{
	
					Send_String("AT+CIPSEND=0,8\r\n");	  	// 多路连接时:AT+CIPSEND=<id>,<length>
					delaynms(60);						  	// <length>	数据长度
					Send_String("Dowm:P15\n");
					delaynms(10);
			}
			if(P16 == 0)
			{
	
					Send_String("AT+CIPSEND=0,8\r\n");	  	// 多路连接时:AT+CIPSEND=<id>,<length>
					delaynms(60);						  	// <length>	数据长度
					Send_String("Dowm:P16\n");
					delaynms(10);
			}
			if(P17 == 0)
			{
			
					Send_String("AT+CIPSEND=0,8\r\n");	  	// 多路连接时:AT+CIPSEND=<id>,<length>
					delaynms(60);						  	// <length>	数据长度
					Send_String("Dowm:P17\n");
					delaynms(10);
			}
			
			if(P20 == 0)
			{
				while(P20 == 0);
					Send_String("AT+CIPSEND=0,8\r\n");	  	// 多路连接时:AT+CIPSEND=<id>,<length>
					delaynms(6);						  	// <length>	数据长度
					Send_String("Dowm:P20\r\n");
					delaynms(1);
			}
			if(P21 == 0)
			{
			
					Send_String("AT+CIPSEND=0,8\r\n");	  	// 多路连接时:AT+CIPSEND=<id>,<length>
					delaynms(60);						  	// <length>	数据长度
					Send_String("Dowm:P21\r\n");
					delaynms(10);
			}
			if(P22 == 0)
			{
			
					Send_String("AT+CIPSEND=0,8\r\n");	  	// 多路连接时:AT+CIPSEND=<id>,<length>
					delaynms(60);						  	// <length>	数据长度
					Send_String("Dowm:P22\r\n");
					delaynms(10);
			}
			if(P23 == 0)
			{
				
					Send_String("AT+CIPSEND=0,8\r\n");	  	// 多路连接时:AT+CIPSEND=<id>,<length>
					delaynms(60);						  	// <length>	数据长度
					Send_String("Dowm:P23\r\n");
					delaynms(10);
			}
			if(P24 == 0)
			{
		
					Send_String("AT+CIPSEND=0,8\r\n");	  	// 多路连接时:AT+CIPSEND=<id>,<length>
					delaynms(60);						  	// <length>	数据长度
					Send_String("Dowm:P24\r\n");
					delaynms(10);
			}
			if(P25 == 0)
			{

					Send_String("AT+CIPSEND=0,8\r\n");	  	// 多路连接时:AT+CIPSEND=<id>,<length>
					delaynms(60);						  	// <length>	数据长度
					Send_String("Dowm:P25\r\n");
					delaynms(10);
			}
			if(P26 == 0)
			{
				
					Send_String("AT+CIPSEND=0,8\r\n");	  	// 多路连接时:AT+CIPSEND=<id>,<length>
					delaynms(60);						  	// <length>	数据长度
					Send_String("Dowm:P26\r\n");
					delaynms(10);
			}
			if(P27 == 0)
			{
		
					Send_String("AT+CIPSEND=0,8\r\n");	  	// 多路连接时:AT+CIPSEND=<id>,<length>
					delaynms(60);						  	// <length>	数据长度
					Send_String("Dowm:P27\r\n");
					delaynms(10);
			}			
			
			
			
			
			
			
			
			
			
			
	
}

/*------------------------------------------------
                    定时器初始化子程序
------------------------------------------------*/
void timer2_init()								    //定时器2初始化 2毫秒@11.0592MHz 
{													
 T2CON=0; 											//设置定时器的T2CON,设置T2为内部定时器,T2EX的跳变对定时器2无效 
 T2MOD=0;											//定时器2输出使能,定时器递增计数 
 /// 以下设置将定时器2的输出频率设置成42HZ/// 	  
 RCAP2H = 0xCD;					    //设置定时器2的RCAP2H为254		  
 RCAP2L = 0xF8;						//设置定时器2的RCAP2L为255 

 TH2    = RCAP2H; 									//将RCAP2H中的值(254)重装到TH2中 
 TL2    = RCAP2L; 									//将RCAP2L中的值(255)重装到TL2中 
 ///													
 TR2    = 1;									    //开启定时器2计数 
 ET2    = 1;									    //开启定时器2中断 
 EA     = 1; 									    //开总中断 
}
void WIFI_INIT()
{
	WIFItest_boot=No;					 //测试是否已经开机
	while(WIFItest_boot==No)
	{
		Send_String("AT\r\n");
		delaynms(200);	
	} 
	WIFItest_boot=No;    				 //设置为AP模式	 
	while(WIFItest_boot==No)
	{
		Send_String("AT+CWMODE=2\r\n");
		delaynms(200);
	}
	WIFItest_boot=No;					 //设置为多连接模式
	while(WIFItest_boot==No)
	{
		Send_String("AT+CIPMUX=1\r\n");
		delaynms(200);
	}
	WIFItest_boot=No;					 //设置为服务器端口号为:5000
	while(WIFItest_boot==No)
	{
		Send_String("AT+CIPSERVER=1,5000\r\n");
		delaynms(200);
	}
	WIFItest_boot=No;                    // 获取IP地址并显示      
	while(WIFItest_boot==No)
	{
		Send_String("AT+CIFSR\r\n");
		delaynms(200);					 //每次延时函数必须时间足够长
	}
	WIFItest_boot=No;
		  						 
}


/************主函数(程序的入口)****************/
void main()
{ 		unsigned char a = 0;
	EA = 1;    		 	//开总中断
	Uart_Init();
	timer2_init();	

	WIFI_INIT();	  	//WIFI初始化   

	while(1)
	{
		Key_set_scan();//按键扫描 
		



	}
}



 /************串行口1中断处理函数*************/
void UART_1Interrupt(void) interrupt 4
{				                                                                                                                        
	unsigned char UART_data;
    unsigned char i;
//	unsigned char  a,b,c;	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      
	if(RI==1)
	{
		UART_data=SBUF;
		if(UART_data=='\n')
		{
			if(WIFI_receive[0]=='O'&&WIFI_receive[1]=='K')	 	WIFItest_boot=Yes;
			else if(WIFI_receive[0]=='+'&&WIFI_receive[1]=='C'&&WIFI_receive[2]=='I'&&WIFI_receive[3]=='F'&WIFI_receive[9]=='I'&&WIFI_receive[10]=='P')//+CIFSR:APIP,"192.168.4.1"
			{																					   //+CIFSR:APMAC,"5e:cf:7f:15:bd:62"
				for(i=0;i<11;i++)
				{
					IP_receive[i] = WIFI_receive[13+i];
				}
			}
//			else if(WIFI_receive[0]=='+'&&WIFI_receive[1]=='I'&&WIFI_receive[2]=='P'&&WIFI_receive[3]=='D')
//			{


//			}
			else if(WIFI_receive[2]=='C'&&WIFI_receive[3]=='O'&&WIFI_receive[4]=='N') 
			{
				xx_flag = 1;
			}
			else if(WIFI_receive[2]=='C'&&WIFI_receive[3]=='L'&&WIFI_receive[4]=='O') 
			{
				xx_flag = 0;
			}
			WIFIDATA_count=0;
		}
		else
		{
			WIFI_receive[WIFIDATA_count]=UART_data;
			WIFIDATA_count++;
		}
	}
	RI=0;
}

void timer2()interrupt 5 using 1 //定时器2中断处理函数  2ms
{
	static unsigned int ms3 = 0;

    TF2 = 0;
 
	ms3++;
	if(ms3>=200)
	{
		flag2s = 1;
		ms3 = 0;
	}
}


接受模块代码
main.c

#include<reg52.h>
#include<intrins.h>
#include <stdio.h>
//#include <stdlib.h>
#include "uart.h"
#include "ds1602.c"
sbit P22 = P2^2;
sbit P32 = P3^2;
sbit P33 = P3^3;
sbit P34 = P3^4;
sbit P35 = P3^5;

sfr ISP_DATA  = 0xe2;		// 数据寄存器
sfr ISP_ADDRH = 0xe3;		// 地址寄存器高八位
sfr ISP_ADDRL = 0xe4;		// 地址寄存器低八位
sfr ISP_CMD   = 0xe5;		// 命令寄存器
sfr ISP_TRIG  = 0xe6;		// 命令触发寄存器
sfr ISP_CONTR = 0xe7;		// 命令寄存器

sfr T2MOD  = 0xC9;
#define Yes		1
#define No		0
/********测试WIFI是否启动**********/
int WIFItest_boot=0;
/********WIFI串口接收数据缓存**********/
unsigned char xdata WIFI_receive[45]; 
unsigned char xdata IP_receive[11];
/********WIFI串口接收计数器**********/
unsigned char WIFIDATA_count;
bit xx_flag;  //手机连接标志 
bit flag2s = 0; 
bit flag1 = 0;

char mode=0,mode1=0,mode2,qia_time=10,da_time=30;
unsigned char H_buff[5];
unsigned char moshi=0,num3,num2;
unsigned char jibie=0,cp,cp1,sec;
unsigned char count = 0;







/*****************************************************************************
延迟函数
/****************************************************************************/
void Delay_Ms (unsigned int a)
{
	unsigned int i;
	while( a-- != 0)
	{
		for(i = 0; i < 600; i++);
	}
}


void Key_set_scan()
{
	uchar i;
	if(P32 == 0 )
	{
		while(P32 == 0);
		LCD_clr1602();
		mode1 = 0;
			num3 = 0;
		num2 = 0;
		P22 = 1;
		mode ++;
		
		if(mode >= 3)mode=0;
	}
		if(P33 == 0 )
	{
		while(P33 == 0);
		if(mode == 1)
		{
			qia_time ++;
			if(qia_time >= 60)qia_time=60;
		}
		if(mode == 2)
		{
			da_time ++;
			if(da_time >= 60)da_time=60;
		}
	}
		if(P34 == 0 )
	{
		while(P34 == 0);
		if(mode == 1)
		{
			qia_time --;
			if(qia_time <= 0)qia_time=0;
		}
		if(mode == 2)
		{
			da_time ++;
			if(da_time <= 0)da_time=0;
		}
	}
		if(P35 == 0 )
	{
		while(P35 == 0);
		LCD_clr1602();
		num3 = 0;
		num2 = 0;
			for(i=0;i<11;i++)
				{
					WIFI_receive[i] = 0;
				}
		flag1 =0;
		if(mode == 0)mode1 ++;
		if(mode1 >= 2)mode1=0;
	}
	
	
	
	
}

/*------------------------------------------------
                    定时器初始化子程序
------------------------------------------------*/
void timer2_init()								    //定时器2初始化 2毫秒@11.0592MHz 
{													
 T2CON=0; 											//设置定时器的T2CON,设置T2为内部定时器,T2EX的跳变对定时器2无效 
 T2MOD=0;											//定时器2输出使能,定时器递增计数 
 /// 以下设置将定时器2的输出频率设置成42HZ/// 	  
 RCAP2H = 0xCD;					    //设置定时器2的RCAP2H为254		  
 RCAP2L = 0xF8;						//设置定时器2的RCAP2L为255 

 TH2    = RCAP2H; 									//将RCAP2H中的值(254)重装到TH2中 
 TL2    = RCAP2L; 									//将RCAP2L中的值(255)重装到TL2中 
 ///													
 TR2    = 1;									    //开启定时器2计数 
 ET2    = 1;									    //开启定时器2中断 
 EA     = 1; 									    //开总中断 
}


/*
AT+E=ON
 AT+CWMODE=1

AT+RST

 AT+CWJAP="TTl",""
AT+CIPSTART="TCP","192.168.4.1",5000
+IPD,8:Dowm:P23

*/

void WIFI_INIT()
{
	WIFItest_boot=No;					 //测试是否已经开机
	while(WIFItest_boot==No)
	{
		Send_String("AT\r\n");
		delaynms(200);	
	} 
	WIFItest_boot=No;    				 //设置为sta模式	 
	while(WIFItest_boot==No)
	{
		Send_String("AT+CWMODE=1\r\n");
		delaynms(200);
	}
WIFItest_boot=No;					 //设置为多连接模式
	while(WIFItest_boot==No)
	{
		Send_String("AT+CWJAP=\"TTl\",\"\"\r\n");
		delaynms(600);
	}
	WIFItest_boot=No;					 //设置为服务器端口号为:5000
	while(WIFItest_boot==No)
	{
		Send_String("AT+CIPSTART=\"TCP\",\"192.168.4.1\",5000\r\n");

		delaynms(200);
	}

		  						 
}


/************主函数(程序的入口)****************/
void main()
{ 	
	unsigned char aa = 0,bb=0;
	EA = 1;    		 	//开总中断
	Uart_Init();
	timer2_init();	
init_1602();
	WIFI_INIT();	  	//WIFI初始化   
P22 = 1;
	while(1)
	{
		Key_set_scan();
				if(mode == 0&&mode1 == 0)
				{
						goto_xy(1,0);
						display_string("Welcome to ");
						goto_xy(2,0);
						display_string("responder");
				}
				if(mode == 1)
				{
						goto_xy(1,0);
						display_string("Rush time");
					
						goto_xy(2,0);
						display_num(qia_time);
				}
				if(mode == 2)
				{
						goto_xy(1,0);
						display_string("Answer time");
					
						goto_xy(2,0);
						display_num(da_time);
				}
				if(mode == 0&&mode1 == 2)
				{
					P22 = 1;
					bb = da_time-sec;
					if(bb <= 0)
					{
						bb = 0;
						sec=0;						
						mode1 = 0;
					}
					
					goto_xy(1,0);
						display_num(num2);
					goto_xy(2,0);
						display_num(bb);
				}
				if(mode == 0&&mode1 == 1)
				{
					aa = qia_time-sec;
					if(aa <= 0)
					{
								P22 = 1;
						aa = 0;	
							sec=0;
						mode1 = 0;
						
					}
					if(aa <= 5)
					{
						P22 = 0;
					}
					if(flag1 == 1)
					{
							sec=0;
							mode1 = 2;	
					}
					
					goto_xy(2,0);
						display_num(aa);
				}	
				if(mode1 == 0 &&flag1 == 1)
				{ 
					if(flag1 == 1)LCD_clr1602();
					flag1 = 0;
					mode = 3;
					
				}
				if(mode == 3)
				{
					P22 = 0;
					goto_xy(1,0);
						display_string("Error");
						goto_xy(2,0);
						display_num(num2);
				}

	}
}
 /************串行口1中断处理函数*************/
void UART_1Interrupt(void) interrupt 4
{				                                                                                                                        
	unsigned char UART_data;
//    unsigned char i;
//	unsigned char  a,b,c;	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      
	if(RI==1)
	{
		UART_data=SBUF;	

		if(UART_data=='\n')
		{
			
			if(WIFI_receive[0]=='O'&&WIFI_receive[1]=='K')	 	WIFItest_boot=Yes;
			

			//+IPD,8:Dowm:P23
			else if(WIFI_receive[0]=='+'&&WIFI_receive[1]=='I'&&WIFI_receive[2]=='P'&&WIFI_receive[3]=='D')
			{
//				if((WIFI_receive[7]=='D')&&(WIFI_receive[8]=='o')&&(WIFI_receive[9]=='w')&&(WIFI_receive[10]=='m')) 
//				{
						if(mode1 != 2 )	num3 = (WIFI_receive[13])*10+(WIFI_receive[14]);		
						if(num3 != 0 ) flag1 = 1;
						if(num3 == 26 )num2 = 1;
						if(num3 == 27 )num2 = 2;
						if(num3 == 28 )num2 = 3;
						if(num3 == 29 )num2 = 4;
						if(num3 == 30 )num2 = 5;
						if(num3 == 31 )num2 = 6;
						if(num3 == 32 )num2 = 7;
						if(num3 == 33 )num2 = 8;
						if(num3 == 36 )num2 = 9;
						if(num3 == 37 )num2 = 10;
						if(num3 == 38 )num2 = 11;
						if(num3 == 39 )num2 = 12;
						if(num3 == 40 )num2 = 13;
						if(num3 == 41 )num2 = 14;
						if(num3 == 42 )num2 = 15;
						if(num3 == 43 )num2 = 16;

//				}
				
		}

			WIFIDATA_count=0;
		}
		else
		{
			
			WIFI_receive[WIFIDATA_count]=UART_data;
			WIFIDATA_count++;
		}
	}
	RI=0;

}

void timer2()interrupt 5 using 1 //定时器2中断处理函数  2ms
{
		unsigned int ms3 = 0;

    TF2 = 0;
 
	ms3++;	
	if(mode1 != 0)cp++;
	if(ms3 >= 200)
	{
	
		flag2s = 1;
		ms3 = 0;
	}
	if(	cp >= 125)
	{
		cp=0;
			cp1 ++;
		if(cp1 >= 2)
		{
			cp1 = 0;
		sec++;
		}
		if(sec >=80)
		{
			sec = 0;
		
		}			
	
	}
	
}


1602.c

#define uchar unsigned char 
#define uint  unsigned int
 
sbit RS = P2^5;//数据/命令
sbit RW = P2^6;//读/写
sbit E  = P2^7;//使能
uchar i;
uchar str[] = {"Internet of Things00"};
uchar num[] = {"0123456789"};

void delayus(uint x)  //延时函数
{
	while(x--);
}

void write_com(uchar com)//写命令
{
	RW = 0;
	RS = 0;
	E = 1;
	P0 = com;
	delayus(100);
	E = 0;
}
void write_data(uchar da)//写入数据
{
	RW = 0;
	RS = 1;
	E = 1;
	P0 = da;
	delayus(100);
	E = 0;
}


void init_1602()	//LCD1602  初始化
{
	write_com(0x3c);//设定数据总线的个数4/8,显示一行/两行
	write_com(0x0c);//	  //光标不显示
	write_com(0x06);//	   //光标随字符右移
}
void LCD_clr1602()	//LCD1602  清屏
{
	write_com(0x01);	// 对字符串清0
	write_com(0x02);   //对光标清0
}

void goto_xy(uchar y,uchar x)    //定位显示位置
{
	if(y == 1)
		write_com(x + 0x80);		 //定位第一行
	else
		write_com(x + 0x80 + 0x40);	 //定位第二行
}

void display_num(unsigned char x)		 //显示数字
{
	write_data(num[x / 10%10]);	 
	write_data(num[x % 10]);
}

void display_num1(unsigned int x)		 //显示数字
{

	write_data(num[x / 100 % 10]);
	write_data(num[x / 10 % 10]);		 
	write_data(num[x % 10]);
}

void display_string(uchar *p)	 //显示字符
{
	while(*p)
	{
		write_data(*p);
		p++;	
	}
}
void display_xnum2(float x)		 //显示数字
{
	uint y,x1;
	
	y = (int)x;
	write_data(num[y / 10]);	 
	write_data(num[y % 10]);
	x1 = (int)((x -(float)y)*1000);
	display_string(".");
	write_data(num[x1 / 100 % 10]);
//	write_data(num[x1 / 10 % 10]);		 
//	write_data(num[x1 % 10]);
}
void display_xnum1(float x)		 //显示数字
{
	uint y,x1;
	
	y = (int)x;
	write_data(num[y / 100%10]);	 
	write_data(num[y / 10%10]);	 
	write_data(num[y % 10]);
	x1 = (int)((x -(float)y)*1000);
	display_string(".");
	write_data(num[x1 / 100 % 10]);
	write_data(num[x1 / 10 % 10]);		 

}

发送模块原理图
在这里插入图片描述

发送模块PCB
在这里插入图片描述

接受板原理图
在这里插入图片描述
发送板PCB
在这里插入图片描述
资源区会上传相关资源,积分下载

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
抢答器是一种常见的电子竞赛设备,可以用于比赛中进行答题抢答。基于stc89c52单片机抢答器设计,可以通过矩阵键盘实现抢答操作。下面是一个简单的抢答器设计流程: 1. 硬件设计 抢答器单片机、矩阵键盘、LED灯等组成。其中,矩阵键盘可选4x4或3x4型号,LED灯数量应与抢答者数量相同。将单片机IO口与矩阵键盘和LED灯连接,具体接线如下: - 矩阵键盘 将矩阵键盘的行列引脚分别连接到单片机的GPIO口,如下所示: ``` 矩阵键盘引脚 GPIO口 R1 P1.0 R2 P1.1 R3 P1.2 R4 P1.3 C1 P1.4 C2 P1.5 C3 P1.6 C4 P1.7 ``` - LED灯 将LED的正极连接到单片机的GPIO口,负极连接到GND,如下所示: ``` LED引脚 GPIO口 LED1 P2.0 LED2 P2.1 ... ``` 2. 软件设计stc89c52单片机上,可以使用C语言编写程序实现抢答器的功能。程序主要分为以下几个部分: - 初始化 在程序开始时,需要对单片机进行初始化。包括设置GPIO口的输入输出方向、开启中断、设置定时器等。 - 矩阵键盘扫描 在程序中需要不断扫描矩阵键盘,判断是否有按键按下。扫描时需要分别对每个列进行扫描,检测是否有行被按下,如果有则表示该键被按下,将按键的编号保存下来。 - 抢答 当有按键按下时,判断该按键对应的抢答者是否已经抢答过,如果没有则表示该抢答者抢答成功,相应的LED灯亮起。同时需要记录该抢答者的编号,以便后续统计成绩。 - 统计成绩 在比赛结束后,需要统计抢答者的成绩。根据记录下来的抢答者编号,可以进行相应的统计。比如,根据抢答时间的先后顺序,确定第一名、第二名等。 - 显示成绩 最后,将统计出的成绩显示在LED灯上,可以通过闪烁等方式进行显示。 以上是一个简单的基于stc89c52单片机抢答器设计流程,可以根据实际需求进行相应的修改和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

(~ ̄▽ ̄)~凤凰涅槃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值