超声波模块就是那最常见的HC-SR04
为了实用,不用每次断电后再设置距离,我后来又加了eeprom存储最新距离设定功能,自己做了个小东西又怕lcd焊接麻烦,所以把lcd代码都注释掉了,基本上应该取消注释就是带lcd显示了,保证能用,目前在用没出现问题
//更新保存上次设置距离到eeprom 保存间隔为每5分钟保存一次 下次开启自动启用上次设置数据
/********************************************************************************************************************
HC-SR04 超声波测距模块可提供 2cm-400cm 的非接触式距离感测功能, 测距精度可达高到 3mm;模块包括超声波发射器、接收器与控制电路。
基本工作原理:
(1)采用 IO 口 TRIG 触发测距,给至少 10us 的高电平信号;
(2)模块自动发送 8个40khz 的方波,自动检测是否有信号返回;
(3)有信号返回,通过IO口ECHO 输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。测试距离=(高电平时间*声速(340M/S))/2;
*********************************************************************************************************************/
#include<reg52.h>
#include<intrins.h>
///晶振12M///
#define uchar unsigned char
#define uint unsigned int
//sbit lcdrs=P3^5; //lcd数据命令选择端 rs为L(ledrs=0)则写命令 H(ledrs=1)则写数据
//sbit lcdrw=P3^6;
//sbit lcden=P3^7; //lcd使能 lcden=1 则写入
sbit TRIG = P2^7; //超声波的 TRIG端 //TRIG为控制端
sbit ECHO = P2^6; //超声波的 ECHO端 //ECHO 为接收端
sbit key1 = P2^2; //增加距离
sbit key2 = P2^1; //减少距离
sbit sbeep = P2^3; //蜂鸣器
#define ReadRomCom 0x01 //内部E2PROM读 写 擦除命令代码
#define PrgRomCom 0x02
#define EraseRomCom 0x03
#define SAVED 1 //内部eprom是否已经保存过的标记
#define NOTSAVED 0
#define WaitTime 0x01
sfr ISP_DATA=0xe2; //ISP寄存器地址
sfr ISP_ADDRH=0xe3;
sfr ISP_ADDRL=0xe4;
sfr ISP_CMD=0xe5;
sfr ISP_TRIG=0xe6;
sfr ISP_CONTR=0xe7;
//uchar DisplayData[3];
uchar alarm_dis=30; //警报距离
//unsigned char code ASCII[15] = {'0','1','2','3','4','5','6','7','8','9','.','-','M'};
uchar flag = 0; //标志定时器是否溢出
uint count=0; //计数来存档
///eeprom//
void ISP_IAP_enable() //打开 ISP IAP功能
{
EA=0; //关闭中断功能
ISP_CONTR=ISP_CONTR & 0X18; //0001 1000 ISP/IAP 控制寄存器复位 相当于寄存器指令清零?
ISP_CONTR=ISP_CONTR | WaitTime; //写入硬件延时 WaitTime 0-3(最后两位分别00 01 10 11) 0等待时间最长 3等待时间最短,过短容易出问题 10M系统时钟建议contr|10 20M系统时钟建议 |01
ISP_CONTR=ISP_CONTR | 0x80; //1000 0000 最高位 ISPEN=1 ISPEN:ISP/IAP功能允许位 1:允许编程改变Flash ISP_CONTR=0x60 01(1)(软件复位)0 0000 则可以实现从用户应用程序区软件复位到ISP程序区开始运行程序。
} //ISP_CONTR=0x20 00(1)(软件复位)0 0000 则可以实现从ISP程序区软件复位到用户应用程序区开始运行程序。
void ISP_IAP_disable() //关闭功能
{
ISP_CONTR=ISP_CONTR & 0x7f; //01111111 通过&操作符最高位清零 ISPEN=0
ISP_TRIG=0x00;
EA