【51单片机练习1——超声波测距+LCD12864显示】

这篇具有很好参考价值的文章主要介绍了【51单片机练习1——超声波测距+LCD12864显示】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

PS:这是人生中的第一篇博客,记录了我人生中的第一次实习工作。与其说是博客文章,这些更像是一个小白的流水账日记,可能会有很多错误和有待优化的地方,希望各位大佬可以多多提出。如有问题可以私信联系。
行文过程中,欲说尽心中无限事,感慨万千。不过各位“道友”,很高兴见到你们,我们来日方长!
话不多说接下来就是正文内容。。。

任务需求

2018年安徽省机器人大赛单片机与嵌入式系统应用技能竞赛试题

需求1:开机后LCD12864屏幕第一行显示"DFZBJQ",第二行显示四位数字,并自下而上滚动,3秒后停止滚动。
需求2:应用超声波传感器实现距离采集,并在LCD12864显示屏上显示。
需求3:能够实现最远最近距离存储、查阅以及清除。

硬件环境介绍

1.开发套件介绍

本练习所采用的的开发套件为单片机与嵌入式系统竞赛实训平台。
【51单片机练习1——超声波测距+LCD12864显示】
单片机与嵌入式竞赛实训平台拥有丰富的板载资源,一共分为公共资源去和四个实训场景,实训场景分别为智慧农业、智能音箱、智能小车以及工业互联网。在每个场景中都有丰富的传感器以及执行器,例如温湿度传感器、超声波测距传感器、步进电机以及直流电机等。
同时,该竞赛实训平台提供了三种不同的核心板——STC51核心板、STM21核心板以及FPGA核心板,可以通过核心板的插拔实现不同单片机核心的切换,大大提高利用率。
该实训平台的场景切换只需要拨动核心板上的拨码开关到对应的编码即可实现元器件的链接和切换,不需要再使用杜邦线进行连接,更加美观简洁。
由于本人是嵌入式学习的小白一枚,因此是从最简单的STC51单片机开始,因此所使用的为STC51核心板。

2.单片机介绍

STC51核心板的核心芯片采用的是宏晶科技的STC15W4K56S4,板载256Kb外置SRAM存储器以及2个100P BTB高速连接器用于和底板连接。
在本实训平台中所使用的晶振值为24MHz,串口测试波特率为115200.
【51单片机练习1——超声波测距+LCD12864显示】

3.所需元器件介绍

3.1 LCD12864液晶显示屏

LCD12864液晶显示屏是一种具有4位/8位并行、2线或3线串行多种接口方式的点阵图形液晶
显示模块,这里使用的是8位并行总线驱动。
引脚连接:
数据端(D0~7) --------------------> P0
RS --------------------------------------> P20
RW -------------------------------------> P21
EN --------------------------------------> P22
电路原理图如下:
【51单片机练习1——超声波测距+LCD12864显示】
对于LCD12864的所有操作可以总结为4中:

  1. 读忙状态:读忙的同时读出指针地址内容,在初始化之后对LCD12864的每次读写都要进行忙检测。
  2. 写命令:写地址也是写指令,所有的指令可以查看下方指令集。
  3. 写数据:操作对象为DDRAM(数据显示RAM)、CGRAM(字符发生RAM)和GDRAM(图形显示RAM)。
  4. 读数据:操作对象与写数据一致
3.1.1 LCD12864引脚介绍

LCD12864一共拥有20个引脚,引脚号以及引脚说明如下图所示,其中我们需要重点关注的是RS、R/W、EN以及DB0~7这几个引脚。
【51单片机练习1——超声波测距+LCD12864显示】

3.1.2 LCD12864时序图
  1. 写时序:
    【51单片机练习1——超声波测距+LCD12864显示】
    2.读时序:
    【51单片机练习1——超声波测距+LCD12864显示】
3.1.3 LCD12864常用指令集

指令集分为基本指令集和扩展指令集,在使用对应的指令集前需要先写入对应指令,表明后续的所有指令都是该类指令。使用基本指令集时写指令(0x30),使用扩展指令集时写指令(0x34)

  • 基本指令集(RE = 0)
    • 清屏指令(0x01)
    • 回车指令(0x02/0x03)
    • 显示开、关光标(0x0c)
  • 扩展指令集(RE = 1)
3.2 超声波控制模块

本实训平台所使用的超声波模块是以CS100A芯片为主的自研模块,其具有两个控制端口——TRIG和ECHO,TRIG端口用于触发测距,至少需要给10us的高电平信号,接着模块自动发送8个40KHz的方波,自动检测是否有信号返回。如果有信号返回,通过ECHO输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。
超声波测距时序图:
【51单片机练习1——超声波测距+LCD12864显示】

由此可以得出:测试距离 = (高电平时间 * 声速(340m/s))/ 2
本次实验超声波控制模块与单片机引脚:
Trig ----------------------> P15
Echo --------------------->P34
超声波模块外围电路图:
【51单片机练习1——超声波测距+LCD12864显示】

3.3 4x4矩阵键盘

4x4矩阵键盘电路原理图:
【51单片机练习1——超声波测距+LCD12864显示】
引脚分配图:
【51单片机练习1——超声波测距+LCD12864显示】

硬件连接示意图

【51单片机练习1——超声波测距+LCD12864显示】

总体程序流程图

【51单片机练习1——超声波测距+LCD12864显示】

实现代码

1. 需求1:LCD12864滚动显示实现

实现思路及代码:

1. 初始化LCD12864屏幕
/*******************************************************************************
* 函 数 名         : LCD12864_Init
* 函数功能		   : 初始化LCD12864
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void LCD12864_Init()
{
	LCD12864_WriteCmd(0x30);  //选择基本指令操作
	LCD12864_WriteCmd(0x0c);  //显示开,关光标
	LCD12864_WriteCmd(0x01);  //清除LCD12864的显示内容
}
2. 使用for循环完成三次位置变换,每次延迟1S,结束for循环后再次显示(一定记得在循环中清屏哦)
for(i; i>0; i--)
{
	LCD12864_ShowStr(i - 1, 0, "DCFZBJQ");
	LCD12864_ShowStr(i, 0, "8957");
	//i--;
	Delay_ms(1000);
	LCD12864_WriteCmd(0x01);
}
LCD12864_ShowStr(2, 0, "DCFZBJQ");
LCD12864_ShowStr(3, 0, "8957");

2. 需求2:LCD12864显示实时显示超声波测距实现

  1. 初始化LCD12864和超声波模块(LCD初始化见上方)
TRIG_IO = 1;
Delay10us();												//@24.000MHz,10微秒
TRIG_IO = 0;
Timer_Count_0 = 0;
while(ECHO_IO == 0 && Timer_Count_0 < 50);					//500微秒超时
Timer_Count_0 = 0;
while(ECHO_IO == 1 && Timer_Count_0 < 2000);				//20毫秒超时
  1. 根据公式计算距离,公式为:距离(毫米)=时间(ms)*速度(340mm/ms)/2,及时通过定时器0完成
Num_Distance = (int)((float)Timer_Count_0 / 100 * 340 / 2);	//计算距离:距离(毫米)=时间(ms)*速度(340mm/ms)/2
void Timer0_Int (void) interrupt 1
{
	Timer_Count_0++;	
}
  1. 显示数据
LCD12864_WriteCmd(0x01);
LCD12864_ShowStr(0, 0, "Distance:");
sprintf((char *)buf,"%d",Num_Distance);
LCD12864_ShowStr(0,5,&buf);

3. 需求3:记录并显示有效最大值最小值并实现清除

  1. 创建三个变量s(交换变量,用于临时存储距离值),max(最大值),min(最小值)。同时将min赋初值为测试输出最大值2187,max赋值为0。并且在主循环中获取距离值的时候不断进行比较更新。
int min = 2187, max = 0, s;
s = Num_Distance;
if(s > max)
	max = s;
if(s < min)
	min = s;
  1. 在屏幕上显示数据
LCD12864_ShowStr(1, 0, "Min:");
sprintf((char *)buf1,"%d",min);
LCD12864_ShowStr(1,2,&buf1);
		
LCD12864_ShowStr(1, 4, "Max:");
sprintf((char *)buf2,"%d",max);
LCD12864_ShowStr(1,6,&buf2);
  1. 按键扫描,判断清除键是否按下,按下后将max和min两个变量恢复初始值
void IO_KeyScan(void)
{
	unsigned char j;
	j = IO_KeyState1;	//保存上一次状态

	P7 = 0xf0;	//X低,读Y
	IO_KeyDelay();
	IO_KeyState1 = P7 & 0xf0;

	P7 = 0x0f;	//Y低,读X
	IO_KeyDelay();
	
	IO_KeyState1 |= (P7 & 0x0f);
	
	IO_KeyState1 ^= 0xff;	//取反
	
	if(j == IO_KeyState1)	//连续两次读相等
	{
		j = IO_KeyState;
		IO_KeyState = IO_KeyState1;
		if(IO_KeyState != 0)	//有键按下
		{
			F0 = 0;
			if(j == 0)	F0 = 1;	//第一次按下
			else if(j == IO_KeyState)
			{
				if(++IO_KeyHoldCnt >= 20)	//1秒后重键
				{
					IO_KeyHoldCnt = 18;
					F0 = 1;
				}
			}
			if(F0)
			{
				j = T_KeyTable[IO_KeyState >> 4];
				if((j != 0) && (T_KeyTable[IO_KeyState& 0x0f] != 0)) 
				{
					KeyCode = (unsigned char)(((j - 1) * 4 )+ (T_KeyTable[IO_KeyState & 0x0f]) );	//计算键码,17~32  + 16
				}
					
			}
		}
		else	
			IO_KeyHoldCnt = 0;
	}
	P7 = 0xff;	
	if(KeyCode>0)
		{
			serial_one_send_number(KeyCode);
			serial_one_send_string("按键\r\n");
			switch(KeyCode)
			{
				case 1: 
				{
					serial_one_send_string("查询最近值\r\n");
					RememberMaxMin();
					
					break;
				}
				case 2: {CleanMaxMin();break;}
			}
			KeyCode=0;
		}	
}
void CleanMaxMin()
{
	LCD12864_WriteCmd(0x01);
	serial_one_send_string("清除最大最小值\r\n");	//串口输出测试
	max = 0;
	min = 2187;
	Delay_ms(100);
}

总结

在完成这个练习之后,第一个感想,我在学校里真的学了51单片机吗?
哦~原来是以前做的太简单了,全程只有一个功能,难怪那会儿不知天高地厚,因为自己掌握了单片机的精髓,结果就这么一个练习就让我费劲心思。
第二个感想,对于单片机的基础知识一定要扎实扎实再扎实,所有的高端操作就离不开最简单的“烹饪方式”,对于定时器、中断以及串口的认识只停留在知道且了解的境地是不够的,我们要做的是将单片机上的基础资源和功能可以了然于胸,这些虽不是什么高深的功法,但没有这些,后续任何高深的操作都会让你“走火入魔”。
第三个感想,精进编程水平的精髓在于多敲!多敲!多敲!以及提前构思好代码流程。由于一段时间没有触碰到C语言以及单片机,初上手一股陌生感油然而生,许多方法和语法都会和其他语言弄混(鄙人还在写Java),因此导致这第一个练习让我踌躇不前,一度怀疑自己是否适合做这个,但是在捋清楚思路和流程后,一步一步的实现和改正bug,最终让我实现了这个功能。
最后,各位,一定要好好学习!天天向上!俺们下一篇“水文”见!文章来源地址https://www.toymoban.com/news/detail-442846.html

到了这里,关于【51单片机练习1——超声波测距+LCD12864显示】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

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

    该系统由AT89C51单片机+数码管模块+LED指示灯模块+按键模块构成。 利用51单片机实现超声波测距功能。利用单片机控制超声波的发射和对超声波自发射至接收往返时间的计时。系统定时发射超声波,在启动发射电路的同时启动单片机内部的定时器,利用定时器的计数功能记录超

    2024年02月11日
    浏览(119)
  • 超声波测距模块HC-SR04详解(基于51单片机)

    本篇文章是个人整理的包含超声波测距模块HC-SR04的基本介绍与基本工作原理以及分别通过LCD1602、数码管和串口显示距离的实例讲解与代码的笔记,部分内容来自《HC-SR04超声波测距模块说明书》,代码使用模块化编辑,部分模块来自江科大自化协的51单片机教学视频。 希望大

    2023年04月16日
    浏览(40)
  • 基于单片机超声波测距语音播放

    一、系统方案 本设计采用52单片机作为主控器,HC-SR04测距,液晶1602显示,按键设置报警阀值,语音报警。 二、硬件设计 原理图如下: 三、单片机软件设计 1、首先是系统初始化 uint dist; // 保存超声波模块测量到的结果 2、液晶显示程序 / / // 1602液晶写命令函数,cmd就是要写

    2024年02月09日
    浏览(36)
  • 基于单片机的超声波语音测距系统

    一、系统方案 超声波具有指向性强,能量消耗缓慢,在介质中传播的距离较远,因而超声波经常用于距离的测量,如测距仪和物位测量仪等都可以通过超声波来实现。利用超声波检测往往比较迅速、方便、计算简单、易于做到实时控制,并且在测量精度方面能达到工业实用的

    2024年02月10日
    浏览(42)
  • 基于Arduino单片机超声波测距仪设计

    文章目录 摘  要 1.课程设计任务 1.1课程设计题目 1.2设计的要求 2.设计总体方案 2.1初步设计方案 2.2各个单元电路的设计要求 2.3主要性能指标 2.4总体方案 3.单元模块设计 3.1显示模块 3.2超声波测距模块 3.3蜂鸣器模块 3.4电机模块 3.5 LED二极管模块 4.软件流程图 5.设计代码 5.1核

    2024年02月11日
    浏览(36)
  • 51单片机使用HC-S104超声波模块

      HC-S104超声波模块是一种测量距离的传感器,可以用于51单片机的测距应用。下面是使用HC-S104超声波模块的步骤: 1.将HC-S104超声波模块的VCC引脚连接到51单片机的3.3V或5V电源,GND引脚连接到51单片机的GND,TRIG引脚连接到51单片机的一个可编程输出口,ECHO引脚连接到51单片机的

    2024年02月12日
    浏览(50)
  • 【毕业设计】基于超声波智能跟随小车 - 单片机 物联网 stm32 c51

    自动跟随小车系统由两部分组成:跟随小车和移动目标携带装置。 工作原理:跟随小车系统通过无线通信模块发送寻找信号,同时超声波接收器开始计时,如果移动目标接收到无线寻找信号,则立即发送超声波信号。这样小车的三角超声波接收器陆续收到超声波信号,CPU通过

    2023年04月08日
    浏览(54)
  • 基于51单片机驱动HC-SR04超声波模块(LCD1602显示)

    点击图片购买 HC- SR04+是一款宽电压工作的超声波测距模块。模块外形尺寸及软件与老版本 HC- SR04完全兼容;可以与老版本HC SR04无缝切换。低至3V的低工作电压, 使其与3.3V供电的MCU可以直接连接。 特点 探测角度: 15° 采用工业级MCU,工作温度:-20C~80C 探测距离:5V:2cm-- 450cm;3.3V: 2c

    2024年02月02日
    浏览(50)
  • 基于单片机的超声波探伤仪

    摘要 超声波探伤仪是目前工业制造和现代化检测的重要途径之一,广泛的应用在质量检测和产品检测中,通过使用其产品能够有效地降低产品次品的风险。尽管随着电子技术的发展, 国内出现了一些数字化的超声检测仪器,但其数据处理及扩展能力有限,缺乏足够的灵活性

    2024年04月11日
    浏览(47)
  • 基于单片机的超声波探伤仪设计

    摘要 超声波探伤仪是目前工业制造和现代化检测的重要途径之一,广泛的应用在质量检测和产品检测中,通过使用其产品能够有效地降低产品次品的风险。尽管随着电子技术的发展, 国内出现了一些数字化的超声检测仪器,但其数据处理及扩展能力有限,缺乏足够的灵活性

    2024年02月08日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包