㈠ C語言單片機主要運用到那些
在單片機的開發應用中,已逐漸開始引入高級語言,
C語言就是其中的一種。對用慣了匯編的人來說,總覺得高級語言』可控性』不好,不如匯編那樣隨心所欲。
但是只要我們掌握了一定的C語言知識,有些東西還是容易做出來的,以下是筆者實際工作中遇到的幾個問題,希望對初學C51者有所幫助。
一、C51熱啟動代碼的編制
對於工業控制計算機,往往設有有看門狗電路,當看門狗動作,使計算機復位,這就是熱啟動。
熱啟動時,一般不允許從頭開始,這將導致現有的已測量到或計算到的值復位,導致系統工作異常。
因而在程序必須判斷是熱啟動還是冷啟動,常用的方法是:確定某內存單位為標志位(如0x7f位和0x7e位),
啟動時首先讀該內存單元的內容,如果它等於一個特定的值(例如兩個內存單元的都是0xaa),就認為是熱啟動,
否則就是冷啟動,程序執行初始化部份,並將0xaa賦與這兩個內存單元。
根據以上的設計思路,編程時,設置一個指針,讓其指向特定的內存單元如0x7f,然後在程序中判斷,程序如下:
void main()
{ char data *HotPoint=(char *)0x7f;
if((*HotPoint==0xaa)&&(*(--HotPoint)==0xaa))
{ /*熱啟動的處理 */
}
else
{ HotPoint=0x7e; /*冷啟動的處進
*HotPoint=0xaa;
*(++HotPoint)=0xaa;
}
/*正常工作代碼*/
}
然而實際調試中發現,無論是熱啟動還是冷啟動,開機後所有內存單元的值都被復位為0,當然也實現不了熱啟動的要求。這是為什麼呢?原來,用C語言編程時,開機時執行的代碼並非是從main()函數的第一句語句開始的,在main()函數的第一句語句執行前要先執行一段』起始代碼』。正是這段代碼執行了清零的工作。C編譯程序提供了這段起始代碼的源程序,名為CSTARTUP.A51,打開這個文件,可以看到如下代碼:
.
IDATALEN EQU 80H ; the length of IDATA memory in bytes.
.
STARTUP1:
IF IDATALEN <> 0
MOV R0,#IDATALEN - 1
CLR A
IDATALOOP: MOV @R0,A
DJNZ R0,IDATALOOP
ENDIF
.
可見,在執行到判斷是否熱啟動的代碼之前,起始代碼已將所有內存單元清零。如何解決這個問題呢?好在啟動代碼是可以更改的,方法是:修改startup.a51源文件,然後用編譯程序所附帶的a51.exe程序對 startup.a51編譯,得到startup.obj文件,然後用這段代碼代替原來的起始代碼。具體步驟是(設C源程序名為HOTSTART.C):
修改startup.a51源文件(這個文件在C51LIB目錄下)。
執行如下命令:
A51 startup.a51 得到startup.obj文件。將此文件拷入HOTSTART.C所在目錄。
將編好的C源程序用C51.EXE編譯好,得到目標文件HOTS
TART.OBJ。
用 L51 HOTSTART, STARTUP.OBJ 命令連接,得到絕對目標文件HOTSTART。
用 OHS51 HOTSTART 得到HOTSTART.HEX文件,即可。
對於startup.a51的修改,根據自已的需要進行,如將IDATALEN EQU 80H中的80H改為70H,就可以使6F到7F的16位元組內存不被清零。
二、直接調用EPROM中已固化的程序
筆者用的模擬機,由6位數碼管顯示,在內存DE00H處放顯示子程序,只要將要顯示的數放入顯示緩沖區,然後調用這個子程序就可以使用了,匯編指令為:
LCALL 0DEOOH
在用C語言編程時,如何實現這一功能呢?C語言中有指向函數的指針這一概念,可以利用這種指針來實現用函數指針調用函數。指向函數的指針變數的定義格式為:
類型標識符 (*指針變數名)();
在定義好指針後就可以給指針變數賦值,使其指向某個函數的開始存地址,然後用
(*指針變數名)()即可調用這個函數。如下例:
void main(void)
{
void (*DispBuffer)(); /*定義指向函數指針*/
DispBuffer=0xde00; /*賦值*/
for(;;)
{ Key();
DispBuffer();
}
}
三、將浮點數轉化為字元數組
筆者在編制應用程序時有這樣的要求:將運算的結果(浮點數)存入EEPROM中。我們知道,浮點數在C語言中是以IEEE格式存儲的,一個浮點數佔用四個位元組,例如浮點數34.526存為(160,26,10,66)這四個數。要將一個浮點數存入EEPROM,實際上就是要存這四個數。那麼如何在程序中得到一個浮點數的組成數呢?
浮點數在存儲時,是存儲連續的位元組中的,只要設法找到存儲位置,就可以得到這些數了。可以定義一個void的指針,將此指針指向需要存儲的浮點數,然後將此指針強制轉化為char型,這樣,利用指針就可以得到組成該浮點數的各個位元組的值了。具體程序如下:
#define uchar unsigned char#define uint unsigned intvoid FtoC(void)
{ float a;
uchar i,*px
uchar x; /*定義字元數組,准備存儲浮點數的四個位元組*、
void *pf;
px=x; /*px指針指向數組x*/
pf=&a; /*void 型指針指向浮點數首地址*/
a=34.526;
for(i=0;i<4;i++)
{ *(px+i)=*((char *)pf+i); /*強制void 型指針轉成char型,因為*/
} /*void型指針不能運算*/
}
如果已將數存入EEPROM,要將其取出合並,方法也是一樣,可參考下面的程序。
#define uchar unsigned char#define uint unsigned int
void CtoF(void)
{ float a;
uchar i,*px
uchar x={56,180,150,73};
void *pf;
px=x;
pf=&a;
for(i=0;i<4;i++)
{ *((char *)pf+i)=*(px+i);
}
}
以上所用C語言為FRANKLIN C51 VER 3.2。
㈡ c語言程序經過編譯後生成文件的後綴是
C語言程序經過編譯後生成的文件後綴通常是<strong>.obj</strong>或<strong>.o</strong>。
這些後綴是對象文件(object file)的後綴,它們是源代碼編譯後的中間文件,通常包含了一些機器代碼和符號表信息。
為了更好地理解這個問題,我們需要知道編譯是一個將源代碼轉換為機器代碼的過程。在編譯過程中,編譯器會將源代碼中的指令和數據提取出來,然後按照特定的格式重新組織成機器代碼。這個過程通常會生成一個或多個對象文件。
為了使答案通俗易懂,我們可以這樣解釋:當你在電腦上編寫C語言程序時,你需要一個編譯器來將你的源代碼轉換為可以在你的電腦或網路上運行的程序。編譯器會將你的源代碼轉化為一種特殊的機器語言,這種語言可以直接被計算機硬體理解並執行。這個特殊的機器語言文件通常被稱為對象文件,因為它們包含了編譯後的代碼和一些其他的信息,如符號表等。
所以,當你編譯一個C語言程序時,你通常會得到一個或多個以<strong>.obj</strong>或<strong>.o</strong>為後綴的文件。這些文件包含了編譯後的代碼和其他信息,它們可以被鏈接器用來創建最終的可執行文件。
㈢ c語言是怎麼用的 具體解釋是什麼
語言是在70年代初問世的。一九七八年由美國電話電報公司(AT&T)貝爾實驗室正式發表了C語言。同時由B.W.Kernighan和D.M.Ritchit合著了著名的「THE C PROGRAMMING LANGUAGE」一書。通常簡稱為《K&R》,也有人稱之為《K&R》標准。但是,在《K&R》中並沒有定義一個完整的標准C語言,後來由美國國家標准學會在此基礎上制定了一個C 語言標准,於一九八三年發表。通常稱之為ANSI C。
當代最優秀的程序設計語言
早期的C語言主要是用於UNIX系統。由於C語言的強大功能和各方面的優點逐漸為人們認識,到了八十年代,C開始進入其它操作系統,並很快在各類大、中、小和微型計算機上得到了廣泛的使用。成為當代最優秀的程序設計語言之一。
C語言的特點
C語言是一種結構化語言。它層次清晰,便於按模塊化方式組織程序,易於調試和維護。C語言的表現能力和處理能力極強。它不僅具有豐富的運算符和數據類型,便於實現各類復雜的數據結構。它還可以直接訪問內存的物理地址,進行位(bit)一級的操作。由於C語言實現了對硬體的編程操作,因此C語言集高級語言和低級語言的功能於一體。既可用於系統軟體的開發,也適合於應用軟體的開發。此外,C語言還具有效率高,可移植性強等特點。因此廣泛地移植到了各類各型計算機上,從而形成了多種版本的C語言。
C語言版本
目前最流行的C語言有以下幾種:
·Microsoft C 或稱 MS C
·Borland Turbo C 或稱 Turbo C
·AT&T C
這些C語言版本不僅實現了ANSI C標准,而且在此基礎上各自作了一些擴充,使之更加方便、完美。
面向對象的程序設計語言
在C的基礎上,一九八三年又由貝爾實驗室的Bjarne Strou-strup推出了C++。 C++進一步擴充和完善了C語言,成為一種面向 對象的程序設計語言。C++目前流行的最新版本是Borland C++4.5,Symantec C++6.1,和Microsoft VisualC++ 2.0。C++提出了一些更為深入的概念,它所支持的這些面向對象的概念容易將問題空間直接地映射到程序空間,為程序員提供了一種與傳統結構程序設計不同的思維方式和編程方法。因而也增加了整個語言的復雜性,掌握起來有一定難度。
C和C++
但是,C是C++的基礎,C++語言和C語言在很多方面是兼容的。因此,掌握了C語言,再進一步學習C++就能以一種熟悉的語法來學習面向對象的語言,從而達到事半功倍的目的。
C源程序的結構特點
為了說明C語言源程序結構的特點,先看以下幾個程序。這幾個程 序由簡到難,表現了C語言源程序在組成結構上的特點。雖然有關內容還未介紹,但可從這些例子中了解到組成一個C源程序的基本部分和書寫格式。main()
{
printf("c語言世界www.vcok.com,您好!\n");
}
main是主函數的函數名,表示這是一個主函數。每一個C源程序都必須有,且只能有一個主函數(main函數)。函數調用語句,printf函數的功能是把要輸出的內容送到顯示器去顯示。printf函數是一個由系統定義的標准函數,可在程序中直接調用。
#include
#include
main()
{
double x,s;
printf("input number:\n");
scanf("%lf",&x);
s=sin(x);
printf("sine of %lf is %lf\n",x,s);
}
每行注釋
include稱為文件包含命令擴展名為.h的文件也稱為頭文件或首部文件
定義兩個實數變數,以被後面程序使用
顯示提示信息
從鍵盤獲得一個實數x
求x的正弦,並把它賦給變數s
顯示程序運算結果
main函數結束
程序的功能是從鍵盤輸入一個數x,求x的正弦值,然後輸出結果。在main()之前的兩行稱為預處理命令(詳見後面)。預處理命令還有其它幾種,這里的include 稱為文件包含命令,其意義是把尖括弧""或引號<>內指定的文件包含到本程序來,成為本程序的一部分。被包含的文件通常是由系統提供的,其擴展名為.h。因此也稱為頭文件或首部文件。C語言的頭文件中包括了各個標准庫函數的函數原型。因此,凡是在程序中調用一個庫函數時,都必須包含該函數原型所在的頭文件。在本例中,使用了三個庫函數:輸入函數scanf,正弦函數sin,輸出函數printf。sin函數是數學函數,其頭文件為math.h文件,因此在程序的主函數前用include命令包含了math.h。scanf和printf是標准輸入輸出函數,其頭文件為stdio.h,在主函數前也用include命令包含了stdio.h文件。
需要說明的是,C語言規定對scanf和printf這兩個函數可以省去對其頭文件的包含命令。所以在本例中也可以刪去第二行的包含命令#include。同樣,在例1.1中使用了printf函數,也省略了包含命令。
在例題中的主函數體中又分為兩部分,一部分為說明部分,另一部分執行部分。說明是指變數的類型說明。例題中未使用任何變數,因此無說明部分。C語言規定,源程序中所有用到的變數都必須先說明,後使用,否則將會出錯。這一點是編譯型高級程序設計語言的一個特點,與解釋型的BASIC語言是不同的。說明部分是C源程序結構中很重要的組成部分。本例中使用了兩個變數x,s,用來表示輸入的自變數和sin函數值。由於sin函數要求這兩個量必須是雙精度浮點型,故用類型說明符double來說明這兩個變數。說明部分後的四行為執行部分或稱為執行語句部分,用以完成程序的功能。執行部分的第一行是輸出語句,調用printf函數在顯示器上輸出提示字元串,請操作人員輸入自變數x的值。第二行為輸入語句,調用scanf函數,接受鍵盤上輸入的數並存入變數x中。第三行是調用sin函數並把函數值送到變數s中。第四行是用printf 函數輸出變數s的值,即x的正弦值。程序結束。
printf("input number:\n");
scanf("%lf",'C10F10&x);
s=sin(x);
printf("sine of %lf is %lf\n",'C10F10x,s);
運行本程序時,首先在顯示器屏幕上給出提示串input number,這是由執行部分的第一行完成的。用戶在提示下從鍵盤上鍵入某一數,如5,按下回車鍵,接著在屏幕上給出計算結果。
輸入和輸出函數
在前兩個例子中用到了輸入和輸出函數scanf和 printf,在第三章中我們要詳細介紹。這里我們先簡單介紹一下它們的格式,以便下面使用。scanf和 printf這兩個函數分別稱為格式輸入函數和格式輸出函數。其意義是按指定的格式輸入輸出值。因此,這兩個函數在括弧中的參數表都由以下兩部分組成: 「格式控制串」,參數表 格式控制串是一個字元串,必須用雙引號括起來,它表示了輸入輸出量的數據類型。各種類型的格式表示法可參閱第三章。在printf函數中還可以在格式控制串內出現非格式控制字元,這時在顯示屏幕上將原文照印。參數表中給出了輸入或輸出的量。當有多個量時,用逗號間隔。例如:
printf("sine of %lf is %lf\n",x,s);
其中%lf為格式字元,表示按雙精度浮點數處理。它在格式串中兩次現,對應了x和s兩個變數。其餘字元為非格式字元則照原樣輸出在屏幕上
int max(int a,int b);
main(){
int x,y,z;
printf("input two numbers:\n");scanf("%d%d",&x,&y);
z=max(x,y);
printf("maxmum=%d",z);
}
int max(int a,int b){
if(a>b)return a;else return b;
}
此函數的功能是輸入兩個整數,輸出其中的大數。
/*函數說明*/
/*主函數*/
/*變數說明*/
/*輸入x,y值*/
/*調用max函數*/
/*輸出*/
/*定義max函數*/
/*把結果返回主調函數*/
上面例中程序的功能是由用戶輸入兩個整數,程序執行後輸出其中較大的數。本程序由兩個函數組成,主函數和max 函數。函數之間是並列關系。可從主函數中調用其它函數。max 函數的功能是比較兩個數,然後把較大的數返回給主函數。max 函數是一個用戶自定義函數。因此在主函數中要給出說明(程序第三行)。可見,在程序的說明部分中,不僅可以有變數說明,還可以有函數說明。關於函數的詳細內容將在第五章介紹。在程序的每行後用/*和*/括起來的內容為注釋部分,程序不執行注釋部分。
上例中程序的執行過程是,首先在屏幕上顯示提示串,請用戶輸入兩個數,回車後由scanf函數語句接收這兩個數送入變數x,y中,然後調用max函數,並把x,y 的值傳送給max函數的參數a,b。在max函數中比較a,b的大小,把大者返回給主函數的變數z,最後在屏幕上輸出z的值。
C源程序的結構特點
1.一個C語言源程序可以由一個或多個源文件組成。
2.每個源文件可由一個或多個函數組成。
3.一個源程序不論由多少個文件組成,都有一個且只能有一個main函數,即主函數。
4.源程序中可以有預處理命令(include 命令僅為其中的一種),預處理命令通常應放在源文件或源程序的最前面。
5.每一個說明,每一個語句都必須以分號結尾。但預處理命令,函數頭和花括弧「}」之後不能加分號。
6.標識符,關鍵字之間必須至少加一個空格以示間隔。若已有明顯的間隔符,也可不再加空格來間隔。
書寫程序時應遵循的規則
從書寫清晰,便於閱讀,理解,維護的角度出發,在書寫程序時 應遵循以下規則:
1.一個說明或一個語句佔一行。
2.用{} 括起來的部分,通常表示了程序的某一層次結構。{}一般與該結構語句的第一個字母對齊,並單獨佔一行。
3.低一層次的語句或說明可比高一層次的語句或說明縮進若干格後書寫。以便看起來更加清晰,增加程序的可讀性。在編程時應力求遵循這些規則,以養成良好的編程風格。
C語言的字元集
字元是組成語言的最基本的元素。C語言字元集由字母,數字,空格,標點和特殊字元組成。在字元常量,字元串常量和注釋中還可以使用漢字或其它可表示的圖形符號。
1.字母 小寫字母a~z共26個,大寫字母A~Z共26個
2.數字 0~9共10個
3.空白符 空格符、製表符、換行符等統稱為空白符。空白符只在字元常量和字元串常量中起作用。在其它地方出現時,只起間隔作用, 編譯程序對它們忽略。因此在程序中使用空白符與否,對程序的編譯不發生影響,但在程序中適當的地方使用空白符將增加程序的清晰性和可讀性。
4.標點和特殊字元
C語言詞彙
在C語言中使用的詞彙分為六類:標識符,關鍵字,運算符,分隔符,常量,注釋符等。
1.標識符
在程序中使用的變數名、函數名、標號等統稱為標識符。除庫函數的函數名由系統定義外,其餘都由用戶自定義。C 規定,標識符只能是字母(A~Z,a~z)、數字(0~9)、下劃線()組成的字元串,並且其第一個字元必須是字母或下劃線。
以下標識符是合法的:
a,x, 3x,BOOK 1,sum5
以下標識符是非法的:
3s 以數字開頭
s*T 出現非法字元*
-3x 以減號開頭
bowy-1 出現非法字元-(減號)
在使用標識符時還必須注意以下幾點:
(1)標准C不限制標識符的長度,但它受各種版本的C 語言編譯系統限制,同時也受到具體機器的限制。例如在某版本C 中規定標識符前八位有效,當兩個標識符前八位相同時,則被認為是同一個標識符。
(2)在標識符中,大小寫是有區別的。例如BOOK和book 是兩個不同的標識符。
(3)標識符雖然可由程序員隨意定義,但標識符是用於標識某個量的符號。因此,命名應盡量有相應的意義,以便閱讀理解,作到「顧名思義」。
2.關鍵字
關鍵字是由C語言規定的具有特定意義的字元串,通常也稱為保留字。用戶定義的標識符不應與關鍵字相同。C語言的關鍵字分為以下幾類:
(1)類型說明符
用於定義、說明變數、函數或其它數據結構的類型。如前面例題中用到的int,double等
(2)語句定義符
用於表示一個語句的功能。如例1.3中用到的if else就是條件語句的語句定義符。
(3)預處理命令字
用於表示一個預處理命令。如前面各例中用到的include。
3.運算符
C語言中含有相當豐富的運算符。運算符與變數,函數一起組成表達式,表示各種運算功能。運算符由一個或多個字元組成。
4.分隔符
在C語言中採用的分隔符有逗號和空格兩種。逗號主要用在類型說明和函數參數表中,分隔各個變數。空格多用於語句各單詞之間,作間隔符。在關鍵字,標識符之間必須要有一個以上的空格符作間隔, 否則將會出現語法錯誤,例如把int a;寫成 inta;C編譯器會把inta當成一個標識符處理,其結果必然出錯。
5.常量
C語言中使用的常量可分為數字常量、字元常量、字元串常量、符號常量、轉義字元等多種。在第二章中將專門給予介紹。
6.注釋符
C 語言的注釋符是以「/*」開頭並以「*/」結尾的串。在「/*」和「*/」之間的即為注釋。程序編譯時,不對注釋作任何處理。注釋可出現在程序中的任何位置。注釋用來向用戶提示或解釋程序的意義。在調試程序中對暫不使用的語句也可用注釋符括起來,使翻譯跳過不作處理,待調試結束後再去掉注釋符。
㈣ c語言編寫的程序在CMD怎麼運行啊
1、首先打開C語言的編譯器,可以選擇Visual Studio、Code::Blocks或者Dev-C++等編譯器軟體。
㈤ c程序編好了不知道怎麼運行,請高手指導一下,小弟不勝感激
運行C程序的具體步驟是生成一個.exe文件,這個文件與你的源代碼功能相同。但是,你剛剛編寫的源代碼是.c文件,需要通過編譯器將它轉換為.exe文件。
你可以選擇多種編譯器進行操作,例如流行的VC/VC++(適用於Windows系統)、dev-c++(同樣適用於Windows系統)、gcc(適用於Linux系統)、eclipse(支持Windows和Linux系統)或TC(早期的DOS環境專用)、專門為學習C語言設計的一些軟體(如易學)等。
編譯器將源代碼通過編譯和鏈接兩個步驟轉換成可執行的.exe文件。編譯過程中可能會遇到編譯時刻錯誤,而在運行過程中可能會遇到運行時刻錯誤,這時你需要修改代碼來糾正這些錯誤。
因此,現在你需要在網上下載一個合適的編譯器或編譯環境。
編譯器的選擇主要取決於你所使用的操作系統。如果你在Windows系統上開發,可以考慮使用VC/VC++或dev-c++;如果你使用Linux系統,則推薦使用gcc。而對於跨平台開發,eclipse是一個不錯的選擇。
下載並安裝好編譯器後,你可以在相應的環境中編寫代碼並進行編譯。在編譯過程中,編譯器會檢查代碼中的錯誤並生成相應的錯誤報告。根據這些報告,你可以找到並修正代碼中的錯誤。之後,你可以再次編譯代碼,直到沒有錯誤為止。
編譯成功後,你將得到一個.exe文件。你可以直接雙擊該文件來運行程序。當然,如果程序需要額外的庫文件或依賴項,你還需要確保這些文件已經正確安裝。
總之,要運行C程序,你需要一個合適的編譯器將源代碼轉換為.exe文件。下載並安裝好編譯器後,通過編譯和調試來修正代碼中的錯誤,最後運行.exe文件即可。