自己写的一个小程序,给51入门的朋友们用一下,实测还行,没什么问题,但几米以上就不怎么准,主要是模块比较廉价,当练手用。注释也都比较清楚。

/*超声波测距程序,利用51单片机的外部中断,如果有时候发现不好使,建议直接使用杜邦线连接引脚*/
#include<reg52.h>
#include <intrins.h>typedef unsigned char uchar;
typedef unsigned int uint;
/*超声波模块为HC-SR04,触发信号给一个至少10us的高电平,之后模块会自动发送8个40kHz的方波信号,
一旦模块收到回响信号,Echo引脚便输出高电平,直到接收不到。这里有个问题是关于时间计算的问题,说明书上说的是
按Echo引脚的高电平持续时间计算,但是声波的路程,不应该是从声波发出的时候就已经开始了吗?这个程序使按照
第二种计算的,如果要改动 ,请改动定时器0的启动时间。*/
sbit Echo=P3^2;//超声波模块的回响信号输出,P3^2也是51单片机外部中断0的输入端,利用下降沿来触发中断
sbit Trig=P1^4;//触发信号脚sbit lcdrs=P1^0;//数据命令选择端,为0时写指令,为1时写数据
sbit lcdrw=P1^1;//读、写命令选择端,为0时写数据,为1时读数据,读状态时置1,其他时间都是0;
sbit lcden=P2^5;//使能端
sbit dula=P2^6;//在这段程序里没有用处
sbit wela=P2^7;
sbit STA7=P0^7;//D0~D7数据口对应P0^0~P0^7,当读液晶的数据时,STA7对应P0^7,STA7为1时表示液晶忙,无法接收数据float dis;//距离的缓存
uchar flag;//中断标志位
char code table[]="distance:";//在规定位置显示字符
char code table1[]="cm";void delayms(uchar x)
{uint i,j;for(i=0;i<x;i++){for(j=0;j<110;j++);}
}
void nops()//延时10.9us,每个机器周期约1.09us,在晶振为11.0592MHz时
{_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
}void distance()//计算距离的函数
{Trig=0;//首先将触发拉低nops();Trig=1;//给至少10us的高电平,启动模块nops();nops();Trig=0;//此时已经触发了模块,接下来立刻开启定时器计数TR0=1;//打开定时器0EX0=1;//打开外部中断,外部中断输入为P3^2,下降沿有效,触发中断delayms(1);//等待一下,一个机器周期约为1.09us,如果不等待,可能就错过计算dis,陷入死循环,永远无法得出值if(flag==1)//如果标志位置1,表示Echo输出下降沿,即接收结束{flag=0;}}void wait()//等待液晶空闲
{P0=0xff;do{lcdrs=0;//循环里的这些语句是读状态时的操作时序lcdrw=1;lcden=0;lcden=1;}while(STA7==1);//等液晶空闲的时候再出循环lcden=0;//使使能为0
}void write_com(uchar com)//写命令程序
{wait();lcdrs=0;//使RS为0,发出的数据会被液晶当做命令而不是现实数据,这也是与写数据程序的唯一不同P0=com;lcdrw=0;//总是写的,故为0delayms(5);//使数据平稳,让液晶有时间读取lcden=1;//根据操作时序,使能要输出高脉冲,这句与后面那句共同构成一个高脉冲delayms(5);lcden=0;
}void write_date(uchar date)//写数据程序
{wait();lcdrs=1;//注意这是写数据P0=date;lcdrw=0;delayms(5);lcden=1;delayms(5);lcden=0;
}/*初始化函数*/
void init()
{wait();dula=0;//没用wela=0;lcden=0;write_com(0x38);//设置16*2显示,5*7点阵,8位数据口。这句是不变的write_com(0x0c);//根据操作时序设置的状态字。下面一样write_com(0x06);TMOD=0x01;//16位计数器,这里不用开启定时器中断,因为定时器中断无事可做,只要定时器里的值就行,因此无需将TF0置1TH0=0;//全部设为0TL0=0;IT0=1;//设置外部中断下降沿有效EA=1;//开总中断
}
/*显示函数*/
void display(float dis)
{uint bai,shi,ge,p1,p2;//分别是百位一次向下,到小数点后两位bai=dis/100;shi=(dis-bai*100)/10;ge=dis-bai*100-shi*10;p1=(dis*10)-bai*1000-shi*100-ge*10;p2=(dis*100)-bai*10000-shi*1000-ge*100-p1*10;write_date(0x30+bai);//将数字转换为字符,必须+0x30,另外,1602液晶只能接收字符型的数据write_date(0x30+shi);write_date(0x30+ge);write_date('.');write_date(0x30+p1);write_date(0x30+p2);}void main()//主函数
{uchar i=0;init();write_com(0x80);//设置地址,在第一行第一列显示distance:,0x80是第一行的起始地址while(table[i]!='\0'){write_date(table[i]);i++;delayms(5);}i=0;write_com(0x80+0x40+6);//设置地址,在第二行第7位显示cm,0x80+0x40是第二行的起始地址while(table1[i]!='\0'){write_date(table1[i]);i++;delayms(5);}while(1){distance();write_com(0x80+0x40);//设置数据的显示地址,为第二行的起始位,之后在进行循环时不断刷新在这个地方显示display(dis);delayms(60);}}void ex() interrupt 0//外部中断的中断函数
{TR0=0;//一旦受到下降沿,立马停止定时器计数dis=(TH0*256+TL0)*1.09/58;//先取出定时器里的时间值,之后再将定时器置0flag=1;//将标志位置0TH0=0;TL0=0;
}

51单片机配合超声波测距以及用1602液晶进行显示相关推荐

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

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

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

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

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

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

  4. 基于51单片机的超声波测距模块

    实现功能 通过超声波模块进行测距显示在LCD1602上并通过设在程序上设置上下限进行进行超出上下限的报警蜂鸣器 模块 1.89c51 2.lcd1602 3.超声波测距模块 4,蜂鸣器 作者用的是51 ...

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

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

  6. 51单片机的超声波测距系统【proteus仿真+程序+报告+原理图】

    1.主要功能 该系统由AT89C51单片机+数码管模块+LED指示灯模块+按键模块构成. 利用51单片机实现超声波测距功能.利用单片机控制超声波的发射和对超声波自发射至接收往返时间的计时.系统定时发射 ...

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

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

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

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

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

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

最新文章

  1. 滚动悬挂 js处理,滚动到一个位置限制某个div
  2. C# 生成验证码 方法一
  3. 关于Redis、ZooKeeper等分布式锁原理的一些思考
  4. 罗永浩向老同事道歉;三星漏洞已波及四千万用户;Clojure 1.11 即将发布 | 极客头条...
  5. CentOS6.X内核升级
  6. Redis中的lru算法实现
  7. Ubuntu 14.04 执行指定用户的命令
  8. Effective C# Item4:使用Conditional特性代替#if条件编译
  9. RTP包里面得到H.264数据和AAC数据的方法
  10. mysql load data infile 上传数据 不显示_第22问:我有带外键的表,你有数据么?
  11. vue ref 绑定的事件需要移除吗_vue生命周期
  12. Java集成第三方推送(极光推送)——文档篇
  13. matlab仿真心型函数,matlab绘制心形函数
  14. python判断谁做了好事
  15. python统计元音字母个数_Quzh[python]统计元音字母——输入一个字符串,统计处其中元音字母的数量。...
  16. 学计算机基础知识的app,电脑基础知识零基础入门版-电脑基础知识APP手机大全v1.0 安卓版-007游戏网...
  17. js中math常用使用方法
  18. 如何重装windows10系统(超详细图文版)
  19. 安卓Apk安装出错:更新包与已安装应用的签名不一致,但在应用管理中却找不到这个已经卸载的应用
  20. 微信小程序商城如何搭建,低成本+高效率运营!

热门文章

  1. WPF编程学习 —— 样式
  2. BizTalk接收消息后路由失败
  3. scrapy简单爬取图片
  4. python动态视频下载器
  5. 【转】常见面试之机器学习算法思想简单梳理
  6. UVA 11237 - Halloween treats(鸽笼原理)
  7. Interbase浴火重生:开源数据库Firebird更新到2.12
  8. visualstudio2019 的报表技术rdlc在windows10上出现乱码的问题解决方法
  9. 解决SpringMVC中文乱码问题 -----这是服务器返回参数到前端中文乱码
  10. QT for android 比较完美解决 全屏问题