
第二年级配备了超声波障碍物检测器,该检测器使用HC-SR04超声波测距模块+ 1602 LCD显示屏和52台单片机.
由于我以前的学习非常薄弱,所以在课程设置期间我没有走弯路,最后在第二周的星期五上了课,这浪费了很多时间,所以我考虑写这本书可以使人加强一个人的理解,另一个人可能会帮助别人.
HC-SR04超声波模块的工作原理
(1). 使用IO端口触发测距并提供至少10us的高电平脉冲;
(2). 该模块自动发送八个40khz方波,并自动检测是否有波返回;
(3)返回信号时,通过IO端口输出高电平,该高电平的持续时间是从发送超声波到返回超声波的时间;
(4)测距公式: 距离=(高电平时间*声速)/ 2;
(5)超声模块的时序图如图6所示:
图6: 超声模块时序图
(模块的原理非常重要. 只有了解了该原理之后,您才能做想要做的事情)
程序的核心在于中断,即微控制器中的计数器被中断.
特定程序分为两部分: 1602显示部分和主程序(见下文)
1602程序基本上是一些简单的计时问题.
首先初始化1602并定义1602相应接口的接线方法. 然后执行写命令和写数据操作,最后将距离数(3位以厘米为单位)输出到LCD上为303. 分开的数字,最后输出单位cm.
#include“ lcd.h”
/ ************************************************** ****** **************************************
*函数名称: Lcd1602_Delay1ms
*功能: 延迟功能,延迟1毫秒
*输入: c
*输出: 无
*名称: 该功能是12MHZ晶振下12分频微控制器的延迟.
************************************************ *** ********************************* /
void Lcd1602_Delay1ms(uint c)//错误0ms
{
uchar a,b;
for(; c> 0; c-)
{
对于(b = 199; b> 0; b-)
{
for(a = 1; a> 0; a-);
}
}
}
/ ************************************************** ****** **************************************
*函数名称: LcdWriteCom
*功能: 将字节写入LCD的命令
*输入: com
*输出: 无
************************************************ *** ********************************* /
#ifndef LCD1602_4PINS // //未定义此LCD1602_4PINS
void LcdWriteCom(uchar com)//编写命令
{
LCD1602_E = 0; //启用

LCD1602_RS = 0; //选择发送命令
LCD1602_RW = 0; //选择写入
LCD1602_DATAPINS = com; //放置命令
Lcd1602_Delay1ms(1); //等待数据稳定
LCD1602_E = 1; //写入时间
Lcd1602_Delay1ms(5); //保持时间
LCD1602_E = 0;
}
#else
void LcdWriteCom(uchar com)//编写命令
{
LCD1602_E = 0; //启用清除
LCD1602_RS = 0; //选择写入命令
LCD1602_RW = 0; //选择写入
LCD1602_DATAPINS = com; //由于4位接线连接到端口P0的高四位数字,因此不需要更改高四位数字.
Lcd1602_Delay1ms(1);
LCD1602_E = 1; //写入时间
Lcd1602_Delay1ms(5);
LCD1602_E = 0;
LCD1602_DATAPINS = com << 4; //发送低四位
Lcd1602_Delay1ms(1);
LCD1602_E = 1; //写入时间
Lcd1602_Delay1ms(5);
LCD1602_E = 0;
}
#endif
/ ************************************************** ****** **************************************
*函数名称: LcdWriteData
*功能: 向LCD写入一个字节的数据
*输入: dat
*输出: 无
************************************************ *** ********************************* /
#ifndef LCD1602_4PINS
void LcdWriteData(uchar dat)//写入数据
{
LCD1602_E = 0; //启用清除
LCD1602_RS = 1; //选择输入数据
LCD1602_RW = 0; //选择写入
LCD1602_DATAPINS = dat; //写入数据
Lcd1602_Delay1ms(1);
LCD1602_E = 1; //写入时间
Lcd1602_Delay1ms(5); //保持时间
LCD1602_E = 0;
}

#else
void LcdWriteData(uchar dat)//写入数据
{
LCD1602_E = 0; //启用清除
LCD1602_RS = 1; //选择写入数据
LCD1602_RW = 0; //选择写入
LCD1602_DATAPINS = dat; //由于4位接线连接到端口P0的高四位数字,因此不需要更改高四位数字.
Lcd1602_Delay1ms(1);
LCD1602_E = 1; //写入时间
Lcd1602_Delay1ms(5);
LCD1602_E = 0;
LCD1602_DATAPINS = dat << 4; //写低四位
Lcd1602_Delay1ms(1);
LCD1602_E = 1; //写入时间
Lcd1602_Delay1ms(5);
LCD1602_E = 0;
}
#endif
/ ************************************************** ****** **************************************
*函数名称: LcdInit()
*功能: 初始化LCD屏幕
*输入: 无
*输出: 无
************************************************ *** ********************************* /
#ifndefLCD1602_4PINS
void LcdInit()// LCD初始化子程序
{
LcdWriteCom(0x38); //打开显示
LcdWriteCom(0x0c); //在没有光标的情况下显示
LcdWriteCom(0x06); //写一个指针加1
LcdWriteCom(0x01); //清除屏幕
LcdWriteCom(0x80); //设置数据指针的起点
}
#else
void LcdInit()// LCD初始化子程序
{
LcdWriteCom(0x32); //将8位总线转换为4位总线
LcdWriteCom(0x28); //在四位行下初始化
LcdWriteCom(0x0c); //在没有光标的情况下显示
LcdWriteCom(0x06); //写一个指针加1
LcdWriteCom(0x01); //清除屏幕
LcdWriteCom(0x80); //设置数据指针的起点
}
#endif

主程序: 主程序的核心是中断.
首先,初始化微控制器的IO端口,1602 LCD的初始化和超声模块的初始化. 在初始化的同时,打开计时器超声波模块工作原理,打开内部中断并开始计数操作. 超声波输入端子接收到返回波后,内部中断关闭,计数停止. 然后根据记录的时间(s = time * 340 / 2m)计算出被测物体的距离.
/ ************************************************** ****** **********************************************
* LCD1602 LCD显示超声波测试距离*
实现现象: 下载程序后,将LCD1602液晶插入开发板上并显示
************************************************ *** ****************************************** /
#include“ reg52.h” //此文件中定义了微控制器的一些特殊功能寄存器
#include“ lcd.h”
#include“ intrins.h”
typedef unsigned int u16; //数据类型的声明定义
typedef unsigned char u8;
位触发= P2 ^ 1;
位回波= P2 ^ 0;
位密钥= P1 ^ 1;
位密钥1 = P3 ^ 2;
位led = P1 ^ 0;
u16时间= 0,S = 0;
/ ************************************************** ****** **************************************
*函数名称: main
*功能功能: 主要功能
*输入: 无
*输出: 无
************************************************ *** ********************************* /
void Time_Init()
{
TMOD = 0x01; //将T0设置为模式1超声波模块工作原理,GATE = 1;
TH0 = 0;
TL0 = 0;
EA = 1;
TR0 = 0;
}
void Conut(void)
{
Trig = 1; //一次启动模块
_nop _();
_nop _();
_nop _();
_nop _();
_nop _();
_nop _();
_nop _();
_nop _();
_nop _();
_nop _();

_nop _();
_nop _();
_nop _();
_nop _();
_nop _();
_nop _();
Trig = 0;
while(!Echo);
TR0 = 1;
while(Echo);
TR0 = 0;
时间= TH0 * 256 + TL0;
TH0 = 0;
TL0 = 0;
S =(时间* 1.7)/ 100; //计算为CM
}
void delayms(u16 xms)
{
u8 i,j;
for(i = 0; i <110; i ++)
for(j = 0; j } void main(void) { Time_Init(); LcdInit(); 同时(1) { Conut(); LcdWriteData((S / 100)+ 0x30); LcdWriteData((S / 10)+ 0x30); LcdWriteData((S)+ 0x30); LcdWriteData('C'); LcdWriteData('M'); 延迟(20); LcdWriteCom(0x80); //设置数据指针的起点 } } 无效Time0()中断1 { 回声= 1; } 硬件仿真图如下: 我希望它会有所帮助. .
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/shumachanpin/article-151620-1.html
大陆媒体现在最起码没有抹黑台湾