STM32 单片机基于正点原子库的 Proteus 仿真综合设计:使用按键发送学号
基于 STM32 单片机,采用正点原子库,使用 Proteus 仿真综合设计:使用按键发送学号
本文介绍基于 STM32 单片机,采用正点原子库,使用 Proteus 仿真进行综合设计,并使用 Kile5 软件编写代码,实现按键发送学号功能。单片机 A 连接按键,按下按键后,单片机 A 通过串口向单片机 B 发送学号。单片机 B 收到正确学号后,在 LCD 上显示学号。
代码实现
#include 'stm32f10x.h'
#include 'usart.h'
#include 'delay.h'
#include 'key.h'
#include 'lcd.h'
int main()
{
u8 flag = 0;
u8 data[10];
u8 rxdata[10];
u8 i = 0;
u8 j = 0;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能GPIOB时钟
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; //PB12
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化GPIOB
USART1_Config(); //串口1初始化
KEY_Init(); //按键初始化
LCD_Init(); //LCD初始化
while(1)
{
if(KEY_Scan() == WKUP_PRES) //检测按键是否按下
{
flag = 1;
USART_SendData(USART1, '1'); //发送数据
while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET); //等待接收数据
rxdata[i++] = USART_ReceiveData(USART1); //接收数据
}
if(flag == 1) //判断是否接收到数据
{
if(rxdata[j] != '\n') //判断数据是否接收完毕
{
data[j] = rxdata[j]; //将数据存入数组
j++;
}
else
{
data[j] = '\0'; //添加字符串结束标志
j = 0;
flag = 0;
if(strcmp((char *)data, '学号') == 0) //判断是否收到正确的学号
{
GPIO_SetBits(GPIOB, GPIO_Pin_12); //点亮LED
LCD_ShowString(0, 0, 'My ID is: '); //在LCD上显示学号
LCD_ShowString(60, 0, '20210001');
}
else
{
GPIO_ResetBits(GPIOB, GPIO_Pin_12); //熄灭LED
}
}
}
}
}
代码解释
- 引入头文件:
stm32f10x.h、usart.h、delay.h、key.h和lcd.h包含了实现代码所需的功能函数定义。 - 初始化:代码中初始化了 GPIOB(用于控制 LED)、串口 1、按键和 LCD,确保硬件设备能够正常工作。
- 主循环:代码使用
while(1)循环不断执行以下操作:- 检测按键是否按下。
- 如果按下,发送数据 '1' 到串口,并等待接收数据。
- 接收数据并将其存入数组
rxdata中。 - 判断是否接收到完整的数据(数据以 '\n' 结尾)。
- 判断接收到的数据是否为 '学号'。
- 如果数据正确,点亮 LED 并显示学号;否则,熄灭 LED。
总结
本代码实现了使用 STM32 单片机、正点原子库、Proteus 仿真和 Kile5 软件编写代码的功能。通过按键发送学号,单片机 A 向单片机 B 发送数据,单片机 B 接收数据后在 LCD 上显示学号。
**注意:**在实际应用中,需要根据实际硬件连接情况修改代码中的引脚定义和相关参数。
原文地址: https://www.cveoy.top/t/topic/n3pE 著作权归作者所有。请勿转载和采集!