基于STC89C51/2的的超声波测距(1602A显示)
楼主在做学校单片机设计的时候为了测试超声波模块的功能与精度,动手DIY一款能用的超声波
测距仪器,用1602液晶显示屏动态显示,精度在0.5cm左右,粗略测距,可用于避障,检测距离
等的实际用途中。
我的超声波模块使用的是HC-SR04,板子使用的是STC89C52RC(理论上51和52均可使用。
得到距离之后可用于扩展功能,之后有空可以把我的经验分享出来,欢迎讨论。
8. D0 ~ D7我接入的是P 0 ^ 0~P 0 ^ 7(注意不要接到VCC管脚上去),还有接入P0口要接上拉电阻,否则会烧坏的。
我的实验效果如下: 图片:
具体的视频实现效果可以移步去点这里
// %% Made by A_Kang
#include<reg51.h>
#include<1602.h>
#define uchar unsigned char
#define uint unsigned int
#define VELOCITY_23C 3453 //23摄氏度时的声速,声速V= 331.5 + 0.6*温度;
long int distance;
uchar count;
sbit dcf=P1^7;
sbit ECHO=P2^4;
sbit TRIG=P2^5;
uchar table[]="distance: ";
void Init_MCU() //初始化定时器
{
TMOD = 0x01; //定时器0初始化,设置为16位自动重装模式
TL0 = 0x66;
TH0 = 0xfc; //1ms
ET0 = 1; //开定时器0
EA = 1; //总中断使能
}
void Init_Parameter(void)//初始化参数和IO口函数
{
ECHO =1;
TRIG = 1;
count = 0;
}
/* 函数描述 : 显示字符串函数 */
/* 输入参数 : point,address */
/* 参数描述 : 写入的字符串的地址指针 1602显示对应的地址 */
void display_char(uchar *point,uchar address)
{
uchar i;
LCD_w_com(0x80 + address);
for(i = 0;i < 16; i++)
{
LCD_w_data(*point);
point++;
}
}
/* 函数描述 : 显示数字 */
/* 输入参数 : number,address */
/* 参数描述 : number写入的数据,address地址 */
void display(int number,uchar address)
{
uchar b,c,d,e;
b= (number / 100);
c= (number / 10) % 10;
d = number % 10;
e = number % 10;
LCD_w_com(0x80 + address);
LCD_w_data(b + 48);
LCD_w_data(c + 48);
LCD_w_data(d + 48);
LCD_w_data(46); //小数点的ASCII
LCD_w_data(e + 48);
}
void Trig_SuperSonic(void)//出发声波
{
TRIG = 1;
delay_ms(1);
TRIG = 0;
}
void Measure_Distance(void)//距离函数计算
{
uchar l;
uint h,y;
TR0 = 1;
while(ECHO==1)
{
;
}
TR0 = 0;
l = TL0;
h = TH0;
y = (h << 8) + l;
y = y - 0xfc66;//us部分
distance = y + 1000 * count;//计算总时间
TL0 = 0x66;
TH0 = 0xfc;
delay_ms(30);
distance = VELOCITY_23C * distance / 20000;
distance=distance/10;
}
void cm()
{
LCD_w_data(99); //"c"的ASCII
LCD_w_data(109); //"m"的ASCII
}
void main()
{
LCD_init();
Init_MCU();//初始化定时器
Init_Parameter();//初始化超声波
display(200,0x00);
while(1)
{
LCD_disp_cher(0X00,1,table);
Trig_SuperSonic(); //触发超声波发射
while(ECHO == 0) //等待回声
{
;
}
Measure_Distance(); //计算脉宽并转换为距离,单位mm
display(distance,0x40); //显示位置
cm();
Init_Parameter();
delay_ms(600);
}
}
void timer0 (void) interrupt 1//T0中断处理函数
{
TF0 = 0;
TL0 = 0x66;
TH0 = 0xfc;
count++;
if(count == 18)//超声波回声脉宽最多18ms
{
TR0 =0;
TL0 = 0x66;
TH0 = 0xfc;
count = 0;
}
}
库函数 1602.h(点这里) 建议自己写适配,我已经写好了一个库文件,需要的话可以点开自取。
**里面集成了1602写入命令函数,写入数据函数,1602显示屏初始化函数, 还有
一个自带的显示函数,可以不用自己再次编写函数,通过指定字符ASCII码,设
置显示行数和显示首地址即可显示到1602上,亲测可行, 但是推荐字符和数字
分开写显示函数。**
中间参考了其他大佬的一点过程,侵联删。 转载请注明链接 2020年8月5日 A_Kang
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/193065.html原文链接:https://javaforall.cn