單片機(jī)C語言實(shí)現(xiàn)printf_第1頁
單片機(jī)C語言實(shí)現(xiàn)printf_第2頁
單片機(jī)C語言實(shí)現(xiàn)printf_第3頁
單片機(jī)C語言實(shí)現(xiàn)printf_第4頁
單片機(jī)C語言實(shí)現(xiàn)printf_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、單片機(jī)串口實(shí)現(xiàn)printf函數(shù)背景敘述:在初學(xué)C語言時,利用printf函數(shù)向屏幕上輸出字符,非常的好用和方便。學(xué)會單片機(jī)以后,尤其在學(xué)會串口通信之后,通過單片機(jī)的串口向PC機(jī)發(fā)送數(shù)據(jù),怎么實(shí)現(xiàn)printf函數(shù)的功能。對于學(xué)習(xí)單片機(jī)來說,如果沒有仿真器,出錯誤的時候不好找,只能用最笨的辦法,使用printf函數(shù),可是在KEIL里面使用printf卻不像VC里面那么簡單,因?yàn)槠浒l(fā)送和硬件是有關(guān)系的。所以今天就簡單來說說怎么在51單片機(jī)中使用"printf"函數(shù):包括使用自帶的printf函數(shù)和自己動手寫一個printf函數(shù)功能描述:通過printf函數(shù)向串口發(fā)送數(shù)據(jù),顯示在終

2、端或者串口助手上Proteus中串口終端的介紹2、串口的配置尤其注意配置的波特率一定要和程序代碼中所寫的一樣(否則會造成無法顯示字符)數(shù)據(jù)位停止位奇偶校驗(yàn)位極性(這些屬性基本上是默認(rèn)的配置)3、串口終端的使用proteusvirtualterminal使用注意事項(xiàng)a.virtualterminal默認(rèn)顯示字符,如果單片機(jī)發(fā)送的是非顯示字符,則虛擬終端不會顯示,會導(dǎo)致用戶認(rèn)為通訊未通。運(yùn)行程序,在虛擬終端窗口里面點(diǎn)擊右鍵,在彈出菜單里面:選HEXDISPLAYMODEU顯示按十六進(jìn)制顯示,能顯示所有字符。b.virtualterminal默認(rèn)情況下不顯示回顯字符,運(yùn)行程序,在虛擬終端窗口里面點(diǎn)擊

3、右鍵,在彈出菜單里面:選EchoTypedCharacters顯示回顯字符c.virtualterminal和模擬物理串口COMPIM不能同時使用,同時使用會發(fā)生相互影響。d.啟動仿真后可以右鍵單擊終端,最后一欄打開和關(guān)閉串口顯示終直接使用系統(tǒng)自帶的printf函數(shù):特別注意需要置位TI=1,否則是無法發(fā)送的,程序如下(此程序在proteus終端上不能顯示漢字,但在串口調(diào)試助手上可以)/*decription*利用printf函數(shù)向串口打印信息51單片機(jī)晶振頻率11.0592MHZ串口通信波特率9600bps*includesfile*#include<reg51.h>#inclu

4、de<intrins.h>#include<string.h>#include<stdio.h>#defineucharunsignedchar#defineuintunsignedintvoiddelay_1ms(uintz)uintx,y;for(x=z;x>0;x-)for(y=110;y>0;y-);voiduart_init(void)TMOD=0x20;定時計(jì)數(shù)器1,工作方式2TH1=0xFD;設(shè)置波特率9600TL1=0xFD;TR1=1;SCON=0x50;PCON=0x00;EA=1;ES=1;TI=1;若利用printf函數(shù)則

5、TI初始值必須置1)voidmain()(uart_init();while(1)(/SBUF='H'/while(TI=0);/TI=0;printf("iamherro!nr");delay_1ms(1000);(ff=0;printf("%c",num);)voidser_interrupt()interrupt4(if(RI=1)(ES=0;RI=0;num=SBUF;ES=1;ff=1;)4.編寫自己的printf函數(shù)(這個函數(shù)不能再proteus中仿真,但實(shí)際中可以使用)a.預(yù)備知識C語言函數(shù):vsprintf,其原型為int

6、vsprintf(char*string,char*format,va_listparam);,作用為將param按格式format寫入字符串string中,因此他可以用于將任何格式數(shù)據(jù)轉(zhuǎn)化為字符串?dāng)?shù)據(jù),比如把整數(shù)97轉(zhuǎn)化為ASCII碼的97的程序就像下面這樣vsprintf(string,"%d",97),當(dāng)然還有一點(diǎn)需要注意:在keil里面使用sprintf需要包含stdio.h這個頭文件(當(dāng)然這里也可以使用sprintf,作用完全差不多,只需要稍加修改即可,不多介紹)。說到這里,再來說說另一個函數(shù)itoa吧,其實(shí)他比vsprintf更簡單,其原型為char*itoa(

7、intvalue,char*string,intradix),作用為將value按radix進(jìn)制寫入到string字符串中,使用時需要包含頭文件stdlib.h,可是在keil里面卻無法使用,頭文件里面不包含itoa,即使把VC里面的復(fù)制進(jìn)來貌似還是不行,呵呵,目前不知道原因。可變參數(shù)函數(shù)具體來說就是stdarg.h里面的這幾個函數(shù)va_start,va_arg,va_list,va_end這幾個參數(shù)用于開辟一段內(nèi)存區(qū)域,可以配合vsprintf使用,但是對內(nèi)存使用較大,需要單片機(jī)具備一定的RAM,否則程序就算能編譯通過也是無法運(yùn)行的。函數(shù)形參列表中的變量在內(nèi)存中的位置是順次排列的。頭文件St

8、darg.h里的幾個宏定義就是利用了這么一點(diǎn),順次獲取多個參數(shù)Keil中上述函數(shù)的定義如下typedefchar*va_list;/va_list即為字符指針類型#defineva_start(ap,v)ap=(va_list)&v+sizeof(v)#defineva_arg(ap,t)(int*)ap)+0)#defineva_end(ap)/keil中什么也沒有做每個平臺下面的Stdarg頭文件的定義都是不相同的。就拿keil那里的來入手。先看一個最簡單的可變參數(shù)列表的函數(shù):voidmytest(inta,.)intb;va_listap;va_start(ap,a);b=va_

9、arg(ap,int);va_end(ap);printf("%d,%d",a,b);i. 首先定義一個va_list型的變量ap,也就是char*。ii. va_start(ap,a彥替換之后就是ap=(va_list)&a+sizeof(a);首先取a的地址,即第一個固定參數(shù)的地址,然后強(qiáng)制類型轉(zhuǎn)換為va_list,接著后移a的內(nèi)存大小,把當(dāng)前這個地址值賦給ap。很明顯,就是第一個參數(shù)a后面的那個地方,按照上面說的,也就是第一個可變參數(shù)。即現(xiàn)在把a(bǔ)p指向第一個可變參數(shù)。iii. b=va_arg(ap,int宏替換為b=(int*)ap)+0;自加在后,因此是獲

10、取第一個參數(shù)的值賦給b,然后ap后移一個類型的位置,即指向下一個元素的地址。iiii.va_end(ap),這里什么都沒有做,在ADS那個版本里是將ap指向NULL防止誤操作。具體內(nèi)容詳見內(nèi)部拓展RAM定義:集成在單片機(jī)內(nèi)部的數(shù)據(jù)存儲器,在物理上是內(nèi)部,但邏輯上是外部,訪問時需要使用MOVX或者xdata訪問,具體可以看STC8051手冊。89C52單片機(jī)內(nèi)含有1024byte=1Kbyte的內(nèi)部拓展RAM,在訪問的時候,使用C語言的時候,需要加上xdata才可以訪問,使用匯編的時候需要用MOVX指令訪問。xdata:訪問內(nèi)部RAM數(shù)據(jù)源程序/*decription*利用printf函數(shù)向串口

11、打印信息51單片機(jī)晶振頻率11.0592MHZ串口通信波特率9600bps利用系統(tǒng)自帶printf函數(shù)TI初始值必須置1*includesfile*#include<reg51.h>#include<intrins.h>用于vsprintf函數(shù)原型#include<stdio.h>#include<stdarg.h>#defineucharunsignedchar#defineuintunsignedintvoiddelay_1ms(uintz);voiduart_init(void);voidsendbyte(ucharc);voidsends

12、tring(uchar*string);可變參數(shù)列表函數(shù)voiduart_printf(constchar*fmt,.voidmain(void)inta=99;uart_init();while(1)uart_printf("10進(jìn)制d16進(jìn)制x字符格式c",a,a,a);delay_1ms(1000);)voiddelay_1ms(uintz)uintx,y;for(x=z;x>0;x-)for(y=110;y>0;y-);)voiduart_init(void)TMOD=0x20;定時計(jì)數(shù)器1,工作方式2TH1=0xFD;設(shè)置波特率9600TL1=0xFD;TR1=1;SCON=0x50;PCON=0x00;EA=1;ES=1;)voidsendbyte(unsignedcharc)if(c='n')(SBUF=0X0D;while(TI=0);TI=0;SBUF=0X0A;while(TI=0);TI=0;else(SBUF=c;while(TI=0);TI=0;voidsendstring(unsignedchar*string)(while(*string!='0')/判斷是否到字符串的尾端sendbyte(*string);string+;

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論