超声波测距求助

2019-03-24 17:12发布

本帖最后由 3955793141 于 2017-1-8 18:35 编辑
  1. #include <reg52.h>   
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint  unsigned int
  5. #define ulong unsigned long
  6. sbit Trig1  = P2^0;
  7. sbit Trig2  = P2^1;
  8. sbit Echo1  = P3^2;
  9. sbit Echo2  = P3^3;
  10. sbit DULA = P2^6;
  11. sbit WELA = P2^7;

  12. uchar code SEG7[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//êyÂë1ü0-9
  13. uchar ge1,shi1,bai1,ge2,shi2,bai2,temp,flag,outcomeH,outcomeL,i,uselection,distance_data,time,time1;
  14. bit succeed_flag;  

  15. void conversion1(uint temp_data);
  16. void delay_20us();
  17. void display(uint o);
  18. void ultrasonic_detect1();
  19. void ultrasonic_detect2();
  20. void delay_10us();
  21. void main(void)
  22. {
  23.         double s;
  24.         time=0;
  25.         i=0;
  26.         flag=0;
  27.         Trig1=0;   
  28.         Trig2=0;
  29.         TMOD=0x12;
  30.         TH0=0;
  31.         TL0=0;
  32.         TH1=0;
  33.         TL1=0;
  34.         TR0=1;
  35.         ET0=1;
  36.         EA=1;
  37.         while(1)
  38.         {
  39.                 if(time>=40)
  40.                 {
  41.                         ultrasonic_detect1();
  42.                         time=0;
  43.                 }
  44.                 if(succeed_flag==1)
  45.           {         
  46.                         time1=outcomeH;               
  47.       time1<<=8;      
  48.                         time1=time1|outcomeL;
  49.                         s=(time1*0.9216)/5.8;
  50.                         s=(uint)s;
  51.                         conversion1(s);
  52.                         succeed_flag=0;
  53.                 }                           
  54.                 display(1);
  55.         }
  56. }

  57. INTO_()  interrupt 0  
  58. {  
  59.         TR1=0;
  60.         TR0=1;
  61.         EX0=0;
  62.         outcomeH =TH1;
  63.         outcomeL =TL1;
  64.         succeed_flag=1;
  65. }

  66. timer0() interrupt 1
  67. {
  68.         time++;
  69. }
  70. //ía2¿ÖD¶Ï1 P3.3
  71. INT1_()  interrupt 2  
  72. {   
  73.         TR1=0;
  74.         TR0=1;
  75.         EX0=0;
  76.         outcomeH =TH1;
  77.         outcomeL =TL1;
  78.         succeed_flag=1;
  79. }

  80. void ultrasonic_detect1()
  81. {
  82.                 EA=0;
  83.                 TR0=0;
  84.                 uselection = 2;
  85.                 Trig1=1;
  86.                 delay_20us();
  87.                 Trig1=0;
  88.                 TH1=0;
  89.                 TL1=0;
  90.                 while(Echo1==0);
  91.                 TR1=1;
  92.                 succeed_flag=0;
  93.                 EX0=1;
  94.                 TF1=0;
  95.                 EA=1;
  96. }

  97. void ultrasonic_detect2()
  98. {
  99.                 EA=0;
  100.                 TR0=0;
  101.                 Trig2=1;
  102.                 uselection = 1;
  103.                 delay_20us();
  104.                 delay_20us();
  105.                 Trig2=0;
  106.                 while(Echo2==0);
  107.                 succeed_flag=0;
  108.                 EX0=1;
  109.                 TH1=0;
  110.                 TL1=0;
  111.                 TL0=0;         
  112.                 TF1=0;
  113.                 TR1=1;          //Æô¶ˉ¶¨ê±Æ÷1
  114.                 EA=1;
  115. }

  116. void conversion1(uint temp_data)  
  117. {  
  118.         uchar ge_data,shi_data,bai_data ;
  119.         bai_data=temp_data/100 ;
  120.         shi_data=temp_data/10%10;
  121.         ge_data=temp_data%10;
  122.         bai1=SEG7[bai_data];
  123.         shi1=SEG7[shi_data];
  124.         ge1 =SEG7[ge_data];
  125. }

  126. void display(uint o)
  127. {
  128.         switch(1)
  129.         {
  130.                 case 1 :
  131.                 DULA = 1 ;P0= bai1 ;DULA = 0 ;P0=0xff;
  132.                 WELA = 1 ;P0= 0xFE ;WELA = 0 ;delay_10us();

  133.                 DULA = 1 ;P0= shi1 ;DULA = 0 ;P0=0xff;
  134.                 WELA = 1 ;P0= 0xFD ;WELA = 0 ;delay_10us();
  135.                
  136.                 DULA = 1 ;P0= ge1  ;DULA = 0 ;P0=0xff;
  137.                 WELA = 1 ;P0= 0xFB ;WELA = 0 ;delay_10us();
  138.                 break;

  139.         default: break;
  140.         }
  141. }

  142. void delay_20us()
  143. {  uchar bt ;
  144.     for(bt=0;bt<100;bt++);
  145. }

  146. void delay_10us()
  147. {  uchar bt ;
  148.     for(bt=0;bt<25;bt++);
  149. }
复制代码我写了一个双通道的超声波测距电路,现在只写了单通道的,我在调试的时候发现,只有定时器1的低八位TL1有值,可是TH1没有值,导致只能计算一部分的距离然后又重新机选了,请问这是怎么回事呢?  还有就是为什么LED上会有残影= =。

啊可以了,原来是我定义错了,犯了低级错误~
此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
gs001588
1楼-- · 2019-03-24 21:56
消灭零回复。本来还想给你看看发挥一下,看到问题已解决,那就走人了
吃土玩泥巴
2楼-- · 2019-03-24 23:12
 精彩回答 2  元偷偷看……
hujj
3楼-- · 2019-03-25 03:19
也许是定义了八位的内存变量来处理定时器十六位的计数。
5000322
4楼-- · 2019-03-25 08:19
怎么解决的,晒出来看看

一周热门 更多>