蓝桥杯嵌入式第十五届模拟考试3解析

1  题目

2  程序

/* USER CODE BEGIN PTD */
char buf1[20],buf2[20],buf3[20],buf4[20],buf5[20],buf6[20],buf7[20],buf8[20],buf9[20];
struct keys
{
	int step;
	int length;
	int state;
}key[5];
int display;
double v1,v2;
int t;
double v1l=1.2,v1u=2.2,v2l=1.4,v2u=3.0;
double vu[6]={0,2.2,2.4,2.6,2.8,3.0},vl[6]={0,1.2,1.4,1.6,1.8,2.0};
int choice;
int i=1,j=1,k=2,p=5;
double ok1,nok1,ok2,nok2;
double p1,p2;
int led1,led2;
int cnt1,cnt2;
char tran[100],tran1[10]={"R37"},tran2[10]={"R38"};

/* USER CODE END PTD */

/* USER CODE BEGIN PFP */
double getADC()
{
	HAL_ADC_Start(&hadc1);
	HAL_ADC_Start(&hadc2);
	v1=HAL_ADC_GetValue(&hadc2);
//	t=100000; while(t--);
	v2=HAL_ADC_GetValue(&hadc1);
//	t=100000; while(t--);
	sprintf(buf2,"     R37:%.2lfV",v1*3.3/4096);
	sprintf(buf3,"     R38:%.2lfV",v2*3.3/4096);
}
void LED_CLOSE()
{
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15,GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	if(htim->Instance==TIM1)
	{
		key[1].state=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0);
		key[2].state=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1);
		key[3].state=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2);
		key[4].state=HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0);
		switch(key[1].step)
		{
			case 0:
			{
				if(key[1].state==GPIO_PIN_RESET)
				{
					key[1].step++;
				}
			}
			break;
			case 1:
			{
				if(key[1].state==GPIO_PIN_RESET)
				{
					display++;
					LCD_Clear(Black);
					if(display%3==0)
					{
						LCD_DisplayStringLine(Line1,(uint8_t*)buf1);
						LCD_DisplayStringLine(Line3,(uint8_t*)buf2);
						LCD_DisplayStringLine(Line4,(uint8_t*)buf3);
					}
					if(display%3==1)
					{
						LCD_DisplayStringLine(Line1,(uint8_t*)buf4);
						LCD_DisplayStringLine(Line3,(uint8_t*)buf5);
						LCD_DisplayStringLine(Line4,(uint8_t*)buf6);
					}
					if(display%3==2)
					{
						LCD_DisplayStringLine(Line1,(uint8_t*)buf7);
						LCD_DisplayStringLine(Line3,(uint8_t*)buf8);
						LCD_DisplayStringLine(Line4,(uint8_t*)buf9);
					}
					key[1].step++;
				}
				else
				{
					key[1].step=0;
				}
			}
			break;
			case 2:
			{
				if(key[1].state==GPIO_PIN_SET)
				{
					key[1].step=0;
				}
			}
			break;
		}
		
		
		if(display%3==1)
		{
			switch(key[2].step)
			{
				case 0:
				{
					if(key[2].state==GPIO_PIN_RESET)
					{
						key[2].step++;
					}
				}
				break;
				case 1:
				{
					if(key[2].state==GPIO_PIN_RESET)
					{
						choice++;
						key[2].step++;
					}
					else
					{
						key[2].step=0;
					}
				}
				break;
				case 2:
				{
					if(key[2].state==GPIO_PIN_SET)
					{
						key[2].step=0;
					}
				}
				break;
			}
		}
		
		
		if(display%3==0)
		{
			switch(key[2].step)
			{
				case 0:
				{
					if(key[2].state==GPIO_PIN_RESET)
					{
						key[2].step++;
					}
				}
				break;
				case 1:
				{
					if(key[2].state==GPIO_PIN_RESET)
					{
						if(v1*3.3/4096<vu[j]&&v1*3.3/4096>vl[i])
						{
							ok1++;
							led1=1;
						}
						else
						{
							nok1++;
						}
						p1=ok1/(ok1+nok1);
						sprintf(buf8,"     PR37:%.1lf%%",p1*100);
						//LCD_DisplayStringLine(Line3,(uint8_t*)buf8);
						key[2].step++;
					}
					else
					{
						key[2].step=0;
					}
				}
				break;
				case 2:
				{
					if(key[2].state==GPIO_PIN_SET)
					{
						key[2].step=0;
					}
				}
				break;
			}
		}
		
		if(display%3==1)
		{
			switch(key[3].step)
			{
				case 0:
				{
					if(key[3].state==GPIO_PIN_RESET)
					{
						key[3].step++;
					}
				}
				break;
				case 1:
				{
					if(key[3].state==GPIO_PIN_RESET)
					{
						if(choice%4==1)
						{
							i++;
							if(i==6) i=1;
							sprintf(buf5,"    SR37:%.1lf-%.1lf",vl[i],vu[j]);
							sprintf(buf6,"    SR38:%.1lf-%.1lf",vl[k],vu[p]);
							ok1=0;
							nok1=0;
							p1=0;
							sprintf(buf8,"     PR37:0.0%%");
						}
						if(choice%4==0)
						{
							j++;
							if(j==6) j=1;
							sprintf(buf5,"    SR37:%.1lf-%.1lf",vl[i],vu[j]);
							sprintf(buf6,"    SR38:%.1lf-%.1lf",vl[k],vu[p]);
							ok1=0;
							nok1=0;
							p1=0;
							sprintf(buf8,"     PR37:0.0%%");
						}
						if(choice%4==3)
						{
							k++;
							if(k==6) k=1;
							sprintf(buf5,"    SR37:%.1lf-%.1lf",vl[i],vu[j]);
							sprintf(buf6,"    SR38:%.1lf-%.1lf",vl[k],vu[p]);
							ok2=0;
							nok2=0;
							p2=0;
							sprintf(buf9,"     PR38:0.0%%"); 
						}
						if(choice%4==2)
						{
							p++;
							if(p==6) p=1;
							sprintf(buf5,"    SR37:%.1lf-%.1lf",vl[i],vu[j]);
							sprintf(buf6,"    SR38:%.1lf-%.1lf",vl[k],vu[p]);
							ok2=0;
							nok2=0;
							p2=0;
							sprintf(buf9,"     PR38:0.0%%"); 
						}
						
						LCD_DisplayStringLine(Line3,(uint8_t*)buf5);
						LCD_DisplayStringLine(Line4,(uint8_t*)buf6);
						key[3].step++;
					}
					else
					{
						key[3].step=0;
					}
				}
				break;
				case 2:
				{
					if(key[3].state==GPIO_PIN_SET)
					{
						key[3].step=0;
					}
				}
				break;
			}
		}
		
		if(display%3==0)
		{
			switch(key[3].step)
			{
				case 0:
				{
					if(key[3].state==GPIO_PIN_RESET)
					{
						key[3].step++;
					}
				}
				break;
				case 1:
				{
					if(key[3].state==GPIO_PIN_RESET)
					{
						if(v2*3.3/4096<vu[p]&&v2*3.3/4096>vl[k])
						{
							ok2++;
							led2=1;
						}
						else
						{
							nok2++;
						}
						p2=ok2/(ok2+nok2);
						sprintf(buf9,"     PR38:%.1lf%%",p2*100);
						//LCD_DisplayStringLine(Line3,(uint8_t*)buf8);
						key[3].step++;
					}
					else
					{
						key[3].step=0;
					}
				}
				break;
				case 2:
				{
					if(key[3].state==GPIO_PIN_SET)
					{
						key[3].step=0;
					}
				}
				break;
			}
		}
		if(display%3==1)
		{
			switch(key[4].step)
			{
				case 0:
				{
					if(key[4].state==GPIO_PIN_RESET)
					{
						key[4].step++;
					}
				}
				break;
				case 1:
				{
					if(key[4].state==GPIO_PIN_RESET)
					{
						if(choice%4==1)
						{
							i--;
							if(i==0) i=5;
							sprintf(buf5,"    SR37:%.1lf-%.1lf",vl[i],vu[j]);
							sprintf(buf6,"    SR38:%.1lf-%.1lf",vl[k],vu[p]);
						}
						if(choice%4==0)
						{
							j--;
							if(j==0) j=5;
							sprintf(buf5,"    SR37:%.1lf-%.1lf",vl[i],vu[j]);
							sprintf(buf6,"    SR38:%.1lf-%.1lf",vl[k],vu[p]);
						}
						if(choice%4==3)
						{
							k--;
							if(k==0) k=5;
							sprintf(buf5,"    SR37:%.1lf-%.1lf",vl[i],vu[j]);
							sprintf(buf6,"    SR38:%.1lf-%.1lf",vl[k],vu[p]);
						}
						if(choice%4==2)
						{
							p--;
							if(p==0) p=5;
							sprintf(buf5,"    SR37:%.1lf-%.1lf",vl[i],vu[j]);
							sprintf(buf6,"    SR38:%.1lf-%.1lf",vl[k],vu[p]);
						}
						LCD_DisplayStringLine(Line3,(uint8_t*)buf5);
						LCD_DisplayStringLine(Line4,(uint8_t*)buf6);
						key[4].step++;
					}
					else
					{
						key[4].step=0;
					}
				}
				break;
				case 2:
				{
					if(key[4].state==GPIO_PIN_SET)
					{
						key[4].step=0;
					}
				}
				break;
			}
		}
		
		if(display%3==2)
		{
			switch(key[4].step)
			{
				case 0:
				{
					if(key[4].state==GPIO_PIN_RESET)
					{
						key[4].step++;
					}
				}
				break;
				case 1:
				{
					if(key[4].state==GPIO_PIN_RESET)
					{
						ok1=0;
						nok1=0;
						p1=0;
						ok2=0;
						nok2=0;
						p2=0;
						sprintf(buf8,"     PR37:0.0%%");
						sprintf(buf9,"     PR38:0.0%%");
						LCD_DisplayStringLine(Line3,(uint8_t*)buf8);
						LCD_DisplayStringLine(Line4,(uint8_t*)buf9);
						key[4].step++;
					}
					else
					{
						key[4].step=0;
					}
				}
				break;
				case 2:
				{
					if(key[4].state==GPIO_PIN_SET)
					{
						key[4].step=0;
					}
				}
				break;
			}
		}
		getADC();
		if(display%3==0)
		{
			LCD_DisplayStringLine(Line1,(uint8_t*)buf1);
			LCD_DisplayStringLine(Line3,(uint8_t*)buf2);
			LCD_DisplayStringLine(Line4,(uint8_t*)buf3);
		}
		if(display%3==1)
		{
			LCD_DisplayStringLine(Line1,(uint8_t*)buf4);
			LCD_DisplayStringLine(Line3,(uint8_t*)buf5);
			LCD_DisplayStringLine(Line4,(uint8_t*)buf6);
		}
		if(display%3==2)
		{
			LCD_DisplayStringLine(Line1,(uint8_t*)buf7);
			LCD_DisplayStringLine(Line3,(uint8_t*)buf8);
			LCD_DisplayStringLine(Line4,(uint8_t*)buf9);
		}
		if(display%3==0)
		{
			HAL_GPIO_WritePin(GPIOC,GPIO_PIN_10,GPIO_PIN_RESET);
			HAL_GPIO_WritePin(GPIOC,GPIO_PIN_11|GPIO_PIN_12,GPIO_PIN_SET);
			HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
			HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
		}
		if(display%3==1)
		{
			HAL_GPIO_WritePin(GPIOC,GPIO_PIN_11,GPIO_PIN_RESET);
			HAL_GPIO_WritePin(GPIOC,GPIO_PIN_10|GPIO_PIN_12,GPIO_PIN_SET);
			HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
			HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
		}
		if(display%3==2)
		{
			HAL_GPIO_WritePin(GPIOC,GPIO_PIN_12,GPIO_PIN_RESET);
			HAL_GPIO_WritePin(GPIOC,GPIO_PIN_11|GPIO_PIN_10,GPIO_PIN_SET);
			HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
			HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
		}
		switch(led1)
		{
			case 0:
			{
				HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_SET);
				HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15,GPIO_PIN_SET);
				HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
				HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
			}
			break;
			case 1:
			{
				HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_RESET);
				HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15,GPIO_PIN_SET);
				HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
				HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
				cnt1++;
				if(cnt1==50)
				{
					cnt1=0;
					led1=0;
				}
			}
			break;
		}
		switch(led2)
		{
			case 0:
			{
				HAL_GPIO_WritePin(GPIOC,GPIO_PIN_9,GPIO_PIN_SET);
				HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15,GPIO_PIN_SET);
				HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
				HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
			}
			break;
			case 1:
			{
				HAL_GPIO_WritePin(GPIOC,GPIO_PIN_9,GPIO_PIN_RESET);
				HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15,GPIO_PIN_SET);
				HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
				HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
				cnt2++;
				if(cnt2==50)
				{
					cnt2=0;
					led2=0;
				}
			}
			break;
		}
	}
}

/* USER CODE END PFP */

/* USER CODE BEGIN 2 */
	LCD_Init();
	LCD_Clear(Black);
	LCD_SetBackColor(Black);
	LCD_SetTextColor(White);
	LED_CLOSE();
	HAL_TIM_Base_Start_IT(&htim1);
	sprintf(buf1,"       GOODS");
	sprintf(buf4,"      STANDARD");
	sprintf(buf5,"    SR37:1.2-2.2");
	sprintf(buf6,"    SR38:1.4-3.0");
	sprintf(buf7,"        PASS");
	sprintf(buf8,"     PR37:0.0%%");
	sprintf(buf9,"     PR38:0.0%%");
	HAL_UART_Receive_DMA(&huart1,(uint8_t*)tran,100);
	__HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE);
	LCD_DisplayStringLine(Line1,(uint8_t*)buf1);
	LCD_DisplayStringLine(Line3,(uint8_t*)buf2);
	LCD_DisplayStringLine(Line4,(uint8_t*)buf3);
	
  /* USER CODE END 2 */

void USART1_IRQHandler(void)
{
  /* USER CODE BEGIN USART1_IRQn 0 */
	if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE)==SET)
	{
		__HAL_UART_CLEAR_IDLEFLAG(&huart1);
		HAL_UART_DMAStop(&huart1);
		if(!strcmp(tran,tran1))
		{
			sprintf(zifuchuan,"R37:%d,%d,%.1lf%%",(int)ok1+(int)nok1,(int)ok1,p1*100);
			HAL_UART_Transmit_DMA(&huart1,(uint8_t*)zifuchuan,100);
		}
		else if(!strcmp(tran,tran2))
		{
			sprintf(zifuchuan,"R38:%d,%d,%.1lf%%",(int)ok2+(int)nok2,(int)ok2,p2*100);
			HAL_UART_Transmit_DMA(&huart1,(uint8_t*)zifuchuan,100);
		}
		else
		{
			HAL_UART_Transmit_DMA(&huart1,(uint8_t*)zifuchuan,0);
		}
		memset(tran,0,sizeof(tran));
		HAL_UART_Receive_DMA(&huart1,(uint8_t*)tran,100);
	}
	
  /* USER CODE END USART1_IRQn 0 */
  HAL_UART_IRQHandler(&huart1);
  /* USER CODE BEGIN USART1_IRQn 1 */

  /* USER CODE END USART1_IRQn 1 */
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

菜只因C

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

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

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

打赏作者

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

抵扣说明:

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

余额充值