实现功能

通过超声波模块进行测距显示在LCD1602上并通过设在程序上设置上下限进行进行超出上下限的报警蜂鸣器

模块

1.89c51

2.lcd1602

3.超声波测距模块

4,蜂鸣器

作者用的是51普中的板

主要模块的介绍

简单介绍一下超声波模块有两个大眼睛怪像外星科技的

HC-SR04超声波模块可提供2cm~400cm的距离感测功能,测量精度可以达到3mm。模块包括超声波发射器,接收器与控制电路。

基本工作原理
采用Trig引脚触发,给至少10us的高电平脉冲信号
模块自动发送8个40kHz的方波,自动检测是否有信号返回
有信号返回,通过Echo引脚输出一个高电平脉冲,高电平脉冲持续的时间就是超声波从发射到反射返回的时间。距离=(高电平脉冲时间*340)/2

超声波实物图:

接线方式:VCC、trig(控制端)、 echo(接收端)、 GND

距离=(高电平持续时间*声速(340m/s))/2

几个比较重要的函数

LCD显示函数  写着写着发现有些概念还是不太清楚去查了查

/*------------------------------------------------判忙函数
------------------------------------------------*/bit LCD_Check_Busy(void) { DataPort= 0xFF; RS_CLR; RW_SET; EN_CLR; _nop_(); EN_SET;return (bit)(DataPort & 0x80);//第一括号是强制转换为Bit类型,第二个是返回端口的信息}
/*------------------------------------------------写入命令函数
------------------------------------------------*/void LCD_Write_Com(unsigned char com) {  while(LCD_Check_Busy()); //忙则等待RS_CLR; RW_CLR; EN_SET; DataPort= com; _nop_(); EN_CLR;}
/*------------------------------------------------写入数据函数
------------------------------------------------*/void LCD_Write_Data(unsigned char Data) { while(LCD_Check_Busy()); //忙则等待RS_SET; RW_CLR; EN_SET; DataPort= Data; _nop_();EN_CLR;}/*------------------------------------------------清屏函数
------------------------------------------------*/void LCD_Clear(void) { LCD_Write_Com(0x01); DelayMs(5);}
/*------------------------------------------------写入字符串函数
------------------------------------------------*/void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) {     if (y == 0) {     LCD_Write_Com(0x80 + x);     //表示第一行}else {      LCD_Write_Com(0xC0 + x);      //表示第二行}        while (*s) {     LCD_Write_Data( *s);     s ++;     }}
/*------------------------------------------------初始化函数
------------------------------------------------*/void LCD_Init(void) {LCD_Write_Com(0x38);    /*显示模式设置*/ DelayMs(5); LCD_Write_Com(0x38); DelayMs(5); LCD_Write_Com(0x38); DelayMs(5); LCD_Write_Com(0x38);  LCD_Write_Com(0x08);    /*显示关闭*/ LCD_Write_Com(0x01);    /*显示清屏*/ LCD_Write_Com(0x06);    /*显示光标移动设置*/ DelayMs(5); LCD_Write_Com(0x0C);    /*显示开及光标设置*/}//     超声波起始信号

下面是全部的函数函数比较可以理解滴

#include<reg51.h>
#include<intrins.h>
sbit RS = P2^6;
sbit RW = P2^5;
sbit EN = P2^7;
sbit key1=P3^1;    //设置按键
sbit key2=P3^0;       //加操作按键
sbit key3=P3^2;
sbit key4=P3^3;
sbit speak=P1^5;
sbit tro=P2^1;
sbit echo =P2^0;
bit flag=0;
unsigned int tempH=100,tempL=1;
unsigned char ge,shi,dian;
unsigned char yu1,yu2,yu3,yu_1,yu_2,yu_3;
unsigned int dcm=0;
unsigned char code str[]="0123456789";
unsigned char code str1[]="distance:" ;
#define RS_CLR RS=0
#define RS_SET RS=1#define RW_CLR RW=0
#define RW_SET RW=1 #define EN_CLR EN=0
#define EN_SET EN=1#define DataPort P0void DelayUs2x(unsigned char t)
{   while(--t);
}
void DelayMs(unsigned char t)
{while(t--){//大致延时1mSDelayUs2x(245);DelayUs2x(245);}
}
/*------------------------------------------------判忙函数
------------------------------------------------*/bit LCD_Check_Busy(void) { DataPort= 0xFF; RS_CLR; RW_SET; EN_CLR; _nop_(); EN_SET;return (bit)(DataPort & 0x80);//第一括号是强制转换为Bit类型,第二个是返回端口的信息}
/*------------------------------------------------写入命令函数
------------------------------------------------*/void LCD_Write_Com(unsigned char com) {  while(LCD_Check_Busy()); //忙则等待RS_CLR; RW_CLR; EN_SET; DataPort= com; _nop_(); EN_CLR;}
/*------------------------------------------------写入数据函数
------------------------------------------------*/void LCD_Write_Data(unsigned char Data) { while(LCD_Check_Busy()); //忙则等待RS_SET; RW_CLR; EN_SET; DataPort= Data; _nop_();EN_CLR;}/*------------------------------------------------清屏函数
------------------------------------------------*/void LCD_Clear(void) { LCD_Write_Com(0x01); DelayMs(5);}
/*------------------------------------------------写入字符串函数
------------------------------------------------*/void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) {     if (y == 0) {     LCD_Write_Com(0x80 + x);     //表示第一行}else {      LCD_Write_Com(0xC0 + x);      //表示第二行}        while (*s) {     LCD_Write_Data( *s);     s ++;     }}/*------------------------------------------------初始化函数
------------------------------------------------*/void LCD_Init(void) {LCD_Write_Com(0x38);    /*显示模式设置*/ DelayMs(5); LCD_Write_Com(0x38); DelayMs(5); LCD_Write_Com(0x38); DelayMs(5); LCD_Write_Com(0x38);  LCD_Write_Com(0x08);    /*显示关闭*/ LCD_Write_Com(0x01);    /*显示清屏*/ LCD_Write_Com(0x06);    /*显示光标移动设置*/ DelayMs(5); LCD_Write_Com(0x0C);    /*显示开及光标设置*/}//     超声波起始信号void chaobostart(){tro=1; DelayUs2x(20);tro=0;}//超声波测距初始化
void chaobo_count()
{unsigned int time=0;time=TH0*256+TL0;TH0=0;TL0=0;dcm=(time*1.7)/100;shi=dcm/100;ge=dcm/10%10;dian=dcm%10;if((dcm>=700)||(flag==1))   //超出量程标志{flag=0;LCD_Write_String(9,0,"-.-CM");}else{LCD_Write_Com(0x80+9);LCD_Write_Data(str[shi]);LCD_Write_Com(0x80+10);LCD_Write_Data(str[ge]);LCD_Write_Com(0x80+11);LCD_Write_Data(str[dian]);LCD_Write_Com(0x80+12);LCD_Write_Data('C');LCD_Write_Com(0x80+13);LCD_Write_Data('M');}
}//报警值处理
void baojing()
{
if((dcm>tempH)||(dcm<tempL))speak=~speak;elsespeak=1;
}
//按键处理函数
void keyscan()
{if(!key1){DelayMs(20);if(!key1){while(!key1);tempH++;if(tempH>=200)tempH=0;}}if(!key2){DelayMs(20);if(!key2){while(!key2);tempH--;if(tempH<=0)tempH=0;}}if(!key3){DelayMs(20);if(!key3){while(!key3);tempL++;if(tempL>=100)tempL=0;}}
if(!key4){DelayMs(20);if(!key4){while(!key4);tempL--;if(tempL<=0)tempL=0;}}}
//主函数//void main()
{TMOD=0x01;
TH0=0;
TL0=0;
ET0=1;
EA=1;
speak=1;
LCD_Init();       //初始化
LCD_Clear();    //清屏
LCD_Write_String(0,0,str1);
LCD_Write_String(0,1,"TH:");
LCD_Write_String(9,1,"TL:");
while(1)
{keyscan();yu1=tempH/100;yu2=tempH/10%10;yu3=tempH%10;yu_1=tempL/100;yu_2=tempL/10%10;yu_3=tempL%10;LCD_Write_Com(0xC0+3);      //上限阈值显示LCD_Write_Data('0'+yu1);LCD_Write_Com(0xC0+4);LCD_Write_Data('0'+yu2);LCD_Write_Com(0xC0+5);LCD_Write_Data('0'+yu3);LCD_Write_Com(0xC0+12);   //下限阈值显示LCD_Write_Data('0'+yu_1);LCD_Write_Com(0xC0+13);    LCD_Write_Data('0'+yu_2);LCD_Write_Com(0xC0+14);   LCD_Write_Data('0'+yu_3);chaobostart();while(!echo);TR0=1;while(echo);TR0=0;chaobo_count();baojing();DelayMs(100);
} }void timer0() interrupt 1//计数器0的中断{flag=1;  //判断条件,如果等于1继续循环,否则跳出循环。}

基于51单片机的超声波测距模块相关推荐

  1. 51单片机 普中V2 超声波测距 报警 显示 基于MCS51单片机的超声波测距模块的开发

    基于MCS51单片机的超声波测距模块的开发 采用C51程序设计语言,完成下列功能要求. l 必选功能: (1) 超声波模块和单片机的接口设计,画出完整的电路原理图.(15分) (2) 开发板上电时,显 ...

  2. 基于51单片机HC-SR04超声波测距带温度补偿

    基于51单片机HC-SR04超声波测距带温度补偿 1 开发环境 2 功能说明介绍 3 程序 3.1 工程文件 3.2 代码 4 原理图 5 元器件清单 6 PCB 7全部资料 1 开发环境 仿真图:p ...

  3. 利用51单片机+HC-SR04+51单片机制造超声波测距模块

    利用HC-SR04和51单片机制造超声波测距模块 完整的项目链接: https://github.com/linxinloningg/51_chip_core.git 硬件电路分析: 1.HC-SR0 ...

  4. 基于51单片机的超声波测距及温度补偿

    具体实现功能 系统由STC89C52单片机+超声波测距传感器(HC-SR04)+DS18B20温度传感器+LCD1602液晶显示屏+按键+蜂鸣器+电源构成 具体功能:1.LCD1602液晶显示测量的距 ...

  5. 基于52单片机的超声波测距模块(hc-sr04超声波测距模块+1602液晶显示器)

    二年级课设做了超声波测障仪,用的是hc-sr04超声波测距模块+1602液晶显示器和52单片机. 由于自己之前的学习很是不牢固,在课设的时候没少走弯路,最后在第二个周的星期五做了出来,浪费了很多的时间 ...

  6. 基于51单片机的超声波测距_液位检测_温度检测protues仿真

    硬件设计 (末尾附文件) 代码设计 //宏定义 #define uchar unsigned char #define uint unsigned int #define ULint unsigned ...

  7. 【030】基于51单片机的超声波液位测距报警系统(带温度显示)Proteus仿真设计

    一.压缩包资料内容 (1).基于51单片机的超声波液位测距报警(带温度显示)系统proteus仿真设计一份: (2).基于51单片机的超声波液位测距报警(带温度显示)系统proteus仿真设计keli ...

  8. 基于51单片机的超声波避障小车设计(含Proteus仿真)

    超声波避障程序随处可见,基于51单片机的超声波避障小车也很成熟,但是完整的Proteus仿真并不容易找到开源资料. 这次主要给大家分享其Proteus仿真部分. 涉及到的模块有:超声波模块(hc-sr ...

  9. 【031】基于51单片机的超声波倒车雷达系统(带温度显示补偿)Proteus仿真设计

    一.压缩包资料内容 (1).基于51单片机的超声波倒车雷达系统(带温度显示补偿)系统proteus仿真设计一份: (2).基于51单片机的超声波倒车雷达系统(带温度显示补偿)系统proteus仿真设计 ...

最新文章

  1. Freemarker详细解释
  2. FPGA的设计艺术(18)如何使用Verilog中的数组对存储器进行建模?
  3. java获取密钥长度_java.security.InvalidKeyException:解密期间密钥大小错误
  4. 你知道JVM内存的那些事吗?
  5. EasyUI——实现展示后台数据代码
  6. [深度学习] 自然语言处理 --- BERT模型原理
  7. php实现标签云,php标签云的实现代码
  8. PHP生成随机数;订单号唯一
  9. 标准3层神经网络搭建Demo
  10. FISCO BCOS(十一)——— FISCO BCOS如何查看账户
  11. python读取txt每一行存入数组
  12. 2021-06-21>字体样式风格font
  13. day14:磁盘管理df/du/fdisk/parted命令
  14. C语言struct 函数,C语言结构体史上最详细的讲解
  15. 计算机打字考试的技巧,快速打字有什么技巧
  16. 【孟子E章】祝大家新年愉快!
  17. 小米小爱同学触屏版蓝牙MESH功能连接小米蓝牙设备-以小米米家蓝牙温湿度计2为例
  18. WPS表格excel实现下拉搜索(简单几步,轻松搞定)
  19. 【矩阵论】01——线性空间——基本概念
  20. 《Java8实战》第9章 重构、测试和调试

热门文章

  1. 读书笔记:《敏捷估计与规划》
  2. feign.RetryableException: Read timed out executing GET http://*****
  3. 数据预处理之对数变换
  4. pso解决tsp matlab,计算智能课程设计_粒子群优化算法求解旅行商问题_Matlab实现.doc...
  5. 跨境电商淘系、阿里巴巴海外站、外贸站搭建,代购系统源码PHP前端源码展示
  6. 动态规划-leetcode#97-交错字符串
  7. 【案例分析】从安捷伦的逆袭之路,看供应商管理如何实现双赢
  8. 在亲生经历被非法APP诈骗中总结经验教训--网络安全
  9. 成人高考计算机基础知识真题及答案,2015成人高考计算机基础试卷
  10. mysql差异备份提权_MSSQL差异备份取系统权限的相关软件下载