基于 STM32 单片机,采用正点原子库,使用 proteus 仿真综合设计

该项目使用 STM32 单片机,基于正点原子库,通过 Proteus 仿真实现 LED 控制和串口通信功能。使用按键控制 LED 灯闪烁,并通过串口发送字符控制另一个单片机上的 LED 灯状态。此外,还实现了接收学号信息并进行验证的功能。

功能需求:

  1. 在程序整个执行过程中,要求控制单片机 A 的 LED1 灯以 500ms 的周期进行闪烁,提示系统正在运行。(20 分)
  2. 单片机 A 通过按键向单片机 B 发送字符'1',单片机 B 收到数据后控制 LED2 灯点亮;。(20 分)
  3. 单片机 A 通过按键向单片机 B 发送字符'2',单片机 B 收到数据后控制 LED2 灯熄灭;。(20 分)
  4. 单片机 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 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录