标题: 请问有没有大佬用过单片机超声波啊,可不可以指点一下 [打印本页]

作者: 合体    时间: 2022-4-14 13:01
标题: 请问有没有大佬用过单片机超声波啊,可不可以指点一下
就是我写的这段超声波的代码不知道为啥用不了
思路:用超声波返回高电平的时间计算距离然后用串口发送到电脑上
#include <STC15F2K60S2.H>
#include "intrins.h"
sbit TRIG = P1^1; //单片机2.7针脚对应 trig
sbit ECHO = P1^2; //单片机2.6针脚对应 echo
int S;
int time;
void Delay30us()                //@11.0592MHz
{
        unsigned char i;

        _nop_();
        _nop_();
        i = 80;
        while (--i);
}

void init()
{        

        AUXR=0x40;
        SCON=0x50;
        TMOD=0x00;//定时0,1为模式0
        TL0 = 0xF7;                //设置定时初值1um
        TH0 = 0xFF;                //设置定时初值
        TL1 = 0xE0;                //波特率9600
        TH1 = 0xFE;                //波特率9600
        ES=1;
        EA=1;
        PS=1;//串口中断设高

        TR1=1;
        ET0=1;
//定时器0,1中断未打开//        
}
void main()
{        
        init();

        while(1)
        {        
          TRIG=1;
          Delay30us();        
          TRIG=0;        
                while(!ECHO);
        
                TR0=1;
                while(ECHO);
                TR0=0;
                SBUF=time;
                time=0;
        
        }

}
void TIMyE() interrupt 1
{
                time++;
               
}
void dff() interrupt 4
{
        RI=0;
        while(!TI);
        TI=0;

}

作者: zhxiufan    时间: 2022-4-14 13:56
有好几个地方错误:
1、SBUF=time;time是int量,所以这样发送是错误的。
2、void TIMyE() interrupt 1
{
                time++;
               
}1us定时,中断服务里面用变量加1来处理,响应加计算占用时间不少,恐怕会影响结果。还不如直接读取定时器值来的准确。
3.void dff() interrupt 4
{
        RI=0;
        while(!TI);
        TI=0;

}这里应该是错误的,发送引起的中断的话TI已经是1了,没有必要再有等待,所以这里最好的处理是判断引起中断原因做相应处理。
void dff() interrupt 4
{
       if(RI) RI=0;
       if(TI) TI=0;

}




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1