STM32 单片机 Proteus 仿真综合设计:LED 控制、串口通信和 LCD 显示
基于 STM32 单片机,采用正点原子库,使用 proteus 仿真综合设计
本项目使用 STM32 单片机和 Proteus 仿真软件,通过串口通信实现两个单片机之间的数据交互,并控制 LED 灯和 LCD 显示屏。其中,单片机 A 通过按键发送数据到单片机 B,控制 LED 灯状态,并发送学号数据,单片机 B 收到数据后显示学号。代码使用 Kile5 软件编写,基于正点原子库。
功能需求:
- 在程序整个执行过程中,要求控制单片机 A 的 LED1 灯以 500ms 的周期进行闪烁,提示系统正在运行。(20 分)
- 单片机 A通过按键向单片机 B 发送字符'1',单片机 B 收到数据后控制 LED2 灯点亮;。(20 分)
- 单片机 A通过按键向单片机 B 发送字符'2',单片机 B 收到数据后控制 LED2 灯熄灭;。(20 分)
- 单片机A连接一个按键,按下按键,单片机A通过串口向单片机B发送数据:“学号”,单片机B收到正确“学号”时,LCD显示学号(30分)。
代码实现:
以下是基于 STM32 单片机的实现代码:
单片机 A 代码
#include "stm32f10x.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "key.h"
#include "sys.h"
int main(void)
{
u8 key_value = 0;
u8 tx_buffer[20] = '学号:123456';
u8 rx_buffer[20];
SysClockInit();
LED_Init();
Key_Init();
USART1_Init(115200);
while (1)
{
LED1 = !LED1; // 控制 LED1 闪烁
key_value = Key_Scan(0); // 检测按键是否按下
if (key_value == KEY0_PRES)
{
USART_SendData(USART1, '1'); // 向单片机 B 发送字符 '1'
while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)
; // 等待发送完成
delay_ms(10); // 延时等待单片机 B 处理数据
USART_ReceiveData(USART1); // 清除接收缓冲区
USART_SendData(USART1, '2'); // 向单片机 B 发送字符 '2'
while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)
; // 等待发送完成
delay_ms(10); // 延时等待单片机 B 处理数据
}
if (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == SET) // 接收到单片机 B 发来的数据
{
rx_buffer[0] = USART_ReceiveData(USART1);
if (rx_buffer[0] == '1') // 控制单片机 B 的 LED2 灯点亮
LED2 = 0;
else if (rx_buffer[0] == '2') // 控制单片机 B 的 LED2 灯熄灭
LED2 = 1;
}
if (Key_Scan(1) == KEY1_PRES) // 检测按键是否按下
{
USART_SendData(USART1, '3'); // 向单片机 B 发送字符 '3'
while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)
; // 等待发送完成
delay_ms(10); // 延时等待单片机 B 处理数据
USART_ReceiveData(USART1); // 清除接收缓冲区
USART_SendBuffer(USART1, tx_buffer, strlen((char *)tx_buffer)); // 向单片机 B 发送数据
}
}
}
单片机 B 代码
#include "stm32f10x.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "lcd.h"
int main(void)
{
u8 rx_buffer[20];
SysClockInit();
LED_Init();
USART1_Init(115200);
LCD_Init();
while (1)
{
if (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == SET) // 接收到单片机 A 发来的数据
{
rx_buffer[0] = USART_ReceiveData(USART1);
if (rx_buffer[0] == '1') // 控制 LED2 灯点亮
LED2 = 0;
else if (rx_buffer[0] == '2') // 控制 LED2 灯熄灭
LED2 = 1;
else if (rx_buffer[0] == '3') // 接收到单片机 A 发来的数据:“学号”
{
USART_SendData(USART1, '4'); // 向单片机 A 发送字符 '4'
while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)
; // 等待发送完成
delay_ms(10); // 延时等待单片机 A 处理数据
USART_ReceiveData(USART1); // 清除接收缓冲区
USART_ReceiveBuffer(USART1, rx_buffer, strlen('学号:123456')); // 接收单片机 A 发来的数据
if (strcmp((char *)rx_buffer, '学号:123456') == 0) // 判断接收到的数据是否正确
LCD_ShowString(0, 0, 240, 32, 24, '学号:123456'); // 显示学号
}
}
}
}
注意:
- 代码中使用了正点原子库,需要根据实际情况进行修改。
- 代码中部分函数需要根据实际情况进行修改,例如:
Key_Scan、LCD_ShowString等。 - 项目的具体实现需要根据实际情况进行修改,例如:硬件连接、参数配置等。
总结:
本项目通过串口通信实现两个 STM32 单片机之间的数据交互,并控制 LED 灯和 LCD 显示屏,实现了基本的通信和控制功能。该项目可以作为学习 STM32 单片机和串口通信的入门项目。
原文地址: https://www.cveoy.top/t/topic/n3vR 著作权归作者所有。请勿转载和采集!