51單片機中為什么很少出現 printf 的身影?是用不了嗎?
不是的,51單片機可以用 printf,只是不建議使用。
平時我們在操作系統上寫C語言代碼,使用 printf 可以把數據寫到標準輸出流:
#includeint main() { printf("helloworld "); return 0; }
然后在屏幕上就能看到它的輸出。
但是51單片機屬于裸機開發,沒有所謂的標準輸出流,他能跟外部交互的,只有串口。
51單片機用的開發語言是C語言,雖然跟標準C有點區別,但是 printf 函數還是可以用的,只要修改 printf 的輸出方式,讓他從串口輸出,也能在電腦上看到輸出信息。
printf 函數把數據格式化后,最終調用 putchar 函數把數據寫出,所以我們要做的,就是實現 putchar 函數。
int putchar(char c) { SBUF = ch; // 將數據發送到SBUF寄存器 while (!TI); // 等待發送完成 TI = 0; // 清除發送中斷標志 return c; }
這些操作都跟串口相關,不去詳細介紹。
使用的時候,包含 stdio.h 頭文件,語法跟我們以前使用的一樣。
那為什么不建議在 51 單片機中使用 printf,有這么幾個原因。
首先 printf 實現起來比較復雜,要考慮到多種輸出格式,還要額外開辟存儲空間。
51單片機資源和性能都有限,使用 printf 開銷比較大。
其次,51 編譯器對 printf 的處理,跟我們經常使用的也有差距。
比如定義一個 char 類型的變量,初始化成 0x01,使用 %u 輸出,雖然類型不一樣,應該不影響它輸出 1。
void main() { unsigned char num1 = 0x01; printf("%u", num1); }
實際上結果是 256,一個字節的 char 類型,轉換成兩個字節的 int,前面補0,由于 51 是大端存儲,輸出的時候反了。
void main() { unsigned char num1 = 0x01; unsigned char num2 = 0x02; printf("%u%u", num1, num2); }
再比如兩個 char 類型,一個 0x01 一個 0x02,同時輸出的話,第二個變量變成了 0。編譯器對參數入棧的處理也不太一樣。
基于種種原因,在 51 中很少用 printf,調試的話,可以借助開發工具,也可以使用一些日志相關的庫,都比 printf 要好用。
-
51單片機
+關注
關注
275文章
5707瀏覽量
125629 -
函數
+關注
關注
3文章
4361瀏覽量
63621 -
Printf
+關注
關注
0文章
83瀏覽量
13984
原文標題:51單片機為什么不用printf
文章出處:【微信號:學益得智能硬件,微信公眾號:學益得智能硬件】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
【經驗分享】單片機中如何實現printf輸出log?
STC51單片機的printf函數的用法和注意事項詳細說明

51單片機C51語言的scanf和printf是如何使用的詳細程序說明

51單片機串口通訊需要注意的寄存器及51單片機使用PRINTF的示例程序

如何在Keil中使用51單片機進行printf串口輸出

51單片機(3)-------單片機的種類

單片機中printf函數的重映射

51單片機串口通信調試printf函數重定向輸出打印

C51/C52單片機printf打印出來的值是原來值的256倍

stm32單片機串口使用printf及u3_printf

評論