精华内容
下载资源
问答
  • 串行口中断服务函数其他中断本质上是一样的,达到特定的条件,如何向CPU申请中断,进入中断服务函数; 我特意在郭天祥老师的书上找到了一句话:当数据被写入SBUF寄存器后,单片机自动开始从起始位发送数据,发送...

            串行口中断服务函数和其他中断本质上是一样的,达到特定的条件,向CPU申请中断,进入中断服务函数;

    我特意在郭天祥老师的书上找到了一句话:当数据被写入SBUF寄存器后,单片机自动开始从起始位发送数据,发送到停止位的开始时,由内部硬件将TI置1,向CPU申请中断,接下来可在中断服务程序中做相应处理,也可选择不进入中断。接收数据时 RI 同理。

             那么下面就有一个问题:串口中断是高电平触发还是上升沿触发?如果是高电平触发,多次响应时每次间隔时间是多久?

             先来引述我在书上看到的一段话:中断服务函数中查询TI 和 RI进行判别, 然后分别处理。因此,两个中断请求标志位均不能由硬件自动置位,必须通过软件清0,否则将出现一次请求多次响应的错误。此处的一次请求多次错误很明显是高电平触发的。

    展开全文
  • SBUF, TI/RI, ES

    2019-09-23 11:36:06
    这里来个小结,51单片机的一些关于串口通信的寄存器/锁存器。 首先放上一段代码,来自郭天祥的51单片机教程 功能是:向单片机发送一个字符(比如e),然后单片机返回字符串“ I get e”,串口通信。 #include...

    寒假过去一半了,这两天重新开始学习。这里来个小结,51单片机的一些关于串口通信的寄存器/锁存器。

     

    首先放上一段代码,来自郭天祥的51单片机教程

    功能是:向单片机发送一个字符(比如e),然后单片机返回字符串“ I get e”,串口通信。

    #include <reg52.h>
    #include <intrins.h>
    
    typedef unsigned char uchar;
    typedef unsigned int uint;
    uchar flag, a;
    uchar code table[]=" I get ";
    
    //串口初始化
    void Serial_Init()
    {
        TMOD = 0x20;    //设定T1定时器工作方式2
        TH1 = 0xfd;        //T1定时器装初值
        TL1 = 0xfd;        //T1定时器装初值
        TR1 = 1;        //启动T1定时器
        REN = 1;        //允许串口接收
        SM0 = 0;        //设定串口工作方式1
        SM1 = 1;        //同上
        EA = 1;            //开总中断
        ES = 1;            //开串口中断
    }
    void main()
    {
    
        Serial_Init();
    
        while(1)
        {
            if(flag)
            {
                uchar i;
                ES = 0;//先关闭串口中断防止干扰
                for(i=0; i<7; i++)
                {
                    SBUF = table[i];
                    while(!TI);//即等待发送完成,因为发送完成后TI由硬件置位
                    TI = 0;//清零以进行下一次发送
                }
                SBUF = a;//串行发送时,CPU向SBUF写入数据,sbuf的容量很大
                while(!TI);
                TI = 0;
    
                ES = 1;
                flag=0;
            }
        }
    }
    
    void ser() interrupt 4        //串口中断,接收,a相当于接收缓存
    {
        RI = 0;//接收完成后RI由硬件置1,中断里面清零以进行下一次接收
        a = SBUF;//串行接收时,CPU从SBUF读出数据
        flag = 1;
    }

     

     

    1.SBUF

    引用百科:

    全称:serial data buffer
    串行数据缓冲器
    串行口中有两个缓冲寄存器SBUF,一个是发送寄存器,一个是接收寄存器,在物理结构上是完全独立的。它们都是字节寻址的寄存器,字节地址均为99H。
    这个重叠的地址靠读/写指令区分:串行发送时,CPU向SBUF写入数据,此时99H表示发送SBUF;串行接收时,CPU从SBUF读出数据,此时99H表示接收SBUF。单片机串口程序参考。
     
        之前学习的时候对SBUF一知半解,只是抄了代码,看了效果。这两天重新学习后得到一些新的认识。
    首先是百科中提到的,串行口中有两个缓冲寄存器SBUF,一个是发送寄存器,一个是接收寄存器,在物理结构上是完全独立的。它们都是字节寻址的寄存器,字节地址均为99H。代码段中 SBUF=a 或者 SBUF = table[i] 都是CPU向SBUF写入数据,同时表示此时是发送状态, a=SBUF 是CPU从SBUF读出数据,同时表示此时是接收状态。也即0x99H这个重叠的地址靠读/写指令区分。
        另外SBUF的容量很大,至少可以放200字节数据(200个字符)
     
    2.TI/RI
     
    首先是Scon的百科
    SCON (Serial Port Control Register在51单片机中代表这是串口控制寄存器
    scon控制寄存器,它是一个可位寻址的专用寄存器,用于串行数据的通信控制,单元地址是98H,其结构格式如下:
     
    SCON SM0 SM1 SM2 REN TB8 RB8 TI RI
    位地址 9FH 9EH 8DH 9CH 9BH 9AH 99H 98H
    其中
    TI:发送中断标志位
    可寻址标志位。方式0时,发送完第8位数据后,由硬件置位,其它方式下,在发送或停止位之前由硬件置位,因此,TI=1表示帧发送结束,TI可由软件置0。
    RI:接收中断标志位
    可寻址标志位。接收完第8位数据后,该位由硬件置位,在其他工作方式下,该位由硬件置位,RI=1表示帧接收完成。
    注:在串口中断处理时,TI、RI都需要软件置0,硬件置位后不可能自动清0,此外,在进行缓冲区操作时,需要ES=0,以防止中断出现。
     
    代码中SBUF = table[i]  即发送后有 while(!TI)  即等待发送完成,因为发送完成后TI由硬件置位,然后 TI = 0  软件清零以进行下一次发送
    RI也是一样,进入中断是因为PC通过串口向单片机发送了信息,单片机接收完成后RI由硬件置1, RI = 0 由软件清零以进行下一次接收。
     
    3.ES
    参考这里,ES是中断允许寄存器IE的第5位(IE^4),表示串行口中断允许(ES=1充许,ES=0禁止)。代码中首先ES=0,关闭串口中断防止干扰,先把要发的数据放到SBUF,全部放完后再ES=1,使能串口中断。
     
    唔,如果昨晚效率高些就能早点总结完这个然后看can通信的代码了。。这里给自己小结下(其实是参考百科等资料把看懂的表达出来),对下一步有帮助。
     
    51和stm32各有长短,stm32给nrf24l01的配置比较麻烦。。
     
    嗯,新年快乐,马上快乐~
     
     

    转载于:https://www.cnblogs.com/Cmfvacks-IsLjj/p/3537274.html

    展开全文
  • 若用 while(TI==0)等待发送完成 当发送完成(TI=1)时,涉及 1)TI=1 跳出循环 while(TI==0) ; 2)TI=1 进入中断 两条指令的执行先后问题 一般认为 TI=1后的瞬间,先进行中断的调用过程,即,将TI清零; ...

    若用 while(TI==0)等待发送完成

    当发送完成(TI=1)时,涉及
    1)TI=1 跳出循环 while(TI==0) ;
    2)TI=1 进入中断
    两条指令的执行先后问题

    一般认为
    TI=1后的瞬间,先进行中断的调用过程,即,将TI清零;
    而 while 将永远读不到TI=1,形成死循环

    因此,新设置一个标志位 tx_flag,进入中断后置反,保证进入中断后返回while语句时能跳出。

    
    #include <stc12c5a.h>          
    #include <stdio.h>            
    
    
    typedef unsigned char uchar;
    typedef unsigned long ulint;
    
    
    sbit RING =P4^3;
    bit tx_flag;
    
    void delay(ulint k);
    void Serial_Init ();
    void Send_String(uchar *s);
    
    
    void delay (ulint k)    
    {
        while (k!=0)
        {k--;}
    }
    
    void Serial_Init()
    {
        SCON=0x50;      //SM0,SM1 = 0 1,REN = 1;
        BRT=0xFD;       //BRT = FD,bps = 9600 ;
        AUXR=0x11;      //BRTx12 = 0,12分频;S1BRS = 1, 选定BRT作为波特率发生器;
        PCON=0x00;      //SMOD = 0 ;
        EA=1;           // 总中断开启 ;
        ES=1;           // 串行中断开启 ;
    }
    
    void Uart_Is_Send () interrupt 4 using 1
    {
        if (TI)
            {
             TI=0;          
             tx_flag=0;
            }
        if (RI) 
        {
            RI=0;
        }                       
    }
    
    void Send_Char(uchar a)
    {
        tx_flag=1;                                                  
        SBUF=a;
        while(tx_flag==1);
    
    }
    
    void Send_String(uchar * s)
    {
        while (*s!='\0')
            {
                Send_Char(*s);
    
                s++;
            }
    }
    
    void main (void) {
    
    
        ulint  k=0;
        uchar s[40]="Hello World!\n";
    
    
        P4M1=0x00;
        P4M0=0x08;
        RING=0;
        Serial_Init();
        tx_flag=0;
        TI=0;
    
    
      while (1)
        {
        Send_String(s);
    
    
             k++;       
            if(k>0x300)
            {
    
            RING=1;
                delay(0xffff);
            RING=0;
                delay(0x1ffff);
                k=0;
            }
        }
    
    }
    
    展开全文
  • 哭求指点:中断实现串口异步通信--RI为何始终为0,并且接收不到数据?RI为何始终为0,并且接收不到数据?recv_buf[]始终不变,借不到数??请明白人指点,我快疯了!!!//////////////////////////////////////////...

    哭求指点:中断实现串口异步通信--RI为何始终为0,并且接收不到数据?

    RI为何始终为0,并且接收不到数据?recv_buf[]始终不变,借不到数??请明白人指点,我快疯了!!!

    void serial_int() interrupt 4 using 2 // 串口中断,使用工作组2

    {

    if(TI == 1) // 发送中断

    {

    TI = 0; // 清发送标志位

    if(count_s < __MAX_LEN_) // 数据未发送完毕

    {

    SBUF = send_buf[count_s]; // 发送数据

    count_s++; // 发送计数增1

    }

    }

    if(RI == 1) // 接受中断

    {

    if(count_r > __MAX_LEN_) // 接收缓冲区已满,忽略已接收数据

    {

    RI = 0; //@@@@@

    return;

    }

    recv_buf[count_r] = SBUF; // 接受数据

    count_r++; // 接收计数增1

    RI = 0; // 清接收标志位

    }

    }

    展开全文
  • 串口通信助手接收到字符串之后显示并由用户反馈回去一个长度为4的字符串并显示到数码管上来看一下效果首先是串口通信电路的配置借助VSPD、串口通信助手对相关串口的设置通过VSPD创建两个可以相互通信的虚拟串口,...
  • 51单片机串口通信

    2021-01-06 04:54:53
    使用串口通信,需要对SCON、PCONTMOD三个特殊寄存器进行配置。 SCON 串口工作方式寄存器SCON(98H)的结构如下表所示: SCON 位 7 6 5 4 3 2 1 0 意义 SM0 SM1 SM2 REN TB8 RB8 TI RI SM2:多机通信控制...
  • 串口; 发送器; 异步串口; 异步串行接口; SBUF 发送缓冲器; 串行数据缓冲器; 接收缓冲器; 缓冲寄存器; 数据缓冲器; ==================================================== 中断允许寄存器IE(地址为A8H,可位...
  • 单片机串口通信

    2019-11-12 18:03:21
    通常的USB串行通信方式为全双工,即两条数据线:RXDTXD,一条用于发送数据,一条用于接收数据。 在串行通信前,需要对串行通信进行配置。 对于单片机: RI为接受中断标志位,未通信时RI=0;当电脑发送第一个字节帧...
  • 单片机之串口通信

    2021-01-19 18:37:34
    串口通信是单片机一个重要的部分,单片机PC,单片机单片机之间的通信大都用串口。单片机的串口是全双工异步串口通信方式。通过TXD(P3.1)发送,RXD(P3.0)引脚接收输入。串口传送数据是一帧一帧发送的,它有四种...
  • 单片机C51 - 串行通信原理及串口编程实验

    千次阅读 多人点赞 2016-09-07 10:42:00
    一、两种通信方式概念 1.并行通信 传输原理:并行通信时数据的各个位同时传送,以字节为单位并行传输优点:并行通信速度快,传输的数据宽度可以是1~128位...优点:串行通信传输线少,占用引脚资源少,成本低,适合远
  • 单片机串口通信原理控制程序

    千次阅读 2017-06-17 16:35:15
    在实际应用中,往往串口还要电脑上的上位机软件进行交互,实现电脑软件发送不同的指令,单片机对应执行不同操作的功能,这就要求我们组织一个比较合理的通信机制逻辑关系,用来实现我们想要的结果。 本节所...
  • 串口通讯

    2020-03-28 20:41:33
    单片机与外部设备交换信息时,通常采用串行通讯和并行通讯
  • 1.13.2.什么是串行通信 1.13.3.51单片机的串行通信 1.13.4.STC51的串行通信相关寄存器1 1.13.5.STC51的串行通信相关寄存器2 1.13.6.STC51的串行通信实战1 1.13.7.STC51的串行通信实战2 1.13.8.STC51的串行通信...
  • 串口通信的使用

    2016-08-13 19:58:44
    通信有并行通信和串行通信两种方式。在多微机系统以及现代测控系统中信息的交换多采用串行通信方式。 一、并行通信 1.定义 并行通信是将数据字节的各位用多条数据线同时进行传送。 2.特点 优点:控制简单、...
  • 初学串口通信

    2020-03-22 18:31:32
    串口通讯(Serial Communication),是指外设计算机间,通过数据信号线、地线等,按位进行传输数据的一种通讯方式。 串口是一种接口标准,它规定了接口的电气标准,没有规定接口插件电缆以及使用的协议。 串行接口是...
  • 13.5 串口通信机制实用的串口例程 程序的功能是,通过电脑串口调试助手下发三个不同的命令, 第一条指令:buzz on 可以让蜂鸣器响; 第二条指令:buzz off 可以让蜂鸣器不响; 第三条指令:showstr ,这个命令...
  • 单片机控制串口通信

    千次阅读 2015-12-17 17:04:36
    串口通信的内容比较重要,大家一定要掌握,...通信是机器与机器之间数据交换的桥梁,按数据发送方式分为串口通信并口通信也可以叫串行通信和并行通信。 串行通信串口通信是指外设计算机间,通过数据信号线 、
  • 单片机: EEPROM和串口通信

    千次阅读 2015-12-22 20:18:07
    名称:IIC协议 EEPROM24c02 通过串口通信存数读取数据  内容:此程序用于检测EEPROM性能,测试方法如下:写入24c02一个数据,然后在内存中改变这些数据, 掉电后主内存将失去这些信息,然后从24c02中调入这些...
  • 串口通信

    2019-12-21 23:01:21
    在51内部有一个全双工串行通信接口。SBUF位串行口数据缓冲寄存器,包括接收发送缓冲寄存器,其中接收缓冲寄存器只能读取不能写入,发送缓冲寄存器只能写入不能读取,它们的地址99H。 接收发送缓冲寄存器在...
  • 单片机串行通信

    2020-08-07 12:11:42
    文章目录串行通信串行口控制器内部结构串行口控制寄存器工作方式0工作方式 1工作方式2工作方式 3 串行通信 计算机与外部设备的通信方式有两种,一是并通信、二是串行通信串行通信有:单工、半双工(常用)、全...
  • 串口通信和RS485

    万次阅读 2018-01-16 09:58:32
    (3)计算机计算机之间的通信? 1.2 通信的关键 (1)事先约定。 (2)基本信息单元。 (3)有效信息的编码、传输解码。 1.3 通信的专业性概念 (1)同步异步。 (2)单工、半双工、全双工。
  • 串行通信

    2017-12-10 18:47:03
    串行通信是将数据字节分成一位一位的形式在一条传输线上逐个地传送。控制寄存器两个:特殊功能寄存器SCONPCON。通过对串行口控制寄存器SCON电源控制寄存器PCON的编程,可以控制串行口的工作方式波特率。 TI—...
  • 文章目录前言单片机串口通信原理控制程序最后 前言 不少同学选择单片机项目作为自己的毕业设计,比较适合自动化、通信、电器、还有物联网的同学; 由于较多同学向学长询问咨询单片机项目问题,学长单独开一...
  • UART串口通信

    2021-04-08 20:23:55
    SCON 串口控制寄存器 位 7 6 5 4 3 2 1 0 符号 SM0 SM1 SM2 REN 允许接收 TB 校验 RB 校验 TI 发送中断 硬件...
  • 串行通信实验

    2012-01-31 22:14:22
    串行口方式0的数据传送可采用中断方式,也可采用查询方式,无论哪种方式,都要借助于TIRI标志。串行发送时,能靠TI置位(发完一帧数据后)引起中断申请,在中断服务程序中发送下一帧数据,或者通过查询TI的状态,...
  • 51单片机之串口通信详解

    千次阅读 2020-10-05 19:36:02
    串口通信一、串口通信概念1、串口通信的作用2...串口通信基本通信方式有两种:并行通信和串行通信串行通信:传送数据的各位按顺序一位一位发送或者接收 并行通信:传送数据各位同时发送或接收 3、串口通信方式 ...
  • 我们首先用串口调试助手进行串口通讯,再使用c语言编程进行通讯。 windows上的串口调试助手我使用的是安信可串口调试助手 http://wiki.ai-thinker.com/tools 在单片机中写好串口通讯的代码,在串口调试助手中对应...

空空如也

空空如也

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

串口通信ti和ri