STM32F10x串口通信控制LED不同模式以及亮灭

非常简单!具体功能如下:

  1. 默认状态:key0->绿灯翻转 key1->红灯翻转
  2. 串口输入1:key0->红灯翻转 key1->绿灯翻转
  3. 串口输入2:key0->全灯灭 key1->全灯灭
  4. 串口输入3:测试用——> 红灯翻转
  5. 串口输入4:测试用——> 绿灯翻转
  6. 串口输入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输出模式以及亮灭】相关推荐

  1. 串口接收字符/字符串/定向printf串口发送/用串口控制led灯的亮灭

    ##usart.h//串口头文件 #include "stm32f10x.h" #include <stdio.h> void usart_init(); void U ...

  2. mini2440A 裸机编程:串口控制LED灯的亮灭

    要求 在PC上发送L11控制开发板led1亮,发送L10控制开发板led1灭: 在PC上发送L21控制开发板led2亮,发送L20控制开发板led2灭: 在PC上发送L31控制开发板led3亮,发送L ...

  3. 红外控制LED灯的亮灭———Arduino

    Arduino的中文社区:https://www.arduino.cn/ \黑脸,今天烧坏一个二极管. 原因:正负极没反,没接电阻. 把自己头打烂了- 1. 所需硬件 开发板,led灯(多个),遥控器 ...

  4. 单片机基础:开关控制LED灯的亮灭

    (一) 单片机的初级运用.通过两个开关来控制LED灯的亮灭.首先要使用Proteus来绘制电路原理图.图中的LED灯为共阴接法.如图: (二)当单片机P3口做输入时,首要让其端口输出1.如图中的P3^ ...

  5. Java 通过GPIO控制LED灯的亮灭(一)

    Java 通过GPIO控制LED灯的亮灭(Firefly-RK3399)(一) Note: 为Android 开发,开发工具AndroidStudio 什么是 GPIO ,(General-purpo ...

  6. 【Arduino基础】倾斜开关控制led灯的亮灭

    实验现象 手拿着面包板,当倾斜到一定程度时,LED被点亮:没有倾斜时,led不亮. 理论学习 当开关一端低于水平位置倾斜,开关导通,模拟口电压值为5V左右 (数字二进制表示为1023),点亮led灯. ...

  7. 设计一个以1秒频率闪烁的LED灯(亮灭各500ms)

    源文件: module cnt_1( clk, Reset_n, Led ); input clk; input Reset_n; output reg Led; reg [24:0]counter; ...

  8. cc2530 按键中断实验——按键控制LED灯的亮灭

    在本次学习中,主要通过外部中断来控制LED的亮灭. 首先,先查看相关电路图.由图可知,当CC2530端口1的1号引脚输出低电平时,LED3将被点亮,当按键31按下时,端口1的1号引脚将为低电平,抬起时 ...

  9. 计数器控制led灯的亮灭

    想让led灯不断闪烁,可以利用计数器操控,在计数器寄存器达到一定的数值后,改变led灯的电平,实现亮灭. 在模块设计中先定义计数器的寄存器,其后再通过寄存器改变led的电平,当我们复位信号为0时,整个 ...

最新文章

  1. Java RMI(远程方法调用) 实例与分析 (转)
  2. 替换富文本里的px为rem
  3. java bean spring_Java bean与Spring、Spring MVC关系
  4. 10年老分析师最终抛弃Excel,它不是最好的数据分析工具
  5. 我又踩坑了!如何为 HttpClient 请求设置 Content-Type 标头?
  6. 如何打造程序员专属聊天室?
  7. C++ 以智能指针管理内存资源
  8. linux下部署node+vue文件
  9. java子字符串个数组_javasript 字符串 数组操作
  10. 3. 说清 Observable
  11. 【图像分割】基于matlab C-V模型水平集图像分割【含Matlab源码 1456期】
  12. sql中的字符串拼接
  13. android icon换不掉图标文件夹,如何替换android系统中的文件夹图标
  14. Revit二次开发入门
  15. 最科学 最舒服 【色彩搭配】 平面设计师必备
  16. qps tps rps 区别
  17. 【华为机试真题 Python】勾股数元祖
  18. 在知乎上看到的一个关于Linux运维工程师必知的几点,希望对有志于从事运维工作的你有帮助
  19. 耐压测试仪结构组成部分
  20. 【小技巧】周杰伦没有离开网易云音乐

热门文章

  1. (c语言 )输入10个学生5门课的成绩,分别用函数求:每个学生平均分;每门课的平均分;
  2. 一文弄懂MySQL的最大连接数
  3. MOS与IC的选型公司
  4. 《Sibelius 脚本程序设计》连载(三十六) - 4.6 Folder
  5. 计算机组装部件推荐,3000元电脑最强组装(好配置都值得推荐)
  6. 自编码器/堆叠式自编码器(SAE)
  7. 手机管理应用研究【6】——省电管理篇
  8. BP神经网络在模式识别中的应用
  9. 直播间自动发言自动评论软件的实现思路与代码分享
  10. 【气动学】基于Matlab模拟各类导弹跟踪