蓝桥杯备赛——扩展板部分

1.数码管

  • 引脚:SER、RCLK、SCK——(PA1、PA2、PA3)
  • 相关代码:
#define SER_H HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET)
#define SER_L HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET)
#define RCLK_H HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET)
#define RCLK_L HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET)
#define SCLK_H HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_SET)
#define SCLK_L HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET)
uint8_t Seg[17] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71, 0x00};

void Seg_Display(uint8_t Bit1, uint8_t Bit2, uint8_t Bit3)
{
	uint8_t i = 0;
	uint8_t Code_Temp = 0;
	
	RCLK_L;
	
	Code_Temp = Seg[Bit3];
	for(i = 0; i < 8; i++)
	{
		SCLK_L;
		
		if(Code_Temp & 0x80)
		{
			SER_H;
		}
		else
		{
			SER_L;
		}
		Code_Temp <<= 1;
		
		SCLK_L;
		SCLK_H;
	}
	
	Code_Temp = Seg[Bit2];
	for(i = 0; i < 8; i++)
	{
		SCLK_L;
		
		if(Code_Temp & 0x80)
		{
			SER_H;
		}
		else
		{
			SER_L;
		}
		Code_Temp <<= 1;
		
		SCLK_L;
		SCLK_H;
	}
	
	Code_Temp = Seg[Bit1];
	for(i = 0; i < 8; i++)
	{
		SCLK_L;
		
		if(Code_Temp & 0x80)
		{
			SER_H;
		}
		else
		{
			SER_L;
		}
		Code_Temp <<= 1;
		
		SCLK_L;
		SCLK_H;
	}
	
	RCLK_L;
	RCLK_H;
}

2.按键(ADC)

  • 原理:
    在这里插入图片描述
  • 引脚:AKEY——PA5(ADC2_13)
  • 相关代码:
#define BTN_BUFF_LEN	50

static uint16_t btn_buff[BTN_BUFF_LEN];

uint16_t Get_ADC2_Key_AD(void)
{
	uint16_t adc = 0;
	
	HAL_ADC_Start(&hadc2);
	HAL_ADC_GetValue(&hadc2);
	adc = HAL_ADC_GetValue(&hadc2);
	
	return adc;
}

//对读取到的电压值进行滤波处理
uint16_t Read_Btn(void)
{
	uint16_t temp = 0;
	uint8_t i = 0, j = 0;
	
	for(i = 0; i < BTN_BUFF_LEN; i++)
	{
		btn_buff[i] = Get_ADC2_Key_AD();
	}
	
	//冒泡排序
	for(i = 0; i <= BTN_BUFF_LEN / 2; i++)
	{
		for(j = 0; j < BTN_BUFF_LEN - i - 1; j++)
		{
			if(btn_buff[j] > btn_buff[j + 1])
			{
				temp = btn_buff[j + 1];
				btn_buff[j + 1] = btn_buff[j];
				btn_buff[j] = temp;
			}
		}
	}
	
	//取中值
	if(BTN_BUFF_LEN % 2 == 0)
	{
		return (btn_buff[BTN_BUFF_LEN / 2 - 1] + btn_buff[BTN_BUFF_LEN / 2]) / 2;
	}
	else
	{
		return (btn_buff[BTN_BUFF_LEN / 2]);
	}
}

//根据读取到的电压值判断按下了哪个按键
uint8_t Scan_Btn(void)
{
	uint16_t btn_tmp;
	
	btn_tmp = Read_Btn();
	if(btn_tmp < 0x0FFF / 14)
	{
		return 1;
	}
	else if((btn_tmp > 0xFFF / 14) && (btn_tmp < 0xFFF / 14 * 3))
	{
		return 2;
	}
	else if((btn_tmp > 0xFFF / 14 * 3) && (btn_tmp < 0xFFF / 14 * 5))
	{
		return 3;
	}
	else if((btn_tmp > 0xFFF / 14 * 5) && (btn_tmp < 0xFFF / 14 * 7))
	{
		return 4;
	}
	else if((btn_tmp > 0xFFF / 14 * 7) && (btn_tmp < 0xFFF / 14 * 9))
	{
		return 5;
	}
	else if((btn_tmp > 0xFFF / 14 * 9) && (btn_tmp < 0xFFF / 14 * 11))
	{
		return 6;
	}
	else if((btn_tmp > 0xFFF / 14 * 11) && (btn_tmp < 0xFFF / 14 * 13))
	{
		return 7;
	}
	else if((btn_tmp > 0xFFF / 14 * 13) && (btn_tmp < 0xF6F))
	{
		return 8;
	}
	else
	{
		return 0;
	}
}

3.温度传感器(DS18B20)

  • 引脚:TDQ——PA6
  • 相关代码:
int16_t DS18B20_Read(void)
{
	uint8_t high, low;
	
	ow_reset();
	ow_byte_wr(OW_SKIP_ROM);
	ow_byte_wr(DS18B20_CONVERT);
	delay_us(750000);
	
	ow_reset();
	ow_byte_wr(OW_SKIP_ROM);
	ow_byte_wr(DS18B20_READ);
	
	low = ow_byte_rd();
	high = ow_byte_rd();
	
	return (high << 8) + low;
}
float DS18B20_Value;

ds18b20_init_x();

DS18B20_Value = (DS18B20_Read() & 0x07FF) / 16.0;

4.温湿度传感器(DHT11)

  • 引脚:TDQ——PA5
  • 相关代码:
//从DHT11读取一次数据
uint8_t DHT11_Read_Data(uint8_t *temp, uint8_t *humi)
{
    uint8_t buf[5];
    uint8_t i;
    DHT11_Rst();
    if(DHT11_Check() == 0)
    {
        for(i = 0; i < 5; i++)
        {
            buf[i] = DHT11_Read_Byte();
        }
        if((buf[0] + buf[1] + buf[2] + buf[3]) == buf[4])
        {
            *humi = buf[0];
            *temp = buf[2];
        }
    }
    else 
    	return 1;
    return 0;
}
uint8_t Humi, Temper;

while(DHT11_Init())
{
	LCD_DisplayStringLine(Line0, (uint8_t *)"  DHT11 Error       ");
   HAL_Delay(200);
}

DHT11_Read_Data(&Temper, &Humi);

5.MEME传感器(LIS302DL)

暂无

6.光敏电阻(DO)

  • 原理图:
    在这里插入图片描述
  • 引脚:TRDO——PA3(INPUT)
  • 相关代码:
if(!HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_3) )
{
		LCD_DisplayStringLine(Line8, (uint8_t *)"       DO:High     ");
}
else
{
		LCD_DisplayStringLine(Line8, (uint8_t *)"       DO:Low      ");
}

7.光敏电阻(AO)

  • 原理图:见6
  • 引脚:TRAO——PA4(ADC2_17)
  • 相关代码:
float ADC_Value;

ADC_Value = Get_ADC2_AO() / (4096. - Get_ADC2_AO()) * 10;

8.两路ADC

  • 相关代码:
uint16_t GetADC_RP5(void)
{
    ADC_ChannelConfTypeDef sConfig = {0};
    uint16_t adc = 0;
    sConfig.Channel = ADC_CHANNEL_13;
    sConfig.Rank = ADC_REGULAR_RANK_1;
    sConfig.SamplingTime = ADC_SAMPLETIME_640CYCLES_5;
    sConfig.SingleDiff = ADC_SINGLE_ENDED;
    sConfig.OffsetNumber = ADC_OFFSET_NONE;
    sConfig.Offset = 0;
    if (HAL_ADC_ConfigChannel(&hadc2, &sConfig) != HAL_OK)
    {
        Error_Handler();
    }
    HAL_ADC_Start(&hadc2);
    adc = HAL_ADC_GetValue(&hadc2);

    return adc;
}

uint16_t GetADC_RP6(void)
{
    ADC_ChannelConfTypeDef sConfig = {0};
    uint16_t adc = 0;
    sConfig.Channel = ADC_CHANNEL_17;
    sConfig.Rank = ADC_REGULAR_RANK_1;
    sConfig.SamplingTime = ADC_SAMPLETIME_640CYCLES_5;
    sConfig.SingleDiff = ADC_SINGLE_ENDED;
    sConfig.OffsetNumber = ADC_OFFSET_NONE;
    sConfig.Offset = 0;
    if (HAL_ADC_ConfigChannel(&hadc2, &sConfig) != HAL_OK)
    {
        Error_Handler();
    }
    HAL_ADC_Start(&hadc2);
    adc = HAL_ADC_GetValue(&hadc2);

    return adc;
}

9.输入捕获(RP3)

  • 引脚:PULS1——PA1

  • cubeMX相关配置:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 相关代码:

uint16_t PWM2_T_Count;
uint16_t PWM2_D_Count;
float PWM2_Duty;

HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_2);
HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1);

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
	if(htim->Instance==TIM2)
	{
		if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
		{
			PWM2_D_Count =  HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1)+1;
			PWM2_Duty = (float)PWM2_D_Count/PWM2_T_Count;
		}
		else if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
		{
			PWM2_T_Count =  HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_2)+1;
		}
	}
}

10.PWM两路互补输出

  • cubeMX相关配置:

在这里插入图片描述
死区设置:
死区设置

在这里插入图片描述

  • 相关代码:
HAL_TIM_PWM_Start(&htim15,TIM_CHANNEL_1);
HAL_TIMEx_PWMN_Start(&htim15,TIM_CHANNEL_1);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值