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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8287|回復: 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. }
復制代碼


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

來自 2#
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 | 只看該作者
中斷請求
回復

使用道具 舉報

5#
ID:716794 發表于 2020-4-5 15:58 | 只看該作者
yzwzfyz 發表于 2020-4-5 12:27
樓主能不能說說TI是干什么用的呢?

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

使用道具 舉報

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

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

使用道具 舉報

7#
ID:722903 發表于 2020-4-5 16:12 | 只看該作者
TI為串口發送完成中斷請求標志,由硬件置1,軟件清0.
發送前先清零,等待發送完成后硬件置1
回復

使用道具 舉報

8#
ID:213173 發表于 2020-4-5 16:20 | 只看該作者
程鵬 發表于 2020-4-5 16:00
那我發的這個程序是屬于特殊情況嗎?如果不是,那需要將T1初始化為1的特殊情況是怎樣的?方便舉個例子嗎 ...

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

使用道具 舉報

9#
ID:716794 發表于 2020-4-5 22:43 | 只看該作者
wulin 發表于 2020-4-5 16:20
參閱此鏈接,C語言指向數組元素的指針
https://www.sohu.com/a/122492626_119709

了解了,多謝
回復

使用道具 舉報

10#
ID:716794 發表于 2020-4-5 22:44 | 只看該作者

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

使用道具 舉報

11#
ID:716794 發表于 2020-4-5 22:45 | 只看該作者
fishen 發表于 2020-4-5 16:12
TI為串口發送完成中斷請求標志,由硬件置1,軟件清0.
發送前先清零,等待發送完成后硬件置1

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

使用道具 舉報

12#
ID:123289 發表于 2020-4-11 11:51 | 只看該作者
你的想法是對的,我很贊同!
回復

使用道具 舉報

13#
ID:716794 發表于 2020-4-12 12:36 | 只看該作者
yzwzfyz 發表于 2020-4-11 11:51
你的想法是對的,我很贊同!

好吧,多謝。
回復

使用道具 舉報

14#
ID:830954 發表于 2021-2-2 22:34 | 只看該作者
這個串口初始化配置可以移植到STC8上嗎?
回復

使用道具 舉報

15#
ID:235954 發表于 2021-2-3 08:04 | 只看該作者
TI為串口發送完成中斷請求標志,由硬件置1,軟件清0. 發送前先清零,等待發送完成后硬件置1
回復

使用道具 舉報

16#
ID:600405 發表于 2021-9-14 19:37 | 只看該作者
初始化TI被置1,為多字節發送時實現“發了不管”,利用等待TI標志出現的時間干點事情。
回復

使用道具 舉報

17#
ID:964308 發表于 2021-9-14 21:00 來自觸屏版 | 只看該作者
那個是一個發送中斷標志,1代表發生完了,由硬件置1,需要軟件置0,第一個置0我覺得可以省略
回復

使用道具 舉報

18#
ID:964308 發表于 2021-9-16 08:14 | 只看該作者
不應該啊,TI是串口中斷標志位,是用來標志有沒有發送完成的,一般都是由硬件置1,軟件置0
回復

使用道具 舉報

19#
ID:514901 發表于 2021-9-17 09:20 | 只看該作者
TI在串口初始化時置1,一般是為了使用printf函數。一般情況下不置1
回復

使用道具 舉報

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

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

使用道具 舉報

21#
ID:419909 發表于 2021-9-17 10:19 | 只看該作者
還有一個原因為是如果調用printf函數時。那個TI一定要置1.不然發不了。
回復

使用道具 舉報

22#
ID:959346 發表于 2021-9-17 17:31 | 只看該作者
wfqxgw 發表于 2021-9-17 10:19
還有一個原因為是如果調用printf函數時。那個TI一定要置1.不然發不了。

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

使用道具 舉報

23#
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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 一区二区成人 | 华丽的挑战在线观看 | 国产91在线观看 | 欧美精品首页 | 国产一区二区三区视频免费观看 | 欧美视频免费 | 红桃视频一区二区三区免费 | 久久9精品 | 精品视频在线免费观看 | 人人看人人爽 | 亚洲午夜视频在线观看 | 成人不卡| 亚洲影音| 色香蕉在线 | 日本人爽p大片免费看 | 爱综合| 日本黄色片免费在线观看 | 亚洲精品视频在线播放 | 综合久久亚洲 | 欧美xxxx色视频在线观看免费 | 午夜小视频免费观看 | 精品一区二区三区四区 | 国产日韩欧美一区二区 | 久久久久久久国产精品影院 | 日韩精品中文字幕一区二区三区 | 黑人中文字幕一区二区三区 | 色婷婷影院 | 日韩精品无码一区二区三区 | 国产成人免费 | 久久亚洲综合 | 91在线视频免费观看 | 精品一区二区三区四区视频 | 精品欧美一区二区三区精品久久 | 天天拍天天操 | 成人中文字幕在线 | 91视频91| 国产在线第一页 | 99日韩| 日本福利视频免费观看 | 91亚洲国产成人久久精品网站 | 91在线精品视频 |