找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1409|回复: 7
打印 上一主题 下一主题
收起左侧

大佬们帮忙看一下这单片机程序呗,不知道为什么不循环

[复制链接]
跳转到指定楼层
楼主
ID:424726 发表于 2019-1-29 21:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
超声波只能启动一次,数值都不变了
请问各位这是什么原因呢

  1. #include<reg52.h>
  2. #include<intrins.h>
  3. sbit TRIG=P2^6;
  4. sbit ECHO=P2^7;
  5. sbit zuo0=P2^0;
  6. sbit zuo1=P2^1;
  7. sbit zuo2=P2^2;
  8. sbit zuo3=P2^3;
  9. sbit clk=P1^2;
  10. sbit cs=P1^1;
  11. sbit din=P1^0;
  12. unsigned char i=0;
  13. unsigned int dis;
  14. unsigned int t;
  15. unsigned char flag=0;
  16. unsigned int timer=0;
  17. unsigned char code LedChar[]=
  18. {
  19. 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
  20. 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e
  21. };
  22. unsigned char LedBuff[]=
  23. {
  24. 0xff,0xff,0xff,0xff
  25. };
  26. unsigned char code disp1[]=
  27. {
  28.   0x04,0x22,0x44,0x40,0x40,0x44,0x22,0x04,
  29. };
  30. unsigned char code disp2[]=
  31. {
  32.   0x00,0x22,0x12,0x10,0x10,0x12,0x22,0x00
  33. };
  34. void delay(unsigned int x)
  35. {
  36. unsigned char i;
  37. unsigned char j;
  38. for(i=0;i<x;i++)
  39.    for(j=0;j<112;j++);
  40.    }
  41.    void write_byte(unsigned char Data)
  42.    {
  43.     unsigned char i;
  44. cs=0;
  45. for(i=8;i>=1;i--)
  46. {
  47. clk=0;
  48. din=Data&0x80;
  49. Data=Data<<1;
  50. clk=1;
  51. }
  52. }
  53. void write(unsigned add,unsigned char dat)
  54. {
  55.   cs=0;
  56.   write_byte(add);
  57.   write_byte(dat);
  58.   cs=1;
  59.   }
  60.   void chushi()
  61.   {
  62.    write(0x09,0x00);
  63.    write(0x0a,0x03);
  64.    write(0x0b,0x07);
  65.    write(0x0c,0x01);
  66.    write(0x0f,0x00);
  67.    }
  68. void open()
  69. {
  70.    TRIG=1;
  71.    _nop_();
  72.    _nop_();
  73.    _nop_();
  74.    _nop_();
  75.    _nop_();
  76.    _nop_();
  77.    _nop_();
  78.    _nop_();
  79.    _nop_();
  80.    _nop_();
  81.    _nop_();
  82.    _nop_();
  83.    TRIG=0;
  84.    }
  85.    void jisuan()
  86.    {
  87.    TH1=0;
  88.   TL1=0;
  89.   while(!ECHO);
  90.   TR1=1;
  91.   while(ECHO);
  92.   TR1=0;
  93.    t=TH1*256+TL1;
  94.    dis=(t*1.7)/100;
  95.    if(dis>420)
  96.    {
  97.     dis=0;
  98.     flag=0;
  99.     LedBuff[0]=LedChar[15];
  100.     LedBuff[1]=LedChar[15];
  101.     LedBuff[2]=LedChar[15];
  102.     LedBuff[3]=LedChar[15];
  103.     }
  104.     else
  105.     {
  106.    LedBuff[0]=LedChar[dis%10];
  107.    LedBuff[1]=LedChar[dis/10%10];
  108.    LedBuff[2]=LedChar[dis/100%10];
  109.    LedBuff[3]=LedChar[dis/1000%10];
  110.    }
  111. }
  112. void xianshixiao()
  113. {
  114. unsigned char i;
  115. delay(50);
  116. chushi();
  117. for(i=1;i<9;i++)
  118. write(i,disp1[i-1]);
  119. delay(1000);
  120. }
  121. void xianshiku()
  122. {
  123.   unsigned char i;
  124.   delay(50);
  125.   chushi();
  126.   for(i=1;i<9;i++)
  127.   write(i,disp2[i-1]);
  128.   delay(1000);
  129.   }
  130.    void main ()
  131.    {
  132.      TMOD=0x11;
  133.   TR0=1;
  134.   EA=1;
  135.   ET0=1;
  136.   ET1=1;
  137.   while(1)
  138.   {
  139.   TH0=0XFC;
  140.   TL0=0X67;
  141.   open();
  142.   jisuan();
  143.      if(dis<=10)
  144.      {
  145.       xianshixiao();
  146.      }
  147.         else
  148.      {
  149.       xianshiku();
  150.      }
  151.    }
  152.   }
  153.    void timer1() interrupt 1
  154.    {
  155.     TH0=0XFC;
  156.     TL0=0X67;
  157.     P0=0XFF;
  158.     switch(i)
  159.     {
  160.      case 0: zuo0=1;zuo1=1;zuo2=1;zuo3=0;i++;P0=LedBuff[0];break;
  161.   case 1: zuo0=1;zuo1=1;zuo2=0;zuo3=1;i++;P0=LedBuff[1];break;
  162.   case 2: zuo0=1;zuo1=0;zuo2=1;zuo3=1;i++;P0=LedBuff[2];break;
  163.   case 3: zuo0=0;zuo1=1;zuo2=1;zuo3=1;i=0;P0=LedBuff[3];break;
  164.   }
  165.   timer++;
  166.     }
  167.    void timer0() interrupt 3
  168.    {
  169.     flag=1;
  170.     }

复制代码

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:138119 发表于 2019-1-30 08:30 | 只看该作者
楼主厉害,一个注释都没有,别人看起来会很累!~
回复

使用道具 举报

板凳
ID:164602 发表于 2019-1-30 09:18 | 只看该作者
不知道你用的哪款超声波传感器,我用的HC-SR04款,这个说明书上说:
为了不影响发波与回波的干扰,需要间隔60ms以上再发波。
从你的程序中,没有看到这样的设置,一直不停地发波,间隔时间可能小了。
我的程序是这样的:
void zd3() interrupt 3//T1中断用来扫描数码管显示和计200MS启动模块,发射超声波
{
        TH1=0xf8;//重装初值
        TL1=0x30;
        DigDisplay();//调用显示
        timer++;
        if(timer>=50)
        {
                timer=0;
                TX=1;//100MS启动一次模块。启动模块,就是控制端发出一个10us以上的高电平脉冲
                         //此处发了15us的高电平脉冲
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                TX=0;
        }
}
把程序改一下看看。
回复

使用道具 举报

地板
ID:243076 发表于 2019-1-30 09:29 | 只看该作者
你的中断看哈是不是有点问题
回复

使用道具 举报

5#
ID:466578 发表于 2019-1-30 10:12 | 只看该作者
行139的
TH0=0XFC;
  TL0=0X67;
嵌在while循环里面,不停的给定时器赋初值
回复

使用道具 举报

6#
ID:276663 发表于 2019-1-30 10:47 | 只看该作者
可能是一直卡在定时器0刷新显示了。
回复

使用道具 举报

7#
ID:405201 发表于 2019-1-30 12:24 | 只看该作者
可能卡在定时器0里了
回复

使用道具 举报

8#
ID:424726 发表于 2019-1-30 14:55 | 只看该作者
HC6800-ES-V2.0 发表于 2019-1-30 09:18
不知道你用的哪款超声波传感器,我用的HC-SR04款,这个说明书上说:
为了不影响发波与回波的干扰,需要间 ...

好的 十分感谢
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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