找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2345|回复: 8
收起左侧

求助超声波测量问题,万分感谢

[复制链接]
ID:232280 发表于 2017-10-18 22:47 | 显示全部楼层 |阅读模式
看了很多别人的程序,也了解了一下原理,感觉别人写的太复杂了,所以就自己写了一个,但是不管用,距离乱显示,而且刷新时间长。麻烦大神帮我看看哪出问题了,不要给别人的程序,我有太多。只想知道这个程序问题在哪,谢谢。
  1. #include<reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
  5.                                                         0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,
  6.                                                         0x79,0x71};
  7. sbit tring=P2^0;
  8. sbit echo=P2^1;
  9. sbit DLA=P2^2;                //位显数码管
  10. sbit DLB=P2^3;
  11. sbit DLC=P2^4;
  12. bit flag=0;                        //测量超声波是否成功标志
  13. uint S;                                //长度
  14. void delay20us(void)   //误差 0us
  15. {
  16.     unsigned char a,b;
  17.     for(b=1;b>0;b--)
  18.         for(a=7;a>0;a--);
  19. }

  20. void conduct()
  21. {
  22.         uint time;
  23.         time=TH0;                          //读取时间长度
  24.         time<<=8;
  25.         time=time|TL0;
  26.         TH0=0;TL0=0;
  27.         S=time*0.017;                 //转化为距离,单位CM;time*340*100/(2*1000000)
  28. }
  29. void init()
  30. {
  31.         TMOD=0x11;
  32.         EA=1;ET0=1;ET1=1;
  33.         TH1=0xB1;TL1=0xE0;//周期为20MS;
  34.         TH0=0;TL0=0;
  35.         TR1=1;
  36. }
  37. void timer0() interrupt 1          //若溢出,则说明测量失败
  38. {
  39.         flag=1;
  40. }
  41. void timer1() interrupt 3
  42. {
  43.         uchar a,b;       
  44.         TH1=0xB1;TL1=0xE0;
  45.         if((S>4000)|(flag==1))                 //数码管显示函数
  46.         {
  47.                 for(a=40;a>0;a--)
  48.                 {
  49.                         flag=0;
  50.                         DLA=0;DLB=0;DLC=0;P0=0x3f;delay20us();
  51.                         DLA=1;DLB=0;DLC=0;P0=0x50;delay20us();
  52.                         DLA=0;DLB=1;DLC=0;P0=0x50;delay20us();
  53.                         DLA=1;DLB=1;DLC=0;P0=0x79;delay20us();
  54.                 }       
  55.         }
  56.         else
  57.         {
  58.                 for(a=40;a>0;a--)
  59.                 {
  60.                         DLA=0;DLB=0;DLC=0;P0=table[S%10];delay20us();
  61.                         DLA=1;DLB=0;DLC=0;P0=table[S%100/10];delay20us();
  62.                         DLA=0;DLB=1;DLC=0;P0=table[S%1000/100];delay20us();
  63.                         DLA=1;DLB=1;DLC=0;P0=table[S/1000];delay20us();
  64.                 }       
  65.         }
  66.         b++;                                                //b为10即200ms测量一次;
  67.         if(b==10)
  68.         {
  69.                 b=0;
  70.                 tring=1;
  71.                 delay20us();
  72.                 tring=0;
  73.                
  74.         }       
  75. }
  76. void main()
  77. {
  78.         init();
  79.         while(1)
  80.         {
  81.                 while(echo==0);
  82.                 TR0=1;
  83.                 while(echo==1);
  84.                 TR0=0;
  85.                 conduct();
  86.         }
  87. }
复制代码


回复

使用道具 举报

ID:240790 发表于 2017-10-18 23:14 | 显示全部楼层
看不出问题
回复

使用道具 举报

ID:232280 发表于 2017-10-19 08:49 来自手机 | 显示全部楼层
tjsh 发表于 2017-10-18 23:14
看不出问题

是吧,我也认为是没问题的,如果有问题,应该是执行时候的问题,可能有冲突,也有可能mcu忙
回复

使用道具 举报

ID:240356 发表于 2017-10-19 21:11 | 显示全部楼层
很多时候不是程序的问题,有可能是传感器的问题,我以前也调过很长时间,最后整了整传感器,然后就好了,你可以尝试一下。
回复

使用道具 举报

ID:232280 发表于 2017-10-19 23:47 来自手机 | 显示全部楼层
xiehuanle 发表于 2017-10-19 21:11
很多时候不是程序的问题,有可能是传感器的问题,我以前也调过很长时间,最后整了整传感器,然后就好了,你 ...

不会的,因为我用别人写的程序试过没问题
回复

使用道具 举报

ID:239427 发表于 2017-10-20 00:00 | 显示全部楼层
帮看,我在我软件试试
回复

使用道具 举报

ID:241144 发表于 2017-10-20 00:33 | 显示全部楼层
感觉没有问题哎,执行时出现的是什么错误?
回复

使用道具 举报

ID:232280 发表于 2017-10-20 22:12 | 显示全部楼层
随炀heart 发表于 2017-10-20 00:33
感觉没有问题哎,执行时出现的是什么错误?

烧录后距离不准确,是很离谱;而且久久不刷新
回复

使用道具 举报

ID:241465 发表于 2017-10-21 00:20 | 显示全部楼层
看不出来。。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表