一、题目解析
- 按键短按
- 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);
}