本人提供代查服务,检测题目是否按要求编写功能以及修改代码纠正错误。
目录
一、题目
二、程序代码
1. RTC实时时钟
2. ADC测量功能
3. 串行功能
4. LCD显示
5. 按键功能
总结
一、题目
二、程序代码
1. RTC实时时钟
合并写入到 LCD显示 内。
2. ADC测量功能
此返回的数据需要处理,ADC*3.3f/4096。
因为:
ADC的范围值为:0-4096
IO口输出的电压为:0-3V
float ADC_R37(void)
{float ADC;HAL_ADC_Start(&hadc2);ADC = HAL_ADC_GetValue(&hadc2);return ADC;
}
3. 串行功能
实现串口接收上报和定时上报数据功能。
void Usart1_Proc(void)
{if((uwTick - uwTick_Usart_Set_Point)<30) return;//减速函数uwTick_Usart_Set_Point = uwTick;//串行功能一if(((uwTick - Uart_Rev_Data_Delay_Time)<=250)&&(uwTick - Uart_Rev_Data_Delay_Time)>=200)//200ms~250ms之内处理数据--会影响发送的次数*****{if( (Usart1_Rx_buf[0]==0X6B)&&(Usart1_Rx_buf[1]==0X30)&&(Usart1_Rx_buf[2]==0X2E)&&(Usart1_Rx_buf[4]==0X5C)&&(Usart1_Rx_buf[5]==0X6E) ){if( (Usart1_Rx_buf[3]>=0X31)&&(Usart1_Rx_buf[3]<=0X39) ){k=Usart1_Rx_buf[3]-0x30;sprintf((char *)Usart1_Str,"ok\n");HAL_UART_Transmit(&huart1,Usart1_Str,strlen((const char *)Usart1_Str),50);K_W[0]=k;IIC_24C02_Write(K_W,0,1);}Usart1_Rx_Start_Sign=0;//接收标志位清零*****Rx_index=0;//数据位数清零*****}}//串行功能二:定时上报电压if( (RTC_sTime.Hours==RTC_Dis[0])&&(RTC_sTime.Minutes==RTC_Dis[1])&&(RTC_sTime.Seconds==RTC_Dis[2]) ){if(Usart1_Tx_Times==0)//使数据只发送一次的标志*****{sprintf((char *)Usart1_Str,"%3.2f+0.%d+%d%d%d\n",ADC_R37()*3.3f/4096,k,RTC_Dis[0],RTC_Dis[1],RTC_Dis[2]);HAL_UART_Transmit(&huart1,Usart1_Str,strlen((const char *)Usart1_Str),50);Usart1_Tx_Times=1;}}else {Usart1_Tx_Times=0;}
}
串口接收中断函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{if( (Usart1_Rx=='k') && (Rx_index==0) )//接收条件{Uart_Rev_Data_Delay_Time = uwTick;//接收到第一个数据启动计时*****Usart1_Rx_Start_Sign=1;//接收标志位*****}if(Usart1_Rx_Start_Sign==1){Usart1_Rx_buf[Rx_index]=Usart1_Rx;//将数据一个一个存入数组Rx_index++;//数据位数增加}HAL_UART_Receive_IT(&huart1,(uint8_t *)(&Usart1_Rx),1);
}
4. LCD显示
void LCD_Proc(void)
{HAL_RTC_GetTime(&hrtc,&RTC_sTime,RTC_FORMAT_BIN);HAL_RTC_GetDate(&hrtc,&RTC_sDate,RTC_FORMAT_BIN);if(LCD_Pag==1){sprintf((char *)LCD_Str," V1:%3.2f",ADC_R37()*3.3f/4096);LCD_DisplayStringLine(Line3,LCD_Str);sprintf((char *)LCD_Str," k:0.%d",k);LCD_DisplayStringLine(Line4,LCD_Str);if(LED_Flicker==1){sprintf((char *)LCD_Str," LED:ON ");LCD_DisplayStringLine(Line5,LCD_Str);}else{sprintf((char *)LCD_Str," LED:OFF ");LCD_DisplayStringLine(Line5,LCD_Str);}sprintf((char *)LCD_Str," T:%02d-%02d-%02d",RTC_sTime.Hours,RTC_sTime.Minutes,RTC_sTime.Seconds);LCD_DisplayStringLine(Line6,LCD_Str);}else if(LCD_Pag==2){sprintf((char *)LCD_Str," Setting");LCD_DisplayStringLine(Line3,LCD_Str);sprintf((char *)LCD_Str," ");LCD_DisplayStringLine(Line4,LCD_Str);sprintf((char *)LCD_Str," T:%02d-%02d-%02d",RTC_Con[0],RTC_Con[1],RTC_Con[2]);if( (uwTick-uwTick_Lcd) < 500) {return;}uwTick_Lcd=uwTick;LCD_Time_Sign_Flicker^=0x01;if(LCD_Time_Sign_Flicker==0x01){if(LCD_Time_Sign==1){LCD_Str[8] = ' ';LCD_Str[7] = ' ';}else if(LCD_Time_Sign==2){LCD_Str[11] = ' ';LCD_Str[10] = ' ';}else if(LCD_Time_Sign==3){LCD_Str[14] = ' ';LCD_Str[13] = ' ';}}LCD_DisplayStringLine(Line5,LCD_Str);sprintf((char *)LCD_Str," ");LCD_DisplayStringLine(Line6,LCD_Str);}
}
5. 按键功能
void Key_Proc(void)
{if( (uwTick-uwTick_Key) < 100) {return;}uwTick_Key=uwTick;Key_Val=Key_Scan();Key_Down=Key_Val & (Key_Old ^ Key_Val);Key_Up=~Key_Val & (Key_Old ^ Key_Val);Key_Old=Key_Val;if(Key_Down==1){LED_Flicker^= 0x01;}if(Key_Down==2){if(LCD_Pag==1){ LCD_Pag=2;}else if(LCD_Pag==2){LCD_Pag=1;RTC_Dis[0]=RTC_Con[0];RTC_Dis[1]=RTC_Con[1];RTC_Dis[2]=RTC_Con[2];}}if( (Key_Down==3)&&(LCD_Pag==2) ){LCD_Time_Sign+=1;if(LCD_Time_Sign==4){LCD_Time_Sign=1;}}if( (Key_Down==4)&&(LCD_Pag==2) ){if(LCD_Time_Sign==1){RTC_Con[0]+=1;if(RTC_Con[0]==24){RTC_Con[0]=0;}}if(LCD_Time_Sign==2){RTC_Con[1]+=1;if(RTC_Con[1]==60){RTC_Con[1]=0;}}if(LCD_Time_Sign==3){RTC_Con[2]+=1;if(RTC_Con[2]==60){RTC_Con[2]=0;}}}
}
总结
第六届的内容相对来说比较简单,只需要细心的去编写基本都可以完成。
CubeMX的初始化因为图片过多在这省略了,需要的可以私信我。