先給大家附上一套完整的模板源代碼,后面章節(jié)練習(xí)C語(yǔ)言的模板程序就直接復(fù)制此完整的源代碼,此源代碼適合的單片機(jī)型號(hào)是STC89C52RC,晶振是11.0592MHz,串口波特率是9600,初學(xué)者只需修改代碼里從“C語(yǔ)言學(xué)習(xí)區(qū)域的開(kāi)始”到“C語(yǔ)言學(xué)習(xí)區(qū)域的結(jié)束”的區(qū)域,其它部分不要更改。可復(fù)制的源代碼請(qǐng)到網(wǎng)上論壇原貼處復(fù)制或者下載,搜索本教程名字就可以找到原貼出處。一套完整的模板源代碼如下:
#include "REG52.H" void View(unsigned long u32ViewData); void to_BufferData(unsigned long u32Data,unsigned char *pu8Buffer,unsigned char u8Type); void SendString(unsigned char *pu8String); /*---C語(yǔ)言學(xué)習(xí)區(qū)域的開(kāi)始。-----------------------------------------------*/ void main() //主函數(shù) { unsigned char a; //定義一個(gè)變量a。 unsigned int b; //定義一個(gè)變量b。 unsigned long c; //定義一個(gè)變量c。 a=100; //給變量a賦值。 b=10000; //給變量b賦值。 c=1000000000; //給變量c賦值。 View(a); //在電腦串口端查看第1個(gè)數(shù)a。 View(b); //在電腦串口端查看第2個(gè)數(shù)b。 View(c); //在電腦串口端查看第3個(gè)數(shù)c。 while(1) { } } /*---C語(yǔ)言學(xué)習(xí)區(qū)域的結(jié)束。-----------------------------------------------*/ void View(unsigned long u32ViewData) { static unsigned char Su8ViewBuffer[43]; code unsigned char Cu8_0D_0A[]={0x0d,0x0a,0x00}; code unsigned char Cu8Start[]={"開(kāi)始..."}; static unsigned char Su8FirstFlag=0; static unsigned int Su16FirstDelay; if(0==Su8FirstFlag) { Su8FirstFlag=1; for(Su16FirstDelay=0;Su16FirstDelay<10000;Su16FirstDelay++); SendString(Cu8Start); SendString(Cu8_0D_0A); SendString(Cu8_0D_0A); } to_BufferData(u32ViewData,Su8ViewBuffer,1); SendString(Su8ViewBuffer); to_BufferData(u32ViewData,Su8ViewBuffer,2); SendString(Su8ViewBuffer); to_BufferData(u32ViewData,Su8ViewBuffer,3); SendString(Su8ViewBuffer); to_BufferData(u32ViewData,Su8ViewBuffer,4); SendString(Su8ViewBuffer); SendString(Cu8_0D_0A); } void to_BufferData(unsigned long u32Data,unsigned char *pu8Buffer,unsigned char u8Type) { code unsigned char Cu8Array1[]={0xB5,0xDA,0x4E,0xB8,0xF6,0xCA,0xFD,0x00}; code unsigned char Cu8Array2[]="十進(jìn)制:"; code unsigned char Cu8Array3[]="十六進(jìn)制:"; code unsigned char Cu8Array4[]="二進(jìn)制:"; static unsigned char Su8SerialNumber=1; static unsigned int Su16BufferCnt; static unsigned int Su16TempCnt; static unsigned int Su16TempSet; static unsigned long Su32Temp1; static unsigned long Su32Temp2; static unsigned long Su32Temp3; static unsigned char Su8ViewFlag; if(1==u8Type) { for(Su16BufferCnt=0;Su16BufferCnt<7;Su16BufferCnt++) { pu8Buffer[Su16BufferCnt]=Cu8Array1[Su16BufferCnt]; } pu8Buffer[2]=Su8SerialNumber+'0'; pu8Buffer[Su16BufferCnt]=0x0d; pu8Buffer[Su16BufferCnt+1]=0x0a; pu8Buffer[Su16BufferCnt+2]=0; Su8SerialNumber++; return; } else if(2==u8Type) { for(Su16BufferCnt=0;Su16BufferCnt<7;Su16BufferCnt++) { pu8Buffer[Su16BufferCnt]=Cu8Array2[Su16BufferCnt]; } Su32Temp1=1000000000; Su32Temp2=10; Su16TempSet=10; } else if(3==u8Type) { for(Su16BufferCnt=0;Su16BufferCnt<9;Su16BufferCnt++) { pu8Buffer[Su16BufferCnt]=Cu8Array3[Su16BufferCnt]; } Su32Temp1=0x10000000; Su32Temp2=0x00000010; Su16TempSet=8; } else { for(Su16BufferCnt=0;Su16BufferCnt<7;Su16BufferCnt++) { pu8Buffer[Su16BufferCnt]=Cu8Array4[Su16BufferCnt]; } Su32Temp1=0x80000000; Su32Temp2=0x00000002; Su16TempSet=32; } Su8ViewFlag=0; for(Su16TempCnt=0;Su16TempCnt 【11.2? ?模板程序的使用說(shuō)明?!?br />
圖11.2.1
大多數(shù)初學(xué)者在學(xué)習(xí)C語(yǔ)言的時(shí)候,往往是在電腦端安裝上VC平臺(tái)軟件來(lái)練習(xí)C語(yǔ)言,這種方法只要在代碼里調(diào)用printf語(yǔ)句,編譯后就可以看到被printf語(yǔ)句調(diào)用的變量,挺方便的。本教程沒(méi)有用這種方法,既然本教程的C語(yǔ)言主要針對(duì)單片機(jī),所以我想出了另外一種方法,這種方法就是直接在單片機(jī)上練習(xí)C語(yǔ)言,這樣會(huì)讓初學(xué)者體驗(yàn)更深刻。這種方法對(duì)硬件平臺(tái)要求不高,只要51學(xué)習(xí)板上有一個(gè)9針的串口就可以,這個(gè)串口既可以用來(lái)燒錄程序,也可以用來(lái)觀察代碼里的某個(gè)變量,只要在代碼里調(diào)用View函數(shù)就可以達(dá)到類似VC平臺(tái)軟件下printf語(yǔ)句的效果,View函數(shù)可以向串口輸出某個(gè)變量的十進(jìn)制,十六進(jìn)制和二進(jìn)制,大家只要在電腦端的串口助手軟件就可以看到某個(gè)變量的這些信息,View函數(shù)能查看的變量最大數(shù)值范圍是4個(gè)字節(jié)的unsigned long變量,十進(jìn)制的范圍是從0到4294967295,也可以查看unsigned int 和unsigned char的類型變量(數(shù)據(jù)的進(jìn)制以及l(fā)ong,int,char等知識(shí)點(diǎn)大家目前還沒(méi)接觸到,因此不懂也沒(méi)關(guān)系,當(dāng)前只要有個(gè)大概的認(rèn)識(shí)就可以,暫時(shí)不用深入理解,后面章節(jié)還會(huì)詳細(xì)介紹)。View函數(shù)是我整個(gè)模板程序的其中一部分,所以要用這種方法就必須先復(fù)制我整個(gè)模板程序,初學(xué)者練習(xí)代碼的活動(dòng)范圍僅僅局限于模板程序里的“C語(yǔ)言學(xué)習(xí)區(qū)域”,在此區(qū)域里有一個(gè)main主函數(shù),main主函數(shù)內(nèi)有一個(gè)初始化區(qū)域,初學(xué)者往往在這個(gè)初始化區(qū)域里練習(xí)C語(yǔ)言就夠了,初學(xué)者最大的活動(dòng)范圍不能超過(guò)從“C語(yǔ)言學(xué)習(xí)區(qū)域的開(kāi)始”到“C語(yǔ)言學(xué)習(xí)區(qū)域的結(jié)束”這個(gè)范圍,這個(gè)范圍之外其它部分的代碼主要用來(lái)實(shí)現(xiàn)數(shù)據(jù)處理和串口發(fā)送的功能,大家暫時(shí)不用讀懂它,直接復(fù)制過(guò)來(lái)就可以了。比如:
/*---C語(yǔ)言學(xué)習(xí)區(qū)域的開(kāi)始。-----------------------------------------------*/
void main() //主函數(shù)
{
//...初始化區(qū)域,也就是主要用來(lái)給初學(xué)者學(xué)習(xí)C語(yǔ)言的區(qū)域。
while(1)
{
}
}
/*---C語(yǔ)言學(xué)習(xí)區(qū)域的結(jié)束。-----------------------------------------------*/
上述例子中,初學(xué)者練習(xí)代碼只能在從“C語(yǔ)言學(xué)習(xí)區(qū)域的開(kāi)始”到“C語(yǔ)言學(xué)習(xí)區(qū)域的結(jié)束”這個(gè)范圍,此范圍外的代碼直接復(fù)制過(guò)來(lái)不要更改。我們?cè)賮?lái)分析分析下面節(jié)選的main函數(shù)源代碼:
/*---C語(yǔ)言學(xué)習(xí)區(qū)域的開(kāi)始。-----------------------------------------------*/
void main() //主函數(shù)
{
unsigned char a; //定義一個(gè)變量a。
unsigned intb; //定義一個(gè)變量b。
unsigned long c; //定義一個(gè)變量c。
a=100; //給變量a賦值。
b=10000; //給變量b賦值。
c=1000000000; //給變量c賦值。
View(a); //在電腦串口端查看第1個(gè)數(shù)a。
View(b); //在電腦串口端查看第2個(gè)數(shù)b。
View(c); //在電腦串口端查看第3個(gè)數(shù)c。
while(1)
{
}
}
/*---C語(yǔ)言學(xué)習(xí)區(qū)域的結(jié)束。-----------------------------------------------*/
上述節(jié)選的main函數(shù)代碼里,比如“a=100; //給變量a賦值。”這行代碼,所謂的“賦值”就是“=”這個(gè)語(yǔ)句,它表面上像我們平時(shí)用的等于號(hào),實(shí)際上不是等于號(hào),而是代表“給”的意思,把“=”符號(hào)右邊的數(shù)復(fù)制一份給左邊的變量,比如“a=100;”就是代表把100這個(gè)數(shù)值復(fù)制一份給變量a,執(zhí)行這條指令后,a就等于100了。這里的分號(hào)“;”代表一條程序指令的結(jié)束。 而雙斜線“//”是注釋語(yǔ)句,雙斜線“//”這行后面的文字或字符都是用來(lái)注釋用的,編譯器會(huì)忽略雙斜線“//”這一行后面的文字或字符,編譯器不把注釋文字或字符列入源代碼,也就是“//”這一行中后面的文字或字符是不占單片機(jī)內(nèi)存的。當(dāng)然“//”僅僅局限于當(dāng)前一行代碼。上面除了“//”是注釋語(yǔ)句外,上面的“/*”和“*/”之間也是注釋語(yǔ)句,跟”//”的作用一樣,只不過(guò)“/*”是注釋開(kāi)始,“*/”是注釋結(jié)束,它們的范圍不局限于一行,而是從“/*”到“*/”的范圍,因此可以用于注釋連著的多行文字或者字符。
接著在分析上述代碼中最重要的函數(shù),也是本節(jié)最核心最重要的函數(shù)View(某個(gè)變量)。比如“ View(a); ”這行代碼,View(a)就是要把變量a的十進(jìn)制,十六進(jìn)制和二進(jìn)制的數(shù)值都發(fā)送到串口,我們通過(guò)USB轉(zhuǎn)串口線讓學(xué)習(xí)板連接上電腦,在電腦串口助手軟件上就能看到被View函數(shù)調(diào)用的變量a的信息。
【11.3 如何在電腦上使用串口助手軟件查看被View函數(shù)調(diào)用的變量?】
前面章節(jié)在講燒錄程序時(shí)提到一個(gè)叫“stc-isp-15xx-v6.85I”的上位機(jī)軟件,這個(gè)軟件除了用來(lái)燒錄程序,還集成了串口助手軟件的功能。所以本節(jié)直接共用燒錄程序時(shí)的USB轉(zhuǎn)串口線和“stc-isp-15xx-v6.85I”軟件就可以了,無(wú)需額外再購(gòu)買新的USB轉(zhuǎn)串口線和下載其它串口助手軟件,但是如何設(shè)置這個(gè)“stc-isp-15xx-v6.85I”上位機(jī)軟件,還是有一些需要特別注意的地方的,現(xiàn)在把這個(gè)詳細(xì)的步驟介紹給大家。
第一步:設(shè)置燒錄軟件的選項(xiàng)。
按前面章節(jié)介紹燒錄程序時(shí)所需的步驟,用USB轉(zhuǎn)串口線連接51學(xué)習(xí)板和電腦,記錄COM號(hào),打開(kāi)“stc-isp-15xx-v6.85I”軟件,選擇單片機(jī)型號(hào),選擇對(duì)應(yīng)的串口號(hào)(COM號(hào)),設(shè)置最低波特率和最高波特率,這部分的內(nèi)容跟燒錄程序時(shí)的配置步驟是一樣的,唯一必須要特別注意的是最高波特率必須選擇9600!最低波特率建議選擇2400。否則在燒錄完程序后,當(dāng)上位機(jī)集成軟件自動(dòng)切換到串口助手軟件窗口時(shí),接收區(qū)域顯示的一些漢字信息可能會(huì)出現(xiàn)亂碼。
----------------------------------步驟之間的分割線----------------------------------------
圖11.3.2
第二步:設(shè)置串口助手軟件的選項(xiàng)。
先點(diǎn)擊右上方選中“串口助手”選項(xiàng)切換到串口助手的窗口,接收緩沖區(qū)選擇“文本模式”,串口選擇匹配的COM號(hào)(跟燒錄軟件一致的COM號(hào)),波特率必須選擇9600,勾選上“編程完成后自動(dòng)打開(kāi)串口”選項(xiàng),最后點(diǎn)擊“打開(kāi)串口”按鈕使之切換到顯示“關(guān)閉串口”的文字狀態(tài),至此串口助手軟件的設(shè)置完畢。接下來(lái)就是按燒錄程序的流程,打開(kāi)新的HEX程序文件,程序燒錄完成后上位機(jī)軟件會(huì)自動(dòng)切換到串口助手的串口,就可以觀察到View函數(shù)從單片機(jī)上發(fā)送過(guò)來(lái)的某個(gè)變量的十進(jìn)制,十六進(jìn)制,二進(jìn)制的信息了。接收緩沖區(qū)的窗口比較小,如果收到的信息比較多,只要在上下方向拖動(dòng)窗口右邊的滑塊就可以依次看到全部的信息。如果想讓單片機(jī)重新發(fā)送數(shù)據(jù),只要讓51學(xué)習(xí)板斷電重啟就可以重發(fā)一次數(shù)據(jù),當(dāng)串口助手的接收區(qū)接收的信息太多影響觀察時(shí),大家可以點(diǎn)擊“清空接收區(qū)”的按鈕來(lái)清屏,然后斷電重啟讓它再重發(fā)一次數(shù)據(jù)。在電腦的串口助手軟件里觀察到的數(shù)據(jù)格式大概是什么樣子的呢?比如編譯完本章節(jié)上述完整的模板源代碼程序后,會(huì)在串口助手軟件里看到a,b,c三個(gè)變量的信息如下:
開(kāi)始...
第1個(gè)數(shù)
十進(jìn)制:100
十六進(jìn)制:64
二進(jìn)制:1100100
第2個(gè)數(shù)
十進(jìn)制:10000
十六進(jìn)制:2710
二進(jìn)制:10011100010000
第3個(gè)數(shù)
十進(jìn)制:1000000000
十六進(jìn)制:3B9ACA00
二進(jìn)制:111011100110101100101000000000
多說(shuō)一句,燒錄程序后,當(dāng)軟件自動(dòng)切換到串口助手軟件選項(xiàng)的窗口時(shí),串口助手窗口顯示單片機(jī)返回的信息,這時(shí)有可能第一行的文字“開(kāi)始...”會(huì)丟失或者顯示不出來(lái),但是后面其它的關(guān)鍵信息不受影響,我猜測(cè)可能是串口助手軟件本身的某個(gè)環(huán)節(jié)存在的小bug,跟我們沒(méi)關(guān)系,我們不用深究原因,因?yàn)椴粫?huì)影響我們的使用。此時(shí)如果讓單片機(jī)斷電重啟就可以看到第一行的文字“開(kāi)始...”。
【11.4 如何利用現(xiàn)有的工程編輯編譯新的源代碼?】
本教程后面有很多章節(jié)的源代碼,是不是每個(gè)章節(jié)都要重新建一個(gè)工程?其實(shí)不用。我們只要用一個(gè)工程就可以編譯編輯本教程所有章節(jié)的源代碼。方法很簡(jiǎn)單,就是打開(kāi)一個(gè)現(xiàn)有的工程,用快捷組合鍵“Ctrl+A”把原工程里面的C源代碼全部選中,再按“Backspace”清空原來(lái)的代碼,然后再?gòu)?fù)制本教程相關(guān)章節(jié)的代碼粘貼到工程的C文檔里,重新編譯一次就可以得到對(duì)應(yīng)的Hex格式的燒錄文件。用這種方法的時(shí)候,建議大家做好每個(gè)程序代碼的備份。每完成一個(gè)項(xiàng)目的小進(jìn)度,都要及時(shí)把源代碼存儲(chǔ)到電腦硬盤(pán)里,電腦硬盤(pán)里每個(gè)項(xiàng)目對(duì)應(yīng)一個(gè)項(xiàng)目文件夾,每個(gè)項(xiàng)目文件夾里包含很多不同版本編號(hào)的源代碼文件,每個(gè)源代碼文件名都有流水編號(hào),方便識(shí)別最新版本的程序,每天下班前都要把最新版本的源代碼文件上傳到自己的網(wǎng)盤(pán)里備份,在互聯(lián)網(wǎng)時(shí)代,把源代碼存到自己的網(wǎng)盤(pán),可以隨時(shí)異地存取,即使遇到電腦故障損壞也不擔(dān)心數(shù)據(jù)永久丟失。
【11.5 編輯源代碼的5個(gè)常用快捷鍵。】
介紹一下常用的快捷鍵,好好利用這5個(gè)快捷鍵,會(huì)讓你在編輯源代碼時(shí)效率明顯提高。
(1)選中整篇所有的內(nèi)容:組合鍵Ctrl+A。
(2)把選中的內(nèi)容復(fù)制到臨時(shí)剪貼板:組合鍵Ctrl+C。
(3)把臨時(shí)剪貼板的內(nèi)容粘貼到光標(biāo)開(kāi)始處:組合鍵Ctrl+V。
(4)把選中的一行或者幾行內(nèi)容整體往右邊移動(dòng):?jiǎn)捂ITab。每按一次就移動(dòng)幾個(gè)空格,很實(shí)用。
(5)把選中的一行或者幾行內(nèi)容整體往左邊移動(dòng):組合鍵Shift+Tab。每按一次就移動(dòng)幾個(gè)空格,很實(shí)用。
-
單片機(jī)
+關(guān)注
關(guān)注
6043文章
44623瀏覽量
638786
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
從單片機(jī)基礎(chǔ)到程序框架(連載)
C語(yǔ)言的指針在32位單片機(jī)上有哪些應(yīng)用呢
單片機(jī)C語(yǔ)言應(yīng)用程序設(shè)計(jì)
![<b class='flag-5'>單片機(jī)</b><b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>應(yīng)用<b class='flag-5'>程序</b>設(shè)計(jì)](https://file.elecfans.com/web2/M00/48/B8/pYYBAGKhtByAI30rAAAVnajJVa4167.jpg)
100個(gè)經(jīng)典C語(yǔ)言程序
單片機(jī)蜂鳴器簡(jiǎn)單發(fā)聲程序【C語(yǔ)言版】
單片機(jī)蜂鳴器_各種發(fā)聲程序_C語(yǔ)言版
51單片機(jī)匯編語(yǔ)言教程_第一個(gè)單片機(jī)小程序
單片機(jī)C語(yǔ)言例程模塊
51單片機(jī)的40個(gè)實(shí)驗(yàn)原理和程序(包含匯編和C語(yǔ)言程序)
簡(jiǎn)單實(shí)用——C語(yǔ)言入門(mén)程序練習(xí)
使用51單片機(jī)設(shè)計(jì)一個(gè)簡(jiǎn)易加法計(jì)算器的C語(yǔ)言程序免費(fèi)下載
![使用51<b class='flag-5'>單片機(jī)</b>設(shè)計(jì)<b class='flag-5'>一</b><b class='flag-5'>個(gè)</b>簡(jiǎn)易加法計(jì)算器的<b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b><b class='flag-5'>程序</b>免費(fèi)下載](https://file.elecfans.com/web1/M00/97/27/o4YBAF0LALOAc43tAAOOfLhH9w8736.png)
單片機(jī)C語(yǔ)言程序與數(shù)據(jù)存儲(chǔ)
![<b class='flag-5'>單片機(jī)</b><b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b><b class='flag-5'>程序</b>與數(shù)據(jù)存儲(chǔ)](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評(píng)論