找回密码
 立即注册

QQ登录

只需一步,快速开始

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

这个超声波程序 怎么没有中断呀,有时候有,有时候没有,苦呀!

[复制链接]
跳转到指定楼层
楼主
ID:299872 发表于 2018-4-13 00:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
超声波程序,
程序大概就是这样的,开始的时候,反复重启,反复重写,有时候可以正常工作。
后来我想找出原因,现在程序成这样了,没一次正常了。
找到的原因是
while(flag==0);
这一句死循环了,跳不出去!!!!
应该是中断出了什么问题吗????
或者是10NS那个,计算的问题引起的中断没成功???



#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar dat_buffer[2]={0};
uint distime;
uint distance;
bit flag=0;
void delay_ms(uint ms)
{
uint ms1, ms2;
for(ms1=ms; ms1>0; ms1--)
for(ms2=110; ms2>0; ms2--);
}
void delay_us(uint us)
{
while(us--);
}
sbit TX=P3^7;
sbit RX=P3^6 ;
void main()
{
P1=0;P2=0;
IT0=1;
TMOD=0x01;
EA=1;
TX=0;
while(1)
{
TX=1;
delay_us(9);
TX=0;
while(RX==0);
flag=0;
ET0=1;
TH0=0;
TL0=0;
TR0=1;
EX0=1;
while(flag==0);      这一句的时候出问题了!!!!
if(flag==1)
{
distime=dat_buffer[1]*256+dat_buffer[0];
distance=(uint)(distime*0.172/10);
P1=distance%256;
P2=distance/256;
delay_ms(400) ;  
}
else
{
distime=0;
}
}
}
void INT0_() interrupt 0
{
dat_buffer[1]=TH0;
dat_buffer[0]=TL0;
flag=1;
EX0=0;
TR0=0;
}

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

使用道具 举报

沙发
ID:123289 发表于 2018-4-13 01:28 | 只看该作者
程序中的死循环,主可以被中断打断的!
中断中的死循环,主可以被更高级的中断打断的!
“没有中断”:
1、要查你的中断源有没有动作。
2、是不是本身中断后,死在中断服务程序中。无法被下次中断打断。
回复

使用道具 举报

板凳
ID:299872 发表于 2018-4-13 02:17 来自手机 | 只看该作者
yzwzfyz 发表于 2018-4-13 01:28
程序中的死循环,主可以被中断打断的!
中断中的死循环,主可以被更高级的中断打断的!
“没有中断”:

这程序,有时候可以工作,有时候又不行,今天,我改了几个参数,就彻底不能运行了,改回去都不行。
回复

使用道具 举报

地板
ID:299872 发表于 2018-4-13 02:18 来自手机 | 只看该作者
yzwzfyz 发表于 2018-4-13 01:28
程序中的死循环,主可以被中断打断的!
中断中的死循环,主可以被更高级的中断打断的!
“没有中断”:

根据我的排除,还没有进中断。就死在哪里了!
回复

使用道具 举报

5#
ID:299872 发表于 2018-4-13 02:24 来自手机 | 只看该作者
yzwzfyz 发表于 2018-4-13 01:28
程序中的死循环,主可以被中断打断的!
中断中的死循环,主可以被更高级的中断打断的!
“没有中断”:

谢谢,仔细看了一下,你的留言。问题是中断没运行???语法错误,硬件故障??
回复

使用道具 举报

6#
ID:123289 发表于 2018-4-13 03:33 | 只看该作者
调试一下,就知道了,很简单。
让运行中断,这是查看一下相关你所用的中断寄存器:如TR0、ET0等等是否正常。
回复

使用道具 举报

7#
ID:164602 发表于 2018-4-13 09:59 | 只看该作者
给你一个可以正常工作的,I/O口自己改。
#include"reg51.h"
#include <intrins.h>

sbit RX=P1^1;//连接Echo
sbit TX=P1^0;//连接Trig

#define GPIO_DIG P0
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;

unsigned int  time=0;
unsigned int  timer=0;
unsigned long S=0;
bit flag=0;

unsigned char code DIG_CODE[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsigned char disbuff[4]={0,0,0,0};

void DigDisplay()
{
        unsigned char i;
        unsigned int j;
        for(i=0;i<4;i++)
        {
                switch(i)
                {
                        case(0):
                                LSC=0;LSB=0;LSA=0; break;
                        case(1):
                                LSC=0;LSB=0;LSA=1; break;
                        case(2):
                                LSC=0;LSB=1;LSA=0; break;
                        case(3):
                                LSC=0;LSB=1;LSA=1; break;
                }
                GPIO_DIG=disbuff[i];
                j=20;
                while(j--);       
                GPIO_DIG=0x00;
        }
}

void Conut(void)
{
        time=TH0*256+TL0;
        TH0=0;
        TL0=0;
       
        S=(long)(time*0.17);
        if((S>=4000)||flag==1)
        {         
                flag=0;
                disbuff[0]=0x5c;//“o”
                disbuff[1]=0x72;//“r”
                disbuff[2]=0x72;//“r”
                disbuff[3]=0x79;//“E”
        }
        else
        {
                disbuff[3]=DIG_CODE[S%10000/1000];
                disbuff[2]=DIG_CODE[S%1000/100];
                disbuff[1]=DIG_CODE[S%100/10];
                disbuff[0]=DIG_CODE[S%10/1];
        }
}

void zd1() interrupt 1
{
        flag=1;
}

void zd3() interrupt 3
{
        TH1=0xf8;
        TL1=0x30;
        DigDisplay();
        timer++;
        if(timer>=50)
        {
                timer=0;
                TX=1;
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                TX=0;
        }
}

void  main(  void  )
{  
        TMOD=0x11;
        TH0=0;
        TL0=0;         
        TH1=0xf8;
        TL1=0x30;
        ET0=1;
        ET1=1;
        TR1=1;
        EA=1;
        while(1)
        {
                while(!RX);
                TR0=1;
                while(RX);
                TR0=0;
                Conut();
        }
}

回复

使用道具 举报

8#
ID:213173 发表于 2018-4-13 13:45 | 只看该作者
【Realplay】HC-SR04 超声波模块 测距模块 超声波 传感器 送资料.rar (1.67 MB, 下载次数: 8)
回复

使用道具 举报

9#
ID:299872 发表于 2018-4-13 18:10 来自手机 | 只看该作者
这程序吐血的地方是有时候,可以正常运行,有时候又不行!!开始我还怀疑过硬件问题,我买的1.99一个的最小系统板。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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