【蓝桥杯嵌入式】12届程序题刷题记录及反思

一、题目解析

  • 按键短按
  • LCD显示两个界面
  • LED指示灯
  • PWM脉冲输出

二、led控制

控制两个led灯,两种状态

//led
void led_set(uint8_t led_dis)
{
    HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPIO_PIN_SET);
    HAL_GPIO_WritePin(GPIOC,led_dis << 8,GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
    HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
}
void led_proc(void)
{
    if((pwm_change_flag == 1)&&(IDLE_num >0)){
        led_set(0x03);
    }else if((pwm_change_flag == 1)&&(IDLE_num == 0)){
        led_set(0x02);
    }else if((pwm_change_flag != 1)&&(IDLE_num > 0)){
        led_set(0x01);
    }else{
        led_set(0x00);
    }
}

三、LCD显示

void display_init(void)
{
    LCD_Init();
    LCD_Clear(Black);
    LCD_SetBackColor(Black);
    LCD_SetTextColor(White);
}
void display_menu(void)
{
    char text[25];
    if(menu == Data_menu){
        sprintf(text,"       Data                ");
        LCD_DisplayStringLine(Line1,(u8*)text);
        sprintf(text,"   CNBR:%d                ",CNBR_num);
        LCD_DisplayStringLine(Line3,(u8*)text);
        sprintf(text,"   VNBR:%d                ",VNBR_num);
        LCD_DisplayStringLine(Line5,(u8*)text);
        IDLE_num = Car_stall - CNBR_num - VNBR_num;
        sprintf(text,"   IDLE:%d                ",IDLE_num);
        LCD_DisplayStringLine(Line7,(u8*)text); 
    }else 
    {
        sprintf(text,"       Para                ");
        LCD_DisplayStringLine(Line1,(u8*)text);
        sprintf(text,"   CNBR:%.2f                ",CNBR_fee);
        LCD_DisplayStringLine(Line3,(u8*)text);
        sprintf(text,"   VNBR:%.2f                ",VNBR_fee);
        LCD_DisplayStringLine(Line5,(u8*)text);
        LCD_ClearLine(Line7); 
    }
}

四、串口

这个题目的最头痛的就是串口了,在此写下我的思路

struct cars{
    char  type[5];       //车辆类型
    char   num[5];       //车辆编号
    uint8_t  year;       //进入年
    uint8_t month;       //进入月
    uint8_t  date;       //进入日
    uint8_t  hour;       //进入时
    uint8_t   min;       //进入分
    uint8_t   sec;       //进入秒
    uint8_t state;       //0为IDLE,1为有车位
};

定义一个结构体数组,存放每个车位的信息

#define IN  0
#define OUT 1

宏定义两个变量   车辆进入和出去

if((receive_data[4]==':')&&(receive_data[9]==':'))

判断字符接收格式  如果上面条件不满足就输出error

sscanf(time_tem,"%2c%2c%2c%2c%2c%2c",year,month,date,hour,min,sec);

字符分割函数 sscanf       存放在Stdio.h头文件中

                        car[car_stall_num].year   =   (year[0]-'0')*10+(year[1]-'0');
                        car[car_stall_num].month  =   (month[0]-'0')*10+(month[1]-'0'); 
                        car[car_stall_num].date   =   (date[0]-'0')*10+(date[1]-'0'); 
                        car[car_stall_num].hour   =   (hour[0]-'0')*10+(hour[1]-'0'); 
                        car[car_stall_num].min    =   (min[0]-'0')*10+(min[1]-'0'); 
                        car[car_stall_num].sec    =   (sec[0]-'0')*10+(sec[1]-'0');

将字符型转换为整型

dir

车的出入变量设置

            for(uint8_t i=0;i<8;i++){
                if(strcmp(id_tem,car[i].num)==0){
                    //出车库
                    dir = OUT;
                    printf("出车库\n");
              //      car_stall_num = i;
                    //计算时间
                    break;
                }
                if(car[i].state == 0){
                    car_stall_num = i;
                    break;
                }
                
            }

存放位置选择

                        CNBR_num --;              //对应车辆类型+1
                        car[car_stall_num].state = 0;       //车位无车,退出停车场
                        sscanf(time_tem,"%2c%2c%2c%2c%2c%2c",year,month,date,hour,min,sec);
                        strcpy(car[car_stall_num].type,"");
                        strcpy(car[car_stall_num].num,"");
                        uint8_t year_temp   =   (year[0]-'0')*10+(year[1]-'0');
                        uint8_t month_temp  =   (month[0]-'0')*10+(month[1]-'0'); 
                        uint8_t date_temp   =   (date[0]-'0')*10+(date[1]-'0'); 
                        uint8_t hour_temp   =   (hour[0]-'0')*10+(hour[1]-'0'); 
                        uint8_t min_temp    =   (min[0]-'0')*10+(min[1]-'0'); 
                        uint8_t sec_temp    =   (sec[0]-'0')*10+(sec[1]-'0'); 

                        printf("日期信息%2d-%2d-%2d-%2d-%2d-%2d\n",car[car_stall_num].year,car[car_stall_num].month,car[car_stall_num].date    \
                                  ,car[car_stall_num].hour,car[car_stall_num].min,car[car_stall_num].sec);
                        printf("车辆类型和编号 %s,%s\n",car[car_stall_num].type,car[car_stall_num].num);

车出去

字符串比较

strcmp("VNBR",type_tem)==0

字符串复制

strcpy(car[car_stall_num].type,"VNBR");

串口重定向

int fputc(int ch, FILE *f) 
{
  HAL_UART_Transmit(&huart1,(unsigned char*)&ch,1,50);
  return ch;
}
车费计算还没有写喔

五、PWM

//pwm
void pwm_on(void)
{
    __HAL_TIM_SetCompare(&htim17,TIM_CHANNEL_1,100-1);
}
void pwm_off(void)
{
    __HAL_TIM_SetCompare(&htim17,TIM_CHANNEL_1,0);
}
  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值