单片机怎么使用超声波传感器

我是鱼,很咸的哪种 2019-04-10 06:13:14
各位大佬,本人最近在玩单片机想做个超声波测距,一直没有弄好,不知道是哪里出了问题,用万用表测超声波模块HC-SRO4的回波在200m的档位时有电压但是单片机就是不产生外部中断,用的是外部中断T1,输入引脚接的是P33,单片机芯片是STC89C52RC,程序运行仿真时在打开EX1=1时执行了下一个语句后马上就进入了外部中断函数,不知道什么问题,因为只进行一次就没管他,不知道是不是这个问题。下面是我的程序 #include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#include <intrins.h>unsigned char data dis_digit;#define uchar unsigned char //定义一下方便使用#define uint unsigned int#define ulong unsigned longvoid conversion() ;void isr_t0(void); //中断服务函数声明void delay ( z);//延时函数声明unsigned char counter,j; //定义一个变量counter用来计数bit succeed_flag; //测量成功标志unsigned char ge,shi,bai,temp,flag,outcomeH,outcomeL,i; //自定义寄存器unsigned char ge_data ,shi_data,bai_data,temp_data ,x,y,z;uint distance_data; /*sbit IN1=P3^1;sbit IN2=P3^0;sbit ENA=P3^2;*/sbit IN3=P1^2;sbit IN4=P1^1;sbit ENB=P1^0;sbit vcc = P3^1;sbit Trig = P3^2; //产生脉冲引脚sbit Echo = P3^3; //回波引脚sbit gnd = P3^4;uchar code SEG7[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//数码管0-9sbit ENB=P3^2;//******************************************************************************************************************void main(void) //主函数{ uint distance_data; PX1=1; counter=0; i=0; vcc=1; gnd=0; Echo=0; Trig=0; IT1=1; TR0=0; TMOD=0x11; TH0=0xdc; TL0=0x00; EA=1; //总中断打开 ET0=1; //定时器中断打开 TR0=1; dis_digit = 0xfd; while(1) //程序循环 { if(succeed_flag==1) { distance_data=outcomeH; //测量结果的高8位 distance_data<<=8; //放入16位的高8位 distance_data=distance_data|outcomeL;//与低8位合并成为16位结果数据 distance_data*=12; //因为定时器默认为12分频 distance_data/=58; //微秒的单位除以58等于厘米 conversion(); } //为什么除以58等于厘米, Y米=(X秒*344)/2 // X秒=( 2*Y米)/344 ==》X秒=0.0058*Y米 ==》厘米=微秒/58 /* if(succeed_flag==0) { distance_data=0; //没有回波则清零 } */ } }//*******************************************************************************************************************void isr_t0(void) interrupt 1 //中断服务函数{ TH0=0xdc;TL0=0x00;counter++; /*产生一个20us的脉冲,每1s产生一次*/ while(counter==100) { TH1=0; //定时器1清零 TL1=0; //定时器1清零 Trig=1; delay(3); Trig=0; //产生一个20us的脉冲,在Trig引脚 TR1=1; //启动定时器1 EX1=1; //打开外部中断 succeed_flag=0; counter=0; } /*数码管显示*/ P1 = 0x00; // 先关闭所有数码管 i++; switch(i) { case 1: P0=bai;break; case 2: P0=shi;break; // 显示代码传送到P0口 case 3: P0=ge ;break; } if(i==3) i=0; P1 = dis_digit; // dis_digit = _crol_(dis_digit,1); // 位选通值左移, 下次中断时选通下一位数码管 if (dis_digit == 0xef) dis_digit = 0xfd;}//**************************************************************************************//***************************************************************//外部中断0,用做判断回波电平INTO_() interrupt 2 // 外部中断是2号 { outcomeH =TH1; //取出定时器的值 outcomeL =TL1; //取出定时器的值 succeed_flag=1; //至成功测量的标志 EX1=0; //关闭外部中断 }//***************************************************************//********************************************void conversion( ) { temp_data=distance_data; bai_data=temp_data/100 ; temp_data=temp_data%100; //取余运算 shi_data=temp_data/10 ; temp_data=temp_data%10; //取余运算 ge_data=temp_data; bai_data=SEG7[bai_data]; shi_data=SEG7[shi_data]; ge_data =SEG7[ge_data]; EA=0; bai = bai_data; shi = shi_data; ge = ge_data ; EA=1; }//************************************************//**************************void delay ( z) { unsigned int x,y; for(x=z;x>0;x--) for(y=10;y>0;y--); }//*****
...全文
292 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
我的触发方式是下降沿触发,应该是只要有下降沿就触发,超声波模块的回波端我测是有电压的所以模块应该没问题,应该就是单片机不进入外部中断。我在程序里加了Echo=1;Echo=0;正常来说仿真执行完这两句后应该进入外部中断,但是没有进去,不知道是不是中断没有定义好。
fly 100% 2019-04-11
  • 打赏
  • 举报
回复
超声波传感器 距离远近会输出不同间隔的脉冲,只需要统计出脉冲间隔就能算出距离,是不是幅度没有达到触发的level ,还是中断没有正确返回

27,377

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧