求各位帮忙看下程序哪里有问题
时间:10-02
整理:3721RD
点击:
基于stm8s105 ,tm1638显示,HC-SR04超声测距 下面是我编的程序,但是当测距超过50cm之后显示的数值就会产生过大的误差,HC-SR04测距范围是0.02~5m例如测量距离为70cm,数码管就会从70cm降到60到50再到40最后再升回去,非常不稳定,希望有哪位大神能帮我解决一下这个问题啊
#include"stm8s.h"
int n=0;
u16 x;
u16 y;
float a;
float b;
u16 c,d,e,f;
u16 DuanMa[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
#define clk1 GPIO_WriteHigh(GPIOB,GPIO_PIN_1)
#define clk0 GPIO_WriteLow(GPIOB,GPIO_PIN_1)
#define stb1 GPIO_WriteHigh(GPIOB,GPIO_PIN_0)
#define stb0 GPIO_WriteLow(GPIOB,GPIO_PIN_0)
#define dio1 GPIO_WriteHigh(GPIOB,GPIO_PIN_2)
#define dio0 GPIO_WriteLow(GPIOB,GPIO_PIN_2)
void gpio()
{ GPIO_DeInit(GPIOB);
GPIO_Init(GPIOB,GPIO_PIN_0,GPIO_MODE_OUT_PP_HIGH_FAST);
GPIO_Init(GPIOB,GPIO_PIN_1,GPIO_MODE_OUT_PP_HIGH_FAST);
GPIO_Init(GPIOB,GPIO_PIN_2,GPIO_MODE_OUT_PP_HIGH_FAST);
GPIO_Init(GPIOB,GPIO_PIN_3,GPIO_MODE_OUT_PP_LOW_FAST);
}
void Write_TM1638(u8 ord)//数码管显示
{
u16 i;
for(i=0;i<8;i++)
{
clk0;
if(ord&0x01)
dio1;
else dio0;
clk1;
ord=ord>>1;
}
}
void Command_TM1638(unsigned char Data)//数码管位选
{
stb1;
stb0;
Write_TM1638(Data);
}
void delay_ms(u16 t)//毫秒定时
{
TIM3_DeInit();
TIM3_TimeBaseInit(TIM3_PRESCALER_16,1000);
while(t--)
{
TIM3_Cmd(ENABLE);
while(TIM3_GetFlagStatus(TIM3_FLAG_UPDATE)!=1);
TIM3_ClearFlag(TIM3_FLAG_UPDATE);
TIM3_Cmd(DISABLE);
}
}
void TIM2_Configuration(void)
{
TIM2_DeInit();
TIM2_TimeBaseInit(TIM2_PRESCALER_16,62500);//16分频
TIM2_ICInit(TIM2_CHANNEL_1, TIM2_ICPOLARITY_RISING, TIM2_ICSELECTION_DIRECTTI, TIM2_ICPSC_div1, 0);//通道1 上升沿 PD4
TIM2_ITConfig(TIM2_IT_CC1, ENABLE);//中断通道1使能
enableInterrupts();
}
void delay_us(u16 z) //10us定时
{ while(z--)
{
nop();nop();nop();nop();
}
}
void trig()
{
GPIO_WriteHigh(GPIOB, GPIO_PIN_3);
delay_us(25) ;
GPIO_WriteLow(GPIOB, GPIO_PIN_3);
}
void main(void)
{
CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIdiv1);
gpio();
Command_TM1638(0x88);
Command_TM1638(0x44);
TIM2_Configuration();
//enableInterrupts();
// trig();
while(1)
{//trig();
/// TIM2_Cmd(ENABLE);
TIM2_SetCounter(0);
trig();
TIM2_Cmd(ENABLE);
a=(float)(y-x)/2000;
b=a*340;
c=(u16)b%10;
d=(u16)b%100/10;
e=(u16)b%1000/100;
f=(u16)b/1000;
Command_TM1638(0xc0);
Write_TM1638(DuanMa[c]);
Command_TM1638(0xc2);
Write_TM1638(DuanMa[d]);
Command_TM1638(0xc4);
Write_TM1638(DuanMa[e]);
Command_TM1638(0xc6);
Write_TM1638(DuanMa[f]);
delay_ms(2000);
}
}
#pragma vector=16
__interrupt void exti_tim2(void)
{
n++;
if(n%2==1)
{
x=TIM2_GetCapture1();
TIM2_ICInit(TIM2_CHANNEL_1, TIM2_ICPOLARITY_FALLING, TIM2_ICSELECTION_DIRECTTI, TIM2_ICPSC_div1, 0);
}
else
{
y=TIM2_GetCapture1();
TIM2_ICInit(TIM2_CHANNEL_1, TIM2_ICPOLARITY_RISING, TIM2_ICSELECTION_DIRECTTI, TIM2_ICPSC_div1, 0);
}
TIM2_ClearITPendingBit(TIM2_IT_CC1);
}
#include"stm8s.h"
int n=0;
u16 x;
u16 y;
float a;
float b;
u16 c,d,e,f;
u16 DuanMa[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
#define clk1 GPIO_WriteHigh(GPIOB,GPIO_PIN_1)
#define clk0 GPIO_WriteLow(GPIOB,GPIO_PIN_1)
#define stb1 GPIO_WriteHigh(GPIOB,GPIO_PIN_0)
#define stb0 GPIO_WriteLow(GPIOB,GPIO_PIN_0)
#define dio1 GPIO_WriteHigh(GPIOB,GPIO_PIN_2)
#define dio0 GPIO_WriteLow(GPIOB,GPIO_PIN_2)
void gpio()
{ GPIO_DeInit(GPIOB);
GPIO_Init(GPIOB,GPIO_PIN_0,GPIO_MODE_OUT_PP_HIGH_FAST);
GPIO_Init(GPIOB,GPIO_PIN_1,GPIO_MODE_OUT_PP_HIGH_FAST);
GPIO_Init(GPIOB,GPIO_PIN_2,GPIO_MODE_OUT_PP_HIGH_FAST);
GPIO_Init(GPIOB,GPIO_PIN_3,GPIO_MODE_OUT_PP_LOW_FAST);
}
void Write_TM1638(u8 ord)//数码管显示
{
u16 i;
for(i=0;i<8;i++)
{
clk0;
if(ord&0x01)
dio1;
else dio0;
clk1;
ord=ord>>1;
}
}
void Command_TM1638(unsigned char Data)//数码管位选
{
stb1;
stb0;
Write_TM1638(Data);
}
void delay_ms(u16 t)//毫秒定时
{
TIM3_DeInit();
TIM3_TimeBaseInit(TIM3_PRESCALER_16,1000);
while(t--)
{
TIM3_Cmd(ENABLE);
while(TIM3_GetFlagStatus(TIM3_FLAG_UPDATE)!=1);
TIM3_ClearFlag(TIM3_FLAG_UPDATE);
TIM3_Cmd(DISABLE);
}
}
void TIM2_Configuration(void)
{
TIM2_DeInit();
TIM2_TimeBaseInit(TIM2_PRESCALER_16,62500);//16分频
TIM2_ICInit(TIM2_CHANNEL_1, TIM2_ICPOLARITY_RISING, TIM2_ICSELECTION_DIRECTTI, TIM2_ICPSC_div1, 0);//通道1 上升沿 PD4
TIM2_ITConfig(TIM2_IT_CC1, ENABLE);//中断通道1使能
enableInterrupts();
}
void delay_us(u16 z) //10us定时
{ while(z--)
{
nop();nop();nop();nop();
}
}
void trig()
{
GPIO_WriteHigh(GPIOB, GPIO_PIN_3);
delay_us(25) ;
GPIO_WriteLow(GPIOB, GPIO_PIN_3);
}
void main(void)
{
CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIdiv1);
gpio();
Command_TM1638(0x88);
Command_TM1638(0x44);
TIM2_Configuration();
//enableInterrupts();
// trig();
while(1)
{//trig();
/// TIM2_Cmd(ENABLE);
TIM2_SetCounter(0);
trig();
TIM2_Cmd(ENABLE);
a=(float)(y-x)/2000;
b=a*340;
c=(u16)b%10;
d=(u16)b%100/10;
e=(u16)b%1000/100;
f=(u16)b/1000;
Command_TM1638(0xc0);
Write_TM1638(DuanMa[c]);
Command_TM1638(0xc2);
Write_TM1638(DuanMa[d]);
Command_TM1638(0xc4);
Write_TM1638(DuanMa[e]);
Command_TM1638(0xc6);
Write_TM1638(DuanMa[f]);
delay_ms(2000);
}
}
#pragma vector=16
__interrupt void exti_tim2(void)
{
n++;
if(n%2==1)
{
x=TIM2_GetCapture1();
TIM2_ICInit(TIM2_CHANNEL_1, TIM2_ICPOLARITY_FALLING, TIM2_ICSELECTION_DIRECTTI, TIM2_ICPSC_div1, 0);
}
else
{
y=TIM2_GetCapture1();
TIM2_ICInit(TIM2_CHANNEL_1, TIM2_ICPOLARITY_RISING, TIM2_ICSELECTION_DIRECTTI, TIM2_ICPSC_div1, 0);
}
TIM2_ClearITPendingBit(TIM2_IT_CC1);
}
