蓝桥杯程序见解:

GPIO的应用:

led的应用:

Cube MX配置:

代码编写:

void GPIO_LED(uint8_t wei)
{
  
HAL_GPIO_WritePin(GPIOC,0xff00,GPIO_PIN_SET);         //选中开发板的8颗LED灯
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);    //选中LED灯所在的锁存器
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);  //

HAL_GPIO_WritePin(GPIOC,wei<<8,GPIO_PIN_RESET);      //选中所需的LED灯点亮
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);	
}

按键检测

Cube MX配置:

代码编写:

uint8_t ucKey_Val,ucKey_Down,ucKey_Up,ucKey_Old;

uint8_t Key_Scan()     //读取按键的函数,读取按键值
{
	 uint8_t unKey_Val=0;

     if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0) == GPIO_PIN_RESET)  unKey_Val=4;  //读取
	 if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0) == GPIO_PIN_RESET)  unKey_Val=1;  //
	 if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1) == GPIO_PIN_RESET)  unKey_Val=2;  //
	 if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2) == GPIO_PIN_RESET)  unKey_Val=3;  //
  
 	 return unKey_Val; //返回值
}

void Key_Proc(void)    //按键检测值
{
    
   ucKey_Val      =   Key_Scan();
   ucKey_Down     =   ucKey_Val & (ucKey_Old ^ ucKey_Val);    //下降沿
   ucKey_Up       =   ~ucKey_Val & (ucKey_Old ^ ucKey_Val);   //上升沿
   ucKey_Old      =   ucKey_Val; 	
	 
}

IIC总线:

 代码编写:

void IIC_24c02_write(uint8_t *p,uint8_t Add,uint8_t Nem)
{
     I2CStart();           //起始信号
	 I2CSendByte(0xa0);    //发送字节
	 I2CWaitAck();         //等待响应
	 
	 I2CSendByte(Add);
	 I2CWaitAck();
	 while(Nem--)
	 {
	 I2CSendByte(*p++);
	 I2CWaitAck();
	 }
	 I2CStop();           //结束信号
	 delay1(500);
}

void IIC_24c02_read(uint8_t *p,uint8_t Add,uint8_t Nem)
{
     I2CStart();
	 I2CSendByte(0xa0);
	 I2CWaitAck();
	 
	 I2CSendByte(Add);
	 I2CWaitAck();
	 
	 I2CStart();
	 I2CSendByte(0xa1);
	 I2CWaitAck();

	 
	 while(Nem--)
	 {
	 *p++=I2CReceiveByte();
	 if(Nem)
		I2CSendAck();       //发送确认信号
	  else
		I2CSendNotAck();    //发送非确认信号
	 }
	 I2CStop(); 
	 delay1(500);
}


void IIC_mcp4017_writch(uint8_t value)
{
   I2CStart();
	 I2CSendByte(0x5E);
	 I2CWaitAck();
	
	 I2CSendByte(value);
	 I2CWaitAck(); 
	 
	 I2CStop();
}


uint8_t IIC_mcp4017_read(void)
{
	 uint8_t value;
   I2CStart();
	 I2CSendByte(0x5F);
	 I2CWaitAck();

	 value=I2CReceiveByte();
	 I2CSendNotAck();
	 
	 I2CStop();
	 
	 return value;
}

//
uint8_t x24c02_read(uint8_t address)
{
	unsigned char val;
	
	I2CStart(); 
	I2CSendByte(0xa0);
	I2CWaitAck(); 
	
	I2CSendByte(address);
	I2CWaitAck(); 
	
	I2CStart();
	I2CSendByte(0xa1); 
	I2CWaitAck();
	val = I2CReceiveByte(); 
	I2CWaitAck();
	I2CStop();
	
	return(val);
}

//
void x24c02_write(unsigned char address,unsigned char info)
{
	I2CStart(); 
	I2CSendByte(0xa0); 
	I2CWaitAck(); 
	
	I2CSendByte(address);	
	I2CWaitAck(); 
	I2CSendByte(info); 
	I2CWaitAck(); 
	I2CStop();
}

ADC的使用

 

 Cube MX 配置

程序代码:

uint16_t GetADC1(void)
{
uint16_t adc=0;
HAL_ADC_Start(&hadc1);
adc= HAL_ADC_GetValue(&hadc1);
return adc;	
}

..........................................................................
..........................................................................
HAL_Delay(100);
sprintf((char *)TX_001,"电压R38:%1.2f V\n",((float)GetADC1())/4028*3.3);
HAL_UART_Transmit(&huart1,TX_001,sizeof(TX_001),50);
........................................................................... 	
...........................................................................


//两个ADC采集Cude MX一样的配置,注意选择就好.程序也是一样的。

HAL_Delay(100);
sprintf((char *)TX_001,"电压R38:%1.2f V\r电压R37:%1.2f V\n",((float)GetADC1())/4096*3.3,((float)GetADC2())/4096*3.3);
HAL_UART_Transmit(&huart1,TX_001,sizeof(TX_001),50);

定时器TIM

定时器中断:

TIM6

80MHz

100ms

Cube MX配置:

记得开中断哦!!!

Cube MX 配置:

 程序代码:

HAL_TIM_Base_Start_IT(&htim6);  //开启定时器6;

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)  //定时器更新回调函数
{
 if(htim->Instance==TIM6)
      {
      //定时器6的回调函数
      }
}

PWM捕获:

定时器2和定时器3的配置一样,要开中断,在中断里做处理,GPIO口的配置。

 Cube MX 配置:

 程序代码:

uint16_t  PWM1_T_Count;
uint16_t  PWM1_D_Count;
uint16_t  PWM2_T_Count;
uint16_t  PWM2_D_Count;
float PWM1_Duty;
float PWM2_Duty;


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

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
  if(htim->Instance==TIM2)
	{
	   if(htim->Channel==HAL_TIM_ACTIVE_CHANNEL_1)
		 {
		   PWM1_T_Count = HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1)+1;
		   PWM1_Duty =(float)PWM1_D_Count/PWM1_T_Count;
		 }
		 else if(htim->Channel==HAL_TIM_ACTIVE_CHANNEL_2)
		 {
		   PWM1_D_Count  = HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_2)+1;
		 }
			 
	}	  
}       //*另一个PWM捕获一样的用法*//




/\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
  \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

	   if(htim->Channel==HAL_TIM_ACTIVE_CHANNEL_1)
		 {
		     PWM1_T_Count = HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1)+1;
			 PWM1_Duty =(float)PWM1_D_Count/PWM1_T_Count;
		 }
		 else if(htim->Channel==HAL_TIM_ACTIVE_CHANNEL_2)
		 {
		     PWM1_D_Count  = HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_2)+1;
		 }
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\  
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\/
//写在it文件中
sprintf((char*)TX_001,"R40P:%05dHz,%4.1f%%\n",(uint16)(1000000/PWM1_T_Count),PWM1_Duty*100);



PWM输出:

不需要开中断

其他的都需要:

 Cube MX 配置:

 6000是600

 程序代码:

HAL_TIM_PWM_Start(&htim16,TIM_CHANNEL_1);//开启
HAL_TIM_PWM_Start(&htim17,TIM_CHANNEL_1);//



__HAL_TIM_SET_AUTORELOAD(&htim16,TIM_CHANNEL_1);  //改变频率//TIM_CHANNEL_1==值
__HAL_TIM_SET_COMPARE(&htim16,TIM_CHANNEL_1,100); //改变占空比
HAL_RTC_GetTime(&hrtc,&H_M_S_Time,RTC_FORMAT_BIN);
HAL_RTC_GetDate(&hrtc,&Y_M_D_data,RTC_FORMAT_BIN);

sprintf((char *)TX_001,"Data:%02d-%02d-%02d-%d\n",Y_M_D_data.Year,(unsigned int)Y_M_D_data.Month,(unsigned int)Y_M_D_data.Date,Y_M_D_data.WeekDay);

RTC_TimeTypeDef H_M_S_Time;
RTC_DateTypeDef Y_M_D_data;

	
RTC_DateTypeDef Y_M_D_data_S;

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值