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

实验目标:

  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 "stm32f10x.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
#include "key.h"

u8 keyValue = 0;

void EXTI9_5_IRQHandler(void)
{
    if(EXTI_GetITStatus(EXTI_Line6) != RESET) //检查LINE6是否发生中断
    {
        keyValue = 1;
        EXTI_ClearITPendingBit(EXTI_Line6); //清除中断标志位
    }
}

int main()
{
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
    USART_Config(); //串口初始化
    LED_Init(); //LED初始化
    KEY_Init(); //按键初始化
    EXTI_Config(); //外部中断初始化
    while(1)
    {
        LED1 = !LED1; //LED1闪烁
        delay_ms(500); //延时500ms
        if(keyValue == 1) //检测到按键按下
        {
            USART_SendData(USART1,'1'); //向单片机B发送字符'1'
            keyValue = 0; //清除按键标志位
        }
    }
}

单片机 B:

#include "stm32f10x.h"
#include "usart.h"
#include "led.h"
#include "lcd.h"

u8 recData = 0;

void USART1_IRQHandler(void)
{
    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //判断是否接收到数据
    {
        recData = USART_ReceiveData(USART1); //读取接收到的数据
        USART_ClearITPendingBit(USART1, USART_IT_RXNE); //清除中断标志位
    }
}

int main()
{
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
    USART_Config(); //串口初始化
    LED_Init(); //LED初始化
    LCD_Init(); //LCD初始化
    while(1)
    {
        if(recData == '1') //收到字符'1'
        {
            LED2 = 1; //LED2点亮
            recData = 0; //清除接收到的数据
        }
        if(recData == '2') //收到字符'2'
        {
            LED2 = 0; //LED2熄灭
            recData = 0; //清除接收到的数据
        }
        if(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) != RESET) //检测是否接收到数据
        {
            u8 temp = USART_ReceiveData(USART1); //读取接收到的数据
            if(temp == '1') //收到字符'1'
            {
                LCD_ShowString(0,2,"学号: 123456"); //在第二行显示学号
                USART_SendString(USART1,"OK"); //向单片机A发送“OK”
            }
        }
    }
}

实验步骤:

  1. 使用 Proteus 软件搭建硬件电路,连接单片机、LED、按键、LCD 等器件。
  2. 使用 Kile5 软件编写代码,并将代码烧录到单片机中。
  3. 运行程序,观察 LED 闪烁、按键控制 LED 点亮或熄灭、LCD 显示学号等现象。

实验结果:

成功实现按键控制 LED 闪烁、数据收发和学号显示功能。

实验总结:

本实验通过 STM32 单片机,学习了按键控制、LED 控制、串口通信、LCD 显示等基本操作,并掌握了使用正点原子库进行开发的方法。实验过程中,需要仔细阅读相关资料,理解代码的功能,并进行调试和测试。


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

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