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. socks5   代理
  2. 为什么采用4~20mA的电流来传输模拟量?
  3. python给图片添加字符
  4. Eclipse如何生成jar包
  5. 荣耀6手机升级android版本,华为荣耀6手机系统是什么?荣耀6能升级安卓4.3吗?...
  6. 6.MYSQL视图的使用和管理
  7. 6、检查约束(CHECK)
  8. Java用map实现沁园春_QQ飞车:小钰挑战沁园春影子记录,成为了这张地图的赛道之王!...
  9. 【渝粤教育】电大中专常见病药物治疗作业 题库
  10. WordPress后台删除不需要的侧边栏菜单
  11. 参加 CSDN 2009 英雄大会有感(二)
  12. JMeter接口测试入门
  13. 奇怪的问题:为什么手机过一年就变得很慢?
  14. 中英文国家名及手机号码前缀
  15. HDMI转SDI转换器信号损失方法
  16. sigil将html转换epub,【教程】(進階版)如何用Sigil製作一本高質量的epub
  17. cad怎么画立体图形教学_怎么在CAD中绘制三维立体图
  18. Android日常开发问题总结:这些问题火候不够,随时变成删库跑路!
  19. 高德SDK 小车轨迹回放,速度、进度控制
  20. 大数据存储技术期末复习(自用)

热门文章

  1. 使用 DML语句,对 “锦图网” 数据进行操作,连接查询(内连接,左外连接,右外连接,全连接)
  2. 小米八android耗电比例很大,手机技巧 篇一:小米新系统推送,耗电严重待解决!教你5招实现三天一充...
  3. HDU 3061 Battle(最小割----最大权闭合图)
  4. latex表格的大小设置_latex设置表格字体大小
  5. 阿里微服务架构的分布式事务GTS
  6. 电子计算机 能力极限,“光脑”来了:性能比超级计算机快一万倍
  7. 【QT开发笔记-基础篇】| 第五章 绘图QPainter | 5.2 界面布局
  8. 电脑无法进入操作系统
  9. Word:快速输入着重号(转)
  10. 播放器缓冲界面显示加载速度