1.第15届蓝桥杯嵌入式模拟2

1.题目描述

2.LED模块

uint8_t led_sta;
extern __IO uint32_t uwTick;
uint32_t time3000=0;//用来计数

void led_proc()
{
	if(mode==0)//mode代表自动模式
	{
	led_sta=(led_sta&0x7f)|0x80;
    led_dis(led_sta);
	}
	else
	{
	led_sta=led_sta&0x7f;
    led_dis(led_sta);
	}
	if(gear==1)
	{
	led_sta=(led_sta&0xfe)|0x01;
    led_dis(led_sta);
	}
	else
	{
	led_sta=led_sta&0xfe;
    led_dis(led_sta);
	}
	if(gear==2)
	{
	led_sta=(led_sta&0xfe)|0x02;
    led_dis(led_sta);
	}
	else
	{
	led_sta=led_sta&0xfd;
    led_dis(led_sta);
	}
	if(gear==3)
	{
	led_sta=(led_sta&0xfb)|0x04;
    led_dis(led_sta);
	}
	else
	{
	led_sta=led_sta&0xfb;
    led_dis(led_sta);
	}
   	if(uwTick-time3000<3000)
    {
        led_sta=(led_sta&0xf7)|0x08;
     	led_dis(led_sta);
		rx_finish_flag=0;
    }
    else{   
  	led_sta=led_sta&0xf7;
	led_dis(led_sta);
	}
}

3.中断函数

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
 if(htim->Instance==TIM4)//定时器4定时10ms
 {
 key_scan();
 if(rx_finish_flag==0)rx_timec++;
 }
 if(htim->Instance==TIM6)
 {
  time1++;
  }
}//定时器6定时10ms


char rxdata[30];
bool rx_finish_flag;
uint8_t rxdat;
uint8_t rx_count;
uint8_t rx_timec;
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
 if(huart->Instance==USART1)
 {
	 rx_finish_flag=0;
	 rx_timec=0;
	 rxdata[rx_count++]=rxdat;
    HAL_UART_Receive_IT(&huart1,&rxdat,1);
 }
}

4.按键模块

void key_proc()
{
	if(view==0)
  {		
	  HAL_TIM_Base_Start_IT(&htim6);
    if(key[0].single_flag==1)
    {
		mode++;
		mode=mode%2;
	  key[0].single_flag=0;
     }
	if(mode==1)
	{
	 if(key[1].single_flag==1)
    {
		gear++;
		if(gear>3)gear=3;
	  key[1].single_flag=0;
     }
	if(key[2].single_flag==1)
    {
		gear--;
		if(gear<1)gear=1;
	  key[2].single_flag=0;
     }	
	}
  }
     if(view==1)//睡眠界面
    {
        //任意按键唤醒
        if(key[0].single_flag==1||key[1].single_flag==1||key[2].single_flag==1){
            LCD_Clear(Black);
            view=0;
            key[0].single_flag=0;
            key[1].single_flag=0;
            key[2].single_flag=0;
        }
    }
    
    //无按键动作和串口接收5s后切换为睡眠界面
    if(time1>=500)
    {
        if(view==0&&key[0].key_sta==1&&key[1].key_sta==1&&key[2].key_sta==1&&rx_finish_flag==0)
        {
            LCD_Clear(Black);
            view=1;
            time1=0;
			HAL_TIM_Base_Stop_IT(&htim6);
        }
    }
    //在5s内按键和串口有动作停止计时
    if(time1<500)
    {
        if(key[0].key_sta==0||key[1].key_sta==0||key[2].key_sta==0||rx_finish_flag==1)
        {
            time1=0;
			HAL_TIM_Base_Stop_IT(&htim6);
        }
    }
}

5.LCD模块


void lcd_proc()
{
	if(view==0)
	{
	r37_volt=getadc(&hadc2);
	if(r37_volt<1)
	{
	 temp=0;
	}
	else if(r37_volt>3)
	{
	 temp=40;
	}
	else 
	{
	temp=10*r37_volt+10;
	}
	 sprintf(lcd_buffer,"        DATA");
     LCD_DisplayStringLine(Line1, (uint8_t *)lcd_buffer);
		sprintf(lcd_buffer,"     TEMP:%.1f",temp);
     LCD_DisplayStringLine(Line3, (uint8_t *)lcd_buffer);
		if(mode==0)
		{
		if(temp<25)gear=1;
		else if(temp>30)gear=3;
		else gear=2;
		sprintf(lcd_buffer,"     MODE:Auto  ");
        LCD_DisplayStringLine(Line4, (uint8_t *)lcd_buffer);
		}
	    else
		{
		sprintf(lcd_buffer,"     MODE:Manu  ");
        LCD_DisplayStringLine(Line4, (uint8_t *)lcd_buffer);
		}
	    sprintf(lcd_buffer,"     GEAR:%d  ",gear);
     LCD_DisplayStringLine(Line5, (uint8_t *)lcd_buffer);
	}
	else if(view==1)
	{
	 sprintf(lcd_buffer,"     SLEEPING ");
     LCD_DisplayStringLine(Line4, (uint8_t *)lcd_buffer);
	 sprintf(lcd_buffer,"     TEMP:%.1f ",temp);
     LCD_DisplayStringLine(Line5, (uint8_t *)lcd_buffer);

	}
}

6.串口模块

void uart_proc()
{
	
  if(rx_count>0)
 {
	uwTick=time3000;
    if(rx_timec>=3)
   {
      rx_timec=0;
	if(rxdata[rx_count-1]==rxdat)rx_finish_flag=1;
   }
   if(rx_finish_flag==1)
   {
	   if(view==0)
	   {
     if(rx_count==2)
	 {
		
	  if(rxdata[0]=='B'&&rxdata[1]-'0'==1)
	  {
	     mode++;
		 mode=mode%2;
	  }
	  else if(rxdata[0]=='B'&&rxdata[1]-'0'==2)
	  {
	    gear++;
		if(gear>3)gear=3;
	  }
	  else if(rxdata[0]=='B'&&rxdata[1]-'0'==3)
	  {
	    gear--;
		if(gear<1)gear=1;
	  }
	  else{
	  sprintf(txdata,"NULL\r\n");
	  HAL_UART_Transmit(&huart1,(uint8_t *)txdata,sizeof(txdata),50);
	  }
     }
	 else{
	 sprintf(txdata,"NULL\r\n");
	 HAL_UART_Transmit(&huart1,(uint8_t *)txdata,sizeof(txdata),50);
	 }
    }
	   if(view==1)
	   {
	   if(rxdata[0]=='B'&&rxdata[1]-'0'==1)
	  {
	     LCD_Clear(Black);
		  view=0;
	  }
	  else if(rxdata[0]=='B'&&rxdata[1]-'0'==2)
	  {
	    LCD_Clear(Black);
		  view=0;
	  }
	  else if(rxdata[0]=='B'&&rxdata[1]-'0'==3)
	  {
	   LCD_Clear(Black);
		  view=0;
	  }
	  else{
	  sprintf(txdata,"NULL\r\n");
	  HAL_UART_Transmit(&huart1,(uint8_t *)txdata,sizeof(txdata),50);
	  }
	   
	   }
     rx_count=0;
	 memset(txdata,0,sizeof(txdata));
      rx_finish_flag=0;
     }
   }
 
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值