1:C51編譯器如何區分位地址和位元組地址
是靠預定義實現的,比如:sfr P0 = 0x80; sbit P0_0 = 0x80;前者聲明了P0埠地址位於0x80,後者說明了P0埠的bit0,即P0.0位於位地址空間0x80處。這2個0x80具有完全不同的含義,靠關鍵字sfr和sbit來區別。這樣當程序被編譯時,編譯器會依此編譯成相應的匯編語言。例如:
C51語句: P0 = 1;
P0聲明為sfr,因此編譯成:mov 80h,01h,將把0x01數據送入0x80單元,由於0x80單元物理上對應P0埠,因此,P0.0腳將輸出高電平(其實是呈現高阻態,P0口獨有的),其他.1-.7腳輸出低電平。
C51語句: P0_0 = 1;
P0_0聲明為sbit,因此編譯成:setb 80h,這將把位地址空間的0x80地址的bit的值置1。這個位正是P0口的bit0,執行後,P0.0將輸出高阻態。而P0.1-.7不會變化。
2:C51為什麼要嵌套匯編
51單片機一個顯著優點就是指令執行時間固定,因此可以適應時序要求嚴格的場合。例如符合ISO7816協議的cpu卡的讀寫,對時序要求比較嚴格。其實就是用io腳做出來的同步半雙工串口。支持cpu卡的程序一般比較龐大,需要用c51來組織,但是由於c編譯的不確定性,必須把底層程序封裝成匯編語言模塊嵌入到工程中。這就帶來幾個問題:如何聲明函數、參數如何傳遞等。限於篇幅,不能說得很細。下面舉例:
匯編程序單獨保存一個文件,加入到工程中,函數如下:
_proc_a:
mov a, r7
inc a
mov r7, a
ret
用c語言在.h文件中聲明: extern unsigned char proc_a(unsigned char val);
調用時形如: retvalue = proc_a(0x11);
說明:
a:匯編程序如果帶參數,則需要在匯編程序前多加一個下劃線。而聲明它的地方不用加(偉福編譯器這么要求的)。
b:函數的形參中第一參數用R7傳遞,函數返回值用R7返回,這是C51的通用規范。其他參數都有相應規定。函數可以返回一個位,用psw的c位返回。c:上面的語句,執行順序是把0x11給R7,然後跳轉子程序,子程序將它加1後送回。
d:函數跳轉到匯編程序時,本區的R0-R7,A,B,PSW,DPTR等寄存器可以供子程序使用,不必考慮調用後是否要恢復這些常規資源。上例中,A的值被函數使用了,編程者不必恢復調用前的值。
Ⅱ 51單片機 C語言編程
首先要明確單片機的埠名稱一般都是規定好了的(參考該單片機的datasheet);
其次,要給某個埠賦值(1或0),還是給埠組(8位單片機一個組八個腳)賦值,這就是按位操作還是按位元組操作的問題。例如:單片機有PA口,PB口,其中PA口有PA0~PA7八個腳,拉高PA口(PA = 0XFF;),拉高PA0腳(PA &=0X01;或者PA0 = 1; )。當然有些單片機是通過讀寫IO口輸入輸出寄存器來實現的。
再者,RTX,TDX兩個腳應該是通信的腳,與通用IO口為復用的腳,要怎麼用,怎麼發送數據、接收數據就涉及到通信協議了,不同通信方式,工作方式就不一樣了,具體(參考該單片機的datasheet)。
建議先仔細閱讀單片機的datasheet和該單片機的編程指南(如果有的話)
希望能解決你的疑問
Ⅲ 51單片機C語言開發與實例的目錄
第1章MCS-51單片機與C語言
1.1MCS-51單片機的特點
1.1.1MCS-51單片機簡介
1.1.2MCS-51單片機的內部結構
1.1.3MCS-51單片機的存儲器組織
1.2匯編語言
1.3C語言
1.4單片機匯編語言與C語言程序設計對照
1.5匯編語言和C語言混合編程
1.5.1在C51中嵌入匯編
1.5.2C程序中調用匯編功能程序
1.5.3匯編程序調用C程序
第2章KeilC51的數據結構
2.1KeilC51
2.2數據類型
2.3存儲種類及存儲區
2.3.1整型常量
2.3.2字元型常量
2.3.3字元串常量
2.3.4位標量
2.4變數
2.4.1變數的定義
2.4.2存儲器類型
2.4.3存儲器模式
2.4.4重新定義數據類型
2.5數組
2.6指針
2.7結構
2.8聯合
2.9枚舉
第3章KeilC51程序設計
3.1預處理
3.2運算符與表達式
3.3控制流語句
3.3.1條件語句
3.3.2while循環
3.3.3do-while循環
3.3.4for循環
3.3.5goto語句
3.3.6switch語句
3.3.7Break語句和continue語句
3.3.8返回語句return
3.4函數
3.4.1定義函數
3.4.2調用函數
3.4.3中斷服務函數
3.4.4函數的遞歸調用與再入函數
第4章KeilC51集成開發環境
4.1KeilC51安裝
4.2μVision3集成開發環境
4.3μVision3的欄目和窗口
4.4創建項目
4.5簡單的程序調試
4.6含有多個文件的項目
4.7代碼優化
4.8技巧和竅門
4.9KeilC編譯器常見警告與錯誤信息的解決方法
第5章用KeilC51開發8051單片機內部資源
5.1用KeilC51開發輸入/輸出埠
5.1.1輸入/輸出埠簡介
5.1.2輸出埠應用實例
5.1.3輸入埠實例
5.2用KeilC51開發定時器/計數器
5.2.1定時器/計數器簡介
5.2.2控制和狀態寄存器
5.2.3定時器/計數器設置實例
5.2.4定時器/計數器2
5.2.5編程實例
5.3中斷系統編程
5.3.1中斷系統
5.3.2中斷系統的控制寄存器
5.3.3中斷的響應過程
5.3.4中斷實例
5.4用KeilC51開發串列口
5.4.1數據通信的基本概念
5.4.2MCS-51的串列口控制寄存器
5.4.3工作方式
5.4.4數據傳輸率的確定
5.4.5串列通信實例
第6章單片機的資源擴展
第7章8051單片機的系統設計
第8章8051單片機程序固化方法
第9章單片機的斷電保護
第10章單片機與PC機通信
第11章在系統編程和在應用中編程
第12章單片機之間的通信
第13章I2C匯流排介面技術
第14章用C51開發線切割機床控制器
第15章步進電機驅動
第16章紅外器件應用
附錄AMCS-51指令表
附錄BKeilC51的庫函數
Ⅳ 51單片機c語言編程
對埠輸出操作,直接適用賦值語句即可。 比如 P1 = 0x03;
對埠讀取操作,直接賦值給局部變數即可。
對數碼管操作,需要先定義 對應的 碼表, Tab[16] = {, }分別對應 0~F 的埠輸出值、點亮相應的LED位; 然後直接 操作埠輸出對應字元即可,比如P1=Tab[3] 數碼管輸出顯示3
Ⅳ (1小時學會C語言51單片機)C語言入門教程
51作為學習入門,確實是最最基礎的了,不過至少它可以讓一個新手明白控制是怎麼回事,反饋是怎麼回事,程序是怎麼下載進去運行,又是怎麼控制到io輸入輸出的,如何去訪問寄存器,掌握一套在嵌入式領悟最最基本的開發方法和學習思路。這部分如果有興趣,建議學習時間不要超過兩個月。
1.c語言,及部分匯編代碼
2.用一個月時間看完做完郭天祥的十天學會51單片機
3.買一塊開發板
4.學習能夠看懂看會原理圖
5.掌握搜集資料,datasheet查找閱讀英文手冊的能力
6.自己動手動手動手做一個簡單的功能
最後,我其實不建議51入門,可以直接stm32,雖然他還是單片機。不過十年前我當初也是51入門的,樂此不疲。至於忽悠你什麼協議,內核,我覺得讓一個大一嵌入式新手學這些,無疑沒有基礎就想建高樓,所以踏踏實實從基礎開始,大學就是注重基礎,學習能力!
Ⅵ at89c51單片機 如何用c語言編程啊
隨著單片機硬體性能的提高,編寫應用程序更著重於程序本身的效率。
Franklin或KEII.C51交叉編譯器是專為51系列單片機設計的一種高效的C語言編譯器,用其開發的應用程序易於維護,可移植性好,是目前較流行的51系列單片機的開發工具。
一、C51語言程序設計的基本技巧
首先,C51語言程序設計要盡可能採用結構化的設計方法。可將整個程序按功能分成若干個模塊,不同的模塊完成不同的功能。對於不同的功能模塊,分別指定相應的入口參數和出口參數,而經常使用的一些程序最好編成函數,這樣既不會引起整個程序管理的混亂,還可使程序的可讀性、移植性增強。
C51語言的主程序結構:
#include
main0{while(1);}
這是最小的C程序,包括頭部文件和程序主體。頭部文件為引用的外部資源文件,包括硬體信息和外部模塊提供的可使用的函數和變數的說明。
語句定義後,就可以在C語言程序中像匯編一樣使用這些硬體設備。
在C5l中常用項目來管理,項目一般分為C文件塊和頭部文件塊,常把不同的功能寫在不同的C文件中,依靠項目的管理,最後把所有文件連接起來,這樣就可以得到燒錄的HEX文件或BIN文件。沒有在頭部文件中列出的文件,可以算是該C文件的內部函數和變數,外部C不能使用。另外,在程序設計過程中要充分利用C51語言的預處理命令。
對於一些常用的常數,如TRUE、FAlSE、PI,以及各種特殊功能寄存器,或程序中一些重要的依據外界條件可變的常量,可採用宏定義(#de-fine)或集中起來放在一個頭文件中進行定義,再採用文件包含命令(#in-elude)將其加入到程序中,這樣當需要修改某個參量時,只需修改相應的包含文件或宏定義,而不必對使用它們的每個程序文件都進行修改,有利於文件的維護和更新。
舉例:利用宏定義和條件編譯,源程序不作任何修改就可適用於不同時鍾頻率的單片機系統,並可根據情況的不同取不同的delay值,完成不同的目的。程序如下:
#define flag 1#ifdef flag==l#define fose 6Mdelay=10;#elif flag==0#define fose 8Mdelay=12;#else#define fosc 12Mdelay=20;#endiFMain0{ for(I=O;l