C51单片机超声波模块代码编写
作者:互联网
超声波模块在日常很多地方都有使用到,它的原理是根据发出声波,接收返回的声波的时间来判断此时物体的距离,我们通常可以超声波来进行测距。
1、利用定时器来计算时间
我们利用定时器0的模式1:16位定时器来作为我们的时间计算。此时TMOD要设置为0x01
注意:如果是波特率为9600的时候,要注意此时有用到定时器1,如果要和超声波一起使用,最后使用移步来配置寄存器,直接赋值会将TMOD的值变化。
超声波初始化:
void chaoshenbo_init(){ //超声波初始化
TMOD |=0X01;
TH0=0;
TL0=0;
}
2、计算声波发出到接收声波的时间
超声波模块上有四个引脚,分别为VCC、GND、Echo、Trig,当给Trig一个脉冲后,Echo会发出声波,此时Echo会被拉高,当接收到返回的声波时候,Echo被拉低,所以我们可以根据Echo的变化来计算时间。
void chaoshenbo_start(){ //超声波发出声波
Trig=0;
Trig=1;
delay(200);
Trig=0;
}
float chaoshenbo_getone(){ //超声波计时,返回值为float型
chaoshenbo_start();
while(!Echo);
TR0=1; //开启定时器
while(Echo);
TR0=0; //关闭定时器
return chaoshenbo_getdis();
}
3、计算距离
声波来回的距离是如何算的呢?距离=声波速度(340m/s)x时间
我们已经通过定时器可以知道声波的时间
float chaoshenbo_getdis(){ //超声波测距
int time=TH0*256+TL0; // 将Th0和TL0的值进行转化
float distance=(float)(time*0.017); //从发出声波到碰到物体的距离
TH0=0; //计算完一定要将TH0和TL0清零
TL0=0;
return distance; //返回值为 计算出的距离
}
补充:如果用定时器精确算出1s的时间
我们所知道的机器周期:12x晶振的倒数
时钟周期:晶振的倒数
当定时器为16位的模式时,能做2^16次方(65536)的加一,加一就是耗时一个机器周期,定时器爆表一次约等于71ms
那我们要计算1s的时间,可以先算出TH0和TL0需要跳到多少次,已知定时器爆表需要65536x(12/11059200),那我们比例计算出10ms时的TH0和TL0需要跳动几次,然后用66536减去它,就可以得出TH0和TL0的初始值。
注:每定时器爆表一次,后要将TH0和TL0初始化
void init_time(){
TMOD |=0X01;
TH0=0XDC; //计算的出RH0和TL0,设置初始化化
TL0=0X00;
TR0=1;//开启定时器0
}
void delay1s(){ //定时1s
int time=1000;
if(TF0==1){ //如果定时器报表了,TF0会被拉高
TF0=0;
TH0=0XDC;
TL0=0X00;
time -=10; //报表一次就让time减去10
if(time==0){
time=1000;//如果等于0了,就将time变为1000
}
}
}
图片来源:来自宏晶科技的STC89C52芯片手册
标签:TL0,C51,TH0,声波,单片机,定时器,time,超声波 来源: https://blog.csdn.net/weixin_44263604/article/details/97620403