基于51单片机下通过蓝牙串口控制LCD1602屏幕显示步进电机正反转以及转速

本文主要是介绍基于51单片机下通过蓝牙串口控制LCD1602屏幕显示步进电机正反转以及转速,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

通过蓝牙串口控制LCD1602屏幕显示正反转以及转速

简 述:

  • 通过蓝牙串口发送指定数据到STC89C52RC单片机,控制28BYJ-48步进电机正转或者反转或者速度的快中慢,然后51单片机,
    做相应的判断,在LCD1602屏幕上显示正反转状态 以及 转速

  • 演示视频放在了哔哩哔哩上: https://www.bilibili.com/video/av61543899

  • 完整程序的已经放在了文末

二.准备
1. 单片机 :个人嫌麻烦用的开发板,可以使用STM32或者其他类型;
2.	24BYJ-48步进电机:该步进电机为4相5线式
4.	LCD1602	有条件可以试试OLED12864之类
5.	HC-05	蓝牙模块

步进电机
LCD1602
蓝牙模块

三. 原理图
【还没画完,半成品,最近要忙着准备2019年的电赛了,所有顾不上但大概的东西都在这儿了】

原理图

四. 程序
1.说明
  • 已经将程序整体工程化,方便移植,比如STM32,STM8等单片机上
  • 思路:
    • 1.蓝牙串口发送特定字符给51单片机
    • 2.单片机接收到消息触发串口中断,进入串口中断服务函数
      注意服务函数不要写过多,中断服务函数应该尽量简短,一般是做一些标识,不要在中断中做延时之类的
      占用CPU很长时间的工作。----快进快出
    • 3.中断函数制作判断标志位,然后给到其他函数去做具体事例
    • 4.主函数中判断并做出相应的动作和屏幕显示
  • 有个问题:主函数判断不知道为什么不能用switch,无法判断出来,希望看完知道的大佬指教下!
2. LCD1602显示程序(lcd.c)
#include "lcd.h"
sbit E = P2 ^ 7;		//1602使能引脚
sbit RW = P2 ^ 6;		//1602读写引脚
sbit RS = P2 ^ 5;		//1602数据/命令选择引脚/********************************************************************
* 名称 : bit Busy(void)
* 功能 : 这个是一个读状态函数,读出函数是否处在忙状态
* 输入 : 输入的命令值
* 输出 : 无
***********************************************************************/
bit Busy(void)
{bit busy_flag = 0;RS = 0;RW = 1;E = 1;delay3();busy_flag = (bit)(P0 & 0x80);E = 0;return busy_flag;
}/********************************************************************
* 名称 : wcmd(uchar del)
* 功能 : 1602命令函数
* 输入 : 输入的命令值
* 输出 : 无
***********************************************************************/
void wcmd(uchar del)
{while(Busy());RS = 0;RW = 0;E = 0;delay3();P0 = del;delay3();E = 1;delay3();E = 0;
}/********************************************************************
* 名称 : wdata(uchar del)
* 功能 : 1602写数据函数
* 输入 : 需要写入1602的数据
* 输出 : 无
***********************************************************************/void wdata(uchar del)
{while(Busy());RS = 1;RW = 0;E = 0;delay3();P0 = del;delay3();E = 1;delay3();E = 0;
}/********************************************************************
* 名称 : L1602_init()
* 功能 : 1602初始化,请参考1602的资料
* 输入 : 无
* 输出 : 无
***********************************************************************/
void L1602_init(void)
{wcmd(0x38);Delay(5);wcmd(0x38);Delay(5);wcmd(0x38);Delay(5);wcmd(0x38);wcmd(0x08);wcmd(0x0c);wcmd(0x04);wcmd(0x01);
}//不用注释掉,防止报错未调用该函数  此处代码中未用到所以注释了
///********************************************************************
//* 名称 : L1602_char(uchar hang,uchar lie,char sign)
//* 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符显示"b" ,调用该函数如下
//		 L1602_char(1,5,'b')
//* 输入 : 行,列,需要输入1602的数据
//* 输出 : 无
//***********************************************************************/
//void L1602_char(uchar hang, uchar lie, char sign)
//{
//    uchar a;
//    if(hang == 1) a = 0x80;
//    if(hang == 2) a = 0xc0;
//    a = a + lie - 1;
//    wcmd(a);
//    wdata(sign);
//}/********************************************************************
* 名称 : L1602_string(uchar hang,uchar lie,uchar *p)
* 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下L1602_string(1,5,"ab cd ef;")
* 输入 : 行,列,需要输入1602的数据
* 输出 : 无
***********************************************************************/
void L1602_string(uchar hang, uchar lie, uchar *p)
{uchar a, b = 0;if(hang == 1) a = 0x80;if(hang == 2) a = 0xc0;a = a + lie - 1;while(1){wcmd(a++);if((*p == '\0') || (b == 16)) break;b++;wdata(*p);p++;}
}
3.控制步进电机正反转(motor.c)
#include "motor.h"int forward(uchar speed)		//控制正转
{uchar i;for(i = 0; i < 8; i++){P1 = F_Rotation[i];		//顺时针转动Delay(speed);					//改变转速}return speed;
}int back(uchar speed)		//控制反转
{uchar i;for(i = 0; i < 8; i++){P1 = B_Rotation[i];	 //逆时针转动Delay(speed);							//改变转速}return speed;
}
4.开启串口定时器,且设置波特率为9600(Uart.c)
#include "Uart.h"void UartInit()		//9600bps@11.0592MHz
{SCON = 0x50; // SCON: 模式1, 8-bit UART, 使能接收TMOD |= 0x20;TH1 = 0xfd; //波特率9600 初值TL1 = 0xfd;TR1 = 1;EA = 1; //打开总中断ES = 1; //打开串口中断
}
5.main.c
#include "123.h"main()
{L1602_init();Delay(100);UartInit();while(1){panduan();}
}void panduan()
{if(flag == 0)		//判断正转{led = 0;	//状态灯灭forward(speed);		//电机执行正转且返回速度送给下面进行判断if(speed == 1)			//如果为1	则速度显示为快速{LCD_display("Mo Dir: Goto","Mo Spd: Fast ^_^");}else if(speed == 3)		//如果为3	则速度显示为中速{LCD_display("Mo Dir: Goto","Mo Spd: Norl ^_^");}else if(speed == 5)		//如果为5	则速度显示为慢速{LCD_display("Mo Dir: Goto","Mo Spd: Slow ^_^");}}if(flag == 1)			//判断反转{led = 1;			//状态灯亮back(speed);if(speed == 1)			//电机执行正转且返回速度送给下面进行判断{LCD_display("Mo Dir: Back","Mo Spd: Fast ^_^");}else if(speed == 3){LCD_display("Mo Dir: Back","Mo Spd: Norl ^_^");}else if(speed == 5){LCD_display("Mo Dir: Back","Mo Spd: Slow ^_^");}}
}void Usart() interrupt 4			//中断服务函数
{uchar n; //定义临时变量
//	led = 1;if(RI) //判断是接收中断产生{RI = 0; //标志位清零n = SBUF; //读入缓冲区的值switch(n){case'0':		//控制正转flag = 0;break;case'1':		//控制反转flag = 1;break;case'2':		//控制速度为慢speed = 5;break;case'3':		//控制速度为中等speed = 3;break;case'4':		//控制速度为快speed = 1;break;}TI = 1;SBUF = n; //把接收到的值再发回}if(TI) //如果是发送标志位,清零TI = 0;
}
五.源代码

完整程序的已经放在了github上:

https://github.com/lbmcu/LCD1602-display-in-the-motor

这篇关于基于51单片机下通过蓝牙串口控制LCD1602屏幕显示步进电机正反转以及转速的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/351087

相关文章

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

day-51 合并零之间的节点

思路 直接遍历链表即可,遇到val=0跳过,val非零则加在一起,最后返回即可 解题过程 返回链表可以有头结点,方便插入,返回head.next Code /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}*

基于51单片机的自动转向修复系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机

控制反转 的种类

之前对控制反转的定义和解释都不是很清晰。最近翻书发现在《Pro Spring 5》(免费电子版在文章最后)有一段非常不错的解释。记录一下,有道翻译贴出来方便查看。如有请直接跳过中文,看后面的原文。 控制反转的类型 控制反转的类型您可能想知道为什么有两种类型的IoC,以及为什么这些类型被进一步划分为不同的实现。这个问题似乎没有明确的答案;当然,不同的类型提供了一定程度的灵活性,但

单片机毕业设计基于单片机的智能门禁系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍程序代码部分参考 设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订

深入解析秒杀业务中的核心问题 —— 从并发控制到事务管理

深入解析秒杀业务中的核心问题 —— 从并发控制到事务管理 秒杀系统是应对高并发、高压力下的典型业务场景,涉及到并发控制、库存管理、事务管理等多个关键技术点。本文将深入剖析秒杀商品业务中常见的几个核心问题,包括 AOP 事务管理、同步锁机制、乐观锁、CAS 操作,以及用户限购策略。通过这些技术的结合,确保秒杀系统在高并发场景下的稳定性和一致性。 1. AOP 代理对象与事务管理 在秒杀商品

PostgreSQL中的多版本并发控制(MVCC)深入解析

引言 PostgreSQL作为一款强大的开源关系数据库管理系统,以其高性能、高可靠性和丰富的功能特性而广受欢迎。在并发控制方面,PostgreSQL采用了多版本并发控制(MVCC)机制,该机制为数据库提供了高效的数据访问和更新能力,同时保证了数据的一致性和隔离性。本文将深入解析PostgreSQL中的MVCC功能,探讨其工作原理、使用场景,并通过具体SQL示例来展示其在实际应用中的表现。 一、

开放式耳机好用?平价开放式耳机推荐?四款开放式的蓝牙耳机推荐

开放式耳机好用吗?有平价些的开放式耳机推荐吗?那这两个问题的回答当然是肯定的。 首先开放式耳机好不好用取决于对耳机的需求,因为开放式耳机其实是比较适用于需要注意周围环境、需要‌长时间佩戴舒适以及需要频繁与人交流的场景中,在这些场景下使用开放式耳机的话就会比较有优势。就例如跑步骑行健身等运动的时候,能够兼得佩戴舒适度的同时,增加一定的安全性;还有在办公学习的时候,会很适合长时间佩戴,能够方便和

vue2实践:el-table实现由用户自己控制行数的动态表格

需求 项目中需要提供一个动态表单,如图: 当我点击添加时,便添加一行;点击右边的删除时,便删除这一行。 至少要有一行数据,但是没有上限。 思路 这种每一行的数据固定,但是不定行数的,很容易想到使用el-table来实现,它可以循环读取:data所绑定的数组,来生成行数据,不同的是: 1、table里面的每一个cell,需要放置一个input来支持用户编辑。 2、最后一列放置两个b

【电机控制】数字滤波算法(持续更新)

文章目录 前言1. 数字低通滤波 前言 各种数字滤波原理,离散化公式及代码。 1. 数字低通滤波 滤波器公式 一阶低通滤波器的输出 y [ n ] y[n] y[n] 可以通过以下公式计算得到: y [ n ] = α x [ n ] + ( 1 − α ) y [ n − 1 ] y[n] = \alpha x[n] + (1 - \alpha) y[n-1]