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

本项目使用 STM32 单片机和 Proteus 仿真软件,通过串口通信实现两个单片机之间的数据交互,并控制 LED 灯和 LCD 显示屏。其中,单片机 A 通过按键发送数据到单片机 B,控制 LED 灯状态,并发送学号数据,单片机 B 收到数据后显示学号。代码使用 Kile5 软件编写,基于正点原子库。

功能需求:

  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分)。

代码实现:

以下是基于 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_ScanLCD_ShowString 等。
  • 项目的具体实现需要根据实际情况进行修改,例如:硬件连接、参数配置等。

总结:

本项目通过串口通信实现两个 STM32 单片机之间的数据交互,并控制 LED 灯和 LCD 显示屏,实现了基本的通信和控制功能。该项目可以作为学习 STM32 单片机和串口通信的入门项目。


原文地址: https://www.cveoy.top/t/topic/n3vR 著作权归作者所有。请勿转载和采集!

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