找回密码
 立即注册

QQ登录

只需一步,快速开始

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

这个超声波测距仪程序只会显示0000

[复制链接]
跳转到指定楼层
楼主
ID:673128 发表于 2019-12-29 10:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include"myhead.h"    //还有一部分是digdisplay(unsigned char wei,unsigned char duan)的封装函数,这一部分没问题(我确定)

sbit Trig=P2^1;
sbit Echo=P2^0;   
bit flag=0;                  //定义一个中断标志位
u16 time,distance;

u8 n,date[4]={0,0,0,0};



void Count()
{
  time=TH0*256+TL0;
  distance=time*0.17;                    //算出距离单位是毫米       
  if(flag==1||distance>4500)                //说明超过超声波测距仪测试范围                         最小2厘米最大450厘米
  {
    flag=0;
    date[3]=12;
        date[2]=13;
        date[1]=13;
        date[0]=0;
  }
  else
  {

         date[3]=distance/1000;
         date[2]=distance%1000/100;
         date[1]=distance%100/10;
         date[0]=distance%10;
  }
         
}

void Int0() interrupt 1                   //标志位的改变
{
   flag=1;
}

void Int1() interrupt 3        //做每隔100毫秒给超声波测距仪发送启动命令
{
        TL1 = 0x18;                //设置定时初值
        TH1 = 0xFC;                //设置定时初值
        digdisplay(3,date[3]);
        digdisplay(2,date[2]);
        digdisplay(1,date[1]);
        digdisplay(0,date[0]);
   n++;
   if(n==100)                //200毫秒定时时间到
   {
     n=0;
    TL0 = 0;               
    TH0 = 0;       
         Trig=1;
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
         Trig=0;
   }
}
void main()
{
   TMOD=0x11;  //开启定时器0,1
   TL0 = 0;                //设置定时初值                         时间 26470微秒
   TH0 = 0;                //设置定时初值                         最大距离 450厘米
   TF0=0;
   ET0=1;
   TL1 = 0x18;                //设置定时初值
   TH1 = 0xFC;                //设置定时初值
   TF1 = 0;                //清除TF1标志
   TR1 = 1;                //定时器1开始计时
   ET1=1;
   EA=1;
   while(1)
   {
      while(!Echo);
          TR0=1;
          while(Echo);
          TR0=0;
          Count();                                //对测试出来的时间进行处理
   }
}

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

使用道具 举报

沙发
ID:437615 发表于 2019-12-29 22:43 | 只看该作者
主循环里没有起动函数,while(!Echo);前面加启动函数
回复

使用道具 举报

板凳
ID:673128 发表于 2019-12-30 12:03 | 只看该作者
zhy123654 发表于 2019-12-29 22:43
主循环里没有起动函数,while(!Echo);前面加启动函数

启动函数在中断3中,
回复

使用道具 举报

地板
ID:673128 发表于 2019-12-30 14:40 | 只看该作者
大家问题我找到了,没想到在显示部分(尴尬了),我的数码管显示程序是一次延时时间是1毫秒(共显示四次也就是4毫秒),导致程序在中断部分延时时间过长,缩短显示函数的延时时间就行了,主程序没问题可以参考一下,也可以用查询式的方法,不用定时器1,这样就不用考虑程序的中断了,而且还解决了某些小问题。谢谢大家的解答了。
回复

使用道具 举报

5#
ID:673128 发表于 2019-12-30 14:43 | 只看该作者
问题出在显示程序上,我的显示程序延时时间过长导致在中断中的时间过长了,缩短显示程序的延时时间就可以了,谢谢大家对我问题的解答。十分感谢!
回复

使用道具 举报

6#
ID:673128 发表于 2019-12-30 14:44 | 只看该作者
左眼 发表于 2019-12-30 12:03
启动函数在中断3中,

问题出在显示程序上,我的显示程序延时时间过长导致在中断中的时间过长了,缩短显示程序的延时时间就可以了,谢谢大家对我问题的解答。十分感谢!
回复

使用道具 举报

7#
ID:130230 发表于 2019-12-30 16:44 | 只看该作者
正确的做法是用中断+标志实现延时。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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