本人提供代查服务,检测题目是否按要求编写功能以及修改代码纠正错误。
目录
一、题目
二、程序代码
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的初始化因为图片过多在这省略了,需要的可以私信我。