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);