Respuestas a preguntas anteriores de la competencia provincial de la competencia de recursos gratuitos Blue Bridge Cup: la décima (código provincial más notas)

Respuestas de la Décima Competencia Provincial del Grupo Single-chip de la Competencia de la Copa Blue Bridge (código más notas)


1. Tema

  He compartido el tema de los concursos provinciales y nacionales anteriores en el artículo anterior ( click para ver ) (recursos de disco en línea), si es necesario, vaya directamente a descargar, no los repetiré aquí.

Dos, archivo hexadecimal

El lector descarga este archivo y lo graba directamente en el microcontrolador con el software de grabación, ¡y está listo para usar!

Enlace: https://pan.baidu.com/s/1OQu0UORfoGjJJwGePCUeXA
Código de extracción: wxas

En tercer lugar, la implementación de la función principal

  Consejo: Durante la competición, es posible que solo la modificación de la función principal no sea suficiente. A veces es necesario prestar atención a si el código de cada piloto proporcionado por el oficial de la competición está escrito intacto. Por ejemplo, a veces, no escribe todos estos en el archivo .h, comente deliberadamente, debe averiguar qué funciones se necesitan en el archivo .c correspondiente y completarlas una por una.
Inserte la descripción de la imagen aquí
  Además, mi código está completamente escrito en un archivo, por lo que es más conveniente para los lectores usarlo. Puedes copiar directamente mi archivo .c o copiar y pegar el contenido, y ponerlo donde quieras.

En el código:

# include "reg52.h"
# include "iic.h"

sbit S4 = P3^3;
sbit S5 = P3^2;
sbit S6 = P3^1;
sbit S7 = P3^0;

sbit L1 = P0^0;
sbit L2 = P0^1;
sbit L3 = P0^2;
sbit L4 = P0^3;
sbit L5 = P0^4;

unsigned int rb2 = 0;				 //读取的电位器RB2的值
unsigned char duanma[18] = {
    
    0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,0xbf,0x7f};
unsigned char duanmadot [10] = {
    
    0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
unsigned int f_dat = 0;				 //用于显示的频率
unsigned int u_dat = 0;				 //用于显示的电压
unsigned char k4 = 1;                //S4的标志位,1为显示电压
bit k5 = 0;							 //S5的标志位,0为显示固定电压2V
bit k6 = 0;							 //S6的标志位,0为显示电压LED
bit k7 = 0;							 //S7的标志位,0为显示数码管
unsigned int f_c = 0;				 //定时器T0用来对脉冲计数
unsigned char count = 0;			 //定时器T1的计数变量

void SelectHC573 (unsigned char n)
{
    
    
	switch (n)
	{
    
    
		case 4:
			P2 = (P2 & 0x1f) | 0x80;break;
		case 5:
			P2 = (P2 & 0x1f) | 0xa0;break;
		case 6:
			P2 = (P2 & 0x1f) | 0xc0;break;
		case 7:
			P2 = (P2 & 0x1f) | 0xe0;break;
		case 0:
			P2 = (P2 & 0x1f) | 0x00;break;
	}
}

//========================初始化函数========================
void InitSystem ()
{
    
    
	SelectHC573(4);
	P0 = 0xff;
	SelectHC573(5);
	P0 = 0x00;
	SelectHC573(0);	
}
//==========================================================

//===================读取Rb2的值-AD转换=====================
void ReadRb2_ADC ()
{
    
    
	IIC_Start();
	IIC_SendByte(0x90);
	IIC_WaitAck();
	IIC_SendByte(0x43);		//注意
	IIC_WaitAck();
	
	IIC_Start();
	IIC_SendByte(0x91);
	IIC_WaitAck();
	rb2 = IIC_RecByte();
	IIC_SendAck(1);
	IIC_Stop();	
}
//==========================================================

//============写入PCF8591具体电压值-DA转换==================
void SetDat_DAC (unsigned int dat)
{
    
    
	IIC_Start();
	IIC_SendByte(0x90);
	IIC_WaitAck();
	IIC_SendByte(0x40);		 
	IIC_WaitAck();
	IIC_SendByte(dat);
	IIC_WaitAck();
	IIC_Stop();		
}
//==========================================================

//==================定时器初始化函数========================
void InitTime ()
{
    
    	
	TMOD = 0x16;
	
	TH0 = 0xff;
	TL0 = 0xff;
	
	TH1 = (65535 - 50000) / 256;
	TL1 = (65535 - 50000) % 256;

	TR0 = 1;
	TR1 = 1;

	ET0 = 1;
	ET1 = 1;
	EA = 1;
}
//==========================================================

//=================定时器中断服务函数=======================
void ServiceTime0 () interrupt 1
{
    
    
	f_c++;
}

void ServiceTime1 () interrupt 3
{
    
    
	TH1 = (65535 - 50000) / 256;
	TL1 = (65535 - 50000) % 256;
	
	count++;
	if (count == 20)
	{
    
    	
		count = 0;
		f_dat = f_c;
		f_c = 0;	
	}	
}
//==========================================================

//======================SMG相关函数=========================
void DelaySMG (unsigned int t)
{
    
    
	while (t--);
}

void ShowSMG_Bit (unsigned char pos,unsigned char dat)
{
    
    
	SelectHC573(7);
	P0 = 0xff;	
	SelectHC573(6);
	P0 = 0x01 << pos - 1;
	SelectHC573(7);
	P0 = dat;
	SelectHC573(0);	
}

void AllSMG(unsigned char dat)
{
    
    
	SelectHC573(6);
	P0 = 0xff;
	SelectHC573(7);
	P0 = dat;
	SelectHC573(0);	
}

void ShowSMG ()
{
    
    
	if(k4 == 1)				   //电压测量状态
	{
    
    
		ShowSMG_Bit (1,0xc1);
		DelaySMG(500);
		ShowSMG_Bit (6,duanmadot[u_dat / 100]);		   
		DelaySMG(500);
		ShowSMG_Bit (7,duanma[(u_dat / 10) % 10]);		   
		DelaySMG(500);
		ShowSMG_Bit (8,duanma[u_dat % 10]);		   
		DelaySMG(500);
		AllSMG(0xff);		
	}
	else if (k4 == 2)		  //频率测量状态
	{
    
    
		ShowSMG_Bit (1,duanma[15]);
		DelaySMG(500);
		if (f_dat > 99999)
		{
    
    
			ShowSMG_Bit (3,duanma[f_dat / 100000]);		   
			DelaySMG(500);	
		}
		if (f_dat > 9999)
		{
    
    
			ShowSMG_Bit (4,duanma[(f_dat / 10000) % 10]);		   
			DelaySMG(500);	
		}
		if (f_dat > 999)
		{
    
    
			ShowSMG_Bit (5,duanma[(f_dat / 1000) % 10]);		   
			DelaySMG(500);	
		}
		if (f_dat > 99)
		{
    
    
			ShowSMG_Bit (6,duanma[(f_dat / 100) % 10]);		   
			DelaySMG(500);	
		}
		if (f_dat > 9)
		{
    
    
			ShowSMG_Bit (7,duanma[(f_dat / 10) % 10]);		   
			DelaySMG(500);	
		}
		ShowSMG_Bit (8,duanma[f_dat % 10]);		   
		DelaySMG(500);	
		AllSMG(0xff);		
	}
}
//==========================================================

//======================浏览按键============================
void Delay_Key (unsigned char t)
{
    
    	
	while (t--);
}

void ScanKey ()
{
    
    
	if (S4 == 0)
	{
    
    
		Delay_Key (100);
		if (S4 == 0)
		{
    
    
			while (S4 == 0)
			{
    
    
				if (k7 == 0)
				{
    
    
					ShowSMG ();
				}	
			}
			if (k4 == 1)
			{
    
    
				k4 = 2;
			}	
			else if (k4 == 2)
			{
    
    
				k4 = 1;
			}
		}
	}
	if (S5 == 0)
	{
    
    
		Delay_Key (100);
		if (S5 == 0)
		{
    
    
			while (S5 == 0)
			{
    
    
				if (k7 == 0)
				{
    
    
					ShowSMG ();
				}	
			}
			k5 = ~k5;
		}
	}
	if (S6 == 0)
	{
    
    
		Delay_Key (100);
		if (S6 == 0)
		{
    
    
			while (S6 == 0)
			{
    
    
				if (k7 == 0)
				{
    
    
					ShowSMG ();
				}	
			}
			k6 = ~k6;
		}
	}
	if (S7 == 0)
	{
    
    
		Delay_Key (100);
		if (S7 == 0)
		{
    
    
			while (S7 == 0)
			{
    
    
				if (k7 == 0)
				{
    
    
					ShowSMG ();
				}	
			}
			k7 = ~k7;
		}
	}
}
//==========================================================

//====================LED显示函数===========================
void LEDRunning ()
{
    
    
	SelectHC573(4);
	if (k4 == 1)
	{
    
    
		L1 = 0;
		L2 = 1;
	}
	else if (k4 == 2)
	{
    
    
		L1 = 1;
		L2 = 0;
	}
	if (k5 == 1)
	{
    
    
		if ((u_dat < 150) | ((u_dat >= 250) & (u_dat < 350)))
		{
    
    
			L3 = 1;	
		}
		else if (((u_dat >= 150) & (u_dat < 250)) | (u_dat >= 350))
		{
    
    
			L3 = 0;	
		}
	}
	else if (k5 == 0)
	{
    
    
		L3 = 1;
	}
	if ((f_dat < 1000) | ((f_dat >= 5000) & (f_dat < 10000)))
	{
    
    
		L4 = 1;	
	}
	else if (((f_dat >= 1000) & (f_dat < 5000)) | (f_dat >= 10000))
	{
    
    
		L4 = 0;	
	}
	if (k5 == 0)
	{
    
    
		L5 = 1;
	}
	else if (k5 == 1)
	{
    
    
		L5 = 0;
	}
	SelectHC573(0);		
}
//==========================================================

//=======================主函数=============================
void main (void)
{
    
    
	InitSystem ();
	InitTime ();
	while (1)
	{
    
    	
		ScanKey ();	
		if (k5 == 0)						  //固定输出2V并显示在数码管上
		{
    
    
			SetDat_DAC (102.4);				  //5V对应255,2V对应102.4
			u_dat = 200;	
		}
		else if (k5 == 1)					  //输出的电压随Rb2的值变换而变化并显示在数码管上
		{
    
    									  
			ReadRb2_ADC ();
			u_dat = rb2 * 1.961;			  // 500 / 255 == 1.961
			//u_dat = rb2;
			SetDat_DAC(rb2);	
		}
		if (k7 == 0)
		{
    
    
			ShowSMG ();	
		}
		if (k6 == 0)
		{
    
    
			LEDRunning ();	
		}
		else if (k6 == 1)
		{
    
    
			SelectHC573(4);
			P0 = 0xff;	
		}
	}
}
//==========================================================

Cuarto, todo el archivo del proyecto

Enlace: https://pan.baidu.com/s/1Wmk1ANx–34niOe230p9Lg
Código de extracción: xo28

 Si no puede abrir este proyecto directamente, puede deberse a la versión de keil. Yo uso keil3. Si hay un problema, puede copiar directamente el contenido del archivo .c. Como dije antes, mi proceso de implementación es en un .c Realizado en el archivo, ¡conveniente para el uso de los lectores!

Inserte la descripción de la imagen aquí

Al final

Los amigos que lo necesiten pueden comentarme o escribirme en privado en cualquier momento para discutir problemas en el proceso de aprendizaje, y haré todo lo posible para brindar ayuda.


Cálido recordatorio: ¡ prestarme atención no es fácil perder el artículo!

Competencia de Blue Bridge Cup grupo de microcomputadoras de un solo chip anterior competencia provincial preguntas respuestas (código más comentarios) para el resto, ver- https : //blog.csdn.net/weixin_45386875/article/details/114136549

Supongo que te gusta

Origin blog.csdn.net/weixin_45386875/article/details/114208339
Recomendado
Clasificación