赛题
部分程序
主函数
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_DMA_Init();
MX_ADC2_Init();
MX_TIM6_Init();
MX_USART1_UART_Init();
MX_RTC_Init();
/* USER CODE BEGIN 2 */
m24c02_init(); //EEPROM初始化
KEY_init(); //KEY初始化
LED_init(); //LED初始化
LCD_Init(); //LCD初始化
TASK_TIMES_init();
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
KEY_function(); //按键功能
ADC_function(); //ADC功能
LED_function(); //LED功能
LCD_function(); //LCD功能
RTC_Alarm_function(); //定时上报功能
UART_function();//串口功能
}
/* USER CODE END 3 */
按键功能函数
uint8_t KYE_scan(void)
{
uint8_t val,key;
static uint8_t com;
if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)==GPIO_PIN_RESET) val=1;
else if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==GPIO_PIN_RESET) val=2;
else if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)==GPIO_PIN_RESET) val=3;
else if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==GPIO_PIN_RESET) val=4;
else val=0;
key=val&(val^com);
com=val;
return key;
}
void KEY_function(void)
{
uint8_t key;
if(get_time_task(TASK_TIMES.TASK_KEY)==0)
{
TASK_TIMES.TASK_KEY=get_time()+KEY_time;
key=KYE_scan(); //扫描按键
if(key==1) //打开/关闭指示灯闪烁报警功能
{ flag_LED^=(1<<7); } //对指定为取反
else if(key==2) //切换界面
{
if(++flag_LCD==2) {flag_LCD=0;}
if(flag_LCD==0)
{
set_Alarm(RTC_Alarm_time[0],RTC_Alarm_time[1],RTC_Alarm_time[2]); //重新设置上报时间
sprintf((char *)LCD_Line4_buf," k:0.1 ");
sprintf((char *)LCD_Line6_buf," T:23-59-55 ");
}
else if(flag_LCD==1)
{
falg_set=0;
LCD_ClearLine(Line3);LCD_ClearLine(Line4);
LCD_ClearLine(Line5);LCD_ClearLine(Line6);
sprintf((char *)LCD_Line4_buf," Setting ");
sprintf((char *)LCD_Line6_buf," 00-00-00 ");
LCD_DisplayStringLine(Line4,LCD_Line4_buf);
}
}
else if(key==3) //选择时分秒
{
if(flag_LCD==1) //仅在参数设置界面有效
{ if(++falg_set==3) {falg_set=0;} }
}
else if(key==4)
{
if(flag_LCD==1) //仅在参数设置界面有效
{
if(falg_set==0) //时
{ if(++RTC_Alarm_time[falg_set]>23) RTC_Alarm_time[falg_set]=0; }
else //分 秒
{ if(++RTC_Alarm_time[falg_set]>59) RTC_Alarm_time[falg_set]=0; }
}
}
}
}
ADC功能函数
/* USER CODE BEGIN 1 */
void ADC_function(void)
{
uint8_t a;
if(get_time_task(TASK_TIMES.TASK_ADC)==0)
{
TASK_TIMES.TASK_ADC=get_time()+ADC_time;
HAL_ADC_Stop_DMA(&hadc2); //停止ADC2 DMA
ADC=0;
for(a=0;a<100;a++)
{ ADC+=ADC2_ch15_buf[a]; } //计算近100次ADC值
HAL_ADC_Start_DMA(&hadc2,(uint32_t *)ADC2_ch15_buf,ADC2_ch15_len); //重新使能ADC DMA
ADC=ADC*3.3/255; //计算放大100倍后的电压
}
if((ADC>(flag_k*33))&&(flag_LED&0x80)) //闪烁
{ flag_LED|=(1<<0); }
else //熄灭
{ flag_LED&=~(1<<0); }
}
/* USER CODE END 1 */
LED功能函数
void LED_function(void)
{
if(get_time_task(TASK_TIMES.TASK_LED)==0)
{
TASK_TIMES.TASK_LED=get_time()+LED_time;
if(flag_LED&0x01) { LED_state^=(1<<0); }
else { LED_state=0xFF; }
LED_Write_all(LED_state);
}
}
LCD功能函数
void LCD_function(void)
{
if(flag_LCD==0) //数据显示界面
{
HAL_RTC_GetTime(&hrtc,&RTC_Time,RTC_FORMAT_BIN);
HAL_RTC_GetDate(&hrtc,&RTC_Date,RTC_FORMAT_BIN);
LCD_Line3_buf[5]=ADC/100+48;LCD_Line3_buf[7]=ADC/10%10+48;LCD_Line3_buf[8]=ADC%10+48;
LCD_Line4_buf[6]=flag_k+48;
if(flag_LED&0x80) {LCD_Line5_buf[6]='O';LCD_Line5_buf[7]='N';LCD_Line5_buf[8]=' ';}
else {LCD_Line5_buf[6]='O';LCD_Line5_buf[7]='F';LCD_Line5_buf[8]='F';}
LCD_Line6_buf[4]=RTC_Time.Hours/10+48; LCD_Line6_buf[5]=RTC_Time.Hours%10+48;
LCD_Line6_buf[7]=RTC_Time.Minutes/10+48; LCD_Line6_buf[8]=RTC_Time.Minutes%10+48;
LCD_Line6_buf[10]=RTC_Time.Seconds/10+48;LCD_Line6_buf[11]=RTC_Time.Seconds%10+48;
LCD_DisplayStringLine(Line3,LCD_Line3_buf);
LCD_DisplayStringLine(Line4,LCD_Line4_buf);
LCD_DisplayStringLine(Line5,LCD_Line5_buf);
LCD_DisplayStringLine(Line6,LCD_Line6_buf);
}
else if(flag_LCD==1) //参数设置界面
{
LCD_Line6_buf[6] =RTC_Alarm_time[0]/10+48; LCD_Line6_buf[7] =RTC_Alarm_time[0]%10+48;
LCD_Line6_buf[9] =RTC_Alarm_time[1]/10+48; LCD_Line6_buf[10]=RTC_Alarm_time[1]%10+48;
LCD_Line6_buf[12]=RTC_Alarm_time[2]/10+48; LCD_Line6_buf[13]=RTC_Alarm_time[2]%10+48;
LCD_DisplayStringLine(Line6,LCD_Line6_buf);
}
}
RTC功能函数
void RTC_Alarm_function(void)
{
if(flag_Alarm==1)
{
flag_Alarm=0;
RTC_Alarm_buf[0]=ADC/100+48;RTC_Alarm_buf[2]=ADC/10%10+48;RTC_Alarm_buf[3]=ADC%10+48;
RTC_Alarm_buf[7]=flag_k+48;
RTC_Alarm_buf[9]=RTC_Time.Hours/10+48;RTC_Alarm_buf[10]=RTC_Time.Hours%10+48;
RTC_Alarm_buf[11]=RTC_Time.Minutes/10+48;RTC_Alarm_buf[12]=RTC_Time.Minutes%10+48;
RTC_Alarm_buf[13]=RTC_Time.Seconds/10+48;RTC_Alarm_buf[14]=RTC_Time.Seconds%10+48;
HAL_UART_Transmit_DMA(&huart1,RTC_Alarm_buf,16);
}
}
串口功能函数
void UART_function(void)
{
if(flag_uart1_rx==1)
{
flag_uart1_rx=0;
if(UART1_RX_len==5) //
{
if((UART1_RX_buf[0]=='k')&&(UART1_RX_buf[1]=='0')&&(UART1_RX_buf[2]=='.')&&(UART1_RX_buf[4]=='\n'))
{
UART1_RX_buf[3]-=48;
if((UART1_RX_buf[3]>0)&&(UART1_RX_buf[3]<10))
{
flag_k=UART1_RX_buf[3];
X24c02_buf[1]=flag_k;
m24c02_write(X24c02_buf+1,DATA_ARR+1,1);
HAL_UART_Transmit_DMA(&huart1,"ok\n",3);
}
}
}
}
}
完整程序下载
下载链接:
链接:https://pan.baidu.com/s/1LMECSy3GuABduu42YUJdSQ
提取码:qy2o