其他分享
首页 > 其他分享> > 蓝桥杯嵌入式国赛知识点

蓝桥杯嵌入式国赛知识点

作者:互联网

一、数码管

在这里插入图片描述

使用代码如下:
(需记忆,是固定的)

void SEG_DisplayValue(u8 Bit1,  u8 Bit2, u8 Bit3)//参数表示想让三个数码管显示的十六进制数
{
	u8 i = 0;	//做循环使用
	u8 code_tmp = 0;//标识数码管点亮时对应的十六进制数

	code_tmp = Seg7[Bit3];//设置第三个译码管
	for(i=0;i<8;i++){
	//注意,这里使用的是串行输入SER,即每次只输入一位数据,也就是把8位二进制的首位给输入到数码管当中,因此,需要连续输入8次
	//这里的输入指从PC机写入的数据输入到开发板
		if(code_tmp & 0x80 ){//0x80二进制为1000 0000,即每次循环将code_tmp的首位与1作逻辑与
		//
			GPIO_SetBits(GPIOA,GPIO_Pin_1);//SER_H;如果code_tmp首位为1,那么,串行输入的SER_H值置为1
		}else{
			GPIO_ResetBits(GPIOA,GPIO_Pin_1);//SER_L;//如果code_tmp首位为0,那么,串行输入的SER_H值置为0
		}
		GPIO_SetBits(GPIOA,GPIO_Pin_3);//SCK_H;//移位寄存器打开
		code_tmp = code_tmp << 1;   //让code_tmp 左移一位,准备判断下一位的串行输入的数据
		//每次左移一位,即将下一位串行输出的数据放到首位
		GPIO_ResetBits(GPIOA,GPIO_Pin_3);//SCK_L;//移位后,重新把移位寄存器关闭,防止出现错误
	}
	//其他数码管的操作同上
	code_tmp = Seg7[Bit2];//设置第二个译码管
	for(i=0;i<8;i++){

		if(code_tmp & 0x80){
			GPIO_SetBits(GPIOA,GPIO_Pin_1);//SER_H;
		}else{
			GPIO_ResetBits(GPIOA,GPIO_Pin_1);//SER_L;
		}
		GPIO_SetBits(GPIOA,GPIO_Pin_3);//SCK_H;
		code_tmp = code_tmp << 1;   
		GPIO_ResetBits(GPIOA,GPIO_Pin_3);//SCK_L;
	}	
	
	code_tmp = Seg7[Bit1];//设置第一个译码管
	for(i=0;i<8;i++){

		if(code_tmp & 0x80){
			GPIO_SetBits(GPIOA,GPIO_Pin_1);//SER_H;
		}else{
			GPIO_ResetBits(GPIOA,GPIO_Pin_1);//SER_L;
		}
		GPIO_SetBits(GPIOA,GPIO_Pin_3);//SCK_H;
		code_tmp = code_tmp << 1;   
		GPIO_ResetBits(GPIOA,GPIO_Pin_3);//SCK_L;
	}		
	//负责输出数据的锁存,连续将输出时钟锁存打开、关闭,以保证数据不会受到其他程序段的影响
	//当三个数码管的数据都已经输入完成,那么把数据锁存起来
	GPIO_SetBits(GPIOA,GPIO_Pin_2);//RCLK_H;
	GPIO_ResetBits(GPIOA,GPIO_Pin_2);//RCLK_L;
}

二、BUTTON(ADC)

三、温度传感器(DS18B20)

四.温湿度传感器(DHT11)

unsigned int dht11_read(void);
//返回一个32位的数据,数据格式为:
//8位湿度整数+8位湿度小数+8位温度整数+8位温度小数
int DHT=dht11_read();
DHT>>24;//湿度的整数部分
(DHT>>8)&0xff//温度的整数部分
//因此在显示湿度时,应该右移24位,温度应该右移8位,同时忽略前16位

五、MEMS传感器(LIS302DL)

六、光敏电阻(DO)

if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_3) == Bit_RESET){//GPIO_ReadInputDataBit:读取引脚输入电平
			LCD_DisplayStringLine(Line7, (u8*)"       DO:High     ");//低电平表示亮度达到阙值
		}else{
			LCD_DisplayStringLine(Line7, (u8*)"       DO:Low      ");

七、光敏电阻(AO)

八、AD采集x2

u16 Get_ADCs(u8 channel)//可以使用中断方式
{
	//因为ADC1同时使用俩个通道读取,因此,每次读取ADC的值,都要选择要读取的通道
	u16 ADC_Val = 0;
	ADC_RegularChannelConfig(ADC1, channel, 1, ADC_SampleTime_239Cycles5);	//这一句是重点
	ADC_SoftwareStartConvCmd(ADC1,ENABLE);
	while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
	ADC_Val = ADC_GetConversionValue(ADC1);
	ADC_ClearFlag(ADC1, ADC_FLAG_EOC);
	ADC_SoftwareStartConvCmd(ADC1, DISABLE);
	return ADC_Val;
}

九、9.脉冲测量(PWM)

其他函数调用

TIM_PWMIConfig(TIM3, &TIM_ICInitStructure);
TIM_SelectInputTrigger(TIM3, TIM_TS_TI2FP2);//选择输入触发源:TI2:表示通道2,PF2:经过滤波器后将接到捕捉比较通道IC2;
TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);//选择从模式   上升沿重新初始化计数器,并且产生一个更新寄存器的信号
TIM_SelectMasterSlaveMode(TIM3, TIM_MasterSlaveMode_Enable);//配置从模式
TIM_Cmd(TIM3, ENABLE);
TIM_ITConfig(TIM3, TIM_IT_CC2, ENABLE);

中断函数

void TIM3_IRQHandler(void)
{
	if(TIM_GetITStatus(TIM3, TIM_IT_CC2) == SET){		
		TIM_ClearITPendingBit(TIM3, TIM_IT_CC2);
		IC2Value = TIM_GetCapture2(TIM3);
		if (IC2Value != 0){
			DutyCycle = (TIM_GetCapture1(TIM3) * 100) / IC2Value;//占空比,
			Frequency = SystemCoreClock / IC2Value;//频率,单位:HZ
		}else{
			DutyCycle = 0;
			Frequency = 0;
		}
	}
}

标签:tmp,知识点,Pin,国赛,蓝桥,TIM,ADC,ADC1,GPIO
来源: https://blog.csdn.net/qq_42424228/article/details/109299143