【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时,整个 ...
最新文章
- socks5 代理
- 为什么采用4~20mA的电流来传输模拟量?
- python给图片添加字符
- Eclipse如何生成jar包
- 荣耀6手机升级android版本,华为荣耀6手机系统是什么?荣耀6能升级安卓4.3吗?...
- 6.MYSQL视图的使用和管理
- 6、检查约束(CHECK)
- Java用map实现沁园春_QQ飞车:小钰挑战沁园春影子记录,成为了这张地图的赛道之王!...
- 【渝粤教育】电大中专常见病药物治疗作业 题库
- WordPress后台删除不需要的侧边栏菜单
- 参加 CSDN 2009 英雄大会有感(二)
- JMeter接口测试入门
- 奇怪的问题:为什么手机过一年就变得很慢?
- 中英文国家名及手机号码前缀
- HDMI转SDI转换器信号损失方法
- sigil将html转换epub,【教程】(進階版)如何用Sigil製作一本高質量的epub
- cad怎么画立体图形教学_怎么在CAD中绘制三维立体图
- Android日常开发问题总结:这些问题火候不够,随时变成删库跑路!
- 高德SDK 小车轨迹回放,速度、进度控制
- 大数据存储技术期末复习(自用)
热门文章
- 使用 DML语句,对 “锦图网” 数据进行操作,连接查询(内连接,左外连接,右外连接,全连接)
- 小米八android耗电比例很大,手机技巧 篇一:小米新系统推送,耗电严重待解决!教你5招实现三天一充...
- HDU 3061 Battle(最小割----最大权闭合图)
- latex表格的大小设置_latex设置表格字体大小
- 阿里微服务架构的分布式事务GTS
- 电子计算机 能力极限,“光脑”来了:性能比超级计算机快一万倍
- 【QT开发笔记-基础篇】| 第五章 绘图QPainter | 5.2 界面布局
- 电脑无法进入操作系统
- Word:快速输入着重号(转)
- 播放器缓冲界面显示加载速度