找回密码
 立即注册

QQ登录

只需一步,快速开始

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

请问有没有大佬用过单片机超声波啊,可不可以指点一下

[复制链接]
跳转到指定楼层
楼主
ID:1018211 发表于 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;

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

使用道具 举报

沙发
ID:121859 发表于 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;

}

评分

参与人数 1黑币 +50 收起 理由
admin + 50

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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