一、题目解析
- 按键短按
- 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 --; //对应车辆类型+1car[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);
}