找回密码
 立即注册

QQ登录

只需一步,快速开始

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

超声波模块这个定时器高低位就是0x0003不管怎么拉距离,附单片机程序

[复制链接]
跳转到指定楼层
楼主
ID:932499 发表于 2021-11-3 08:34 来自手机 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <reg52.h>                 //51单片机最好不用浮点数因为C51中
#include"number.h"                 //有关于浮点运算的函数可以用但代码量大非常耗时不建议使用
void delay(unsigned int xms);
void shu(int cm);
void Delay10us();
void send_out();
int Sum(int a);
sbit tring=P3^7;
sbit echo=P3^6;
void initialization()               //初始化
{
tring=0;
echo=0;
}
int distance()                     
   {               
                  int a;
                   int s;         
                  while(echo==0)               
                   TR0=1;           
                   while(echo==1)                //就是这一块
                   {;}  
                   TR0=0;               
                  a=TH0*256+TL0;                                   //得出定时器从开始到结束的时间   
                   s=a*0.017;                          //高电平时间*170m 要厘米所以 *100 还要小数点后两位 *100;                           
                  TH0=0x00;                  
                  TL0=0x00;                                         //重置                                         
                  return s;
}
void timer0()
{        EA=1;
        ET0=1;
        TMOD &= 0xF0;           //清空
        TMOD |= 0x01;                        //设置定时器模式         
        TH0=0x00;        
        TL0=0x00;               //从0000 0000  0000 0000开始记数 为十六位
}
int main()
{        
        int cm;
          initialization();       //初始化
        timer0();                     //配置定时器                                      while (1)        
{
         send_out();         //发射18us高电平   
        cm=distance();      //从距离函数中获得返回值                                 
         shu(cm);            //让数码管显示        
}
}
void Delay10us()                    //@11.0592MHz  20us 左右{
        unsigned char i;
        i = 5;
        while (--i);
}
void send_out()         //每隔5.54ms 提高20us或10us高电平 搞不懂 不动 可能是第22行while的问题
{
tring=1;
Delay10us();
tring=0;
Delay10us();
}
void delay(unsigned int xms)     //延迟
{
        unsigned int i,j;
        for(i=xms;i>0;i--)        
        for(j=112;j>0;j--);
}
void shu(int cm)    //数码管显示数
{
        int a[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};     //定义时需要放在前面否则报错               
int b[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};          int yi,er,san,si;                          
yi=(int)cm/1000%10;               
er=(int)cm/100%10;               
san=(int)cm/10%10;               
si=(int)cm%10;                        
{                        
P2=0xfe;                        
P0=a[yi];                        
delay(1);                        
P2=0xfd;                        
P0=b[er];                        
delay(1);                        
P2=0xfb;                        
P0=a[san];                        
delay(1);                                
P2=0xf7;                        
P0=a[si];                        
delay(1);               
}
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:624769 发表于 2021-11-3 19:29 | 只看该作者
               while(echo==0)               
                   TR0=1;           
                   while(echo==1)                //就是这一块
                   {;}  
                   TR0=0;               

这几句的意思明白么?  
当echo==0 的时候, TR0 = 1   [反复,不停的 TR0 = 1  直到 echo 不等于0]

然后 当 echo==1 的时候,在那里发呆,傻等,直到 echo 不等于 1

然后, 不管前面干啥了, 到了这里都会 TR0 = 0


所以, 你分析一下,这个逻辑,是你希望的效果么?

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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