第七届蓝桥杯嵌入式(省赛)程序题

2023-05-16

第七届蓝桥杯(省赛)解读+程序

    • 解读:
      • 这里自己多读几遍设计任务以及要求再看下面
    • `A):先搭总体框架`
      • 各初始化函数:
        • `LCD初始化`
        • `按键初始化`
        • `ADC初始化`
        • `i2c初始化`
        • `USART2初始化`
        • `LED初始化`
      • 注:仅展示部分初始化函数,完整程序请下载工程查看
    • `B):LCD处理函数`
    • `C):按键处理函数`
    • `D):ADC处理函数`
    • `E):UART处理函数`
    • `F):LED处理函数`
    • `G):整体程序设计参考`
    • 完整工程下载

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


解读:

模拟液位检测系统中,实验设计任务要求:
在这里插入图片描述
依据实验设计任务,所要用到的片内,片外外设有:
1.ADC, 2.UART,3. LCD, 4.LED, 5.E2PROM, 6.按键

这里自己多读几遍设计任务以及要求再看下面

A):先搭总体框架

//引入头文件
#include "key.h"
#include "led.h"
#include "lcd.h"
#include "usart.h"
#include "i2c.h"
#include "adc.h"

//函数声明
void LCD_Proc(void);
void KEY_Proc(void);
void ADC_Proc(void);
void UART_Proc(void);


//主函数
int main(void)
{
  SysTick_Config(72000);//开启系统时钟
  
  STM3210B_LCD_Init();//LCD初始化四部曲
  LCD_Clear(Blue);
  LCD_SetBackColor(Blue);
  LCD_SetTextColor(White);
  
  KEY_Init(); //按键初始化
  ADC1_Init();//ADC初始化
  i2c_init(); //i2c初始化
  USART2_Init(9600);//串口初始化
  LED_Init();//初始化
  LED_Disp(ucLed);//LED功能函数
  i2c_read(pucTh, 0, 3);//i2c读取函数
	

  while(1)
  {
		ADC_Proc();
		LCD_Proc();
        KEY_Proc();
		UART_Proc();
  }
}


//LCD显示处理
void LCD_Proc(void)
{

}

//按键扫描
void KEY_Proc(void)
{
  
}
	

//ADC处理程序
void ADC_Proc(void)
{

}

//USART2处理程序
void UART_Proc(void)
{

}

void SysTick_Handler(void)
{
  ulTick_ms++;
}

// USART2中断处理程序
void USART2_IRQHandler(void)
{

}

LED的处理函数等会儿直接在系统滴答定时器里进行

各初始化函数:

LCD初始化

void STM3210B_LCD_Init(void)
{ 
	LCD_CtrlLinesConfig();
	dummy = LCD_ReadReg(0);	
	
	if(dummy == 0x8230){
		REG_8230_Init();
	}
	else{
		REG_932X_Init();	
	}
	dummy = LCD_ReadReg(0);	
}
*******************************************************

void LCD_Clear(u16 Color)
{
	u32 index = 0;
	LCD_SetCursor(0x00, 0x0000); 
	LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */
	for(index = 0; index < 76800; index++)
	{
		LCD_WriteRAM(Color);    
	}
}
*******************************************************
void LCD_SetBackColor(vu16 Color)
{
	BackColor = Color;
}
*******************************************************
void LCD_SetTextColor(vu16 Color)
{
	TextColor = Color;
}

按键初始化

void KEY_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  // 允许GPIOA和GPIOB时钟
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  // PA0和PA8浮空输入(复位状态,可以省略)
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_8;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  // PB1和PB2浮空输入(复位状态,可以省略)
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
}

ADC初始化

void ADC1_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct;
  ADC_InitTypeDef ADC_InitStruct;
  // 允许GPIOB和ADC1时钟
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
  // PB0-IN8模拟输入
  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;
  GPIO_Init(GPIOB, &GPIO_InitStruct);
  // 初始化ADC1
  ADC_InitStruct.ADC_Mode = ADC_Mode_Independent;  //ADC为独立工作模式
  ADC_InitStruct.ADC_ScanConvMode = DISABLE;//单通道模式
  ADC_InitStruct.ADC_ContinuousConvMode = ENABLE;//单次模式
  ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//触发方式,软件触发
  ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;//数据对齐方式右对齐
  ADC_InitStruct.ADC_NbrOfChannel = 1;//进行规则转换的ADC通道数目
  ADC_Init(ADC1, &ADC_InitStruct);
  // 配置通道8
  ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 1,
    ADC_SampleTime_1Cycles5);    
  // 配置通道16
  ADC_InjectedChannelConfig(ADC1, ADC_Channel_16, 1,
    ADC_SampleTime_239Cycles5);
  ADC_TempSensorVrefintCmd(ENABLE);	//使能或者失能温度传感器和内部参考电压通道
  ADC_AutoInjectedConvCmd(ADC1, ENABLE);//使能或者失能指定ADC在规则组转化后自动开始注入组转化
  // 启动ADC1
  ADC_Cmd(ADC1, ENABLE);   
  // 校准ADC1
  ADC_StartCalibration(ADC1);
  while(ADC_GetCalibrationStatus(ADC1));
}

i2c初始化

void i2c_init()
{
 GPIO_InitTypeDef GPIO_InitStructure;
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
 GPIO_InitStructure.GPIO_Pin = SDA_Pin | SCL_Pin;
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
 GPIO_Init(I2C_PORT, &GPIO_InitStructure);
}


USART2初始化

void USART2_Init(unsigned long ulBaud)
{
  GPIO_InitTypeDef GPIO_InitStruct;
  USART_InitTypeDef USART_InitStruct;
  NVIC_InitTypeDef NVIC_InitStruct;
  // 允许GPIOA和USART2时钟
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
  // PA2-TX2复用推挽输出
  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2;
  GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOA, &GPIO_InitStruct);
  // PA3-TX2浮空输入(复位状态,可以省略)
  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3;
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOA, &GPIO_InitStruct); 
  // 初始化USART2(波特率ulBaud,默认8个数据位,1个停止位,无校验,允许Rx和Tx)
  USART_InitStruct.USART_BaudRate = ulBaud;
  USART_InitStruct.USART_WordLength = USART_WordLength_8b;
  USART_InitStruct.USART_StopBits = USART_StopBits_1;
  USART_InitStruct.USART_Parity = USART_Parity_No;
  USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  USART_InitStruct.USART_HardwareFlowControl
    = USART_HardwareFlowControl_None;
  USART_Init(USART2, &USART_InitStruct);
  // 允许USART2
  USART_Cmd(USART2, ENABLE);
  //中断优先级组
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  // 允许USART2接收中断
  USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);	
  // 允许NVIC USART2中断
  NVIC_InitStruct.NVIC_IRQChannel = USART2_IRQn;
  NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
  NVIC_InitStruct.NVIC_IRQChannelSubPriority = 2;
  NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStruct);
}

LED初始化

void LED_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct;
	
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
	
  GPIO_InitStruct.GPIO_Pin = 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_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOC, &GPIO_InitStruct);
	
  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2;
  GPIO_Init(GPIOD, &GPIO_InitStruct);
}

*******************************************************

void LED_Disp(unsigned char ucLed)
{
  GPIO_Write(GPIOC, ~ucLed << 8);
  GPIO_SetBits(GPIOD,GPIO_Pin_2);
  GPIO_ResetBits(GPIOD,GPIO_Pin_2);
}

注:仅展示部分初始化函数,完整程序请下载工程查看


B):LCD处理函数

在这里插入图片描述

在这里插入图片描述

要做两面屏,并且通过B1按键切换,这里可以设置标志位,等做按键的时候通过标志位切换
第一面屏中液位等级,液位高度,R37电压采集值均为变量
第二面屏通过B2按键上下切换,且颜色突出显示,这里同样可以通过改变标志位切换
第二面屏的阈值可以通过B3,B4改变,同样设立变量先行替代

LCD程序设计如下

unsigned char ucState,pucStr[21], ucHeight, ucLevel,pucTh[3];
unsigned int Vadc_Val;
float temp;

void LCD_Proc(void)
{
   

  if(!ucState)//	ucState   标志位										
  {
    LCD_DisplayStringLine(Line1, (u8*)"    Liquid Level    ");

    sprintf((char*)pucStr, "    Height:%03dcm     ", ucHeight);//ucHeight 液位高度
    LCD_DisplayStringLine(Line4, pucStr);

    temp = (float)Vadc_Val*3.3/4095;
    sprintf((char*)pucStr, "    ADC:  %4.2fV      ", temp);//temp  R37电压采集
    LCD_DisplayStringLine(Line6, pucStr);

    sprintf((char*)pucStr, "    Level: %1u        ", ucLevel);//ucLevel  液位等级
    LCD_DisplayStringLine(Line8, pucStr);
  }
  else													// 阈值设置
  {
    LCD_DisplayStringLine(Line1, (u8*)"  Parameter Setup   ");
	sprintf((char*)pucStr, "  Threshold1:%02dcm   ", pucTh[0]);  //pucTh[0]   阈值1
	
    if(ucState == 1)
	LCD_SetBackColor(Magenta);
    LCD_DisplayStringLine(Line4, pucStr);
    LCD_SetBackColor(Blue);
	sprintf((char*)pucStr, "  Threshold2:%02dcm   ", pucTh[1]); //pucTh[1]  阈值2
	
	if(ucState == 2)
	LCD_SetBackColor(Magenta);
    LCD_DisplayStringLine(Line6, pucStr);
    LCD_SetBackColor(Blue);
	sprintf((char*)pucStr, "  Threshold3:%02dcm   ", pucTh[2]); //pucTh[2]  阈值3
    if(ucState == 3) 
	LCD_SetBackColor(Magenta);
    LCD_DisplayStringLine(Line8, pucStr);
    LCD_SetBackColor(Blue);
	}
}

C):按键处理函数

实验按键功能:
B1:第一二屏切换
B2:第二屏的上下切换
B3:阈值+5cm
B4:阈值-5cm
注:阈值的范围为5—95,设计时应该加入限制条件,并保存在E2PROM。

//按键扫描
void KEY_Proc(void)
{
  unsigned char ucKey_Val;

  ucKey_Val = KEY_Scan();
  if(ucKey_Val != ucKey_Long)
    ucKey_Long = ucKey_Val;
  else
    ucKey_Val = 0;

  switch(ucKey_Val)
  {
    case 1:												// B1: 设置键
      if(!ucState)
        ucState = 1;
      else
      {
        if(pucTh[0] < pucTh[1] && pucTh[1] < pucTh[2])
        {
          LCD_DisplayStringLine(Line3, (u8*)"                    ");

          i2c_write(pucTh, 0, 3);							// 保存阈值
          ucState = 0;
        }
        else
        {
          LCD_SetTextColor(Red);
          LCD_DisplayStringLine(Line3, (u8*)"  Threshold Error   ");
          LCD_SetTextColor(White);
        }
      }
      break;
    case 2:												// B2: 切换键
      if(ucState)
        if(++ucState == 4)
          ucState = 1;
      break;
    case 3:												// B3: 阈值加
      if(ucState)
        if(pucTh[ucState-1] < 95)
          pucTh[ucState-1] += 5;
      break;
    case 4:												// B4: 阈值减
      if(ucState)
        if(pucTh[ucState-1] > 5)
          pucTh[ucState-1] -= 5;
  }
}

D):ADC处理函数

ADC处理函数功能:
R37电压采集,以及液位高度的转换,液位等级的设置,这里与阈值设定关联。

void ADC_Proc(void)
{
  if(!ucState && ucSec != ucSec1)
  {
    ucSec1 = ucSec;

    Vadc_Val = ADC1_Conv();							// 获取转换值
    ucHeight = Vadc_Val*100/4095;						// 计算液位高度
	//ucHeight =(temp/3.3)*100;//注:此种转换值只能到99;

    if(ucHeight < pucTh[0])
      ucLevel = 0;
    else if(ucHeight < pucTh[1])
      ucLevel = 1;
    else if(ucHeight < pucTh[2])
      ucLevel = 2;
    else
      ucLevel = 3;
	
	 }
}

注:
ucHeight = Vadc_Val*100/4095; // 计算液位高度
ucHeight =(temp/3.3)*100;//注:此种转换值只能到99;
这两种计算结果第一种直接用R37采集到的电压值转换的更为准确,

E):UART处理函数

UART处理函数功能:
在这里插入图片描述

UART程序设计如下
程序功能:如4.1查询

//USART2处理程序
void UART_Proc(void)
{
   if(pucRcv[0] == 'C')
    printf("C:H%02u+L%1u\r\n", ucHeight, ucLevel);
  if(pucRcv[0] == 'S')
    printf("S:TL%02u+TM%02u+TH%02u\r\n", pucTh[0], pucTh[1], pucTh[2]);
	
								
  	pucRcv[0] = 0;
}

*******************************************************


// USART2中断处理程序
void USART2_IRQHandler(void)
{
	pucRcv[0] = USART_ReceiveData(USART2);
}

4.2输出所要实现的功能可以放入ADC处理函数中,这样液位等级在改变同时自动输出到串口


把该条件放入ADC_Proc中,实现4.2输出的功能
 if(ucLevel != ucLevel1)
    {
           (ucLevel > ucLevel1)?
			printf("A:H%02u+L%1u+U\r\n", ucHeight, ucLevel)
			: printf("A:H%02u+L%1u+D\r\n", ucHeight, ucLevel);
			ucLevel1 = ucLevel;
     											
   }

F):LED处理函数

这里我们直接在SysTick_Handler里面处理
要求实现功能:
在这里插入图片描述
思路:
LED1: 一直闪烁,间隔1s(没什么好说的)
LED2: 液位等级变化时候,UART会发送数据,LED指示灯会工作,可以放到一起
LED3:设备接受到查询指令时候,会工作,可以放到UART里面
这里同样设立标志位,为该标志位时候执行对应功能,屡试不爽。

void SysTick_Handler(void)
{
  ulTick_ms++;

  if(ulTick_ms%1000 == 0)
  {
    ucSec++;
    ucLed ^= 1;											// LED1闪烁
		
  }

  if(ucLd2)												// 等级改变
  {
    if(ulTick_ms%200 == 0)
    {
      if(ucNum--)
        ucLed ^= 2;										// LED2闪烁5次
      else
      {
			ucLd2 = 0;
		    ucNum = 10;
      }
    }
  }

  if(ucLd3)												// 串口查询
  {
    if(ulTick_ms%200 == 0)
    {
      if(ucNum--)
        ucLed ^= 4;										// LED3闪烁5次
      else
      {
        ucLd3 = 0;
        ucNum = 10;
      }
    }
  }
  LED_Disp(ucLed);
}

G):整体程序设计参考

#include "key.h"
#include "led.h"
#include "lcd.h"
#include "usart.h"
#include "i2c.h"
#include "adc.h"

unsigned int uiAdc_Val;
unsigned char ucHeight, ucLevel, ucLevel1;
unsigned char ucState, pucStr[21], pucTh[3], pucRcv[1];
unsigned char ucLed, ucLd2, ucLd3, ucNum = 10;
unsigned char ucSec, ucSec1, ucKey_Long;
unsigned long ulTick_ms;

void KEY_Proc(void);
void LCD_Proc(void);
void ADC_Proc(void);
void UART_Proc(void);

int main(void)
{
  SysTick_Config(72000);
 

  STM3210B_LCD_Init();
  LCD_Clear(Blue);
  LCD_SetBackColor(Blue);
  LCD_SetTextColor(White);
  KEY_Init();
  LED_Init();
  USART2_Init(9600);
  i2c_init();
  ADC1_Init();
	
  i2c_read(pucTh, 0, 3);
  if(pucTh[0] > 100) pucTh[0] = 10;
  if(pucTh[1] > 100) pucTh[0] = 20;
  if(pucTh[2] > 100) pucTh[0] = 30;
	
  while(1)
  {
    KEY_Proc();
    LCD_Proc();
    ADC_Proc();
    UART_Proc();
  }
}

void KEY_Proc(void)
{
  unsigned char ucKey_Val;

  ucKey_Val = KEY_Scan();
  if(ucKey_Val != ucKey_Long)
    ucKey_Long = ucKey_Val;
  else
    ucKey_Val = 0;

  switch(ucKey_Val)
  {
    case 1:												// B1: 设置键
      if(!ucState)
        ucState = 1;
      else
      {
        if(pucTh[0] < pucTh[1] && pucTh[1] < pucTh[2])
        {
          LCD_DisplayStringLine(Line3, (u8*)"                    ");

          i2c_write(pucTh, 0, 3);							// 保存阈值
          ucState = 0;
        }
        else
        {
          LCD_SetTextColor(Red);
          LCD_DisplayStringLine(Line3, (u8*)"  Threshold Error   ");
          LCD_SetTextColor(White);
        }
      }
      break;
    case 2:												// B2: 切换键
      if(ucState)
        if(++ucState == 4)
          ucState = 1;
      break;
    case 3:												// B3: 阈值加
      if(ucState)
        if(pucTh[ucState-1] < 95)
          pucTh[ucState-1] += 5;
      break;
    case 4:												// B4: 阈值减
      if(ucState)
        if(pucTh[ucState-1] > 5)
          pucTh[ucState-1] -= 5;
  }
}

void LCD_Proc(void)
{
  float temp;

  if(!ucState)											// 液位检测
  {
    LCD_DisplayStringLine(Line1, (u8*)"    Liquid Level    ");

    sprintf((char*)pucStr, "    Height:%03ucm    ", ucHeight);
    LCD_DisplayStringLine(Line4, pucStr);

    temp = (float)uiAdc_Val*3.3/4095;
    sprintf((char*)pucStr, "    VR37:  %4.2fV    ", temp);
    LCD_DisplayStringLine(Line6, pucStr);

    sprintf((char*)pucStr, "    Level: %1u        ", ucLevel);
    LCD_DisplayStringLine(Line8, pucStr);
  }
  else													// 阈值设置
  {
    LCD_DisplayStringLine(Line1, (u8*)"  Threshold Setup   ");

    sprintf((char*)pucStr, "  Threshold 1:%02ucm  ", pucTh[0]);
    if(ucState == 1) LCD_SetBackColor(Red);
    LCD_DisplayStringLine(Line4, pucStr);
    LCD_SetBackColor(Blue);

    sprintf((char*)pucStr, "  Threshold 2:%02ucm  ", pucTh[1]);
    if(ucState == 2) LCD_SetBackColor(Red);
    LCD_DisplayStringLine(Line6, pucStr);
    LCD_SetBackColor(Blue);

    sprintf((char*)pucStr, "  Threshold 3:%02ucm  ", pucTh[2]);
    if(ucState == 3) LCD_SetBackColor(Red);
    LCD_DisplayStringLine(Line8, pucStr);
    LCD_SetBackColor(Blue);
  }
}

void ADC_Proc(void)
{
  if(!ucState && ucSec != ucSec1)
  {
    ucSec1 = ucSec;

    uiAdc_Val = ADC1_Conv();							// 获取转换值
    ucHeight = uiAdc_Val*100/4095;						// 计算液位高度

    if(ucHeight < pucTh[0])
      ucLevel = 0;
    else if(ucHeight < pucTh[1])
      ucLevel = 1;
    else if(ucHeight < pucTh[2])
      ucLevel = 2;
    else
      ucLevel = 3;

    if(ucLevel != ucLevel1)
    {
      if(ucLevel > ucLevel1)								// 液位升高
        printf("A:H%02u+L%1u+U\r\n", ucHeight, ucLevel);
      else												// 液位降低
        printf("A:H%02u+L%1u+D\r\n", ucHeight, ucLevel);

      ucLevel1 = ucLevel;
      ucLd2 = 1;											// 等级改变
    }
  }
}

void UART_Proc(void)
{
  if(pucRcv[0] == 'C')
    printf("C:H%02u+L%1u\r\n", ucHeight, ucLevel);
  if(pucRcv[0] == 'S')
    printf("S:TL%02u+TM%02u+TH%02u\r\n", pucTh[0], pucTh[1], pucTh[2]);
  if(pucRcv[0] == 'C' || pucRcv[0] == 'S')
    ucLd3 = 1;											// 串口查询
  pucRcv[0] = 0;
}
// SysTick中断处理程序
void SysTick_Handler(void)
{
  ulTick_ms++;

  if(ulTick_ms%1000 == 0)
  {
    ucSec++;
    ucLed ^= 1;											// LD1闪烁
  }

  if(ucLd2)												// 等级改变
  {
    if(ulTick_ms%200 == 0)
    {
      if(ucNum--)
        ucLed ^= 2;										// LD2闪烁5次
      else
      {
        ucLd2 = 0;
        ucNum = 10;
      }
    }
  }

  if(ucLd3)												// 串口查询
  {
    if(ulTick_ms%200 == 0)
    {
      if(ucNum--)
        ucLed ^= 4;										// LD3闪烁5次
      else
      {
        ucLd3 = 0;
        ucNum = 10;
      }
    }
  }
  LED_Disp(ucLed);
}
// USART2中断处理程序
void USART2_IRQHandler(void)
{
	pucRcv[0] = USART_ReceiveData(USART2);
}

完整工程下载

选择第4个工程

作者:江多多(在校学生)
版权所有,欢迎保留原文链接进行转载:)

不忘初心,牢记使命,励志成为一名优秀的嵌入式工程师! (我的第四篇博客)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

第七届蓝桥杯嵌入式(省赛)程序题 的相关文章

  • 计算机视觉(三)--- 图像到图像的映射(全景拼接)

    目录 1 基本介绍 2 RANSAC 3 单应性矩阵估计 4 全景图像 1 基本介绍 引言 众所周知 xff0c 在我们拍摄风光摄影时 xff0c 广角镜头是使用频率最高的镜头 xff0c 特别是拍摄那些波澜壮阔的大场景风光 而且镜头可谓是
  • 机器学习课后练习题(期末复习题目附答案)

    此为第一章绪论部分 一 单选题 1 移动运营商对客户的流失进行预测 可以使用下面哪种机器学习方法比较合适 A 一元线性回归分析 B 关联方法 C 聚类算法 D 多层前馈网络 正确答案 A 2 下面哪种说法有关机器学习的认识是错误的 A 高质
  • STM32野火教程学习笔记

    欢迎使用STM32 虽然经历了疫情期间的价格起飞 xff0c 但是STM32系列的单片机仍然是各个控制领域内主流的微控制器 它是控制人的必修课之一 STM32的编程方法 我们在学习51单片机的时候 xff0c 通常是通过编写程序直接对其输入
  • Docker的使用

    目录 Docker概念 Docker安装 配置docker加速器 Docker命令 docker进程命令 docker镜像命令 容器命令 Docker容器的数据卷 数据卷概念 数据卷配置 数据卷容器 docker部署mysql 1 搜索my
  • launch启动文件的使用方法

    launch文件 xff1a 脚本 xff0c 可以把很多节点的启动写进去 Launch文件语法 1 lt launch gt launch文件中的根元素采用 lt launch gt 标签定义 2 lt node gt pkg xff1a
  • 基于单片机的电子万年历的设计

    文末下载完整资料 基于51单片机的电子万年历的设计 摘 要 电子万年历是单片机系统的一个应用 xff0c 由硬件和软件相配合使用 硬件由主控器 时钟电路 温度检测电路 显示电路 键盘接口5个模块组成 主控模块用AT89C52 时钟电路用时钟
  • 基于单片机的数字钟设计

    文末下载完整资料 摘 要 基于单片机的定时和控制装置在许多行业有着广泛的应用 xff0c 而数字钟是其中最基本的 xff0c 也是最具有代表性的一个例子 在基于单片机系统的数字钟电路中 xff0c 除了基本的单片机系统和外围电路外 xff0
  • 电子设计大赛-电源电路

    文末下载完整资料 集成直流稳压电源的设计 直流稳压电源是电子设备的能源电路 xff0c 关系到整个电路设计的稳定性和可靠性 xff0c 是电路设计中非常关键的一个环节 本节重点介绍三端固定式 xff08 正 负压 xff09 集成稳压器 三
  • 总线的分类和区别

    总线分类 xff1a 点击查看原文 全套资料免费下载 xff1a 关注v x 公 众 号 xff1a 嵌入式基地 后 台 回 复 xff1a 电赛 即可获资料 回复 编程 即可获取 包括有 xff1a C C 43 43 C JAVA Py
  • 电子设计大赛-室内可见光定位装置

    室内可见光定位装置 1 1 设计任务 设计并制作可见光室内定位装置 xff0c 其构成示意图如图 1 所示 参赛者自行搭建不小于 80cm 80cm 80cm 的立方空间 xff08 包含顶部 底部和 3 个侧面 xff09 顶部平面放置
  • 嵌入式面试题

    首先给大家分享一个在线练习面试题的网站 xff1a 牛客网 该网站包含使用实例 应用技巧 基本知识点总结和需要注意事项 xff0c 具有参考价值 xff0c 需要的朋友可以参考一下 嵌入式面试题 点击进行练习 嵌入式面试题 第一部分 xff
  • ESP32 DIY 机器狗

    关注v x 公 众 号 xff1a 嵌入式基地 后 台 回 复 xff1a 电赛 即可获资料 回复 编程 即可获取 包括有 xff1a C C 43 43 C JAVA Python JavaScript PHP 数据库 微信小程序 人工智
  • 半桥与全桥的优缺点

    关注v x 公 众 号 xff1a 嵌入式基地 后 台 回 复 xff1a 电赛 即可获资料 回复 编程 即可获取 包括有 xff1a C C 43 43 C JAVA Python JavaScript PHP 数据库 微信小程序 人工智
  • 分享几个适合新手的C/C++开源项目

    分享几个适合新手的C C 43 43 开源项目 今天主要给大家分享一些github内适合初学者练手的c c 43 43 开源项目 所有项目均提供项目下载地址 xff0c 无法使用github的读者 xff0c 也可以在文末进行获取 如果说不
  • 树莓派VNC viewer显示cannot currently show the desktop的三种可能与解决办法(自己遇到过的)

    一 储存空间满了 var cache apt archives提示空间不够 xff0c 下线后再次连接VNC可能会黑屏 xff0c 改分辨率没有用 解决方法 xff1a sudo apt span class token operator
  • 程序员常用刷题网站分享

    1 牛客网 https www nowcoder com link pc csdncpt qrsjd c 该网站内集成了面试 题库 社群交流 课程教育 面试 招聘内推等多个模块 另外还是一个交流学习的平台 xff0c 在该网站经常会有大佬对
  • C语言刷题(二)

    作者简介 xff1a 大家好我是 xff1a 嵌入式基地 xff0c 是一名嵌入式工程师 xff0c 希望一起努力 xff0c 一起进步 xff01 x1f4c3 个人主页 xff1a 嵌入式基地 x1f525 系列专栏 xff1a 牛客网
  • 嵌入式软件工程师面试题(八)

    作者简介 xff1a 大家好我是 xff1a 嵌入式基地 xff0c 是一名嵌入式工程师 xff0c 希望一起努力 xff0c 一起进步 xff01 x1f4c3 个人主页 xff1a 嵌入式基地 x1f525 系列专栏 xff1a 嵌入式
  • 嵌入式软件工程师面试题(九)

    作者简介 xff1a 大家好我是 xff1a 嵌入式基地 xff0c 是一名嵌入式工程师 xff0c 希望一起努力 xff0c 一起进步 xff01 x1f4c3 个人主页 xff1a 嵌入式基地 x1f525 系列专栏 xff1a 嵌入式
  • 单片机、嵌入式的大神都平时浏览什么网站?

    单片机 嵌入式的大神都平时浏览什么网站 xff1f 1 基础学习 xff08 C C 43 43 xff0c Linux基础等 xff09 菜鸟教程 xff08 C语言学习 xff09 c语言中文网计算机科学网站 xff08 C语言部分 x

随机推荐

  • 一文读懂锁相环基本原理

    1 锁相环是什么 xff1f 锁相环电路是使一个特殊系统跟踪另外一个系统 xff0c 更确切的说是一种输出信号在频率和相位上能够与输入参考信号同步的电路 xff0c 它是模拟及数模混合电路中的一个基本的而且是非常重要的模块 2 锁相环基本理
  • 史上最全—毕业设计答辩技巧

    史上最全 毕业设计答辩技巧 一 常见问题二 答辩技巧三 论文答辩 图表穿插四 论文答辩 语流适中五 论文答辩六 论文答辩七 论文答辩八 论文答辩 紧扣主题九 论文答辩 人称使用十 完整版下载 一 常见问题 1 自己为什么选择这个课题 xff
  • 毕业设计答辩常见问题汇总

    毕设答辩常见问题汇总 1 P0 口需不需要加上拉电阻问题 xff1f 2 本课题的选课背景 意义等等 xff1f 3 数码管采用的是什么扫描方式 xff1f 4 蜂鸣器或继电器的驱动三极管为什么选用pnp型的 xff08 9012 8550
  • 【C语言】判断素数的函数

    文章目录 一 函数描述二 素数定义三 函数实现 一 函数描述 自定义一个函数 xff0c 传入一个整数n xff0c 判断是否为素数 若是返回1 xff0c 否则返回0 二 素数定义 素数又称质数 一个大于1的自然数 xff0c 除了1和它
  • 【C语言】判断闰年的函数

    文章目录 一 函数描述二 相关说明三 函数实现 一 函数描述 自定义一个函数 xff0c 传入一个年份n xff0c 判断是否为闰年 若是返回1 xff0c 否则返回0 二 相关说明 平年二月28 xff0c 闰年二月29 平年有365天
  • PX4串口驱动的三种方式:系统级操作、task/work_queue、类似PX4IO中断响应

    因为项目需要 xff0c 需在px4实现与stm32F407串口通信功能 xff0c 以200Hz双工交互数据 xff0c 所以探究了3种不同的串口驱动方式 三种方式概况参考了AcmeUavs公众号的文章 xff1a PX4 6 串口设备驱
  • 【C语言】求n的阶乘(递归法和循环法)

    文章目录 一 循环法二 递归法 一 循环法 根据阶乘的计算方法 xff1a n xff01 61 1 2 3 n xff0c 我们在一个for循环完成 n 次乘法运算 注意因为是连乘 xff0c 最终阶乘结果可能会非常大所以我们在Fac函数
  • 【C语言】数组排序方法总结

    一 冒泡排序 相邻元素两两比较 xff0c 按照要求交换位置 xff0c n个元素一共要比较n 1趟 xff0c 每趟要两两比较未排序元素个数 1次 span class token macro property span class to
  • 【C语言】通讯录实现

    通讯录功能 添加联系人信息 xff08 名字 xff0c 性别 xff0c 年龄 xff0c 电话号码 xff0c 家庭住址 xff09 输出指定联系人信息查找指定联系人信息修改指定联系人信息打印所有联系人信息对所有联系人 xff08 通过
  • 【C++】多态学习总结

    文章目录 一 多态的分类1 静态的多态2 动态的多态 二 多态的相关概念介绍及其实现1 虚函数2 虚函数的重写 xff08 覆盖 xff09 3 多态的构成条件4 C 43 43 11的 override 和 final5 重载 覆盖 重写
  • 【Linux】线程基础知识

    文章目录 一 什么是线程 xff1f 1 线程概念2 重新理解进程3 线程优缺点4 线程周期5 线程调度6 线程工作原理7 线程异常8 线程资源 二 为什么要有线程 xff1f 三 如何控制线程 xff1f 1 Linux支持的POSIX线
  • 【MySQL】数据库基础知识

    文章目录 一 什么是数据库二 为什么要有数据库三 数据库分类四 数据库的基本使用1 MySQL安装2 检查MySQL后端服务器是否启动3 连接MySQL服务器4 服务器 xff0c 数据库 xff0c 表关系5 数据存储逻辑 五 MySQL
  • 【C语言】typedef关键字

    文章目录 一 使用介绍1 对一般类型进行重命名2 对结构体类型进行重命名3 对指针进行重命名4 对数组进行重命名 二 typedef 和 define 的区别 一 使用介绍 typedef 的作用就是对类型进行重命名 xff0c 具体作用在
  • 【C语言】深入理解注释

    文章目录 一 预处理阶段对注释的处理二 注释使用时的注意事项1 C风格的注释无法嵌套使用2 基本注释注意事项3 注释导致的二义性 四 关于注释的一个使用建议 一 预处理阶段对注释的处理 我们知道一个源文件要变成可执行程序的话 xff0c 首
  • 【Java】数组

    文章目录 一 为什么要有数组 xff1f 二 什么是数组 xff1f 1 基本语法2 数组的本质 三 数组的使用1 获取长度 访问元素2 遍历数组3 下标越界 空引用4 数组作为函数参数5 数组作为函数返回值 四 数组拷贝1 手动拷贝2 使
  • 欧几里得算法的图形化理解

    欧几里得算法用于求两个数的最大公约数 xff0c 这篇博文力求以可视化的图形帮助读者理解欧几里得算法 首先 xff0c 简单介绍一下欧几里得算法 设a b N xff0c 我们规定gcd a b 代表a与b的最大公约数 欧几里得算法的实质是
  • PX4IO刷写BootLoader、固件 PX4IO固件损坏修复

    前两天玩坏了一个飞控的IO芯片 xff0c 具体表现为上电后红灯一直闪或常亮 xff0c 有以下解决办法 xff1a 文章目录 FMU给IO刷写重新烧写BootLoader FMU给IO刷写 先断电 xff0c 按住安全开关 xff0c 上
  • Maven版本3.6.1环境配置安装

    文章目录 前言一 操作步骤 xff1a 总结 前言 注意 xff1a 在换源时保持联网状态 xff0c 才能成功换成 提示 xff1a 以下是本篇文章正文内容 xff0c 下面案例可供参考 一 操作步骤 xff1a 1 下载maven安装包
  • 蓝桥杯STM32F103RB数码管计时(秒表)

    STM32F103RB数码管定时 xff08 秒表 xff09 硬件单路 96 配置TIM2及其中断代码片如下 示例 96 96 中断执行函数代码片如下 示例 96 96 seg c 数码管 代码片如下 示例 96 完整工程下载 gt gt
  • 第七届蓝桥杯嵌入式(省赛)程序题

    第七届蓝桥杯 xff08 省赛 xff09 解读 43 程序 解读 xff1a 这里自己多读几遍设计任务以及要求再看下面 96 A 先搭总体框架 96 各初始化函数 96 LCD初始化 96 96 按键初始化 96 96 ADC初始化 96