微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 求各位帮忙看下程序哪里有问题

求各位帮忙看下程序哪里有问题

时间: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);
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top