51單片機(jī)中為什么很少出現(xiàn) printf 的身影?是用不了嗎?
不是的,51單片機(jī)可以用 printf,只是不建議使用。
平時(shí)我們在操作系統(tǒng)上寫C語言代碼,使用 printf 可以把數(shù)據(jù)寫到標(biāo)準(zhǔn)輸出流:
#includeint main() { printf("helloworld "); return 0; }
然后在屏幕上就能看到它的輸出。
但是51單片機(jī)屬于裸機(jī)開發(fā),沒有所謂的標(biāo)準(zhǔn)輸出流,他能跟外部交互的,只有串口。
51單片機(jī)用的開發(fā)語言是C語言,雖然跟標(biāo)準(zhǔn)C有點(diǎn)區(qū)別,但是 printf 函數(shù)還是可以用的,只要修改 printf 的輸出方式,讓他從串口輸出,也能在電腦上看到輸出信息。
printf 函數(shù)把數(shù)據(jù)格式化后,最終調(diào)用 putchar 函數(shù)把數(shù)據(jù)寫出,所以我們要做的,就是實(shí)現(xiàn) putchar 函數(shù)。
int putchar(char c) { SBUF = ch; // 將數(shù)據(jù)發(fā)送到SBUF寄存器 while (!TI); // 等待發(fā)送完成 TI = 0; // 清除發(fā)送中斷標(biāo)志 return c; }
這些操作都跟串口相關(guān),不去詳細(xì)介紹。
使用的時(shí)候,包含 stdio.h 頭文件,語法跟我們以前使用的一樣。
那為什么不建議在 51 單片機(jī)中使用 printf,有這么幾個(gè)原因。
首先 printf 實(shí)現(xiàn)起來比較復(fù)雜,要考慮到多種輸出格式,還要額外開辟存儲空間。
51單片機(jī)資源和性能都有限,使用 printf 開銷比較大。
其次,51 編譯器對 printf 的處理,跟我們經(jīng)常使用的也有差距。
比如定義一個(gè) char 類型的變量,初始化成 0x01,使用 %u 輸出,雖然類型不一樣,應(yīng)該不影響它輸出 1。
void main() { unsigned char num1 = 0x01; printf("%u", num1); }
實(shí)際上結(jié)果是 256,一個(gè)字節(jié)的 char 類型,轉(zhuǎn)換成兩個(gè)字節(jié)的 int,前面補(bǔ)0,由于 51 是大端存儲,輸出的時(shí)候反了。
void main() { unsigned char num1 = 0x01; unsigned char num2 = 0x02; printf("%u%u", num1, num2); }
再比如兩個(gè) char 類型,一個(gè) 0x01 一個(gè) 0x02,同時(shí)輸出的話,第二個(gè)變量變成了 0。編譯器對參數(shù)入棧的處理也不太一樣。
基于種種原因,在 51 中很少用 printf,調(diào)試的話,可以借助開發(fā)工具,也可以使用一些日志相關(guān)的庫,都比 printf 要好用。
-
51單片機(jī)
+關(guān)注
關(guān)注
274文章
5705瀏覽量
124350 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4346瀏覽量
62990 -
Printf
+關(guān)注
關(guān)注
0文章
83瀏覽量
13737
原文標(biāo)題:51單片機(jī)為什么不用printf
文章出處:【微信號:學(xué)益得智能硬件,微信公眾號:學(xué)益得智能硬件】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
【經(jīng)驗(yàn)分享】單片機(jī)中如何實(shí)現(xiàn)printf輸出log?
STC51單片機(jī)的printf函數(shù)的用法和注意事項(xiàng)詳細(xì)說明
![STC<b class='flag-5'>51</b><b class='flag-5'>單片機(jī)</b>的<b class='flag-5'>printf</b>函數(shù)的用法和注意事項(xiàng)詳細(xì)說明](https://file.elecfans.com/web1/M00/8E/84/o4YBAFy216eATqRlAAkNnhhNhwA255.png)
51單片機(jī)C51語言的scanf和printf是如何使用的詳細(xì)程序說明
![<b class='flag-5'>51</b><b class='flag-5'>單片機(jī)</b>C<b class='flag-5'>51</b>語言的scanf和<b class='flag-5'>printf</b>是如何使用的詳細(xì)程序說明](https://file.elecfans.com/web1/M00/A4/AB/pIYBAF1jm9uABqpzAARKzrh8QpY877.png)
51單片機(jī)串口通訊需要注意的寄存器及51單片機(jī)使用PRINTF的示例程序
![<b class='flag-5'>51</b><b class='flag-5'>單片機(jī)</b>串口通訊需要注意的寄存器及<b class='flag-5'>51</b><b class='flag-5'>單片機(jī)</b>使用<b class='flag-5'>PRINTF</b>的示例程序](https://file.elecfans.com/web1/M00/A3/6F/pIYBAF1TqjmAUAWiAAHjjfYNubY807.png)
如何在Keil中使用51單片機(jī)進(jìn)行printf串口輸出
![如何在Keil中使用<b class='flag-5'>51</b><b class='flag-5'>單片機(jī)</b>進(jìn)行<b class='flag-5'>printf</b>串口輸出](https://file.elecfans.com/web1/M00/A2/E9/o4YBAF1SbG-AQzQ0AAMFISPncRs170.png)
如何使用單片機(jī)系統(tǒng)重寫printf函數(shù)
![如何使用<b class='flag-5'>單片機(jī)</b>系統(tǒng)重寫<b class='flag-5'>printf</b>函數(shù)](https://file.elecfans.com/web1/M00/9E/1C/o4YBAF02uxWAKWETAAI75dv1pvw201.png)
單片機(jī)printf的移植過程資料免費(fèi)下載
![<b class='flag-5'>單片機(jī)</b><b class='flag-5'>printf</b>的移植過程資料免費(fèi)下載](https://file.elecfans.com/web1/M00/9D/25/o4YBAF0xdKeAZDqQAAOnymwSmV8113.png)
什么是51單片機(jī)?又該如何自學(xué)51單片機(jī)
51單片機(jī)是什么?應(yīng)該如何學(xué)習(xí)51單片機(jī)
51單片機(jī)(一)—— 51單片機(jī)簡介
![<b class='flag-5'>51</b><b class='flag-5'>單片機(jī)</b>(一)—— <b class='flag-5'>51</b><b class='flag-5'>單片機(jī)</b>簡介](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
51單片機(jī)(3)-------單片機(jī)的種類
![<b class='flag-5'>51</b><b class='flag-5'>單片機(jī)</b>(3)-------<b class='flag-5'>單片機(jī)</b>的種類](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
單片機(jī)中printf函數(shù)的重映射
![<b class='flag-5'>單片機(jī)</b><b class='flag-5'>中</b><b class='flag-5'>printf</b>函數(shù)的重映射](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
51單片機(jī)串口通信調(diào)試printf函數(shù)重定向輸出打印
![<b class='flag-5'>51</b><b class='flag-5'>單片機(jī)</b>串口通信調(diào)試<b class='flag-5'>printf</b>函數(shù)重定向輸出打印](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
C51/C52單片機(jī)printf打印出來的值是原來值的256倍
![C<b class='flag-5'>51</b>/C52<b class='flag-5'>單片機(jī)</b><b class='flag-5'>printf</b>打印出來的值是原來值的256倍](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
stm32單片機(jī)串口使用printf及u3_printf
![stm32<b class='flag-5'>單片機(jī)</b>串口使用<b class='flag-5'>printf</b>及u3_<b class='flag-5'>printf</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評論