【STM32F10x串口通信控制LED输出模式以及亮灭】
STM32F10x串口通信控制LED不同模式以及亮灭
非常简单!具体功能如下:
- 默认状态:key0->绿灯翻转 key1->红灯翻转
- 串口输入1:key0->红灯翻转 key1->绿灯翻转
- 串口输入2:key0->全灯灭 key1->全灯灭
- 串口输入3:测试用——> 红灯翻转
- 串口输入4:测试用——> 绿灯翻转
- 串口输入5:led流水灯
鉴于大部分同学是为了快速入门或者完成作业,本次教程非常无脑化,并且实时更新。
首先具备如下:
请确保CH340驱动正常运作,有无正常运转点击我的电脑 ——>管理——>查看端口
我的常见错误是win10不允许驱动签名,这时候百度一下使用高级重启重新配置一下就行。
1.软件
1.XCOM V2.0(ALIENTEK官方推荐)
2. Keil5 编译软件
2.硬件
1.STM32F103正点原子精英版
3.代码来源
1.正点原子实验三按键输入实验
2.正点原子实验四串口通信实验
4.代码源码
4.1main.c文件
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"extern u8 mod ;int main(void){ vu8 key=0; mod = 0;KEY_Init(); delay_init(); //延时函数初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级uart_init(115200); //串口初始化为115200LED_Init(); //LED端口初始化KEY_Init(); //初始化与按键连接的硬件接口USART_SendString(USART1, "一次非常可爱的串口实验\r\n"); //发送字符串USART_ClearFlag(USART1,USART_FLAG_RXNE); //接收前先清空标志位while(1){key=KEY_Scan(0); if(key){ switch(key){ case KEY1_PRES: //默认控制状态LED1=!LED1; //key0红灯亮 key1绿灯亮break;case KEY0_PRES:LED0=!LED0;break;}}else delay_ms(10);
/*************************key0绿灯亮 key1红灯亮********************************/if(mod == 1){USART_SendString(USART1, "控制模式1\r\n"); LED1=1;LED0=1;while(1){key=KEY_Scan(0); if(key){ switch(key){ case KEY1_PRES: LED0=!LED0;break;case KEY0_PRES:LED1=!LED1;break;}}else delay_ms(10); } }
/*******************同时亮灭*********************/ if(mod == 2){USART_SendString(USART1, "控制模式2\r\n"); //发送字符串LED1=1;LED0=1;while(1){key=KEY_Scan(0); if(key){ switch(key){ case KEY1_PRES: LED1=1;LED0=1;break;case KEY0_PRES:LED1=0;LED0=0;break;}}else delay_ms(10); } }
/**************流水灯*********************/if(mod == 5){ USART_SendString(USART1, "控制模式3\r\n"); //发送字符串delay_ms(500);LED1=0;LED0=1;while(1){LED1=!LED1;LED0=!LED0;delay_ms(1000);} }delay_ms(10);}
}
4.2usart.c文件
#include "sys.h"
#include "usart.h"
#include "led.h"u8 mod = 0;
#if SYSTEM_SUPPORT_OS
#include "includes.h"
#endif
#if 1
#pragma import(__use_no_semihosting)
//标准库需要的支持函数
struct __FILE
{ int handle; }; FILE __stdout;
//定义_sys_exit()以避免使用半主机模式
_sys_exit(int x)
{ x = x;
}
//重定义fputc函数
int fputc(int ch, FILE *f)
{ while((USART1->SR&0X40)==0);//循环发送,直到发送完毕 USART1->DR = (u8) ch; return ch;
}
#endif #if EN_USART1_RX //如果使能了接收
//串口1中断服务程序
//注意,读取USARTx->SR能避免莫名其妙的错误
u8 USART_RX_BUF[USART_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节.
u16 USART_RX_STA=0; //接收状态标记 void uart_init(u32 bound){//GPIO端口设置GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE); //使能USART1,GPIOA时钟//USART1_TX GPIOA.9GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9//USART1_RX GPIOA.10初始化GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10 //Usart1 NVIC 配置NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级3NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器//USART 初始化设置USART_InitStructure.USART_BaudRate = bound;//串口波特率USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式USART_Init(USART1, &USART_InitStructure); //初始化串口1USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断USART_Cmd(USART1, ENABLE); //使能串口1 }void USART_SendString(USART_TypeDef* USARTx, char *DataString)
{int i = 0;USART_ClearFlag(USARTx,USART_FLAG_TC); //发送字符前清空标志位(否则缺失字符串的第一个字符)while(DataString[i] != '\0') //字符串结束符{USART_SendData(USARTx,DataString[i]); //每次发送字符串的一个字符while(USART_GetFlagStatus(USARTx,USART_FLAG_TC) == 0); //等待数据发送成功USART_ClearFlag(USARTx,USART_FLAG_TC); //发送字符后清空标志位i++;}
}void USART1_IRQHandler(void) //串口中断执行函数
{char USART1_ReceiveData = 0; //接收PC端发送过来的字符if(USART_GetFlagStatus(USART1,USART_IT_RXNE) == 1) //USART_FLAG_RXNE判断数据,== 1则有数据{ USART1_ReceiveData = USART_ReceiveData(USART1); //通过USART1串口接收字符USART_ClearFlag(USART1,USART_IT_RXNE); //接收后先清空标志位}if( '1' == USART1_ReceiveData ) //如果数据为1,LED1灯电平翻转{LED0 = !LED0;mod = 1 ;}if( '2' == USART1_ReceiveData ) //如果数据为2,LED2灯电平翻转{LED1= !LED1;mod = 2 ;}if( '3' == USART1_ReceiveData ) //如果数据为1,LED1灯电平翻转{LED0 = !LED0;}if( '4' == USART1_ReceiveData ) //如果数据为2,LED2灯电平翻转{LED1= !LED1;}if( '5' == USART1_ReceiveData ) //如果数据为2,LED2灯电平翻转{mod = 5 ;}
}#endif
以上便是实现功能的两个主要代码文件
原理很简单有基础的同学一眼能看明白,没基础的同学直接复制就行。
检查文件是否有缺,key.c文件和led.c针对不同单片机可以单独配置,此时无需更改。
5.最后
波特率为115200,
打开串口,若屏幕显示:开头图片,则程序正常运行。
*随便一小时写的程序,简陋实用,大佬请见笑,写给需要的同学,学linux去啦!!。。。*
链接:https://pan.baidu.com/s/1pO2wB9TDxed4JPzp04XBlg
提取码:ibhm
附上程序源码:
https://download.csdn.net/download/m0_50629392/54221946?spm=1001.2014.3001.5501
【STM32F10x串口通信控制LED输出模式以及亮灭】相关推荐
- 串口接收字符/字符串/定向printf串口发送/用串口控制led灯的亮灭
##usart.h//串口头文件 #include "stm32f10x.h" #include <stdio.h> void usart_init(); void U ...
- mini2440A 裸机编程:串口控制LED灯的亮灭
要求 在PC上发送L11控制开发板led1亮,发送L10控制开发板led1灭: 在PC上发送L21控制开发板led2亮,发送L20控制开发板led2灭: 在PC上发送L31控制开发板led3亮,发送L ...
- 红外控制LED灯的亮灭———Arduino
Arduino的中文社区:https://www.arduino.cn/ \黑脸,今天烧坏一个二极管. 原因:正负极没反,没接电阻. 把自己头打烂了- 1. 所需硬件 开发板,led灯(多个),遥控器 ...
- 单片机基础:开关控制LED灯的亮灭
(一) 单片机的初级运用.通过两个开关来控制LED灯的亮灭.首先要使用Proteus来绘制电路原理图.图中的LED灯为共阴接法.如图: (二)当单片机P3口做输入时,首要让其端口输出1.如图中的P3^ ...
- Java 通过GPIO控制LED灯的亮灭(一)
Java 通过GPIO控制LED灯的亮灭(Firefly-RK3399)(一) Note: 为Android 开发,开发工具AndroidStudio 什么是 GPIO ,(General-purpo ...
- 【Arduino基础】倾斜开关控制led灯的亮灭
实验现象 手拿着面包板,当倾斜到一定程度时,LED被点亮:没有倾斜时,led不亮. 理论学习 当开关一端低于水平位置倾斜,开关导通,模拟口电压值为5V左右 (数字二进制表示为1023),点亮led灯. ...
- 设计一个以1秒频率闪烁的LED灯(亮灭各500ms)
源文件: module cnt_1( clk, Reset_n, Led ); input clk; input Reset_n; output reg Led; reg [24:0]counter; ...
- cc2530 按键中断实验——按键控制LED灯的亮灭
在本次学习中,主要通过外部中断来控制LED的亮灭. 首先,先查看相关电路图.由图可知,当CC2530端口1的1号引脚输出低电平时,LED3将被点亮,当按键31按下时,端口1的1号引脚将为低电平,抬起时 ...
- 计数器控制led灯的亮灭
想让led灯不断闪烁,可以利用计数器操控,在计数器寄存器达到一定的数值后,改变led灯的电平,实现亮灭. 在模块设计中先定义计数器的寄存器,其后再通过寄存器改变led的电平,当我们复位信号为0时,整个 ...
最新文章
- Java RMI(远程方法调用) 实例与分析 (转)
- 替换富文本里的px为rem
- java bean spring_Java bean与Spring、Spring MVC关系
- 10年老分析师最终抛弃Excel,它不是最好的数据分析工具
- 我又踩坑了!如何为 HttpClient 请求设置 Content-Type 标头?
- 如何打造程序员专属聊天室?
- C++ 以智能指针管理内存资源
- linux下部署node+vue文件
- java子字符串个数组_javasript 字符串 数组操作
- 3. 说清 Observable
- 【图像分割】基于matlab C-V模型水平集图像分割【含Matlab源码 1456期】
- sql中的字符串拼接
- android icon换不掉图标文件夹,如何替换android系统中的文件夹图标
- Revit二次开发入门
- 最科学 最舒服 【色彩搭配】 平面设计师必备
- qps tps rps 区别
- 【华为机试真题 Python】勾股数元祖
- 在知乎上看到的一个关于Linux运维工程师必知的几点,希望对有志于从事运维工作的你有帮助
- 耐压测试仪结构组成部分
- 【小技巧】周杰伦没有离开网易云音乐