完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
STC51单片机利用HC-SR04进行测距,HC-SRF05与HC-SR04并无太大差别,前者有五针脚,多出来一个是OUT脚,是开关量输出,可以当报警模块用。
编程思路:给Trig发送一个10us-20us的高电平,然后利用定时器计Echo高电平的时间,然后进行转换得到距离值,然后用数码管显示距离值。 编程的时候是用的TX的开发板,与其他开发板可能会不匹配,所以就分享编程心得和个中细节,完整程序就不列出来了,完整程序在下面的连接里下载,如果是TX开发板可以直接用。 1、引脚定义: ***it Tx = P3^2; //产生脉冲引脚Trig ***it Rx = P3^3; //回波引脚Echo ***it dula=P2^6; ***it wela=P2^7; ***it FM=P2^3;//蜂鸣器这个可以用来检测哪里运行出了问题,这个帮了我大忙了 2、定时器中断 flag_overtime是做溢出标志位。 //定时器0中断,用做显示 timer0() interrupt 1 // 定时器0中断是1号 { TR0=0; TH0=(65536-55294)/256; TL0=(65536-55294)%256; flag_overtime=1; } 如果溢出了,则显示000,如果数码管出现了000,说明定时器某处配置有问题。算是个找BUG的方法。 if(flag_overtime==1) { display(0,0,0); flag_overtime=0; } 3、数码管显示 uchar code table[]= { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77 };//键一个数表 void display (uchar bai,shi,ge) //显示子函数,个十百位送位选段选 { wela=1; P0=0x7e; //送位选 wela=0; dula=1; P0=table[bai]; dula=0; P0=0xff; //送段选 delay(5); wela=1; P0=0x7d; //送位选 wela=0; dula=1; P0=table[shi]; dula=0; P0=0xff; //送段选 delay(5); wela=1; P0=0x7b; //送位选 wela=0; dula=1; P0=table[ge]; dula=0; P0=0xff; //送段选 delay(5); } 4、个十百位转换 一个三位数转换成三个一位数,用来送到数码管。比如距离153,拆成1、5、3分别送到第一个、第二个、第三个数码管里。 bai=(uint)distance/100; shi=(uint)distance%100/10; ge=(uint)distance%10; display(bai,shi,ge); 5、距离量的转换 51单片机定时器还是存在误差,所以还需要根据实际微调。转换完成就可以送到数码管了。 time=(float)(TH0*256+TL0-10242)*1.0851; //减去初值 distance=time*0.346/2*10; //此时为CM单位 |
|
|
|
只有小组成员才能发言,加入小组>>
2514 浏览 0 评论
1092浏览 2评论
703浏览 1评论
456浏览 0评论
200浏览 0评论
341浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-24 18:08 , Processed in 1.280982 second(s), Total 80, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号