精华内容
下载资源
问答
  • 串口通讯(Serial Communication)是一种设备间非常常用的串行通讯方式。 异步通讯中没有时钟信号,只有起始位,数据位,奇偶校验位,停止位。 异步通讯中我们使用了USART(通用同步异步收发器)。 TX:发送数据输出...

    串口通讯(Serial Communication)是一种设备间非常常用的串行通讯方式。
    异步通讯中没有时钟信号,只有起始位,数据位,奇偶校验位,停止位。
    异步通讯中我们使用了USART(通用同步异步收发器)。
    TX:发送数据输出引脚。
    RX:接收数据输入引脚。
    目的:在串口调试助手上显示文字。
    需要进行一系列配置和初始化,并且重定向printf函数中的fputc。
    GPIO初始化:

    void init_uart_gpio(void)
    {
     GPIO_InitTypeDef GPIO_InitStructure;
     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
     //  USART Tx  GPIO 
     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
     GPIO_Init(GPIOA, &GPIO_InitStructure);
     
     //  USART Rx  GPIO 
     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
     GPIO_Init(GPIOA, &GPIO_InitStructure);
    }
    

    初始化串口配置:

    void init_uart1(void)
    
        {
         USART_InitTypeDef USART_InitStructure;
         USART_InitStructure.USART_BaudRate = 115200;
         USART_InitStructure.USART_WordLength = USART_WordLength_8b;
         USART_InitStructure.USART_StopBits = USART_StopBits_1;
         USART_InitStructure.USART_Parity = USART_Parity_No ;
         USART_InitStructure.USART_HardwareFlowControl =USART_HardwareFlowControl_None;
         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
         USART_Init(USART1, &USART_InitStructure);
        }
    

    初始化串口中断(使串口接收中断,打开工作时钟)

    void init_uart_it(void)
    {
    	 USART_Cmd(USART1, ENABLE);
    	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
    }
    

    初始化总中断:

    void init_uart_nvic(void)
    {
     NVIC_InitTypeDef NVIC_InitStructure;
    
     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
     
     NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
    
     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    
     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    
     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    
     NVIC_Init(&NVIC_InitStructure);
    	
    }
    

    重定向fputc:

    void Usart_SendByte( USART_TypeDef * pUSARTx, uint8_t ch)
    {
     USART_SendData(pUSARTx,ch);
     
     while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);
    }
    
    int fputc(int ch, FILE *f)
    {
    	Usart_SendByte(USART1,ch);
    	return ch;
    }
    

    需配置在禁主机模式下:

    #pragma import(__use_no_semihosting)  //
    void _sys_exit(int  x) 
    {
    x = x;
    }
    struct __FILE  //
    {
    int handle;
    

    最后是主函数:

    void delay()
    {
    	int i,j;
    	for(i=0;i<100;i++){
    		for(j=0;j<100;j++){
    		}
    	}
    }
    int main()
    {
    	init_uart();
    	while(1){
    	delay();
    	printf("chanhhbin\n");
    	}
    }
    

    在串口助手处打开所对应串口,即可接收到所打印的字符串。

    展开全文
  • 89c51中断入口地址

    2019-10-05 15:35:57
    中断源 中断入口地址 外部中断0 0003H 定时器/计数器T0 000BH 外部中断1 0013H 定时器/计数器T1 001BH 串行口中断 0023H 转载于:https://www.cnblogs.com/lzh-Linux/p/4008315.html...

    中断源        中断入口地址

    外部中断0       0003H

    定时器/计数器T0   000BH

    外部中断1       0013H

    定时器/计数器T1   001BH

    串行口中断        0023H

    转载于:https://www.cnblogs.com/lzh-Linux/p/4008315.html

    展开全文
  • 在第一篇到第九篇博文中,我们认识到了一些基于IO输入与输出的基础电子器件使用: 《8051单片机实战分析(以STC89C52RC为例) | 01 - 点亮一个LED》 《8051单片机实战分析(以STC89C52RC为例) | 02 - LED延时约5s...

    在第一篇到第九篇博文中,我们认识到了一些基于IO口输入与输出的基础电子器件使用:
    8051单片机实战分析(以STC89C52RC为例) | 01 - 点亮一个LED
    8051单片机实战分析(以STC89C52RC为例) | 02 - LED延时约5s闪烁
    8051单片机实战分析(以STC89C52RC为例) | 03 - LED流水灯
    8051单片机实战分析(以STC89C52RC为例) | 04 - 蜂鸣器驱动
    8051单片机实战分析(以STC89C52RC为例) | 05 - 静态数码管驱动
    8051单片机实战分析(以STC89C52RC为例) | 06 - 动态数码管驱动
    8051单片机实战分析(以STC89C52RC为例) | 07 - 独立按键驱动
    8051单片机实战分析(以STC89C52RC为例) | 08 - 矩阵按键驱动
    8051单片机实战分析(以STC89C52RC为例) | 09 - LED点阵显示数字
    但现在我们要开始回到8051单片机内部,通过实战来认识它们的工作原理,你会发现通过它们可以去开发一些更有意思的东西!

    这篇博文带领大家认识一下STC89C52RC单片机定时器中断的使用。

    如果你不了解什么是中断,建议你先看这篇:
    STC89C52RC单片机额外篇 | 01 - 认识中断、中断源以及中断优先级

    如果你不了解什么是串口通信,建议你先看这篇:
    STC89C52RC单片机额外篇 | 02 - 认识串行通信、波特率以及数据包

    1 中断系统结构

    以下这张图是从中断引脚到中断入口所经过的通道:

    从图中不难看出RXTX引脚经过了SCON、IE、IP这些寄存器,因此我们在写程序时得把这些寄存器功能配置好,CPU才会按照我们的想法只执行!下面分别对这些寄存器进行介绍(稍微了解一下即可,忘记的时候再查)。

    1.1 SCON寄存器

    SCON(Serial Control Register),中文叫串行口控制寄存器,SCON寄存器是用于控制串行通信的方式选择、接收和发送,指示串口的状态。

    首先介绍SCON寄存器位SM0/SM1,它们用于设置工作方式:

    其余SCON寄存器位的用途:

    SCON寄存器位 作用
    SM2 多机通信控制位。多机通信是工作于方式2和方式3,SM2位主要用于方式2和方式3。接收状态,当串行口工作于方式2或3,以及SM2=1时,只有当接收到第9位数据(RB8)为1时,才把接收到的前8位数据送入SBUF,且置位RI发出中断申请,否则会将接收到的数据放弃。当SM2=0时,就不管第9位数据是0还是1,都会将数据送入SBUF,并发出中断申请。工作于方式0时,SM2必须为0。
    REN 允许接收位。REN用于控制数据接收的允许和禁止,REN=1时,允许接收,REN=0时,禁止接收。
    TB8 发送数据位8。在方式2和方式3中,TB8是要发送的——即第9位数据位。在多机通信中同样亦要传输这一位,并且它代表传输的地址还是数据,TB8=0为数据,TB8=1时为地址。
    RB8 接收数据位8。在方式2和方式3中,RB8存放接收到的第9位数据,用以识别接收到的数据特征。
    TI 发送中断标志位,它是可寻址标志位。方式0时,发送完第8位数据后,由硬件置位,其它方式下,在发送或停止位之前由硬件置位,因此,TI=1表示帧发送结束,TI可由软件清“0”。
    RI 接收中断标志位,它是可寻址标志位。接收完第8位数据后,该位由硬件置位,在其他工作方式下,该位由硬件置位,RI=1表示帧接收完成。

    要注意的是在串口中断处理时,TI,RI都需要软件清"0",硬件置位后不可能自动清0,此外,在进行缓冲区操作时,需要ES=0,以防止中断出现。ES寄存器位位于接下来介绍的IE寄存器。

    1.2 IE寄存器

    IE(Interrupt Enable),中文叫中断允许寄存器,它的作用是控制所有中断源的开放或禁止,以及每个中断源是否被允许。

    各寄存器位的作用如下:

    IE寄存器位 作用
    EA EA = 0时,所有中断禁止(即不产生中断);EA = 1时,各中断的产生由个别的允许位决定
    ES 串行口RX/TX中断允许
    ET1 定时器T1中断允许
    EX1 外中断INT1中断允许
    ET0 定时器T0中断允许
    EX0 外部中断INT0中断允许

    1.3 IP寄存器

    IP(Interrupt Priority),中文叫中断优先级寄存器,它是用来设定各个中断源属于两级中断中的哪一级。

    各寄存器位的作用如下:

    IP寄存器位 作用
    PS 串行口RX/TX中断优先
    PT1 定时器T1中断优先
    PX1 外中断INT1中断优先
    PT0 定时器T0中断优先
    PX0 外部中断INT0中断优先

    除此之外,还有一个波特率有关的PCON寄存器,当然这里只用到它其中的一位。

    1.4 PCON寄存器

    PCON全称Power Control Register,即功率控制寄存器

    系统复位默认为SMOD=0。当SMOD=0时,串口方式1,2,3时,波特率正常;当SMOD=1时,串口方式1,2,3时,波特率加倍。

    2 串行口结构

    注意这里的SBUF寄存器只是逻辑上同名,但是它们物理上是分开的!另外,还需要用到TH1TL1这种属于定时器T1的寄存器,后面会了解到它们的作用!

    下面列出各个工作方式的数据传输:

    ① 工作方式0:

    ② 工作方式1:

    ③ 工作方式2与工作方式3:

    3 波特率计算

    如果你不了解什么是波特率,建议你先看这篇:
    STC89C52RC单片机额外篇 | 02 - 认识串行通信、波特率以及数据包

    下面列出基于各个工作方式的波特率计算公式,对于可变波特率的设置需要用到TH1寄存器:

    当然,对于波特率,一般有几种是可供选择的,因为我们通常使用标称值:

    这里我们好奇为什么晶振频率选择11.0592MHz就能减小计算误差,下面我们以9600波特率,分别代入11.0592MHz与12MHz计算一下:

    我们设置定时器T1为工作模式2,SMOD 设为1,分别看看那所要求的TH1为何值。代入公式:

    • 11.0592MHz

              9600=(2÷32)×((11.0592M/12)/(256-TH1)) 
              =》TH1=250 
      
    • 12MHz

              9600=(2÷32)×((12M/12)/(256-TH1)) 
              =》TH1≈249.49 
      

    4 代码

    ① 中断服务函数:

    我们知道我们编写的C程序,函数的执行是从main主函数开始执行,现在有了中断,自然就产生一个中断服务函数:

    从图中我们可以知道单片机在发生中断的时候,程序的执行过程会从主程序A跳到中断服务程序B,在执行完中断服务程序B后,会返回到之前主程序A被中断打断处继续执行程序。

    那么我们如何指定中断服务程序?具体参考以下模板(对于函数名你可以随便写,当然最好贴近有意义的命名)。

    外部中断0的中断服务函数:

    void Int0()	interrupt 0
    {
    	... // 中断服务程序中要执行内容
    }
    

    定时器0的中断服务函数:

    void Timer0()	interrupt 1
    {
    	... // 中断服务程序中要执行内容
    }
    

    外部中断1的中断服务函数:

    void Int1()	interrupt 2
    {
    	... // 中断服务程序中要执行内容
    }
    

    定时器1的中断服务函数:

    void Timer1()	interrupt 3
    {
    	... // 中断服务程序中要执行内容
    }
    

    串行口的中断服务函数:

    void Serial()	interrupt 4
    {
    	... // 中断服务程序中要执行内容
    }
    

    ② 下面我们写个程序,将波特率设置为4800,把发送的数据字符"1"显示到串口调试助手SSCOM:

    #include "reg52.h"			 //此文件中定义了单片机的一些特殊功能寄存器
    
    typedef unsigned int u16;	  //对数据类型进行声明定义
    typedef unsigned char u8;
    
    /*******************************************************************************
    * 函数名         :UartInit()
    * 函数功能		 :设置串口
    * 输入           : 无
    * 输出         	 : 无
    *******************************************************************************/
    void UartInit()
    {
    	SCON=0x50;			//设置为工作方式1
    	TMOD=0x20;			//设置计数器工作方式2
    	PCON=0x80;			//波特率加倍
    	TH1=0xF3;			//计数器初始值设置,注意波特率是4800
    	TL1=0xF3;
    	ES=1;				//打开接收中断
    	EA=1;				//打开总中断
    	TR1=1;				//打开计数器
    }
    
    /*******************************************************************************
    * 函 数 名       : main
    * 函数功能		 : 主函数
    * 输    入       : 无
    * 输    出    	 : 无
    *******************************************************************************/
    void main()
    {	
    	UartInit();  //	串口初始化
    	while(1);		
    }
    
    /*******************************************************************************
     * 函数名         : Serial() interrupt 4
     * 函数功能		 : 串口通信中断函数
     * 输入           : 无
     * 输出          : 无
    *******************************************************************************/
    void Serial() interrupt 4
    {
    	u8 receiveData;
    
    	receiveData=SBUF; //出去接收到的数据
    	RI = 0;			  //清除接收中断标志位
    	SBUF=receiveData; //将接收到的数据放入到发送寄存器
    	while(!TI);		  //等待发送数据完成
    	TI=0;			  //清除发送完成标志位
    }
    

    简要分析:

    • 代码中设置波特率为4800,根据前面的表格不是应该设置TH1=0xFA;吗?根据前面的介绍,我们不难发现此处用到晶振频率肯定不是11.0592MHz,明显是使用12MHz。
    • 注意这里把定时器T1设置为工作方式2——8 位自动重装模式,因此寄存器TH1TL0的值是一样的。
    • 最后附上串口调试助手的操作:
    展开全文
  • 串行口中断入口地址 LJMP INT_T0 ORG 0030H MAIN:MOV SCON,#50H ;串行口工作方式1 MOV PCON,#00H ; SMOD置0 MOV TMOD,#20H ;定时计数器工作方式2 MOV TH1,#0FDH ;设置溢出率初值 MOV TL1,#0FDH

    编写一个发送程序:采用串口工作方式1将8051单片机P1口采集的8位数据实时串行传输。无需奇偶校验,采用中断方式。波特率为9600波特(晶振频率为11.0592MHz)。

    ORG 0000H
    LJMP MAIN
    ORG 0023H ;串行口中断入口地址
    LJMP INT_TI
    ORG 0030H
    
    MAIN:MOV SCON,#40H ;串行口工作方式1,REN发送时取0,接收时取1
    MOV PCON,#00H ;SMOD置0
    MOV TMOD,#20H ;定时计数器工作方式2
    MOV TH1,#0FDH ;设置溢出率初值
    MOV TL1,#0FDH
    SETB TR1 ;TCON按位寻址,打开定时计数器
    MOV IE,#90H ;开启中断使能
    MOV RO,#90H ;P1口首地址
    MOV R2,#08H ;计数
    LCALL SEND
    SJMP $
    
    INT_TI:CLR TI ;串行接口控制器发送中断标志
    INC R0 ;地址加1
    DJNZ R2,CONT
    CLR ES;关闭中断
    
    JIESHU: RETI
    
    CONT:LCALL SEND ;调用中断传输子程序
    SJMP JIESHU ;传输完成后结束程序
    
    SEND:MOV A,@R0 ;读入P1口采集的数据
    MOV SBUF,A ;串行口发送数据
    RET	
    END
    

    编写一个接收程序:8051单片机采用串口工作方式1接收8位串行数据,由P1口输出。无需奇偶校验,采用中断方式。波特率为9600波特(晶振频率为11.0592MHz)。

    ORG 0000H
    LJMP MAIN
    ORG 0023H ;串行口中断入口地址
    LJMP INT_RI
    ORG 0030H
    
    MAIN:MOV SCON,#50H ;串行口工作方式1
    MOV PCON,#00H ;SMOD置0
    MOV TMOD,#20H ;定时计数器工作方式2
    MOV TH1,#0FDH ;设置溢出率初值
    MOV TL1,#0FDH
    SETB TR1 ;打开定时计数器
    MOV IE,#90H ;
    MOV RO,#90H ;P1口首地址
    MOV R2,#08H ;计数
    SJMP $
    
    INT_RI:CLR RI ;串行接口控制器接收中断标志
    MOV A,SBUF ;串行口接收数据
    INC R0 ;地址加1
    DJNZ R2,JIESHOU
    
    JIESHOU:MOV @R0,A;串行口接收数据放入P1 
    DJNZ,R2,ERR
    CLR ES	
    
    ERR: RETI
    END
    

    如果需要加上奇偶校验,只需奇偶校验位TB8取1,并在中断服务子程序中添上:

    INT_RI:MOV A,SBUF ;以接收数据结束为例
    MOV C,P
    JC LP0
    JB RB8,ERR ;RB8奇偶校验标志位
    SJMP JIESHOU
    
    LP0:JNB RB8,ERR
    
    展开全文
  • (2) 0003H——外部中断 0 的中断服务子程序入口地址。 (3) 000BH——定时/计数器 0 的中断服务子程序入口地址。 (4) 0013H——外部中断 1 的中断服务子程序入口地址。 (5) 001BH——定时/计数器 1 的中断服务子程序...
  • 51单片机串行口的使用与串行通信串行通信:俩个概念:RS232接口标准:串行口的使用:串行口的结构:串行口相关寄存器:串行口的工作方式:方式0:同步移位寄存器方式利用方式0扩展并行I/O口:方式1:8位异步通信方式...
  • 单片机--串行口实验

    千次阅读 2019-11-30 16:10:40
    目的:利用“模块化单片机教学实验平台”,加深对单片机的串行口的理解。 任务:利用单片机的串行口完成程序设计。 实验内容 使用AT89S52单片机的串行口通过RS232通信接口与PC机进行通信,让单片机把接收到的每一...
  • 51单片机学习 串行口通信实验
  • 中断源--入口地址

    千次阅读 2004-11-17 08:30:00
    中断源 入口地址 EICE51INT0 0003H 800xHT0 000BHINT1 0013HT1 
  • 串行口扩展并行输出口 一、实验目的 二、实验内容 三、实验步骤 四、C代码如下 五、实验结果 六、实验体会 一、实验目的 掌握AT89C52串行口方式0的工作方式和编程 掌握利用串行口和移位寄存器扩展并行...
  • 十五路遥控接收板,汇编语言编程的 ORG 0000H ;程序开始地址 ...串行口中断入口地址 RETI ;中断返回(不开中断) ORG 002BH ;定时器T2中断入口地址 RETI ;中断返回(不开中断) ;
  • 外接一个同步移位寄存器 74LS165芯片,拓展一个 8 位 并行输入端口的电路, 可将接在74LS165芯片的8个开关 S0——S7 的状态 通过 串行口方式 0 读到 单片机内。 SH/LD : (一) 控制端 低电平: 74LS165芯片可以...
  • 甲乙传输数据

    2021-06-10 15:50:59
    ;甲 ORG 0000H ...串行口中断入口地址 LJMP SINT ORG 0030H MAIN: MOV TMOD,#20H;工作方式寄存器TMOD89H设置波特率 MOV TL1,0F4H MOV TH1,0F4H;方式二自动重载 SETB TR1;TCON定时器/计数器控...
  • 中断向量地址一览表

    2019-10-06 13:38:52
    中断向量地址一览表 一.8088中断向量 0-3 4-7 8-B C-F 10-13 14-17 18-1F 0 1 2 3 4 5 6,7 除以零 单步(用于DEBUG) 非屏蔽中断 断点指令 溢出 打印屏幕 保留 二.8259...
  • ARM中断返回地址详细分析

    千次阅读 2016-09-07 09:25:33
    ARM中断返回地址详细分析 在ARM体系中,通常有以下3种方式控制程序的执行流程: 1、在正常执行过程中,每执行一条ARM指令,程序计数器PC的值加4个字节;每执行一条Thumb指令,程序计数器PC加2个字节。整个过程是...
  • 接收采用中断方式。 发送的查询模式,要查询两个东西,一个是键盘缓冲区,一个是通信线状态寄存器。当键盘缓冲区有内容,读取出键盘缓冲区ASCII码,然后等待通讯线状态寄存器的D5位为1,即可将数据发送到发送保持...
  • 51单片机之中断系统

    2020-06-20 15:55:54
    51单片机之中断系统中断系统四种中断类型:外部中断:定时器/计数器T0、T1中断:串行口中断:定时器/计数器T2中断:中断入口:与中断相关的特殊功能寄存器:中断优先级:中断响应时间中断优先级及中断嵌套规则: ...
  • 51定时/中断

    2013-10-18 00:31:00
    外部中断0(INT0),对应中断号是0, 中断入口地址0003H 定时/计数器0(T1),对应中断号1 ,中断入口地址000BH 外部中断1(INT1),中断号2 入口地址0013H 定时/计数器1(T1)中断号3 入口地址001BH 串行口中(RI/TI)...
  • 中断向量地址 总览表

    2011-07-25 10:59:00
    80x86中断向量 I/O地址 中断类型(中断号) 功能 0~3 0 除法溢出中断 4~7 1 单步 8~B 2 非屏蔽中断(NMI) C~F 3 断点中断 10~13 4 溢出中断 14~17 5 打印屏幕 18~1F 6、7 保留 8259中断向量 20~23 8 定时器(IRQ0) 24~27...
  • 中断

    2017-04-02 22:58:27
    有5个固定的中断源,其中3个在片内,2个在片外,它们在程序存储器ROM中都分别有各自固定的中断入口地址,由此进入中断服务程序(ISR);这5个固定的中断源都分别有两级中断优先级:高优先级和低优先级;可形成中断嵌套;有2个...
  • 中断

    千次阅读 2012-01-29 23:09:25
    中断号 常见的中断号如下,不同型号的单片机可能会扩展一些。 要根据相应IC的规格书确定。 不过使用方法简单,只要掌握了使用其中任何一个中断号,就掌握了。...中断号3:定时/计数器1(T1),中断入口地址001BH
  • C51 interrupt 中断

    2021-04-01 19:07:40
    1、中断源与标记位 ----引起CPU中断的根源叫做中断源,中断源向CPU的请求,叫做中断请求,51单片机有5个中断源 符号 产生条件 ...外部中断0,中断请求信号...串行口中断,串行口完成一帧数据发送/接收后引起 ...
  • 单片机中断的过程

    千次阅读 2019-02-18 10:19:46
    4.清除相应的中断请求标志位(串行口中断请求标志RI和TI除外); 5.把被响应的中断源所对应的中断服务程序的入口地址(中断矢量)送入PC, 从而转入相应的中断服务程序。 6.中断返回,程序返回断点处继续执行。  ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,232
精华内容 1,292
关键字:

串行口中断的入口地址