实验四 串口应用
相关电路代码文件下载:https://wwe.lanzouw.com/ioorOyxic0h
一.实验目的
(1)熟悉STM32CubeMX的安装与使用。
(2)熟悉MDK Keil软件的安装与使用。
(3)熟悉Proteus仿真软件的使用。
(4)掌握STM32串口的应用方法。
二.实验内容
利用两个STM32F103芯片分别作为发送端和接收端,两个芯片利用串口 进行通信。发送端每隔1秒生成一个10以内的随机数,然后利用数码管 显示生成的随机数,同时将随机数利用串口发送到接收端。接收端收到 数据后,利用数码管显示接收到的数据。
实验扩展
生成100以内的随机数,并分别在发送端和接收端的数码管正确显示。
三.电路设计说明
采用轮询方式,准备四个数码管,两个STM32F103R6芯片,外加10Ω电阻和+5V电源若干,数码管需要接电阻以及电源。
将左侧数码管的显示十位数数码管的7个引脚标记为LS1-LS7,将左侧STM32F103R6芯片的PA0-PA6引脚也标记为LS1-LS7,表示连线。将左侧数码管的显示个位数数码管的7个引脚标记为LG1-LG7, 将左侧STM32F103R6芯片的PB0-PB6引脚也标记为LS1-LS7,表示连线。
将右侧数码管的显示十位数数码管的7个引脚标记为RS1-RS7,将右侧STM32F103R6芯片的PA0-PA6引脚也标记为RS1-RS7,表示连线。将右侧数码管的显示个位数数码管的7个引脚标记为RG1-RG7, 将右侧STM32F103R6芯片的PB0-PB6引脚也标记为RS1-RS7,表示连线。
将左侧STM32F103R6芯片的PA9引脚标记为send,将右侧STM32F103R6芯片的PA10引脚标记为send,表示连线。
将每个STM32F103R6芯片都进行如图 1 STM32F103R6芯片串口配置中的配置所示。
图 1 STM32F103R6芯片串口配置
四.电路图
图 2 实验设计电路图
五.程序设计说明
本程序采用轮询设计方式。
发送端:首先将控制数码管显示数字的数据存储到number数组中,以便后面使用。编写一个显示倒计时的函数daojishi。daojishi函数传入参数是要显示倒计时的秒数,经过计算提取出个位数和十位数,然后输出显示。编写延时函数,10万空循环设置为一秒,可自己设定。在主函数中,首先设置随机数种子srand(10),然后在while(1)循环中,首先定义一个uint8_t的一百以内的随机数,然后通过倒计时函数显示出来。然后把数据通过HAL_UART_Transmit函数传输出去,然后调用延时函数保持1秒。然后关闭数码管。
接收端:首先将控制数码管显示数字的数据存储到number数组中,以便后面使用。编写一个显示倒计时的函数daojishi。daojishi函数传入参数是要显示倒计时的秒数,经过计算提取出个位数和十位数,然后输出显示。编写延时函数,10万空循环设置为一秒,可自己设定。在主函数中,定义一个uint8_t的变量用于接收数据,然后把数据通过HAL_UART_Receive函数接收过来,然后通过倒计时函数显示出来。然后调用延时函数保持1秒。然后关闭数码管。
六.主要的程序源码
发送端:
unsigned char number[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void daojishi(int sec){
int shi,ge;
shi = sec/10;
ge = sec%10;
GPIOA->ODR=~number[shi];
GPIOB->ODR=~number[ge];
}
void delay(int sec){
int i;
for (i=0;i<sec*400000;i++){}
}
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART1_UART_Init();
srand(10);
while (1)
{
uint8_t randnum = rand()%100;
daojishi(randnum);
HAL_UART_Transmit(&huart1, &randnum, sizeof(randnum),1000);
delay(1);
GPIOA->ODR=0xff;
GPIOB->ODR=0xff;
}
}
接收端:
unsigned char number[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void daojishi(int sec){
int shi,ge;
shi = sec/10;
ge = sec%10;
GPIOA->ODR=~number[shi];
GPIOB->ODR=~number[ge];
}
void delay(int sec){
int i;
for (i=0;i<sec*400000;i++){}
}
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART1_UART_Init();
while (1)
{
uint8_t randnum;
HAL_UART_Receive(&huart1, &randnum, sizeof(randnum),2000);
daojishi(randnum);
delay(1);
GPIOA->ODR=0xff;
GPIOB->ODR=0xff;
}
}
七.实验结果
启动仿真后,两边数码管开始显示数字。如图 3 开始仿真后的显示效果1,图 4 开始仿真后的显示效果2中所示。
图 3 开始仿真后的显示效果1
图 4 开始仿真后的显示效果2
八.总结
通过这次实验使我了解了STM32F103R6通过串口进行通信的方式,掌握了STM32F103R6串口的应用方法。可以通过STM32CubeMX、MDK Keil和Proteus软件完成两个STM32F103R6芯片通过串口进行通信的小程序。虽然这次实验是使用轮询方式实现的,因为自己能力原因,没有实现中断方式,有点遗憾。不过老师还是给我们检查了程序,并提了许多问题和可行性的建议。