「STC8A8K64D4开发板」第2-5讲:I/O中断

第2-5讲:I/O中断

    1. 学习目的
  1. 学习中断的相关概念。
  2. 掌握中断向量大于 31的处理方法。
  3. 掌握中断服务程序的编写。
    1. STC8A8K64D4 I/O中断

STC8A8K64D4单片机的所有GPIO都支持I/O 中断,且支持 4 种中断触发模式:下降沿中断、上升沿中断、低电平中断和高电平中断。

I/O中断的中断号如下表所示,P0端口到P7端口的中断号为37~44,都是大于31的,而KEIL中支持的中断号为0~31,因此,I/O中断的中断服务函数如果使用他们的中断号是无法编译的。

宏晶科技给出的解决方案是:借用第13号中断入口地址,详见《STC8A8K64D4系列单片机技术参考手册》中的《附录Q:关于中断号大于 31 在 Keil 中编译出错的处理》。在后面的程序编写小节,我们会说明编写程序时如何解决这个问题。

表3:I/O中断的中断号

中断号

中断向量

中断类型

37

012B H

P0口中断

38

0133 H

P1口中断

39

013B H

P2口中断

40

0143 H

P3口中断

41

014B H

P4口中断

42

0153 H

P5口中断

43

015B H

P6口中断

44

0163 H

P7口中断

从上表中,我们也可以看到,I/O中断是针对IO端口的,只有端口有独立的中断入口地址,不是每个GPIO都有独立的入口地址的,但是每个 GPIO 可独立设置是否开启I/O中断以及中断模式。

  1. 编程知识点:电平触发和边沿触发的区别

下图描述了边沿触发和电平触发(低电平触发为例,高电平触发类似)的时机。 

图8-:电平触发和边沿触发的区别

  1. 下降沿触发:当电平从高电平转变为低电平转变时,触发中断。
  2. 上升沿触发:当电平从低电平转变为高电平转变时,触发中断。
  3. 电平触发(低电平触发为例,高电平触发类似):低电平时间内中断一直有效的,在低电平期间,当我们处理完中断,退出中断服务函数后,会再次触发中断。因此,我们使用电平中断时常采用这样的做法:在中断退出前关闭中断,等后面恰当时机再打开。
    1. 软件设计
      1. I/O中断应用步骤

I/O中断的应用流程如下图所示,其中配置GPIO为输入以及开启GPIO的上/下拉电阻在前文已经讲解过,这里不再赘述。本节中,我们重点描述I/O中断初始化和中断服务程序的编写。

 

图8-:I/O中断应用步骤

        1. 初始化I/O中断

初始化I/O中断所要做的工作主要包括使能GPIO的I/O中断、配置I/O中断的触发方式以及中断优先级,最后开启总中断。

  1. 使能GPIO的I/O中断

I/O中断的开启和关闭由端口中断使能寄存器(PnINTE,n=0~7)控制,如下图所示。

 

图7-:端口中断使能寄存器

  1. PnINTE.x:端口中断使能控制位(n=0~7,x=0~7)
  1. 0: 关闭 Pn.x 口中断功能。
  2. 1: 使能 Pn.x 口中断功能。
  1. 配置I/O中断的触发方式

I/O中断的触发方式由端口中断模式配置寄存器(PnIM0,PnIM1,n=0~57)控制,如下图所示。

 

图8:端口中断模式配置寄存器(PnIM0,PnIM1)

PnIM1.x PnIM0.x的组合决定了端口中各个I/O的中断触发方式,如下表所示。

表8-:端口中断触发模式

PnIM1.x

PnIM0.x

Pn.x 口中断模式

0

0

下降沿中断

0

1

下降沿中断

1

0

低电平中断

1

1

高电平中断

  1. 配置示例:配置P0.0为低电平中断

P0IM1 |= 0x01;      // P0IM1的位0设置为1

P0IM0 &= ~0x01;  // P0IM0的位0设置为0

  1. 配置中断优先级

I/O中断的优先级由端口中断优先级控制寄存器(PINIPL,PINIPH)控制,如下图所示。STC8A8K64D4有P0~P7共8个端口,因此,STC8A8K64D4使用PINIPL和PINIPH中的位0~位7配置中断优先级。

图7-:中断优先级控制寄存器

 

  1. PxIPH,PxIP:Px(x=0~7)口中断优先级控制位
  1. 00: Px 口中断优先级为 0 级(最低级)。
  2. 01: Px 口中断优先级为 1 级(较低级)。
  3. 10: Px 口中断优先级为 2 级(较高级)。
  4. 11: Px 口中断优先级为 3 级(最高级)。

  1. 配置示例:配置P0端口的中断优先级为最高级3

PINIPH |= 0x01;    // PINIPH的位0设置为1

PINIPL |= 0x01;    // PINIPL的位0设置为1

        1. 编写中断服务函数

由于I/O中断的中断号都是大于31的,在 KEIL中无法直接编译,因此,根据宏晶科技提供的解决方法,我们可以借用0~31中断里面没有使用的中断号,在该中断的入口地址放一条跳转的代码,当该中断产生时,跳转语句执行,跳转到I/O中断服务函数,由此,解决中断号大于31,KEIL中无法直接编译的问题。

在借用中断号时,首先借用第13号中断入口地址,因为第13号是保留中断号,不会占用系统的其他中断,其次,再借用程序中未使用的中断号。

该方法是需要借助汇编代码实现的,具体的做法如下:

  1. 新建一个汇编语言文件isr.asm,并将该文件加入到工程的USER组。
  2. isr.asm文件中加入如下的代码,这段代码实现的是P1端口借用第13号中断入口地址,P1端口地址是0133H,如果是其他端口,修改这个中断入口地址即可。各个端口的中断入口地址可以在STC8A8K64D4的数据手册中查到(《STC8A8K64D4系列单片机技术参考手册》第958页:中断列表)。

代码清单:引用头文件

  1.         CSEG   AT 0133H     ;  P1口中断入口地址,如果是其他端口,修改这个中断入口地址即可
  2.         JMP    P1INT_ISR  
  3. P1INT_ISR:  
  4.         JMP    006BH         ;  借用13号中断的中断入口地址
  5.         END  

  1. 中断服务程序

isr.asm文件中借用的是13中断,因此,中断服务程序中的中断号就要使用13,这样,I/O中断产生后,就可以正确地跳转到I/O中断的中断服务函数了。下面是以P1端口I/O中断的中断服务函数示例,借用了13中断,中断产生后,在中断服务函数中读取P1端口中断标志,从而确定是P1端口的哪个I/O触发了中断。

代码清单:中断服务函数示例

  1. /************************************************************************************* 
  2. 功能描述:P1口中断服务函数,借用第13号中断 
  3.     数:无 
  4.   值:无 
  5. **************************************************************************************/  
  6. void p1_isr (void) interrupt 13       
  7. {  
  8.    u8 psw2_st;  
  9.    u8 intf;  
  10.       
  11.    psw2_st = P_SW2;  
  12.    P_SW2 |= 0x80;          //将EAXFR位置1,使能访问XFR(扩展RAM区特殊功能寄存器)
  13.    intf = P1INTF;          //读出P1端口中断标志,用来判断具体是P1口的哪个I/O产生了中断  
  14.       
  15.    if(intf)  
  16.    {  
  17.       P1INTF = 0x00;        //I/O中断标志必须软件清零  
  18.       if(intf & 0x01)       //P1.0口中断  
  19.       {  
  20.          //用户功能代码
  21.       }  
  22.       if(intf & 0x02)       //P1.1口中断  
  23.       {  
  24.          //用户功能代码
  25.       }  
  26.       if(intf & 0x04)       //P1.2口中断  
  27.       {  
  28.          //用户功能代码
  29.       }  
  30.       if(intf & 0x08)       //P1.3口中断  
  31.       {  
  32.          //用户功能代码
  33.       }  
  34.       if(intf & 0x10)       //P1.4口中断  
  35.       {  
  36.          //用户功能代码
  37.       }  
  38.       if(intf & 0x20)       //P1.5口中断  
  39.       {  
  40.          //用户功能代码
  41.       }  
  42.       if(intf & 0x40)       //P1.6口中断  
  43.       {  
  44.          //用户功能代码
  45.       }  
  46.       if(intf & 0x80)       //P1.7口中断  
  47.       {  
  48.          //用户功能代码
  49.       }  
  50.    }  
  51.    P_SW2 = psw2_st;        //将EAXFR位置0,关闭访问XFR
  52. }  

      1. 外部中断实验(使用一个端口的I/O中断)
  • 注:本节的实验是在“实验2-3-2:触摸按键检测”的基础上修改,本节对应的实验源码是:“实验2-5-1:I/O中断(使用一个端口的I/O中断)”。
        1. 实验内容
  1. 配置P3.7为I/O中断(下降沿中断),这里使用P3.7为例,是因为P3.7连接了按键KEY1,方便测试。按下按键KEY1触发P3端口I/O中断,中断服务函数中翻转指示灯D1的状态(由亮变灭或由灭变亮)。
  2. P3端口中断号大于31的处理。
        1. 代码编写
  1. 新建一个名称为“gpio_int.c”的文件及其头文件“gpio_int.h”并保存到工程的“Source”文件夹,并将“gpio_int.c”加入到Keil工程中的“SOURCE”组。
  2. 引用头文件

因为在“main.c”文件中使用了“gpio_int.c”文件中的函数,所以需要引用下面的头文件“gpio_int.h”。

代码清单:引用头文件

  1. //引用I/O中断头文件  
  2. #include  "gpio_int.h"    
  1. 编写跳转的汇编代码

本例中,我们只使用了一个端口的I/O中断,因此,我们借用13号中断即可。在STC8A8K64D4的数据手册中(《STC8H系列单片机技术参考手册》第417页:STC8H中断列表)查到P3的I/O中断入口地址是“0143H”,所以,中断跳转代码如下。

代码清单:汇编跳转代码

  1.         CSEG    AT 0143H     ;P3口中断入口地址,如果是其他端口,修改这个中断入口地址即可  
  2.         JMP     P3INT_ISR  
  3. P3INT_ISR:  
  4.         JMP     006BH        ;跳转到13号中断的入口地址  
  5.         END  
  1. 编写中断初始化函数

中断初始化函数中将P3端口中的P3.7 I/O中断进行初始化,配置为下降沿触发,最低级0级的中断优先级,代码清单如下。

代码清单:中断初始化

  1. /***************************************************************************************** 
  2. 功能描述:P3端口中的P3.6 I/O中断初始化,下降沿触发,优先级:0     
  3. 参    数:无 
  4. 返 回 值:无 
  5. ******************************************************************************************/  
  6. void p3_int_init(void)  
  7. {  
  8.    P_SW2 |= 0x80;         //将EAXFR位置1,使能访问XFR(扩展RAM区特殊功能寄存器)  
  9.       
  10.    P3INTF &= ~0x80;       //将P3.7 I/O中断标志位清"0"  
  11.    P3INTE |= 0x80;        //使能P3.7的I/O中断  
  12.       
  13.    P3IM1 &= ~0x80;        //下降沿触发方式  
  14.    P3IM0 &= ~0x80;   
  15.       
  16.    PINIPH &= ~0x08;       //设置P3的中断优先级为0  
  17.    PINIPL &= ~0x08;      
  18.   
  19.    P_SW2 &= 0x7F;         //将EAXFR位置0,关闭访问XFR  
  20. }  
  1. 编写中断服务函数

本例中只使用了P3端口的P3.7的I/O中断,因此,中断服务函数里面只需判断P3.7的中断标志即可(P3INTF的位7)。另外,I/O中断的标志需要软件清零,这一点和外部中断不一样,外部中断硬件会自动清零。因此,中断服务函数中需要清零I/O中断标志(P3INTF),代码清单如下。

代码清单:中断服务函数

  1. /***************************************************************************************** 
  2. 功能描述:P3口中断服务函数,我们使用了P3端口中的P3.7,因此,中断服务函数中判断P3.7的中断标志即可(P3INTF的位7) 
  3. 参    数:无 
  4. 返 回 值:无 
  5. *****************************************************************************************/  
  6. void p3_isr (void) interrupt 13       
  7. {  
  8.    u8 psw2_st;  
  9.    u8 intf;  
  10.       
  11.    psw2_st = P_SW2;  
  12.    P_SW2 |= 0x80;          //将EAXFR位置1,以访问在XDATA区域的扩展SFR  
  13.    intf = P3INTF;  
  14.    if(intf)  
  15.    {  
  16.       P3INTF = 0x00;        //清零中断标志
  17.       if(intf & 0x80)       //P3.7中断 
  18.       {  
  19.          led_toggle(LED_1); //翻转用户指示灯D1  
  20.       }  
  21.    }  
  22.    P_SW2 = psw2_st;  
  23. }  
  1. 主函数

主函数中配置P3.7为准双向输入并开启上拉电阻,接着调用P3端口的I/O中断初始化函数p3_int_init ()完成P3.7的I/O中断初始化,之后开启总中断即可。

代码清单:主函数

  1. /***************************************************************************************** 
  2. 功能描述:主函数 
  3. 参    数:无 
  4. 返 回 值:int类型 
  5.  *****************************************************************************************/  
  6. int main(void)  
  7. {  
  8.    P2M1 &= 0xBF;   P2M0 &= 0xBF;     /配置P2.6为准双向口(指示灯D1)
  9.    P3M1 &= 0x7F;   P3M0 &= 0x7F;     //配置P3.7为准双向口(按键KEY1)
  10.       
  11.    p3_int_init();                    //初始化P3.7 I/O中断
  12.    EA = 1;                           //允许总中断
  13.    while(1)
  14.    {
  15.    }
  16. }
        1. 硬件连接

本实验需要使用LED指示灯D1和按键KEY1,因此需要用跳线帽短接复用引脚的指示灯(D1)和按键(KEY1)。

 

图8-:跳线帽短接

        1. 实验步骤
  1. 解压“…\第3部分:配套例程源码”目录下的压缩文件“实验2-5-1:I/O中断(使用一个端口的I/O中断)”,将解压后得到的文件夹拷贝到合适的目录,如“D\STC8”(这样做的目的是为了防止中文路径或者工程存放的路径过深导致打开工程出现问题)。
  2. 双击“…\gpio_int\project”目录下的工程文件“gpio_int.uvproj”。
  3. 点击编译按钮编译工程,编译成功后生成的HEX文件“gpio_int.hex”位于工程的“…\gpio_int\Project\Object”目录下。
  4. 打开STC-ISP软件下载程序,下载使用内部IRC时钟,IRC频率选择:24MHz。
  5. 程序运行后,按下按键KEY1触发I/O中断,中断服务函数中会翻转指示灯D1的状态(由亮变灭或由灭变亮),因此,可以观察到指示灯D1状态改变。
  • 注意事项:

因为按键存在抖动,因此一次按键可能会多次触发中断,即指示灯状态会翻转多次。

      1. 外部中断实验(使用多个端口的I/O中断)
  • 注:本节的实验是在“实验2-5-1:I/O中断(使用一个端口的I/O中断)”的基础上修改,本节对应的实验源码是:“实验2-5-2:I/O中断(使用多个端口的I/O中断)”。
        1. 实验内容

在“实验2-5-1:I/O中断(使用一个端口的I/O中断)”的基础上,增加P0.7(按键KEY3)的I/O中断,同样配置为下降沿中断,0级优先级。按下按键S5触发P4端口I/O中断,中断服务函数中翻转指示灯D2的状态(由亮变灭或由灭变亮)。

        1. 代码编写

本例中,主要的代码编写工作包含:跳转部分的汇编代码、P0.7的中断初始化和中断服务程序代码以及主函数中增加P0.7的配置。

  1. 编写跳转的汇编代码

本例中,我们使用了2个端口的I/O中断,因此,除了借用13号中断外,我们还借用了16号中断(外部中断4)。在STC8A8K64D4的数据手册中(《STC8A8K64D4系列单片机技术参考手册》第958页:中断列表)查到P0的I/O中断入口地址是“012BH”、外部中断4的中断入口地址是0083H,所以,编写中断跳转代码如下。

代码清单:汇编跳转代码

  1.         CSEG    AT 012BH     ;P0口中断入口地址,如果是其他端口,修改这个中断入口地址即可  
  2.         JMP     P0INT_ISR  
  3. P0INT_ISR:  
  4.         JMP     0083H        ;跳转到16号中断的入口地址  
  5.           
  6.         CSEG    AT 0143H     ;P3口中断入口地址,如果是其他端口,修改这个中断入口地址即可  
  7.         JMP     P3INT_ISR  
  8. P3INT_ISR:  
  9.         JMP     006BH        ;跳转到13号中断的入口地址
  10.         END  
  1. 编写中断初始化函数

中断初始化函数中将P0端口中的P0.7 I/O中断进行初始化,配置为下降沿触发,最低级0级的中断优先级,代码清单如下。

代码清单:中断初始化

  1. /***************************************************************************************** 
  2. 功能描述:P0端口中的P0.7 I/O中断初始化,下降沿触发,优先级:0     
  3. 参    数:无 
  4. 返 回 值:无 
  5. *****************************************************************************************/  
  6. void p0_int_init(void)  
  7. {  
  8.    P_SW2 |= 0x80;       //将EAXFR位置1,使能访问XFR(扩展RAM区特殊功能寄存器)  
  9.       
  10.    P0INTF &= ~0x80;     //将P0.7 I/O中断标志位清"0"  
  11.    P0INTE |= 0x80;      //使能P0.7的I/O中断  
  12.       
  13.    P0IM1 &= ~0x80;      //下降沿触发方式  
  14.    P0IM0 &= ~0x80;   
  15.       
  16.    PINIPH &= ~0x01;     //设置P0的中断优先级为0  
  17.    PINIPL &= ~0x01;      
  18.   
  19.    P_SW2 &= 0x7F;       //将EAXFR位置0,关闭访问XFR  
  20. }  

  1. 编写中断服务函数

本例中P0端口只使用了P0.7的I/O中断,因此,中断服务函数里面只需判断P0.7的中断标志即可(P0INTF的位7)。同样,中断服务函数中需要清零I/O中断标志(P0INTF),代码清单如下。

  1. /***************************************************************************************** 
  2. 功能描述:P0口中断服务函数,我们使用了P0端口中的P0.7,因此,中断服务函数中判断P0.7的中断标志即可(P0INTF的位7) 
  3. 参    数:无 
  4. 返 回 值:无 
  5. *****************************************************************************************/  
  6. void p0_isr (void) interrupt 16       
  7. {  
  8.    u8 psw2_st;  
  9.    u8 intf;  
  10.       
  11.    psw2_st = P_SW2;  
  12.    P_SW2 |= 0x80;          //将EAXFR位置1,以访问在XDATA区域的扩展SFR  
  13.    intf = P0INTF;  
  14.       
  15.    if(intf)  
  16.    {  
  17.       P0INTF = 0x00;        //清零I/O中断标志
  18.       if(intf & 0x80)       //P0.7中断  
  19.       {  
  20.          led_toggle(LED_2); //翻转用户指示灯D2  
  21.          delay_ms(100);  
  22.       }  
  23.    }  
  24.    P_SW2 = psw2_st;  
  25. }  

代码清单:中断服务函数

  1. /***************************************************************************************** 
  2. 功能描述:P4口中断服务函数,我们使用了P4端口中的P4.4,因此,中断服务函数中判断P4.4的中断标志即可
  3.        :(P4INTF的位4). P4口中断借用了中断16(外部中断4),因此,中断号用16
  4. 参    数:无 
  5. 返 回 值:无 
  6. *****************************************************************************************/  
  7. void p4_isr (void) interrupt 16 
  8. {  
  9.    u8 psw2_st;  
  10.    u8 intf;  
  11.       
  12.    psw2_st = P_SW2;  
  13.    P_SW2 |= 0x80;          //将EAXFR位置1,以访问在XDATA区域的扩展SFR  
  14.    intf = P4INTF;  
  15.    if(intf)  
  16.    {  
  17.       P4INTF = 0x00;        //清零中断标志
  18.       if(intf & 0x10)       //P4.4中断  
  19.       { 
  20.          led_toggle(LED_2); //翻转用户指示灯D2  
  21.        }  
  22.    }  
  23.    P_SW2 = psw2_st;   //将EAXFR位置0,关闭访问XFR  
  24. }  
  1. 主函数

主函数中增加配置P0.7为准双向输入以及调用P0端口的I/O中断初始化函数p0_int_init ()完成P0.7的I/O中断初始化的代码,之后开启总中断即可。

代码清单:主函数

  1. /************************************************************************** 
  2. 功能描述:主函数 
  3. 入口参数:无 
  4. 返 回 值:int类型 
  5. **************************************************************************/  
  6. int main(void)  
  7. {  
  8.    P2M1 &= 0x3F;   P2M0 &= 0x3F;     //设置P2.6~P2.7为准双向口(指示灯D1和D2)  
  9.    P3M1 &= 0x7F;   P3M0 &= 0x7F;     //配置P3.7为准双向口(按键KEY1)  
  10.    P0M1 &= 0x7F;   P0M0 &= 0x7F;     //配置P0.7为准双向口(按键KEY3)  
  11.       
  12.    p0_int_init();                //初始化P0.7 I/O中断  
  13.    p3_int_init();                //初始化P3.7 I/O中断  
  14.    EA = 1;                       //允许总中断  
  15.    while(1)  
  16.    {  
  17.    }  
  18. }  

        1. 硬件连接

本实验需要使用LED指示灯D1、D2和按键KEY1、KEY3,因此需要用跳线帽短接复用引脚的指示灯(D1和D2)和按键KEY1。按键KEY3是独立引脚,没有和其他电路复用引脚,是没有短接跳线帽的操作的。

 

图4:跳线帽短接

        1. 实验步骤
  1. 解压“…\第3部分:配套例程源码”目录下的压缩文件“实验2-5-2:I/O中断(使用多个端口的I/O中断)”,将解压后得到的文件夹拷贝到合适的目录,如“D\STC8”(这样做的目的是为了防止中文路径或者工程存放的路径过深导致打开工程出现问题)。
  2. 双击“…\multi_gpio_int\project”目录下的工程文件“multi_gpio_int.uvproj”。
  3. 点击编译按钮编译工程,编译成功后生成的HEX文件“multi_gpio_int.hex”位于工程的“…\multi_gpio_int\Project\Object”目录下。
  4. 打开STC-ISP软件下载程序,下载使用内部IRC时钟,IRC频率选择:24MHz。
  5. 程序运行后,按下按键KEY1触发P3.7的I/O中断,中断服务函数中翻转指示灯D1的状态(由亮变灭或由灭变亮),因此,可以观察到指示灯D1状态改变;按下按键KEY3触发P0.7的I/O中断,中断服务函数中翻转指示灯D2的状态(由亮变灭或由灭变亮),因此,可以观察到指示灯D2状态改变。
  • 注意事项:

因为按键存在抖动,因此一次按键可能会多次触发中断,即指示灯状态会翻转多次。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,以下是STC8A8K64D4单片机与JDY-31蓝牙模块进行通信的基本代码: ```c #include <STC8.H> #include <intrins.h> #define FOSC 24000000L //系统时钟频率 #define BAUD 9600 //串口波特率 #define MD0 P3_0 //定义STC8A8K64D4 P3.0引脚作为蓝牙模块的模式选择引脚 bit busy; //串口忙标志位 unsigned char RcvBuff; //串口接收缓冲区 void InitUART() //初始化串口 { SCON = 0x50; //8位数据,可变波特率 TMOD &= 0x0F; //清除原来的定时器设置 TMOD |= 0x20; //设定定时器1为8位自动重装方式 TH1 = TL1 = -(FOSC/12/32/BAUD);//设定波特率 TR1 = 1; //启动定时器1 ES = 1; //串口中断允许 EA = 1; //总中断允许 } void UART_SendByte(unsigned char dat) //串口发送一个字符 { while(busy); //等待前面的数据发送完成 busy = 1; SBUF = dat; //写数据到UART数据寄存器 } void main() { InitUART(); //初始化串口 while(1) { MD0 = 0; //将P3.0引脚置为低电平,使蓝牙模块进入AT指令模式 UART_SendByte('A'); //向蓝牙模块发送AT指令 MD0 = 1; //将P3.0引脚置为高电平,使蓝牙模块退出AT指令模式 } } void UART_Isr() interrupt 4 using 1 //串口中断服务程序 { if(RI) { RI = 0; RcvBuff = SBUF; } if(TI) { TI = 0; busy = 0; } } ``` 以上代码实现了串口初始化、发送一个字符的函数以及主函数中对蓝牙模块的AT指令操作。其中,P3.0引脚作为蓝牙模块的模式选择引脚,当该引脚为低电平时,蓝牙模块进入AT指令模式;当该引脚为高电平时,蓝牙模块退出AT指令模式。此外,还需要注意将STC8A8K64D4单片机的串口接口连接到JDY-31蓝牙模块的TX和RX引脚上。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

电子友人张

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值