這是我最近剛完成的藍橋杯嵌入式模擬題--里程儀的程序設計,經實驗在開發板上功能基本實現。附件里包含程序源碼,歡迎各位前來下載。
實驗結果圖片
單片機源程序如下:
#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)
2020-3-10 13:33 上傳
點擊文件名下載附件
源程序
|