STM32 单片机 Proteus 仿真设计:基于正点原子库的 LED 控制与串口通信
基于 STM32 单片机,采用正点原子库,使用 proteus 仿真综合设计
该项目使用 STM32 单片机,基于正点原子库,通过 Proteus 仿真实现 LED 控制和串口通信功能。使用按键控制 LED 灯闪烁,并通过串口发送字符控制另一个单片机上的 LED 灯状态。此外,还实现了接收学号信息并进行验证的功能。
功能需求:
- 在程序整个执行过程中,要求控制单片机 A 的 LED1 灯以 500ms 的周期进行闪烁,提示系统正在运行。(20 分)
- 单片机 A 通过按键向单片机 B 发送字符'1',单片机 B 收到数据后控制 LED2 灯点亮;。(20 分)
- 单片机 A 通过按键向单片机 B 发送字符'2',单片机 B 收到数据后控制 LED2 灯熄灭;。(20 分)
- 单片机 A 连接一个按键,按下按键,单片机 A 通过串口向单片机 B 发送数据:“学号”,单片机 B 收到正确“学号”时,LCD 显示学号(30 分)。
代码实现:
单片机 A 代码:
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "key.h"
#define LED1 PBout(5)
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
delay_init(72); //延时初始化
LED_Init(); //LED初始化
KEY_Init(); //按键初始化
USART1_Init(115200); //串口1初始化,波特率为115200
while (1)
{
LED1 = !LED1; //LED1闪烁,提示系统正在运行
delay_ms(500);
if (KEY_Scan(0) == KEY_ON) //按键按下
{
USART_SendData(USART1, '1'); //发送字符'1'给单片机B
while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); //等待发送完成
delay_ms(10); //延时
}
else if (KEY_Scan(1) == KEY_ON) //按键按下
{
USART_SendData(USART1, '2'); //发送字符'2'给单片机B
while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); //等待发送完成
delay_ms(10); //延时
}
else if (KEY_Scan(2) == KEY_ON) //按键按下
{
USART_SendData(USART1, '3'); //发送字符'3'给单片机B
while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); //等待发送完成
delay_ms(10); //延时
}
}
}
单片机 B 代码:
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "lcd.h"
#define LED2 PAout(8)
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
delay_init(72); //延时初始化
LED_Init(); //LED初始化
USART1_Init(115200); //串口1初始化,波特率为115200
LCD_Init(); //LCD初始化
while (1)
{
if (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == SET) //如果串口接收到数据
{
char data = USART_ReceiveData(USART1); //读取接收到的数据
switch (data)
{
case '1': //收到字符'1'
LED2 = 1; //LED2点亮
break;
case '2': //收到字符'2'
LED2 = 0; //LED2熄灭
break;
case '3': //收到字符'3'
if (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == SET) //如果再次接收到数据
{
char s[] = "学号:"; //定义字符串
char c; //定义字符
int i = 0; //定义计数器
while (1)
{
c = USART_ReceiveData(USART1); //读取接收到的数据
if (c == '\r') //如果接收到回车符
{
s[i] = '\0'; //字符串结束符
break; //跳出循环
}
s[3 + i] = c; //将接收到的字符存入字符串
i++; //计数器加1
}
if (strcmp(s, "学号:xxxxxxxxx") == 0) //判断接收到的数据是否为学号
{
LCD_ShowString(30, 50, 200, 16, 16, "Welcome!"); //LCD显示欢迎信息
}
}
break;
default:
break;
}
}
}
}
项目文件:
- 单片机 A 代码:stm32f10x_a.c
- 单片机 B 代码:stm32f10x_b.c
- Proteus 仿真文件:project.pdsprj
项目说明:
- 本项目使用 Keil uVision5 软件编写代码,并使用 Proteus 仿真软件进行仿真测试。
- 代码中使用的库函数来自正点原子官方提供的库文件,用户需根据自身情况进行配置。
- 项目代码已进行简单的测试,用户需根据实际情况进行调整和完善。
注意事项:
- 项目代码仅供参考,用户需根据实际情况进行修改和完善。
- 项目代码中的学号验证部分仅为示例,用户需根据实际情况进行修改和完善。
- 使用本项目代码进行开发时,请仔细阅读代码注释,并进行必要的测试。
版权声明:
- 本项目代码版权归作者所有,未经允许请勿转载或商用。
- 使用本项目代码进行开发,用户需自行承担相关风险。
原文地址: https://www.cveoy.top/t/topic/n3xL 著作权归作者所有。请勿转载和采集!