标题: 蓝桥杯嵌入式模拟题—STM32里程仪的设计程序 [打印本页]

作者: 雨后无语    时间: 2020-3-10 11:27
标题: 蓝桥杯嵌入式模拟题—STM32里程仪的设计程序
这是我最近刚完成的蓝桥杯嵌入式模拟题--里程仪的程序设计,经实验在开发板上功能基本实现。附件里包含程序源码,欢迎各位前来下载。


单片机源程序如下:
#include "stm32f10x.h"
#include "lcd.h"

#include "io.h"
#include "i2c.h"
#include <stdio.h>


__IO u8 Flag_key = 1;//50ms
__IO u8 Flag_led = 0;//500ms
__IO u8 Flag_catch = 0;//pwm捕获标志位i
__IO u8 Flag_check = 0;//200ms刷新显示信息
__IO u8 Flag_stop_check = 0;//1500ms检测是否停车
__IO u8 Flag_car = 0;//开车监测
__IO u8 Flag_time = 0;//时间标志位
__IO u32 TimeVar=0;//计时缓存
u8 THH=0,TMM=0,TSS=0;//时间显示
__IO uint16_t IC2Value;//pwm捕获缓存
__IO uint32_t Frequency_in;//输入频率
__IO uint32_t Frequency_out = 0;//输出频率
#if PWM_MODE
__IO uint16_t CCR1_Val = 5000;//频率=10000/CCR1_Val;
#else

#endif

__IO u8 Total_km = 0;//总公里数
__IO float Total_km_temp;//总公里计数缓存
__IO float km = 0;//本次行车路程
__IO float Vim = 0;//瞬时速度
__IO float Vavg = 0;//本次平均速度

u8 string[20];
u32 TimingDelay = 0;
void delay_ms(u32 nTime);
//Main Body
int main(void)
{

SysTick_Config(SystemCoreClock/1000);



io_init();

STM3210B_LCD_Init();
LCD_Clear(White);

i2c_init();

#if PWM_MODE
TIM3OUT_Init(0xffff,3600-1);//时钟频率20khz
TIM3CH1_set(0);//关闭输出pwm
#else

pwm_init();

#endif

TIM2IN_Init(0xffff,7200-1);//时钟频率10khz


sprintf(string,"Vim(km/h):  %0.1f   ",Vim);
LCD_DisplayStringLine(Line1,string);
   
sprintf(string,"Vavg(km/h): %0.1f   ",Vavg);
LCD_DisplayStringLine(Line3,string);

sprintf(string,"T(h:m:s): %0.2d:%0.2d:%0.2d",THH,TMM,TSS);
LCD_DisplayStringLine(Line5,string);

sprintf(string,"S(km):  %0.1f  ",km);
LCD_DisplayStringLine(Line7,string);


Total_km = eeprom_read(0x01);
Total_km_temp = (float)(Total_km*500);
delay_ms(2);
sprintf(string,"    Total(km):%d   ",Total_km);
LCD_DisplayStringLine(Line9,string);

while(1)
{
  //50ms
  if(Flag_key)
  {
   Flag_key = 0;
   
   key_read();
   
   if(key_sum==1)
   {
   
   
    Frequency_out++;
    if(Frequency_out>=20)
    {
     Frequency_out = 20;
    }
   
    #if PWM_MODE
   
    CCR1_Val =  10000/Frequency_out;
    if(Frequency_out<=1)
    TIM3CH1_set(1);
    Flag_stop_check=1;
    //Flag_catch = 1;
   
    #else
   
   
    #endif
   
   }
   if(key_sum==2)
   {
    Frequency_out--;
   
    #if PWM_MODE
   
    CCR1_Val =  10000/Frequency_out;
    if((Frequency_out<=0)||(Frequency_out>20))
    {
     Frequency_out=0;
     TIM3CH1_set(0);
    }
    #else
    if((Frequency_out<=0)||(Frequency_out>20))
    {
     Frequency_out=0;
    }
    #endif
   }
   
   
  }
  if(Flag_check)
  {
   //瞬时
   Vim = (float)(Frequency_in)*7.2;
   sprintf(string,"Vim(km/h):  %0.1f     ",Vim);
   LCD_DisplayStringLine(Line1,string);
  }
  //200ms
  if((Flag_check)&&(Flag_car))
  {
   Flag_check = 0;
   
   Vavg = ((km*1000)/TimeVar)*3.6;
   
   sprintf(string,"Vavg(km/h): %0.1f   ",Vavg);
   LCD_DisplayStringLine(Line3,string);
   
   sprintf(string,"S(km):  %0.1f   ",km);
   LCD_DisplayStringLine(Line7,string);
   
   eeprom_write(0x01,Total_km);
   delay_ms(2);
   Total_km = eeprom_read(0x01);
   delay_ms(2);
   sprintf(string,"    Total(km):%d   ",Total_km);
   LCD_DisplayStringLine(Line9,string);
   
   
  }
  if((Flag_time)&&(Flag_car))
  {
   Flag_time = 0;
   TimeVar++;
   if (TimeVar >= 21390039)
   {
    TimeVar = 0;
   }
   THH = TimeVar / 3600;
   TMM = (TimeVar % 3600) / 60;
   TSS = (TimeVar % 3600) % 60;
   
   sprintf(string,"T(h:m:s): %0.2d:%0.2d:%0.2d",THH,TMM,TSS);
   LCD_DisplayStringLine(Line5,string);
  }

  if(Flag_stop_check)
  {
   Flag_stop_check = 0;
   
   if(Flag_catch)
   {Flag_car = 1;}
   
   else
   {Flag_car = 0;}
   
   Flag_catch = 0;
  }
  if(Flag_car==0)//停车
  {
   TimeVar = 0;
   Frequency_in = 0;
   Vavg = 0;
   km = 0;
  }
  //1s闪烁报警
  if((Flag_led)&&(Flag_car)&&(Vim>90))
  {
   Flag_led = 0;
   
   LED ^= (0x01<<0);
   led_set();
  }

  if((Flag_led)&&((Flag_car)||(Vim<90)))
  {
   Flag_led = 0;
   
   LED |= (0x01<<0);
   led_set();
  }
}

}

全部资料51hei下载地址:
第四届模拟题及答案.7z (586.15 KB, 下载次数: 19)





欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1