STM32通过串口发送指令控制LED灯亮灭OLED并显示命令

news2024/11/17 3:23:44

先来看看程序运行的结果吧:

接下来就不说废话了,自己看源代码吧!每一行我都做了注释:

首先是主函数main.c文件:

#include "stm32f10x.h"                  // Device header
#include "OLED.h"
#include "Serial.h"
#include "Delay.h"
#include "String.h"
#include "LED.h"

int main(void)
{
	OLED_Init();       //oled  屏幕初始化
	Serial_Init();      //串口初始化
	LED_Init();        //LED灯初始化
	
	while(1)
	{
		if(Rx_Flag)                                         //如果接收到数据
		{
			if(strcmp(Rx_Data, "LED_ON") == 0)                  //如果接收到的数据是LED_ON
			{
				OLED_ShowString(1,1,"                ");            //OLED显示16个空格,清屏
				LED_ON();                                           //执行开灯函数
				OLED_ShowString(1,1,Rx_Data);                       //OLED显示LED_ON
				Send_String("LED    ON");                           //串口发送LED    ON,反馈控制者灯已经打开
			}
			else if(strcmp(Rx_Data, "LED_OFF") == 0)            //如果接收到的数据是LED_OFF
			{
				OLED_ShowString(1,1,"                ");            //OLED显示16个空格,清屏
				LED_OFF();                                          //执行关灯函数
				OLED_ShowString(1,1,Rx_Data);                       //OLED显示LED_OFF
				Send_String("LED    OFF");                          //串口发送LED    OFF,反馈控制者灯已经关闭
			}
			Rx_Flag=0;                                      //接收到数据标志位置0,为下次接收字符串做准备
		}
		Delay_ms(1000);                                      //延时50毫秒,不用那么快
	}
}

接下来是LED.h文件:

#ifndef __LED_H
#define __LED_H



void LED_Init(void);
void LED_ON(void);
void LED_OFF(void);

#endif

接下来是LED.c文件:

#include "stm32f10x.h"                  // Device header

//  LED灯初始化函数
void LED_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStruct;                 //创建GPIOA初始化的结构体
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;      //推挽输出模式
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5;             //引脚5
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;     //频率50MHz
	GPIO_Init(GPIOA, &GPIO_InitStruct);                //GPIOA初始化
	GPIO_SetBits(GPIOA, GPIO_Pin_5);                   //引脚5设置高电平,防止LED灯初始化后亮
}


// 打开LED灯的函数
void LED_ON(void)
{
	GPIO_ResetBits(GPIOA, GPIO_Pin_5);  //引脚5置低电平
}

// 关闭LED灯的函数
void LED_OFF(void)
{
	GPIO_SetBits(GPIOA, GPIO_Pin_5);   //引脚5置高电平
}

记下来是串口相关的Serial.h文件:

#ifndef __SERIAL_H
#define __SERIAL_H

extern char Rx_Data[];
extern uint8_t Rx_Flag;

void Serial_Init(void);
void Send_Byte(uint8_t Byte);
void Send_String(char *str);

#endif

接下来就是最后一个serial.c文件了:

#include "stm32f10x.h"                  // Device header

char Rx_Data[100];                 //创建接收字符串的变量能盛放100个字节,闲小可以扩大
uint8_t Rx_Flag = 0;               //创建接收到字符串的标志位。1表示接收到了字符串,0表示没有接收到字符串


//串口初始化函数
void Serial_Init(void)
{
	//1:RCC
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);   //开始串口1时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);    // 开启GPIOA的时钟
	//2:GPIO_init
	GPIO_InitTypeDef GPIO_InitStruct;                        //创建GPIO初始化的结构体
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;             // GPIO的模式为推挽输出
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;                   //GPIO的引脚9
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;           //GPIO的频率50MHz
	GPIO_Init(GPIOA, &GPIO_InitStruct);                      //GPIO初始化
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;               //GPIO的模式为上拉输入
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;                  //GPIO引脚10
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;           //GPIO的频率50MHz
	GPIO_Init(GPIOA, &GPIO_InitStruct);                      //GPIO初始化
	//3:USART_Init
	USART_InitTypeDef USART_InitStruct;                                          //创建串口初始化的结构体
	USART_InitStruct.USART_BaudRate = 9600;                                      // 波特率为9600
	USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; // 没有硬件流控制
	USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;                 // 串口1的接收和发送模式
	USART_InitStruct.USART_Parity = USART_Parity_No;                             // 串口无校验
	USART_InitStruct.USART_StopBits = USART_StopBits_1;                          // 串口停止位1位
	USART_InitStruct.USART_WordLength = USART_WordLength_8b;                     // 串口数据位长度:8位
	USART_Init(USART1, &USART_InitStruct);                                       // 串口初始化
	//4:NVIC_Init
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);        //NVIC的分组选择2组                       
	NVIC_InitTypeDef NVIC_InitStruct;                      //NVIC初始化的结构体
	NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn;          //通道选择串口1
	NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;            //NVIC串口通道使能
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;  //NVIC抢占优先级:1
	NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;          //NVIC响应优先级:1
	NVIC_Init(&NVIC_InitStruct);                            //NVIC初始化
	//5:USART_Cmd
	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);          //开启串口1的接收数据中断
	USART_Cmd(USART1, ENABLE);                           //串口1使能
}


// 发送字节的函数(参数:8位的一个字节)
void Send_Byte(uint8_t Byte)
{
	USART_SendData(USART1, Byte);                                //发送1个字节
	while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);     //等待发送完成的标志位置1,是0时就等待
	USART_ClearFlag(USART1, USART_FLAG_TXE);                         //发送完成的标志位置0,为下次发送做准备
}


// 发送字符串函数(参数char类型的指针)
void Send_String(char *str)
{ 
	while(*str)         //如果解引用指针内容不是0就循环
	{
		Send_Byte(*str);      //发送字节当前指针所指向的内容
		str++;                // 指针++,指向下一个字节的内容
	}
}


// 串口1中断函数
void USART1_IRQHandler(void)
{
	static uint8_t state =0;        // 定义接收状态码
	static uint8_t i=0;                 //定义接收数组的下标
	uint8_t Dat;                                    //定义每次进中断接收当前字节的变量
	if(USART_GetFlagStatus(USART1, USART_FLAG_RXNE))  //如果接收标志置位了
	{
		Dat = USART_ReceiveData(USART1);           // 变量接收当前收到的字节
		if(state == 0)                      // 如果状态码是0
		{
			if(Dat == '@')                            //如果收到的字节是@
			{
				state = 1;                            //状态码置1
			}
		}
		else if(state == 1)             // 如果状态码是1
		{
			if(Dat == '$')                      //如果收到的字节是$
			{
				state = 2;                            //状态码置2
			}
			else                       //否则
			{
				Rx_Data[i]=Dat;                 //接收数组的第i个下标赋值为当前接收的字节 
				i++;                            //下标++,移到数组下一个位置,准备下次接收
			}
		}
		else if(state == 2)          // 如果状态码是2
		{
			if(Dat == '&')                    //如果收到的字节是&
			{
				state = 0;                              //状态码置0   结束这次的接收
				i = 0;                                  //小标置0    这一串字符串接收完毕,下串从头覆盖
			}
		}
		
	}
	Rx_Flag = 1;                               // 接收标志位置1, 证明这段字符串接收完毕
	USART_ClearFlag(USART1, USART_FLAG_RXNE);  // 清除接收标志位

}


所有文件在工程中的目录为:

工程编译后下载到单片机就能实现串口控制LED灯的亮灭了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1542112.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

学习SpringBoot笔记--知识点(1)

目录 SpringBoot介绍 创建一个最基础的springbooot项目 使用Spring Initializr创建springboot项目 Spring Boot 自动配置机制 SpringBoot常用注解 1.组件注册 2.条件注解 3.属性绑定 SpringBoot自动配置流程​编辑 学习SpringBoot的方法 ​编辑 SpringBoot日志配置…

AJAX——JSON

目录 一、JSON概述 二、JSON对象语法 三、JSON序列化方法 四、JSON与XML比较 五、Java对象与Json对象的转换 六、Js解析服务器发送过来的JSON字符串 七、$.getJSON() 一、JSON概述 JSON简介:JSON的全称为JavaScript Object Nation(JavaScript 对象表示语法),…

基于nodejs+vue的BBS论坛系统python-flask-django-php

为了更好地发挥本系统的技术优势,根据BBS论坛系统的需求,本文尝试以B/S架构设计模式中的express框架,nodejs语言为基础,通过必要的编码处理、BBS论坛系统整体框架、功能服务多样化和有效性的高级经验和技术实现方法,旨…

【Web】NKCTF 2024 个人wp(部分)

目录 my first cms 全世界最简单的CTF attack_tacooooo 属实太菜了,3/4 my first cms 一眼搜版本2.2.19 CVE -CVE-2024-27622 GitHub - capture0x/CMSMadeSimple 访问/admin/login.php 爆出弱口令,后台登录 admin Admin123 Extensions > User D…

<Linux> 模拟实现文件流 - 简易版

目录 1. FILE 结构设计 2、函数使用及分析 3、文件打开 fopen 4. 缓冲区刷新fflush 5. 数据写入fwrite 6. 文件关闭 fclose 7. 测试 8. 小结 1. FILE 结构设计 在设计 FILE 结构体前,首先要清楚 FILE 中有自己的缓冲区及冲刷方式 缓冲区的大小和刷新方式因…

【云开发笔记No.6】腾讯CODING平台

腾讯云很酷的一个应用,现在对于研发一体化,全流程管理,各种工具层出不穷。 云时代用云原生,再加上AI,编码方式真是发生了质的变化。 从前,一个人可以写一个很酷的软件,后来,这变得…

Day08 Java复习8 Spring MVC概念

Day09 Java复习9 Spring MVC spring mvc 的核心组件是什么? DispatcherServlet 1.JAVA 和Spring 、Spring Boot 、Spring MVC的关系 你要举办一个生日派对,而且你希望它既特别又好玩。Java就像是举办派对的地方,Spring、Spring Boot和Spri…

javaSSM公司招聘管理系统IDEA开发mysql数据库web结构计算机java编程maven项目

一、源码特点 IDEA开发SSM公司招聘管理系统是一套完善的完整企业内部系统,结合SSM框架和bootstrap完成本系统,对理解JSP java编程开发语言有帮助系统采用SSM框架(MVC模式开发)MAVEN方式加 载,系统具有完整的源代码和…

银行监管报送系统介绍(六):客户风险数据报送系统

【概念定义】 银监会决定从2013年起实行新版客户风险统计制度,对各政策性银行、国有商业银行、股份制商业银行进行客户信息汇总统计。 客户风险统计信息,是指新版客户风险统计报送信 息。客户风险统计报送信息包括但不限于对公及同业客户授信和 表内外业…

设计模式(十二):中介者模式(行为型模式)

Mediator,中介者模式:用一个中介对象封装一些列的对象交互。属于行为型模式 Facade,外观模式:为子系统中的一组接口提供一致的界面,facade 提供了一高层接口,这个接口使得子系统更容易使用。属于结构型模式…

Rust并发编程thread多线程和channel消息传递

安全高效的处理并发是 Rust 诞生的目的之一,主要解决的是服务器高负载承受能力。 并发(concurrent)的概念是指程序不同的部分独立执行,这与并行(parallel)的概念容易混淆,并行强调的是"同…

npm、nrm、nvm详解与应用

本文全面介绍了 npm、nrm 以及 nvm 这三个与 Node.js 开发密切相关的工具。首先,对 npm 进行了定义和功能解释,包括其在依赖管理、项目管理、脚本执行、版本控制和社区贡献等方面的作用。接着,详细介绍了 npm 的常用命令和设置下载源的操作&a…

python综合实战案例-数据分析

Python是进行数据分析的好工具,今天就是借助一个案例给大家进行数据分析讲解。 本例设计一个log.txt⽂件,该文件记录了某个项⽬中某个 api 的调⽤情况,采样时间为每分钟⼀次,包括调⽤次数、响应时间等信息,⼤约18万条数…

java数据结构与算法刷题-----LeetCode451. 根据字符出现频率排序

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846 文章目录 1. hash统计出现次数后排序2. 桶排序 1. hash统计出现次数后排序…

WebClient 同步、异步调用实现对比

文章目录 一、概述二、pom依赖三、代码结构四、源码传送1、异步代码2、同步代码3、完整代码 一、概述 WebClient是Spring WebFlux模块提供的一个非阻塞的基于响应式编程的进行Http请求的客户端工具,从Spring5.0开始WebClient作为RestTemplete的替代品,有…

初探Flink集群【持续更新】

周末下雨&#xff0c;倒杯茶&#xff0c;在家练习Flink相关。 开发工具&#xff1a;IntelliJ Idea 第一步、创建项目 打开Idea&#xff0c;新建Maven项目&#xff0c;包和项目命名 在pom.xml 文件中添加依赖 <properties><flink.version>1.13.0</flink.vers…

python(django(自动化))之流程接口展示功能前端开发

1、创建模板代码如下&#xff1a; <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><title>测试平台</title> </head> <body role"document"> <nav class "navbar n…

轻量级 C++ UI 库:快速、可移植、自包含 | 开源日报 No.168

ocornut/imgui Stars: 53.4k License: MIT imgui 是 C 的无臃肿图形用户界面&#xff0c;具有最小的依赖关系。 该项目的主要功能、关键特性、核心优势包括&#xff1a; 为 C 提供了一个轻量级的图形用户界面库输出优化的顶点缓冲区&#xff0c;可在 3D 渲染应用程序中随时呈…

2024/03/24----Pycharm社区版本下载以及创建一个新项目

1.本科安装过这个软件&#xff0c;因为系统重置了&#xff0c;所以重头再来一遍。 2.链接 社区版本Pycharm 3.我下载了2023.1.15的版本&#xff0c;越前面一些的版本可能会比较稳定 4.安装步骤 &#xff08;1&#xff09;先把文件安装目录改成其他盘(文件名最好不要有数字和符号…

2025汤家凤考研数学视频,基础网课百度网盘课程+PDF讲义资料

2025汤家凤大神及数学全程 docs.qq.com/doc/DTmtOa0Fzc0V3WElI 复制粘贴到浏览器&#xff0c;可以见所有的Ke 第一轮 夯实基础 1.阅读大纲考查要求&#xff0c;明确每章的学习目标&#xff1b; 2.按节学习数学理论基础知识&#xff0c;吃透书中例题&#xff1b; 3.学习每章…