单片机串口初始化时TI为什么要置1?

单片机串口初始化时TI为什么要置1?,具体代码如上,为什么在串口初始化函数里,TI要被置为1呢?还有,在Uart_SendB函数里,为什么要开头清零一次TI,末尾再清零一次TI? …

单片机串口初始化时TI为什么要置1?,具体代码如上,为什么在串口初始化函数里,TI要被置为1呢?还有,在Uart_SendB函数里,为什么要开头清零一次TI,末尾再清零一次TI?

单片机源程序如下:

  1. #include <stc15f2k60s2.h>
  2. #include <absacc.h>
  3. #include <intrins.h>
  4. #include <stdio.h>
  5. void UartInit(void);//串口初始化函数。
  6. void Uart_SendB(unsigned char us);//串口单个字节发送函数。
  7. void main(void)
  8. {
  9.         XBYTE[0xA000]=0;
  10.         UartInit();
  11.         EA=1;
  12.         while(1)
  13.         {
  14.                 Uart_SendB(‘a’);
  15.         }
  16. }
  17. void UartInit(void)                //9600bps@12.000MHz
  18. {
  19.         SCON = 0x50;                //8位数据,可变波特率
  20.         AUXR &= 0xBF;                //定时器1时钟为Fosc/12,即12T
  21.         AUXR &= 0xFE;                //串口1选择定时器1为波特率发生器
  22.         TMOD &= 0x0F;                //设定定时器1为16位自动重装方式
  23.         TL1 = 0xE6;                //设定定时初值
  24.         TH1 = 0xFF;                //设定定时初值
  25.         ET1 = 0;                //禁止定时器1中断
  26.         TR1 = 1;                //启动定时器1
  27.         TI=1;                                
  28.         ES=1;                                //开启串口中断。
  29. }
  30. void Uart_SendB(unsigned char us)
  31. {
  32.         TI=0
  33.         SBUF=us;
  34.         while(TI==0);//等待发送结束。
  35.         TI=0;
  36. }

复制代码

,27、32行多余。TI为串口发送完成中断请求标志,由硬件置1,软件清0。只有在特殊使用串口情况才会在初始化时置TI为1。通常来讲,如果想一次发送多个数据的时候,就需要把第一个字节写入SBUF,然后再等待发送中断,再在后续中断中在发送剩余的数据,但是数据发送过程就被拆分到了两个地方——主循环内和中断服务函数内,无疑就使得程序结构变得零散了。这个时候,为了使程序结构尽量紧凑,在启动发送的时候,不是向SBUF中写入第一个待发的字节,而是直接让TI=1,注意,这时候会马上进入串口中断,因为中断标志位置1了,但是串口线上并没有发送任何数据,于是,我们所有的数据发送都可以在中断中进行,而不用再分为两部分了。,楼主能不能说说TI是干什么用的呢?,中断请求,

yzwzfyz 发表于 2020-4-5 12:27

楼主能不能说说TI是干什么用的呢?

发送中断标志位,发送完毕后,该位硬件置一,但是需要软件清零,这个我还是知道的,就是不懂它为什么要初始化置1,然后清零两次,我觉得只要留一个清零语句就可以了。单片机串口初始化时TI为什么要置1?插图,

wulin 发表于 2020-4-5 06:25

27、32行多余。TI为串口发送完成中断请求标志,由硬件置1,软件清0。只有在特殊使用串口情况才会在初始化时 …

那我发的这个程序是属于特殊情况吗?如果不是,那需要将T1初始化为1的特殊情况是怎样的?方便举个例子吗?
不是很懂,麻烦了。,TI为串口发送完成中断请求标志,由硬件置1,软件清0.
发送前先清零,等待发送完成后硬件置1,

程鹏 发表于 2020-4-5 16:00

那我发的这个程序是属于特殊情况吗?如果不是,那需要将T1初始化为1的特殊情况是怎样的?方便举个例子吗 …

参阅此链接,C语言指向数组元素的指针
https://www.sohu.com/a/122492626_119709,

wulin 发表于 2020-4-5 16:20

参阅此链接,C语言指向数组元素的指针

https://www.sohu.com/a/122492626_119709

了解了,多谢,

zsczsc 发表于 2020-4-5 15:17

中断请求

谢谢回答,但是我的问题不是这个,

fishen 发表于 2020-4-5 16:12

TI为串口发送完成中断请求标志,由硬件置1,软件清0.

发送前先清零,等待发送完成后硬件置1

多谢回答,但是我的问题不是这个。,你的想法是对的,我很赞同!,

yzwzfyz 发表于 2020-4-11 11:51

你的想法是对的,我很赞同!

好吧,多谢。,这个串口初始化配置可以移植到STC8上吗?

作者: soufei

为您推荐


Fatal error: Can't use function return value in write context in /www/wwwroot/www.qianrushi.com.cn/wp-content/themes/news/footer.php on line 115