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

这篇具有很好参考价值的文章主要介绍了STM32通过串口发送指令控制LED灯亮灭OLED并显示命令。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

stm32串口控制灯亮灭,STM32,stm32,嵌入式硬件,单片机,proteus,F103C8T6

stm32串口控制灯亮灭,STM32,stm32,嵌入式硬件,单片机,proteus,F103C8T6

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

首先是主函数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);  // 清除接收标志位

}


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

stm32串口控制灯亮灭,STM32,stm32,嵌入式硬件,单片机,proteus,F103C8T6

工程编译后下载到单片机就能实现串口控制LED灯的亮灭了。文章来源地址https://www.toymoban.com/news/detail-853024.html

到了这里,关于STM32通过串口发送指令控制LED灯亮灭OLED并显示命令的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • stm32按键控制LED灯亮灭(中断法)

    用按键控制STM32上的LED灯亮灭,可以采用轮询法和中断法。轮询法需要不断检测按键的状态,消耗MCU;而中断法只是在按下的那一刻触发中断,控制灯亮灭。轮询法相对于更常规,容易操作。因此我们这里讲的用中断法。关于中断的概述,这里不作介绍,只讲操作,分析代码

    2024年02月07日
    浏览(45)
  • FPGA通过一个按键控制三个LED灯亮灭(状态机法)

    FPGA型号:Cyclone IV EPFCE10F17C8    开发工具:Quartus13.0专业版  Modelsim 10.1d 文章目录 状态机 一、设计思路 二、代码设计 1.顶层代码 2.测试代码 三、仿真 状态机由状态寄存器和组合逻辑电路构成,能够根据控制信号按照预先设定的状态进行状态转移,是协调相关信号动作、完成

    2024年02月02日
    浏览(83)
  • 十、stm32-ESP8266(串口透传、MCU透传、控制LED亮灭)

    见博客:stm32f103c8t6新建固件库模板(可自取) 固件库模板 MDK5开发环境 stm32参考手册 UART串口协议 stm32中断概念 ESP8266模块资料 利用固件库模板点灯工程(下面第三行,手动狗头) CH340 USB→TTL模块 ESP8266模块 手机软件 实验程序已经发布到百度网盘,本文末有链接可以自取

    2023年04月19日
    浏览(39)
  • STM32入门笔记10_USART串口通信+案例:上位机控制LED亮灭(USART串口通信、TIM定时器、EXTI综合案例)

    通信的目的: 将一个设备的数据传送到另一个设备, 扩展硬件系统 通信协议: 制定通信的规则, 通信双方按照协议规则进行数据收发 名称 引脚 双工 时钟 电平 设备 USART TX、RX 全双工 异步 单端 点对点 I2C SCL、SDA 半双工 同步 单端 多设备 SPI SCLK、MOSI、MISO、CS 全双工 同步 单端

    2024年02月09日
    浏览(30)
  • stm32----串口通讯,通过串口控制LED灯

    1.初始化LED灯(根据原理图修改pin和gpio): 2.初始化串口 3.编译中断函数: 以下是完整代码: 效果如下

    2024年02月11日
    浏览(34)
  • STM32通过串口控制LED闪烁或者呼吸效果

    目录 STM32通过串口控制LED闪烁或者呼吸效果 1、准备工作 2、思路分析 3、实际操作 4、小结 1.首先我们需要准备32的最小系统板或者开发板。 2.准备一个LED灯(如果使用板子上的灯来实现则不需要,下面我是使用最小系统板上的LED灯来实现)。 3.若干杜邦线。 4.软件方面的准备

    2024年02月08日
    浏览(34)
  • 设计分享|单片机独立按键控制4个LED灯亮灭

    目录 具体实现功能 设计介绍 51单片机简介 设计思路 设计内容 仿真图(protues8.7) 程序(Keil5) 具体实现功能 单片机四个按键分别控制四个LED的亮灭! 设计介绍 51单片机简介 51单片是一种低功耗、高性能CMOS-8位微控制器,具有8K可编程Flash存储器,使得其为众多嵌入式控制应

    2024年02月06日
    浏览(41)
  • STM32驱动串口屏,STM32F103C8T6串口发送指令控制HMI串口屏

    串口屏是一个集成了单片机的屏幕模块,采用的是TTL串口协议,可以直接通过对应指令控制屏幕, 本文采用的串口屏是陶晶驰T0系列的基本型,目的是通过单片机的串口来控制串口屏 上面仅是一部分常用的基础指令,更多更仔细的指令或者函数可以访问陶晶驰资料官网。 硬

    2024年02月13日
    浏览(36)
  • HC-05蓝牙模块与STM32控制led灯亮详解

    HC-05模块是一种基于蓝牙协议的简单无线通信设备,共有6个引脚,其中两个引脚通过stm32的两个含TX和RX的接口与之进行通信,一般用于无线控制,智能家居等。 VCC:用于供电 GND:用于供电 TX(发送):与单片机某一RX口进行通信 RX(接收):与单片机某一TX口进行通信 一句话

    2024年02月08日
    浏览(57)
  • 毕业设计 基于51单片机的手机蓝牙控制8位LED灯亮灭设计

    选题之前,同学们要弄明白一件事情,做毕业设计是干什么用的! 这里我告诉大家,毕业设计对于你来说,不是让你去搞研究,掌握运用所学知识的,也不是让你去比谁做的毕业设计多么牛逼,多么厉害。 说白点,它的作用就是一个,让你顺利毕业,能够拿到学位证,毕业

    2024年02月07日
    浏览(52)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包