一、实验说明
本次实验建立在第三个实验基础上,稍加修改,通过串口调试助手发送数据到Proteus来实现对流水灯的启动和停止,所以实验采用2个通信串口,实验原理非常简单,只要熟悉第三次实验的过程,就非常容易,只是在上节的基础上建立通信串口和通信串口中断,在通信中断中加入按键的软件中断,从而控制流水灯的启动和停止。(启动还是实验一的流水灯工作方式,停止则为保持现有状态)过程非常简单,只需几分钟搞懂。
(附加上三次实验链接:
实验1中keil和Proteus所有工程文件,百度网盘链接提取码:wig1
实验1:Proteus仿真STM32流水灯实验例程、详细步骤
实验2:Proteus仿真STM32外部EXTI中断、按键中断控制led流水灯的亮灭
实验3:Proteus仿真STM32定时器TIM2与中断来控制流水灯的定时闪烁

公众号:希望招聘(专为大学生毕业求职而用)

二、在实验之前我们需要下载两个软件工具
1.虚拟串口
a.网上下载串口调试助手,按照步骤安装,链接:虚拟串口下载链接
b.添加2对端口COM4、COM8和COM2、COM7。如下图所示:

2.串口调试助手
a.网上下载串口调试助手,按照步骤安装,链接:友善串口调试助手下载链接
b.配置串口里面参数并打开。如下图所示:
这里需要打开两次因为我们需要两个窗口,一个发送启动,一个发送停止。
并且一个配置串口COM7、一个配置串口COM8。参数什么的按以下步骤。

c.这时串口调试助手的串口就已经连接好了,我们可以点击开始,然后再虚拟串口查看连接的情况。

三、在Proteus中配置实验所需器件
1.Proteus配置中我们就不细讲,只讲添加配置原件,具体过程自己实现,因为前三次课程大家已经非常熟悉的会用proteus了,还不熟悉的可以回看前面的实验。
2.在第三次实验基础上增加以下原件COMPIM和VIRTUAL TERMINAL,注意:wo这里用的通信串口USART2所以占用了PA2口,所以在第三次的实验基础上,我还改变了两个按键的端口,原来是PA1和PA2,现在改为PA0和PA1,总体图如下,具体的请继续往下看,一步步讲解。

a.点击P,然后输入COMPIM,添加。
b.添加两个COMPIM(也就是RS232),,看准连接的端口,TXD和RXD的连接情况,如下图所示。

b.点击INSTRUMENTS选择VIRTUAL TERMINAL

c.配置端口COMPIM,双击COMPIM,输入以下参数,如下图所示。


四、keil中配置代码
1.在第三次试验流水灯的基础上不需要添加任何东西,只是修改某部分,打开第三次实验的main.c文件,并删除main.c中的内容,将以下代码拷贝进去。(手机端可能看到的代码不全,但都在代码框里)

#include "stm32f10x.h"
GPIO_InitTypeDef   GPIO_InitStructure;
EXTI_InitTypeDef   EXTI_InitStructure;
NVIC_InitTypeDef   NVIC_InitStructure;
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
USART_InitTypeDef USART_InitStructure;void TIM2_Config(void);
void EXTI0_EXTI1_Config(void);
void USART_Config(void);
uint32_t recieve_ch;
int main(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOC, &GPIO_InitStructure);TIM2_Config();EXTI0_EXTI1_Config();USART_Config();GPIOC->ODR=0x00ff;while (1){}
}
void TIM2_Config(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);TIM_TimeBaseStructure.TIM_Period = 10000;TIM_TimeBaseStructure.TIM_Prescaler = 799;TIM_TimeBaseStructure.TIM_ClockDivision = 0;TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
// TIM_Cmd(TIM2, ENABLE);TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);
}
void EXTI0_EXTI1_Config(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA, &GPIO_InitStructure);RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource1);EXTI_InitStructure.EXTI_Line = EXTI_Line0|EXTI_Line1;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;  EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure);NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);
}
void USART_Config(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1, ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_2;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_3;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//GPIO_cnf.GPIO_Speed = GPIO_Speed_2MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);USART_InitStructure.USART_BaudRate = 9600;USART_InitStructure.USART_WordLength = USART_WordLength_8b;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);USART_Cmd(USART1, ENABLE);USART_Init(USART2, &USART_InitStructure);USART_Cmd(USART2, ENABLE);NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
}

2.选中stm32f10x_it.c文件并打开,删除stm32f10x_it.c文件所有内容,将以下代码复制进去即可。

#include "stm32f10x_it.h"
uint32_t i=0,j=0;
void TIM2_IRQHandler(void)
{if(i<8){if((TIM2->SR&0x0001)==0x0001){TIM2->SR&=0x0000;GPIOC->ODR=~(1<<i);i++;}}else{if(j==0)GPIOC->ODR=0x0000;if(j<16){if((TIM2->SR&0x0001)==0x0001){TIM2->SR&=0x0000;GPIOC->ODR^=0x00ff;j++;}}else{i=0;j=0;}}
}
void EXTI0_IRQHandler(void)
{if(EXTI_GetITStatus(EXTI_Line0) != RESET){EXTI_ClearITPendingBit(EXTI_Line0);TIM_Cmd(TIM2, ENABLE);}
}
void EXTI1_IRQHandler(void)
{if(EXTI_GetITStatus(EXTI_Line1) != RESET){EXTI_ClearITPendingBit(EXTI_Line1);TIM_Cmd(TIM2, DISABLE);}
}
void USART1_IRQHandler(void)
{if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET){EXTI_GenerateSWInterrupt(EXTI_Line0);}
}
void USART2_IRQHandler(void)
{if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET){EXTI_GenerateSWInterrupt(EXTI_Line1);}
}

五、实验操作
1.将keil生成的hex文件加载到proteus中,点击运行。刚才以上步骤中已经配置好了虚拟串口和串口调试助手,如果有关闭的,请重新打开和配置虚拟串口和串口调试助手。
2.因为有两个串口调试助手的页面,我们提前选的是COM8串口调试助手的发送数据使流水灯启动,COM7的串口调试助手发送数据停止。
a.选择COM8串口调试助手发送任意数据,启动流水灯,如下图所示。


b.点击发送之后,如下图,流水灯开始工作。
c.选择COM7串口调试助手发送任意数据,停止流水灯,则流水灯一直保持现在状态。如果想继续开启,则在COM8串口调试助手继续发送数据,就可开启串口调试助手。


六、公众号:希望招聘


4、Proteus仿真STM32串口通信,发送数据控制LED流水灯的启动和停止相关推荐

  1. VSPD+XCOM+Proteus仿真stm32串口通信

    本文说明 功能要求 开机后,向串口1发送"Welcome" 串口1接收字节指令"0xA1",打开LED1,回传"LED1 ON" 串口1接收 ...

  2. 【Multisim仿真】74LS194组成的8个led流水灯

    [Multisim仿真]74LS194组成的8个led流水灯 Multisim仿真演示 原理图 74LS194 注意事项 将2个74ls194做成8位单向移位寄存时, 比如右移:s1 s0(0 1), ...

  3. 关于Proteus 8仿真STM32串口通信时显示数据错误或乱码问题解决!

    本人用Proteus 8仿真STM32F401RBT6串口通信时一直不能正确收发数据,写到板子通信数据显示正常,也在csdn查了很多人的解决办法,但都没了正常解决,直到看到某大神说到串口参数,我试着改 ...

  4. 关于stm32串口接收发送数据不完整的相关问题

    如果串口接收数据,数据传输的比较快,这个时候还要使用同一个串口发送数据. 如果是在主函数中使用HAL_UART_Receive();,这个时候不管使用HAL_UART_Transmit();还是使用H ...

  5. CC2530基础实验:(8)串口通讯-发送字符串控制LED

     目录 前言 一.实验相关电路图 二.实验相关理论与寄存器 1.并行通信与串行通信 2.URAT 3.同步通信与异步通信 4.外设I/O 5.CC2530 的串口通信模块 6.相关寄存器 三.源码分析 ...

  6. arduino串口监视器显示nan_进阶教程1:Arduino串口通信与电脑控制LED

    本专栏内容经修订后,已在豆瓣阅读集结成书出版: https://read.douban.com/ebook/106875966/​read.douban.com 我是潘,曾经是个工程师.这是为 htt ...

  7. STM32串口发送数据控制LED灯的亮灭

    1.配置相应的 GPIO 时钟.串口时钟.复用时钟 2.配置GPIO结构体 3.配置串口 main.c #include "stm32f10x.h" #include " ...

  8. STM32移植RT-Thread后的串口在调试助手上出现:(mq != RT_NULL) assert failed at rt_mq_recv:2085和串口只发送数据不能接收数据问题

    STM32移植RT-Thread后的串口在调试助手上出现:(mq != RT_NULL) assert failed at rt_mq_recv:2085的问题讨论:http://www.rt-thr ...

  9. STM32应用开发实践教程:可控 LED 流水灯的设计与实现

    任务 2.1 LED 流水灯的应用开发 2.1.1 任务分析 本任务要求设计一个 LED 流水灯系统,具体要求如下. 系统通电时,两个 LED 以 2s 为周期(亮 1s,灭 1s)交替闪烁,并逐渐缩 ...

最新文章

  1. 一文了解迁移学习经典算法
  2. 计算机操作员中级操作试题,中级计算机操作员应知模拟考试试题(一)
  3. ES6中的新特性:Iterables和iterators
  4. linux生成固定大小的文件夹的实现
  5. 华为机试——取近似值
  6. GitHub上传文件的过滤规则 -- windows下
  7. 将Hibernate中的枚举转换为自定义数值
  8. python gmm em算法 2维数据_AI大语音(六)——混合高斯模型(GMM)(深度解析)...
  9. 中兴机顶盒服务器地址大全,中兴机顶盒网络设置无线路由器教程
  10. 3D次时代来临 如何玩转红蓝立体游戏
  11. win10 常用快捷键
  12. 英语NLP词汇类别列表
  13. springboot返回date类型的数据会慢8个小时解决方案
  14. loadrunner 12 --录制手机app脚本
  15. 职场新境之“甩手组”
  16. 谷歌浏览器复制禁止复制文字网页上的文字
  17. Ubuntu系统安装搜狗(sougou for linux)输入法
  18. KindEditor插件(富文本编辑器)的使用
  19. 数据规模超大,分布密集,数据存储难
  20. Online Meetup DevOps World 社区议程和 CFP

热门文章

  1. AI: 如何快速开发智能机器人 Bot Intelligence
  2. 输出自新中国成立以来至今所有的闰年年份。
  3. matlab sdm,运行matlab空间计量包中的sdm_d.m,出现?Undefined function or variable 'sdm_d'.
  4. 个人创业如何赚钱?现在做什么生意赚钱?
  5. arcgis sde mysql_ArcGis中地理数据库(sde)中概念及常见函数
  6. 有关Batch Size的玄学被打破了!
  7. 什么是HIS、PACS、LIS、RIS
  8. 【结构光三维重建标定学习】左超论文之Triangular stereo model
  9. 顺丰,披着快递马甲的科技公司?
  10. 【网络工程师精华篇】华为路由交换机基础命令!