学习笔记——STM32F103V3版本——HC-05模块控制数码管

一.硬件

1.HC-05模块

2.数码管

3.连接硬件

二.在keil5中的代码

main.c代码:
 

#include "stm32f10x.h"
#include "buletooth.h"
#include "led.h"
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
#include "exti.h" 

void SystemClock_Config(void);
void GPIO_Init(void);
void UART_Init(void);

int main(void)
{
    
      Stm32_Clock_Init(9);    //³õʼ»¯ÏµÍ³Ê±ÖÓΪ72MHZ
    delay_init(72);         // ³õʼ»¯ÑÓʱº¯Êý
    uart_init(72, 9600);    // ³õʼ»¯´®¿Ú£¬²¨ÌØÂÊΪ9600
    SystemClock_Config();
    GPIO_Init();
    UART_Init();
    LED_Init(); 
    EXTI_Init(); 
    
    
    while (1)
    {
        BlueTooth_Process();
    }
}

void SystemClock_Config(void)
{
    
    RCC->CR |= RCC_CR_HSEON;
    while (!(RCC->CR & RCC_CR_HSERDY));
    
    FLASH->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY_2;
    
    RCC->CFGR |= RCC_CFGR_HPRE_DIV1 | RCC_CFGR_PPRE2_DIV1 | RCC_CFGR_PPRE1_DIV2;
    RCC->CFGR |= RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL9;
    RCC->CR |= RCC_CR_PLLON;
    while (!(RCC->CR & RCC_CR_PLLRDY));
    
    RCC->CFGR |= RCC_CFGR_SW_PLL;
    while ((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_PLL);
}

void GPIO_Init(void)
{
    RCC->APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_AFIOEN;
    uint32_t shiftPA9 = 9 * 4;
    uint32_t shiftPA10 = 10 * 4;   
    GPIOA->CRH &= ~((0xF << shiftPA9) | (0xF << shiftPA10));
    GPIOA->CRH |= (0xB << shiftPA9); 
    GPIOA->CRH |= (0x4 << shiftPA10);
}


void UART_Init(void)
{
    RCC->APB2ENR |= RCC_APB2ENR_USART1EN;
    
    USART1->BRR = 0x1D4C; // 9600 baud @ 72 MHz
    USART1->CR1 = USART_CR1_TE | USART_CR1_RE | USART_CR1_UE;
}
 

led.c代码:
 

#include "sys.h"   
#include "led.h"

//³õʼ»¯PA8ºÍPD2µÄÊä³ö¿Ú£¬²¢ÊÇʹÄÜÕâÁ½¸ö¿ÚµÄʱÖÓ
//LED IO³õʼ»¯

void LED_Init(void)
{
    RCC->APB2ENR|=1<<2;    //ʹÄÜPORTAʱÖÓ         
    GPIOA->CRL&=0X00000000; 
    GPIOA->CRL |= 0x33333333; 
    JTAG_Set(SWD_ENABLE);    //¹Ø±ÕJTAG,¿ªÆôSWD
    GPIOA->ODR&=0X00000000;//È«²¿Êä³öµÍµçƽ
}

//ÉèÖÃÿλÊý×ÖÊä³öµÄ¶þ¼«¹Ü״̬
void LED_1(void)
{
    PAout(1)=1;
      PAout(2)=1;
    PAout(0)=1;
    PAout(5)=0;
    PAout(6)=1;
    PAout(7)=1;
    PAout(3)=1;
    PAout(4)=0;
}
void LED_2(void)
{
    PAout(1)=0;
      PAout(2)=1;
    PAout(0)=0;
    PAout(5)=0;
    PAout(6)=0;
    PAout(7)=1;
    PAout(3)=0;
    PAout(4)=1;
}
void LED_3(void)
{
    PAout(1)=0;
    PAout(0)=0;
      PAout(2)=0;
    PAout(5)=1;
    PAout(6)=0;
    PAout(7)=1;
    PAout(3)=0;
    PAout(4)=1;
}
void LED_4(void)
{
    PAout(1)=0;
    PAout(0)=1;
    PAout(5)=1;
    PAout(6)=0;
    PAout(7)=1;
      PAout(2)=0;
    PAout(3)=1;
    PAout(4)=0;
}
void LED_5(void)
{
    PAout(1)=1;
    PAout(0)=0;
    PAout(5)=1;
    PAout(6)=0;
    PAout(7)=1;
    PAout(3)=0;
    PAout(2)=0;
    PAout(4)=0;
}
void LED_6(void)
{
    PAout(1)=1;
    PAout(0)=0;
    PAout(5)=0;
    PAout(6)=0;
    PAout(7)=1;
    PAout(3)=0;
    PAout(4)=0;
      PAout(2)=0;
}
void LED_7(void)
{
    PAout(1)=0;
    PAout(0)=0;
    PAout(5)=1;
    PAout(6)=1;
    PAout(7)=1;
      PAout(2)=0;
    PAout(3)=1;
    PAout(4)=1;
}
void LED_8(void)
{
    PAout(1)=0;
    PAout(0)=0;
      PAout(2)=0;
    PAout(5)=0;
    PAout(6)=0;
    PAout(7)=1;
    PAout(3)=0;
    PAout(4)=0;
}
void LED_9(void)
{
    PAout(1)=0;
    PAout(0)=0;
    PAout(5)=1;
    PAout(6)=0;
    PAout(7)=1;
    PAout(3)=0;
    PAout(4)=0;
      PAout(2)=0;
}


 

buletooth.c

#include "stm32f10x.h"
#include "buleTooth.h"
#include "led.h"


void BlueTooth_Process(void)
{
    if (USART1->SR & USART_SR_RXNE)
    {
        uint8_t data = USART1->DR;
        USART_SendData(data);
       
        switch (data)
        {
            case 1:
                LED_1();
                break;
            case 2:
                LED_2();
                break;
            case 3:
                LED_3();
                break;
            case 4:
                LED_4();
                break;
            case 5:
                LED_5();
                break;
            case 6:
                LED_6();
                break;
            case 7:
                LED_7();
                break;
            case 8:
                LED_8();
                break;
            case 9:
                LED_9();
                break;
            default:
                break;
        }
    }
}

void USART_SendData(uint8_t data)
{
    while (!(USART1->SR & USART_SR_TXE));
    USART1->DR = data;
}


 

exti.c代码:

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

void EXTI_Init(void)
{
    
    RCC->APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_AFIOEN;

    
    GPIOA->CRH &= ~(GPIO_CRH_CNF9 | GPIO_CRH_CNF10);
    GPIOA->CRH |= GPIO_CRH_CNF9_1 | GPIO_CRH_MODE9_0;  
    GPIOA->CRH |= GPIO_CRH_CNF10_1;                    

    
    AFIO->EXTICR[2] &= ~(AFIO_EXTICR3_EXTI9 | AFIO_EXTICR3_EXTI10);
    AFIO->EXTICR[2] |= AFIO_EXTICR3_EXTI9_PA | AFIO_EXTICR3_EXTI10_PA;

   
    EXTI->IMR |= EXTI_IMR_MR9 | EXTI_IMR_MR10;
    EXTI->FTSR |= EXTI_FTSR_TR9 | EXTI_FTSR_TR10; 

 
    NVIC_SetPriority(EXTI9_5_IRQn, 2);
    NVIC_EnableIRQ(EXTI9_5_IRQn);
    NVIC_SetPriority(EXTI15_10_IRQn, 2);
    NVIC_EnableIRQ(EXTI15_10_IRQn);
}


void EXTI9_5_IRQHandler(void)
{
  
    if (EXTI->PR & EXTI_PR_PR9)
    {
        EXTI->PR |= EXTI_PR_PR9; 

        
        if (USART1->SR & USART_SR_RXNE)
        {
            uint8_t data = USART1->DR;

            
            switch (data)
            {
                case 1:
                    LED_1();
                    break;
                case 2:
                    LED_2();
                    break;
                case 3:
                    LED_3();
                    break;
                case 4:
                    LED_4();
                    break;
                case 5:
                    LED_5();
                    break;
                case 6:
                    LED_6();
                    break;
                case 7:
                    LED_7();
                    break;
                case 8:
                    LED_8();
                    break;
                case 9:
                    LED_9();
                    break;
                default:
                  
                    break;
            }
        }
    }
}


void EXTI15_10_IRQHandler(void)
{
    
    if (EXTI->PR & EXTI_PR_PR10)
    {
        EXTI->PR |= EXTI_PR_PR10; 

        
        if (USART1->SR & USART_SR_RXNE)
        {
            uint8_t data = USART1->DR; 

            switch (data)
            {
                case 1:
                    LED_1();
                    break;
                case 2:
                    LED_2();
                    break;
                case 3:
                    LED_3();
                    break;
                case 4:
                    LED_4();
                    break;
                case 5:
                    LED_5();
                    break;
                case 6:
                    LED_6();
                    break;
                case 7:
                    LED_7();
                    break;
                case 8:
                    LED_8();
                    break;
                case 9:
                    LED_9();
                    break;
                default:
                   
                    break;
            }
        }
    }
}
 

三.注意事项:

1.在写好程序后,用串口调试助手(XCOM)来进行程序展示,在上传过程中使用PA9和PA10的两个跳线帽来实现蓝牙控制数码管的数字,但这里要将switch……case中的要用'1','2'等来进行控制才能实现相关功能。

2.在蓝牙调试器app(手机上的)中的对话模式中要把两个跳线帽去掉,将引脚PA9来连接HC-05上的RX引脚,PA10来连接HC-05上的TX引脚,这里也要将switch……case中的要用'1','2'等来进行控制才能实现相关功能。

3.在蓝牙调试器app(手机上的)中的专业模式中,则用上述代码即可,用switch……case中的要用1,2等。

图片配置如下:
                             

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/15216.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTTP content-type MIME 类型(IANA 媒体类型)

Content-Type(MediaType)&#xff0c;即是Internet Media Type&#xff0c;互联网媒体类型&#xff0c;也叫做MIME类型。在互联网中有成百上千中不同的数据类型&#xff0c;HTTP在传输数据对象时会为他们打上称为MIME的数据格式标签&#xff0c;用于区分数据类型。最初MIME是用…

数据与结构--AVL树

目录 AVL树的概念 AVL树的性质 AVL树结点的定义 AVL树的插入 AVL树的旋转 左单旋 右单旋 左右双旋 右左单旋 AVL树的验证 AVL树的查找 AVL树的修改 AVL树的删除 AVL树的概念 二叉搜索树虽然可以提高我们查找数据的效率&#xff0c;但如果插入二叉搜索树的数据是…

LFSR线性反馈移位寄存器及Verilog实现

一、LFSR LFSR线性反馈移位寄存器&#xff0c;通常由移位寄存器和异或门组成&#xff0c;主要用于产生伪随机序列等。 线性反馈的含义是各个寄存器的输出通过一个反馈函数连接到第一级触发器的输入&#xff1b;LFSR中的寄存器的个数被称为LFSR的级数。 LFSR分为两类&#xff…

开源的在线JSON数据可视化编辑器jsoncrack本地部署与远程访问

文章目录 1. 在Linux上使用Docker安装JSONCrack2. 安装Cpolar内网穿透工具3. 配置JSON Crack界面公网地址4. 远程访问 JSONCrack 界面5. 固定 JSONCrack公网地址 JSON Crack 是一款免费的开源数据可视化应用程序&#xff0c;能够将 JSON、YAML、XML、CSV 等数据格式可视化为交互…

Iphone自动化指令每隔固定天数打开闹钟关闭闹钟

1.业务需求&#xff1a;小z每隔五天有一个夜班&#xff0c;然后下午会有三个小时的休息时间&#xff0c;如果闹钟不响就会错过交班日期&#xff0c;但是如果设置闹钟&#xff0c;iPhone的闹钟只能设定固定循环日期闹钟&#xff0c;或者一次的闹钟&#xff0c;导致要么忘记设闹钟…

【C语言】指针运算

前言 前面在“走进指针世界”中我已经讲解过指针相关的很多前置知识&#xff0c;其实还有一个很重要的部分就是指针的运算。这篇博客&#xff0c;就让我们一起了解一下指针的运算吧&#xff01; 指针作为变量&#xff0c;是可以进行算术运算的&#xff0c;只不过情况会和整型…

LLM-Llama在 MAC M1上体验Llama.cpp和通义千问Qwen 1.5-7B

Llama.cpp的主要目标是在各种硬件上&#xff08;本地和云端&#xff09;实现LLM推断&#xff0c;同时保持最小的设置和最先进的性能。 纯C/C实现&#xff0c;没有任何依赖关系Apple芯片是一级的支持对象 - 通过ARM NEON、Accelerate和Metal框架进行优化对x86架构的AVX、AVX2和…

Go语言的命名规范是怎样的?

文章目录 Go语言的命名规范详解一、标识符命名规范示例代码 二、包名命名规范示例代码 三、变量命名规范示例代码 四、常量命名规范示例代码 五、函数命名规范示例代码 总结 Go语言的命名规范详解 在Go语言中&#xff0c;代码的命名规范对于项目的可读性、可维护性和可扩展性至…

前端菜鸡,对于35+程序员失业这个事有点麻了

“经常看到30岁程序员失业的新闻&#xff0c;说实话&#xff0c;有点麻。目前程序员供求关系并未失衡&#xff0c;哪怕是最基础的前端或者后台、甚至事务型的岗位也是足够的。 事实上&#xff0c;现在一个开出的岗位要找到一位尽职尽责能顺利完成工作的程序员并不是一件那么容…

C++_string简单源码剖析:模拟实现string

文章目录 &#x1f680;1.构造与析构函数&#x1f680;2.迭代器&#x1f680;3.获取&#x1f680; 4.内存修改&#x1f680;5. 插入&#x1f680;6. 删除&#x1f680;7. 查找&#x1f680;8. 交换swap&#x1f680;9. 截取substr&#x1f680;10. 比较符号重载&#x1f680;11…

副业树洞聊天项目/树洞倾诉/陪陪系统源码/树洞源码下载搭建

随着社会的发展和人们生活水平的提高&#xff0c;越来越多的人在面临心理压力、情感困扰或生活困境时&#xff0c;需要一个可以宣泄、倾诉和寻求支持的平台。而传统的人际交往方式往往会遇到难以排解的问题&#xff0c;比如担心被他人知晓自己的隐私等&#xff0c;这就导致了人…

package.json中peerDependencies的使用场景

文章目录 peerDependencies 的使用场景peerDependencies 的使用案例为什么使用 peerDependencies需要注意的事项主要作用 ✍创作者&#xff1a;全栈弄潮儿 &#x1f3e1; 个人主页&#xff1a; 全栈弄潮儿的个人主页 &#x1f3d9;️ 个人社区&#xff0c;欢迎你的加入&#xf…

DNS服务的部署与配置(1)

一、DNS的定义 1、域名系统&#xff08;英文&#xff1a;Domain Name System&#xff0c;缩写&#xff1a;DNS&#xff09;是互联网的一项服务。 它作为将域名和IP地址相互映射的一个分布式数据库&#xff0c;能够使人更方便地访问互联网。 DNS使用UDP端口53。 当前&#xff0…

超简单白话文机器学习 - 回归树树剪枝(含算法介绍,公式,源代码实现以及调包实现)

1. 回归树 1.1 算法介绍 大家看到这篇文章时想必已经对树这个概念已经有基础了&#xff0c;如果不是很了解的朋友可以看看笔者的这篇文章&#xff1a; 超简单白话文机器学习-决策树算法全解&#xff08;含算法介绍&#xff0c;公式&#xff0c;源代码实现以及调包实现&#x…

BL121DT网关在智能电网分布式能源管理中的应用钡铼技术协议网关

随着全球能源结构的转型和智能电网技术的飞速发展&#xff0c;分布式能源管理系统在提高能源利用效率、促进可再生能源接入及保障电网稳定运行方面发挥着日益重要的作用。然而&#xff0c;分布式能源系统内设备种类繁多&#xff0c;通信协议各异&#xff0c;如何高效整合这些设…

如何从http免费升级到https

使用https协议开头是为了在用户访问网站时提供更安全的网络环境。相比http&#xff0c;使用https有数据加密、身份验证、保护隐私、搜索引擎优化等优势。一般获取https证书&#xff0c;则需要支付费用给证书颁发机构&#xff08;CA&#xff09;。还有一些免费的证书证书颁发机构…

解决 SpringBoot 的 Date、LocalDateTime 变成时间戳和数组的问题,创建自定义对象消息转换器

问题描述 SpringBoot 项目&#xff0c;当返回前端的数据类型为 Map 的时候&#xff0c;在 Map 中 put() 时间对象会出现以下问题&#xff1a; 传递的 Date 对象会变成时间戳传递的 LocalDateTime 对象会变成数组 问题复现 编写一个 Controller 方法&#xff0c;返回值为 Ma…

Java并发: 基于Unsafe的CAS实现无锁数据结构

在上一篇Java并发: 面临的挑战文章中说过CAS是解决原子性问题的方案之一。Unsafe提供了CAS的支持&#xff0c;支持实例化对象、访问私有属性、堆外内存访问、线程的启停等功能。 许多Java的并发类库都是基于Unsafe实现的&#xff0c;比如原子类AtomicInteger&#xff0c;并发数…

多线程(C++11)

多线程&#xff08;C&#xff09; 文章目录 多线程&#xff08;C&#xff09;前言一、std::thread类1.线程的创建1.1构造函数1.2代码演示 2.公共成员函数2.1 get_id()2.2 join()2.3 detach()2.4 joinable()2.5 operator 3.静态函数4.类的成员函数作为子线程的任务函数 二、call…

【Linux学习】深入探索进程等待与进程退出码和退出信号

文章目录 退出码return退出 进程的等待进程等待的方法 退出码 main函数的返回值&#xff1a;进程的退出码。 一般为0表示成功&#xff0c;非0表示失败。 每一个非0退出码都表示一个失败的原因&#xff1b; echo $&#xff1f;命令 作用&#xff1a;查看进程退出码。&#xf…