微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 新人求帮看查一下程序(stc89c52超声波测距)

新人求帮看查一下程序(stc89c52超声波测距)

时间:10-02 整理:3721RD 点击:
求大神帮看一下,超声波模块一直没有作用,中断部分编程不太懂
//超声波模块程序  
//超声波模块程序
//Trig  = P2^0 //Echo  = P3^2  
#include <reg52.h>     
#define uchar unsigned char
#define uint  unsigned int
#define ulong unsigned long
uchar timeL;
uchar timeH;
bit succeed_flag;
uchar time;
sbit Trig=P0^0;
sbit Echo=P3^3;

sbit P2_0 = P2^0;
sbit P2_1 = P2^1;
sbit P2_2 = P2^2;
sbit P2_3 = P2^3;
uchar code table[]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f};//共阳数字编码  0.1.2.3.4....9
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--);
for(y=110;y>0;y--);
}
void delay_20us()
{
uchar a  ;
for(a=0;a<100;a++);
}
//显示转换程序
void display(uint temp)
{
  uchar ge,shi,bai;
  bai=temp/100;
  shi=(temp%100)/10;
  ge=temp%10;

  P1=table[bai];
  delay(5);

  P1=table[shi];
  delay(5);


  P0=table[ge];
  delay(5);

}

void main()
{
  uint distance;
  P2_2=P2_1=P2_0=0;

  Trig=0;  //首先拉低脉冲输入引脚
  EA=1;  //打来总中断0
  TMOD=0x10;  //定时器1,16位工作方式
  IT1=0;
  EX1=0;
  while(1)
  {
   EA=0;  //关总中断
   Trig=1;  //超声波输入端
   delay_20us();
   Trig=0;
   while(Echo==0); //等待Echo回波引脚变高电平
   succeed_flag=0;  //清测量成功标志
   EA=1;
   EX0=1;  //打开外部中断0
   TH1=0;  //定时器1清零
                 
   TL1=0 ; //定时器1清零
   TF1=0;  //启动定时器1
   delay(20);  //等待测量结果
   TR1=0;  //关闭定时器1
   EX0=0;   //关闭外部中断0
   if(succeed_flag==1 )
   {time=timeH*256+timeL;
    distance=time*0.172;  //厘米

         display(distance);
        }
        if(succeed_flag==0)
         {
          distance=0;    //没有回波则清零
          
          }
        }
}
//外部中断0,用做判断回波电平
void exter() interrupt 0 //外部中断0是0号
{
  timeH=TH1;  //取出定时器的值
  timeL=TL1;  //取出定时器的值
  succeed_flag=1; //至成功测量的标志
  EX0=0;  //关闭外部中断
}

这个就是超声波发生的同时开计时器,接收到回波时引起外部中断从而触发计时器关闭,计时器的两个时间差乘以速度/2就是你要的距离

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

网站地图

Top