以下是基于 STM32 单片机,采用正点原子库,使用 proteus 仿真综合设计的代码:

(1) 控制单片机 A 的 LED1 灯以 500ms 的周期进行闪烁,提示系统正在运行

#include "stm32f10x.h"
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "key.h"

int main(void)
{
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 设置中断优先级分组2:2位抢占优先级,2位响应优先级

    LED_GPIO_Config(); // 初始化LED
    KEY_GPIO_Config(); // 初始化按键
    USART1_Config(); // 初始化USART1

    while (1)
    {
        LED1_TOGGLE(); // LED1闪烁
        delay_ms(500); // 延时500ms
    }
}

(2) 单片机 A 通过按键向单片机 B 发送字符'1',单片机 B 收到数据后控制 LED2 灯点亮

单片机 A 代码:

#include "stm32f10x.h"
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "key.h"

int main(void)
{
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 设置中断优先级分组2:2位抢占优先级,2位响应优先级

    LED_GPIO_Config(); // 初始化LED
    KEY_GPIO_Config(); // 初始化按键
    USART1_Config(); // 初始化USART1

    while (1)
    {
        if (KEY_Scan(KEY1_GPIO_PORT, KEY1_GPIO_PIN) == KEY_ON) // 检测KEY1是否按下
        {
            USART_SendData(USART1, '1'); // 向USART1发送字符'1'
            while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); // 等待发送完成
        }
    }
}

单片机 B 代码:

#include "stm32f10x.h"
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "key.h"

int main(void)
{
    char data;

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 设置中断优先级分组2:2位抢占优先级,2位响应优先级

    LED_GPIO_Config(); // 初始化LED
    KEY_GPIO_Config(); // 初始化按键
    USART1_Config(); // 初始化USART1

    while (1)
    {
        if (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == SET) // 检测USART1是否接收到数据
        {
            data = USART_ReceiveData(USART1); // 读取USART1接收到的数据

            if (data == '1') // 如果接收到字符'1'
            {
                LED2_ON(); // 点亮LED2
            }
        }
    }
}

(3) 单片机 A 通过按键向单片机 B 发送字符'2',单片机 B 收到数据后控制 LED2 灯熄灭

单片机 A 代码:

#include "stm32f10x.h"
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "key.h"

int main(void)
{
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 设置中断优先级分组2:2位抢占优先级,2位响应优先级

    LED_GPIO_Config(); // 初始化LED
    KEY_GPIO_Config(); // 初始化按键
    USART1_Config(); // 初始化USART1

    while (1)
    {
        if (KEY_Scan(KEY1_GPIO_PORT, KEY1_GPIO_PIN) == KEY_ON) // 检测KEY1是否按下
        {
            USART_SendData(USART1, '2'); // 向USART1发送字符'2'
            while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); // 等待发送完成
        }
    }
}

单片机 B 代码:

#include "stm32f10x.h"
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "key.h"

int main(void)
{
    char data;

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 设置中断优先级分组2:2位抢占优先级,2位响应优先级

    LED_GPIO_Config(); // 初始化LED
    KEY_GPIO_Config(); // 初始化按键
    USART1_Config(); // 初始化USART1

    while (1)
    {
        if (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == SET) // 检测USART1是否接收到数据
        {
            data = USART_ReceiveData(USART1); // 读取USART1接收到的数据

            if (data == '2') // 如果接收到字符'2'
            {
                LED2_OFF(); // 熄灭LED2
            }
        }
    }
}

(4) 单片机 A 连接一个按键,按下按键,单片机 A 通过串口向单片机 B 发送数据:'学号',单片机 B 收到正确'学号'时,LCD 显示学号

单片机 A 代码:

#include "stm32f10x.h"
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "key.h"

int main(void)
{
    char data[] = "20190101"; // 定义要发送的数据
    char recv_data[8]; // 定义接收数据的数组

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 设置中断优先级分组2:2位抢占优先级,2位响应优先级

    LED_GPIO_Config(); // 初始化LED
    KEY_GPIO_Config(); // 初始化按键
    USART1_Config(); // 初始化USART1

    while (1)
    {
        if (KEY_Scan(KEY1_GPIO_PORT, KEY1_GPIO_PIN) == KEY_ON) // 检测KEY1是否按下
        {
            USART_SendString(USART1, data); // 向USART1发送数据
            while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); // 等待发送完成

            USART_ReceiveString(USART1, recv_data, 8); // 从USART1接收数据
            if (strcmp(recv_data, data) == 0) // 判断接收到的数据是否与发送的数据相等
            {
                // 在LCD上显示学号
            }
        }
    }
}

单片机 B 代码:

#include "stm32f10x.h"
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "key.h"

int main(void)
{
    char data[8]; // 定义接收数据的数组

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 设置中断优先级分组2:2位抢占优先级,2位响应优先级

    LED_GPIO_Config(); // 初始化LED
    KEY_GPIO_Config(); // 初始化按键
    USART1_Config(); // 初始化USART1

    while (1)
    {
        if (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == SET) // 检测USART1是否接收到数据
        {
            USART_ReceiveString(USART1, data, 8); // 从USART1接收数据

            if (strcmp(data, "20190101") == 0) // 判断接收到的数据是否为正确的学号
            {
                // 在LCD上显示学号
                USART_SendString(USART1, data); // 向USART1发送数据,表示收到正确的学号
            }
        }
    }
}

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

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