51編譯器為什麼不能添加C文件
1. KEIL C51的編譯連接問題
字面意思是未解析的外部符號,你沒把包含外部變數的c文件放在同一文件夾下,或者說你沒把那個文件添加到工程。我剛測試完,就是這個問題
啊對了,如果還有問題可以網路hi我,我每天都會看。很喜歡單片機設計,願意一起研究
2. 為什麼在KEIL中C文件不能添加到工程裡面
因為你的項目中已經添加了這個C文件,所以,KEIL就不讓你重復添加了。
你可以看一下項目的文件樹,裡面應該能看到這個文件。
3. 看很多單片機的頭文件里寫著 extern "c",這是什麼意思另外,51單片機可不可以用C++編寫程序
我們的C語言有個進化版,叫C++,這個想必樓主知道,Keil
MDK是支持C++編程的,也就是說,你可以用C語言或者C++寫你的程序,都可以。
但是,有一個問題,就是頭文件的問題,C語言寫的頭文件C++是不認識的,需要轉換一下,這個轉換的方法就是加上extern
"C"
#ifdef
__cplusplus
extern
"C"
{
}
這句話意思是,如果你定義了「__cplusplus」這個宏,說明你的意圖是想在C++文件中調用這個頭文件,我前頭說了,C語言的頭文件C++是不認識的,怎麼辦呢,就加上
extern
"C"
{。。。。。}
告訴C++文件,大括弧裡面的東西是用C語言寫的,然後C++文件就認識了,就能調用這個頭文件里的東西了,
extern
"C"
{
}
的存在,使得C語言和C++能更好的結合的一塊。
另外,樓主的問題是錯誤的,不管什麼單片機,他們只識別二進制語言,至於你的高級語言用什麼編寫,那要看你的編譯或者編輯環境支持與否,比如ARM,可以扶持C,C++,而C51編譯器並不支持C++,所以C51編譯器只能把C語言翻譯成最終的二進制語言,不能翻譯C++
4. 51單片機C語言程序頭文件問題
REG51內部規定的SFR寄存器的地址與INTEL MCS-8051單片機的相同,即任何一種型號的51單片機都有的基本SFR,REG52則是對REG51進行擴充,增加了T2和DPTR1。因此可以認為REG51是REG52的子集,此外對於不同廠家生產的51單片機,如AT89S52、W78E58等都有自己相應的SFR定義頭文件。
5. 51單片機C語言問題
這個程序有2個重要錯誤
//第一個
雖然不知道你的鎖存晶元是什麼。
注意看這里 你的程序:
u1=1; //U1 鎖存晶元 使能 打開
P0=cbw[shi]; //送 十位段選數據
u1=0; //U1 鎖存晶元 使能 關閉 U1 鎖存十位段選數據
P0=0xff; //防混亂 (這句不能理解)
u2=1; //U2 鎖存晶元 使能 打開
P0=0xfe; //U2 鎖存 位選數據 1111 1110
u2=0; ////U2 鎖存晶元 使能 關閉 U2 鎖存位選數據
cc(5); //延時
u1=1; //U1 鎖存晶元 使能 打開
P0=cbw[ge]; //送 個位段選數據
u1=0; //U1 鎖存晶元 使能 關閉 U1 鎖存個位段選數據
P0=0xff; //防混亂 (這句不能理解)
u2=1; //U2 鎖存晶元 使能 打開
P0=0xfd; //U2 鎖存 位選數據 1111 1010
u2=0; ////U2 鎖存晶元 使能 關閉 U2 鎖存位選數據
cc(5); //延時
如果我的理解沒錯的話 看下面程序:
u1=1; //U1 鎖存晶元 使能 打開
P0=cbw[shi]; //送 十位段選數據
u1=0; //U1 鎖存晶元 使能 關閉 U1 鎖存十位段選數據
u2=1; //U2 鎖存晶元 使能 打開
P0=0xfe; //U2 鎖存 位選數據 1111 1110
u2=0; ////U2 鎖存晶元 使能 關閉 U2 鎖存位選數據
cc(5); //延時 //滯留下顯示數據 增加亮度
//以上 正常 顯示了 十位
//接下來我們清 U2 選中數據為 下一個段 做准備
//為啥要清除 U2的數據呢 若 在下一個段 送完顯示數據之前 上一個段的位選任然有效 是不是 下一個段的數據 顯示在了上一個段 所以我們進行清除
u2 = 1;
P0 = 0xFF;//位選都不選中
u2 = 0;
//接下來是下一位的顯示
u1=1; //U1 鎖存晶元 使能 打開
P0=cbw[ge]; //送 個位段選數據
u1=0; //U1 鎖存晶元 使能 關閉 U1 鎖存個位段選數據
u2=1; //U2 鎖存晶元 使能 打開
P0=0xfd; //U2 鎖存 位選數據 1111 1010
u2=0; ////U2 鎖存晶元 使能 關閉 U2 鎖存位選數據
cc(5); //延時
u2 = 1;
P0 = 0xFF;//位選都不選中
u2 = 0;
//以上是數碼管顯示驅動的問題, 程序結構不合理,要多多參看寫系統性的大程序,提高程序結構水平 這個由你以後自己學習 這里不做多解釋 這是你第一個問題
//第二個是 main 寫成了 mian 所以編譯器報錯 這個問題你自己要多多注意
6. keil5添加c文檔的問題
那是因為,你保存這個程序文件時,所起的文件名就是TXT型的。
估計你不是用keil5裡面新建的程序文件吧?而是在文件夾下,點右鍵新建的文件。
因為,對於windows操作系統,文件的擴展名都隱藏的,即那個TXT是隱藏的,需要改系統的設置,顯示出擴展名才能改擴展名的。
你不知道怎麼設置也不要緊。打開keil 5後,新建一個文件,打字輸入程序,然後保存,起文件名時,一定要帶 .C 。如:main.c ,這樣,就不會是TXT型的程序文件了。
7. keil c51添加工程模塊C文件的問題
錯誤顯示為定義了多個同名公共變數,我估計可能是你在main.c開頭把頭文件包含的變數聲明又寫了一遍,導致出錯了,把main 中的多餘的變數聲明刪除試試
8. 51單片機中匯編語言如何調用C的子程序
我的程序是KEIL編譯的,如下
先申明
EXTRN CODE (_Send_CRC) ;Send_CRC是C中的函數,匯編中加了_
調用的時候
LCALL _Send_CRC
如果要使用C中的變數,那麼CODE變成相應的DATA,XDATA等
9. 51單片機,如何建立多C文件,
1. 模塊化編程的原則:
模塊化編程通常要遵循以下幾個原則:
每一個c文件對應一個同名的h頭文件
一個h文件伴隨相應c文件存在,頭文件是為了聲明對外公開的介面。如果一個c文件不需要對外公布任何介面,則其就不應當存在,除非它是程序的入口,如main函數所在的文件,同時main函數所在文件可以沒有對應的頭文件。如有一個led.c,那應該同時製作一個led.h頭文件。
頭文件中適合放置介面的聲明,不適合放置實現
頭文件是模塊的對外的介面,供外部程序調用。頭文件中應放置對外部的聲明,如對外提供的函數聲明、宏定義、變數類型聲明等。函數的實現、變數的賦值、語句的操作等決不能放在頭文件中。因為頭文件的功能是向外提供介面,譬如函數,變數,具體如何實現是在c文件中進行,頭文件僅是進行了描述聲明。
任意一個c文件只要使用了其他c文件提供的介面,都要同時包含其對應的頭文件,每個c文件應該頭文件自包含
任意一個c文件只要使用了其他c文件提供的介面,都要將其對應的頭文件包含到該c文件中,沒有使用到其他c文件的介面就不應該將其匹配的頭文件包含,並且每個c文件都應該包含自己的頭文件。
防止頭文件被重復包含
避免一個頭文件被重復包含,通常使用條件編譯命令#ifndef--#endif,如下示例:
示例1:
#ifndef TIME_H
#define TIME_H
……
#endif
示例2:
#ifndef LED_H
#define LED_H
……
#endif
其中#define FILENAME_H為基本格式,FILENAME_H為頭文件名稱,但要全部使用大寫形式,使用單下劃線後緊跟一個H表明是頭文件。不要在宏名最前面加上「_"或「__」,即使用FILENAME_H代替_FILENAME_H_,因為一般以"_"和」__"開頭的標識符為系統保留或者標准庫使用。
10. 51單片機KEIL如何建立多個C文件及注意事項
只管建就是了,建了之後要有頭文件引導,並且一定要將這些源文件添加到工程中