标题:
超声波模块这个定时器高低位就是0x0003不管怎么拉距离,附单片机程序
[打印本页]
作者:
星空宗主
时间:
2021-11-3 08:34
标题:
超声波模块这个定时器高低位就是0x0003不管怎么拉距离,附单片机程序
#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);
}
}
作者:
188610329
时间:
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
所以, 你分析一下,这个逻辑,是你希望的效果么?
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1