单片机串口初始化时TI为什么要置1?,具体代码如上,为什么在串口初始化函数里,TI要被置为1呢?还有,在Uart_SendB函数里,为什么要开头清零一次TI,末尾再清零一次TI?
单片机源程序如下:
- #include <stc15f2k60s2.h>
- #include <absacc.h>
- #include <intrins.h>
- #include <stdio.h>
- void UartInit(void);//串口初始化函数。
- void Uart_SendB(unsigned char us);//串口单个字节发送函数。
- void main(void)
- {
- XBYTE[0xA000]=0;
- UartInit();
- EA=1;
- while(1)
- {
- Uart_SendB(‘a’);
- }
- }
- void UartInit(void) //9600bps@12.000MHz
- {
- SCON = 0x50; //8位数据,可变波特率
- AUXR &= 0xBF; //定时器1时钟为Fosc/12,即12T
- AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
- TMOD &= 0x0F; //设定定时器1为16位自动重装方式
- TL1 = 0xE6; //设定定时初值
- TH1 = 0xFF; //设定定时初值
- ET1 = 0; //禁止定时器1中断
- TR1 = 1; //启动定时器1
- TI=1;
- ES=1; //开启串口中断。
- }
- void Uart_SendB(unsigned char us)
- {
- TI=0
- SBUF=us;
- while(TI==0);//等待发送结束。
- TI=0;
- }
复制代码
,27、32行多余。TI为串口发送完成中断请求标志,由硬件置1,软件清0。只有在特殊使用串口情况才会在初始化时置TI为1。通常来讲,如果想一次发送多个数据的时候,就需要把第一个字节写入SBUF,然后再等待发送中断,再在后续中断中在发送剩余的数据,但是数据发送过程就被拆分到了两个地方——主循环内和中断服务函数内,无疑就使得程序结构变得零散了。这个时候,为了使程序结构尽量紧凑,在启动发送的时候,不是向SBUF中写入第一个待发的字节,而是直接让TI=1,注意,这时候会马上进入串口中断,因为中断标志位置1了,但是串口线上并没有发送任何数据,于是,我们所有的数据发送都可以在中断中进行,而不用再分为两部分了。,楼主能不能说说TI是干什么用的呢?,中断请求,
yzwzfyz 发表于 2020-4-5 12:27
楼主能不能说说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上吗?