zoukankan      html  css  js  c++  java
  • TI and RI

    https://blog.csdn.net/qq_27977257/article/details/70677661

    51单片机的串口,是个全双工的串口,发送数据的同时,还可以接收数据。
    当串行发送完毕后,将在标志位 TI 置 1,同样,当收到了数据后,也会在 RI 置 1。
    无论 RI 或 TI 出现了 1,只要串口中断处于开放状态,单片机都会进入串口中断处理程序。
    在中断程序中,要区分出来究竟是发送引起的中断,还是接收引起的中断,然后分别进行处理。

    接收数据时,使用“中断方式”,清除 RI 后,用一个变量通知主函数,收到新数据。
    发送数据时,也用“中断方式”,清除 TI 后,用另一个变量通知主函数,数据发送完毕。
    这样一来,收、发两者基本一致,编写程序也很规范、易懂。
    更重要的是,主函数中,不用在那儿死等发送完毕,可以有更多的时间查看其它的标志。

    1.

    #include <reg52.h>

    //#define uchar unsigned char

    //uchar receive;

    void main(void)
    {
    EA = 1; //允许总中断(如不使用中断,可用//屏蔽)
    ES = 1; //允许UART串口的中断

    TMOD = 0x20; //定时器T/C1工作方式2
    SCON = 0x50; //串口工作方式1,允许串口接收(SCON = 0x40 时禁止串口接收)
    TH1 = 0xF3; //定时器初值高8位设置 //12MHZ晶振,波特率为4800 0xf3
    TL1 = 0xF3; //定时器初值低8位设置 //11.0592MHZ晶振,波特率为4800 0xf4 9600 0xfa 19200 0xfd
    PCON = 0x80; //波特率倍频(屏蔽本句波特率为2400)
    TR1 = 1; //定时器启动

    while(1);

    }

    void tranData() interrupt 4
    {
    SBUF='1';
    while(TI==0);
    TI=0;
    RI=0;      // 将此句注释掉,查看效果.

    }

     2. 键盘输入

    #include <reg52.h>

    #define uchar unsigned char

    uchar uc;

    void main(void)
    {
    EA = 1; //允许总中断(如不使用中断,可用//屏蔽)
    ES = 1; //允许UART串口的中断

    TMOD = 0x20; //定时器T/C1工作方式2
    SCON = 0x50; //串口工作方式1,允许串口接收(SCON = 0x40 时禁止串口接收)
    TH1 = 0xF3; //定时器初值高8位设置 //12MHZ晶振,波特率为4800 0xf3
    TL1 = 0xF3; //定时器初值低8位设置 //11.0592MHZ晶振,波特率为4800 0xf4 9600 0xfa 19200 0xfd
    PCON = 0x80; //波特率倍频(屏蔽本句波特率为2400)
    TR1 = 1; //定时器启动

    while(1);

    }

    void tranData() interrupt 4
    {
    uc=SBUF;

    SBUF=uc;
    while(TI==0);
    TI=0;
    RI=0;

    }

    3.  

     1 #include <reg52.h>
     2 #define uchar unsigned char
     3 
     4 uchar receive;
     5 
     6  
     7 void main(void)
     8 { 
     9      EA = 1; //允许总中断(如不使用中断,可用//屏蔽)
    10     ES = 1; //允许UART串口的中断
    11     TMOD = 0x20;    //定时器T/C1工作方式2
    12     SCON = 0x50;    //串口工作方式1,允许串口接收(SCON = 0x40 时禁止串口接收)
    13     TH1 = 0xF3;    //定时器初值高8位设置   //12MHZ晶振,波特率为4800 0xf3
    14     TL1 = 0xF3;    //定时器初值低8位设置   //11.0592MHZ晶振,波特率为4800 0xf4   9600  0xfa   19200  0xfd
    15     PCON = 0x80;    //波特率倍频(屏蔽本句波特率为2400)
    16     TR1 = 1;    //定时器启动    
    17     while(1);
    18 
    19 }
    20 
    21 void tranData() interrupt 4
    22 {
    23     uchar i;
    24     if(RI)
    25     {
    26        RI=0;
    27        receive=SBUF;
    28        if(receive==0x31)
    29        {
    30           for(i=0;i<4;i++)
    31           {
    32                SBUF='a';
    33              while(!TI);                             
    34             TI=0;
    35           }
    36        }
    37        else if(receive==0x32)
    38        {
    39         for(i=0;i<4;i++)
    40           {
    41                SBUF='b';
    42              while(!TI);
    43             TI=0;
    44           }
    45        }
    46     }
    47 }
    48 
    49  
    View Code
  • 相关阅读:
    2018.09.08什么是ajax
    2018.09.03怎样让网页自适应所有屏幕宽度
    2018.08.25字符串和二维数组之间的转换
    2018.08.20MySQL常用命令总结(二)
    2018.08.15解决MySQL1290问题
    2018.08.13MySQL常用命令总结(一)
    2018.08.11MySQL无法启动错误码1067的解决方法
    2018.08.10 css中position定位问题
    2018.08.10jQuery导航栏置顶
    2018.08.07css实现图片放大
  • 原文地址:https://www.cnblogs.com/https/p/9250407.html
Copyright © 2011-2022 走看看