久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8081|回復: 22
收起左側

單片機串口初始化時TI為什么要置1?

  [復制鏈接]
回帖獎勵 5 黑幣 回復本帖可獲得 5 黑幣獎勵! 每人限 1 次(中獎概率 70%)
ID:716794 發表于 2020-4-4 22:31 | 顯示全部樓層 |閱讀模式
具體代碼如上,為什么在串口初始化函數里,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. }
復制代碼


回復

使用道具 舉報

ID:213173 發表于 2020-4-5 06:25 | 顯示全部樓層
27、32行多余。TI為串口發送完成中斷請求標志,由硬件置1,軟件清0。只有在特殊使用串口情況才會在初始化時置TI為1。通常來講,如果想一次發送多個數據的時候,就需要把第一個字節寫入SBUF,然后再等待發送中斷,再在后續中斷中在發送剩余的數據,但是數據發送過程就被拆分到了兩個地方——主循環內和中斷服務函數內,無疑就使得程序結構變得零散了。這個時候,為了使程序結構盡量緊湊,在啟動發送的時候,不是向SBUF中寫入第一個待發的字節,而是直接讓TI=1,注意,這時候會馬上進入串口中斷,因為中斷標志位置1了,但是串口線上并沒有發送任何數據,于是,我們所有的數據發送都可以在中斷中進行,而不用再分為兩部分了。
回復

使用道具 舉報

ID:123289 發表于 2020-4-5 12:27 | 顯示全部樓層
樓主能不能說說TI是干什么用的呢?
回復

使用道具 舉報

ID:722839 發表于 2020-4-5 15:17 | 顯示全部樓層
中斷請求
回復

使用道具 舉報

ID:716794 發表于 2020-4-5 15:58 | 顯示全部樓層
yzwzfyz 發表于 2020-4-5 12:27
樓主能不能說說TI是干什么用的呢?

發送中斷標志位,發送完畢后,該位硬件置一,但是需要軟件清零,這個我還是知道的,就是不懂它為什么要初始化置1,然后清零兩次,我覺得只要留一個清零語句就可以了。
回復

使用道具 舉報

ID:716794 發表于 2020-4-5 16:00 | 顯示全部樓層
wulin 發表于 2020-4-5 06:25
27、32行多余。TI為串口發送完成中斷請求標志,由硬件置1,軟件清0。只有在特殊使用串口情況才會在初始化時 ...

那我發的這個程序是屬于特殊情況嗎?如果不是,那需要將T1初始化為1的特殊情況是怎樣的?方便舉個例子嗎?
不是很懂,麻煩了。
回復

使用道具 舉報

ID:722903 發表于 2020-4-5 16:12 | 顯示全部樓層
TI為串口發送完成中斷請求標志,由硬件置1,軟件清0.
發送前先清零,等待發送完成后硬件置1
回復

使用道具 舉報

ID:213173 發表于 2020-4-5 16:20 | 顯示全部樓層
程鵬 發表于 2020-4-5 16:00
那我發的這個程序是屬于特殊情況嗎?如果不是,那需要將T1初始化為1的特殊情況是怎樣的?方便舉個例子嗎 ...

參閱此鏈接,C語言指向數組元素的指針
https://www.sohu.com/a/122492626_119709
回復

使用道具 舉報

ID:716794 發表于 2020-4-5 22:43 | 顯示全部樓層
wulin 發表于 2020-4-5 16:20
參閱此鏈接,C語言指向數組元素的指針
https://www.sohu.com/a/122492626_119709

了解了,多謝
回復

使用道具 舉報

ID:716794 發表于 2020-4-5 22:44 | 顯示全部樓層

謝謝回答,但是我的問題不是這個
回復

使用道具 舉報

ID:716794 發表于 2020-4-5 22:45 | 顯示全部樓層
fishen 發表于 2020-4-5 16:12
TI為串口發送完成中斷請求標志,由硬件置1,軟件清0.
發送前先清零,等待發送完成后硬件置1

多謝回答,但是我的問題不是這個。
回復

使用道具 舉報

ID:123289 發表于 2020-4-11 11:51 | 顯示全部樓層
你的想法是對的,我很贊同!
回復

使用道具 舉報

ID:716794 發表于 2020-4-12 12:36 | 顯示全部樓層
yzwzfyz 發表于 2020-4-11 11:51
你的想法是對的,我很贊同!

好吧,多謝。
回復

使用道具 舉報

ID:830954 發表于 2021-2-2 22:34 | 顯示全部樓層
這個串口初始化配置可以移植到STC8上嗎?
回復

使用道具 舉報

ID:235954 發表于 2021-2-3 08:04 | 顯示全部樓層
TI為串口發送完成中斷請求標志,由硬件置1,軟件清0. 發送前先清零,等待發送完成后硬件置1
回復

使用道具 舉報

ID:600405 發表于 2021-9-14 19:37 | 顯示全部樓層
初始化TI被置1,為多字節發送時實現“發了不管”,利用等待TI標志出現的時間干點事情。
回復

使用道具 舉報

ID:964308 發表于 2021-9-14 21:00 來自手機 | 顯示全部樓層
那個是一個發送中斷標志,1代表發生完了,由硬件置1,需要軟件置0,第一個置0我覺得可以省略
回復

使用道具 舉報

ID:964308 發表于 2021-9-16 08:14 | 顯示全部樓層
不應該啊,TI是串口中斷標志位,是用來標志有沒有發送完成的,一般都是由硬件置1,軟件置0
回復

使用道具 舉報

ID:514901 發表于 2021-9-17 09:20 | 顯示全部樓層
TI在串口初始化時置1,一般是為了使用printf函數。一般情況下不置1
回復

使用道具 舉報

ID:959346 發表于 2021-9-17 10:17 | 顯示全部樓層
程鵬 發表于 2020-4-5 16:00
那我發的這個程序是屬于特殊情況嗎?如果不是,那需要將T1初始化為1的特殊情況是怎樣的?方便舉個例子嗎 ...

如果不開發送中斷,要發送字符串時,通過判斷TI為1來發送下一位。所以在開始時置1,表示可以發送下一位。
回復

使用道具 舉報

ID:419909 發表于 2021-9-17 10:19 | 顯示全部樓層
還有一個原因為是如果調用printf函數時。那個TI一定要置1.不然發不了。
回復

使用道具 舉報

ID:959346 發表于 2021-9-17 17:31 | 顯示全部樓層
wfqxgw 發表于 2021-9-17 10:19
還有一個原因為是如果調用printf函數時。那個TI一定要置1.不然發不了。

那你這個printf函數應該就是根據TI為1判斷一個字節發送完成了,可以開始發送下一個字節的數據了。
回復

使用道具 舉報

ID:624769 發表于 2021-9-17 18:22 | 顯示全部樓層
串口初始化程序中 TI = 1; 一般是用來針對 不開 串口中斷,對程序優化的操作。

大多不開串口中斷的串口發送函數,都是如下的寫法:
SBUF = xxxx;
while(!TI);
TI = 0;

如上這樣的寫法,會造成讓串口發送數據后,傻等串口傳輸完成,才會繼續其他其他操作,那么如果初始化時TI = 1; 就可以如下寫發送函數:
while(!TI);
TI = 0;
SBUF = xxxxxx;

這樣寫的好處是: 往SBUF 里面放了數據,就能繼續做別的事情,只在發送前判斷上一次發送有沒有完成,在非連續數據傳送時,有非常高的效率。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 视频一二区 | 天天夜天天操 | av在线播放网 | 精品国产乱码一区二区三区 | 日本不卡高字幕在线2019 | 欧美1区 | 亚洲成人激情在线观看 | 91亚洲国产| 久久久99精品免费观看 | 亚洲iv一区二区三区 | av一区二区在线观看 | 一本一道久久a久久精品综合 | 国产丝袜人妖cd露出 | 亚洲国产中文在线 | 青青草华人在线视频 | 精品久久久久久久久久久久久久 | 在线观看成人 | 亚洲视频在线免费观看 | 日韩精品极品视频在线观看免费 | 日韩中文字幕视频 | 国产欧美精品一区二区 | 欧美亚洲国产日韩 | 91精品国产综合久久国产大片 | 日韩三片 | 欧美日韩视频在线 | 久久久久亚洲精品 | 国产在线第一页 | 色悠悠久 | 精品久| 国产一区二区免费在线 | 99久久精品免费看国产高清 | 亚洲成人中文字幕 | 亚洲第一天堂 | 国产91亚洲精品 | 欧美在线一区二区三区 | www国产成人免费观看视频,深夜成人网 | 婷婷综合激情 | 91精品国产91久久久久久吃药 | 久久免费观看视频 | 青青草精品视频 | 天天拍天天草 |