2006-05-11 10:01:56
c51語言應用程式設計的若干問題
摘 要簡要介紹了franklin c51交叉編譯器的特點,較詳細地討論了c51語言程式設計的基本技巧及其與組合語言程式的混合程式設計、中斷處理過程等實際問題,並給出了相應的處理程式。
在研製微控制器應用系統時,組合語言是一種常用的軟體工具。它能直接操作硬體,指令的執行速度快。但其指令系統的固有格式受硬體結構的限制很大,且難於編寫與除錯,可移植性也差。隨著微控制器硬體效能的提高,其工作速度越來越快,因此在編寫微控制器應用系統程式時,更著重於程式本身的編寫效率。而franklin c51交叉編譯器是專為80c51系列微控制器設計的一種高效的c語言編譯器,使用它可以縮短開發周期,降低開發成本,而且開發出的系統易於維護,可靠性高,可移植性好,即使在**的使用效率上,也完全可以和組合語言相比,因此目前它已成為開發80c51系列微控制器的流行工具。
1 c51語言程式設計的基本技巧
c語言是一種高階程式語言,它提供了十分完備的規範化流程控制結構。因此採用c51語言設計微控制器應用系統程式時,首先要盡可能地採用結構化的程式設計方法,這樣可使整個應用系統程式結構清晰,易於除錯和維護。對於乙個較大的程式,可將整個程式按功能分成若干個模組,不同的模組完成不同的功能。對於不同的功能模組,分別指定相應的入口引數和出口引數,而經常使用的一些程式最好編成函式,這樣既不會引起整個程式管理的混亂,還可增強可讀性,移植性也好。
在程式設計過程中,要充分利用c51語言的預處理命令。對於一些常用的常數,如true,false,pi以及各種特殊功能暫存器,或程式中一些重要的依據外界條件可變的常量,可採用巨集定義"#define"或集中起來放在乙個標頭檔案中進行定義,再採用檔案包含命令"#include"將其加入到程式中去。這樣當需要修改某個參量時,只須修改相應的包含檔案或巨集定義,而不必對使用它們的每個程式檔案都作修改,從而有利於檔案的維護和更新。現舉例說明如下:
例1 對於不同的微控制器晶振,程式取不同的延時時間,而且可根據外界條件的變化修改延時時間的長短。對於這樣的程式,可利用巨集定義和條件編譯來實現。程式如下:
#define flag 1這樣源程式不作任何修改就可適用於不同時鐘頻率的微控制器系統,並可根據情況的不同取不同的delay值,完成不同的目的。#ifdef flag==1
#define fosc 6m
delay=10;
#elif flag = = 0
#define fosc 8m
delay=12;
#else
#define fosc 12m
delay=20;
#endif
main()
2 c51語言與組合語言程式的混合程式設計
c51編譯器能對c語言源程式進行高效率的編譯,生成高效簡潔的**,在絕大多數場合採用c語言程式設計即可完成預期的目的。但有時為了程式設計直觀或某些特殊位址的處理,還須採用一定的組合語言程式設計。而在另一些場合,出於某種目的,組合語言也可呼叫c語言。在這種混合程式設計中,關鍵是引數的傳遞和函式的返回值。它們必須有完整的約定,否則資料的交換就可能出錯。下面就以力源公司的10位序列a/d轉換器tlc1549 為例說明c語言程式與組合語言程式的呼叫。
圖1 tlc1549管腳圖
1549的管腳圖和時序圖分別如圖1和圖2所示,假定data out接p1.0,cs 接p1.1,clock接p1.2。
1549的具體特性請查閱有關資料。
圖2 tlc1549時序圖
例2 c語言程式與組合語言程式的呼叫,其子程式如下:
在以上程式中,函式的返回值為一無符號整型數,根據呼叫規則,返回值的高位必須在r6中,低位在r7中,這樣才可保證資料的傳遞不出錯。另外,在呼叫過程中,必須注意暫存器的入棧。這樣在以後用到a/d轉換時,在c語言中呼叫組合語言子程式ad()即可。public ad ;入口位址
seg_ad segment code ;程式段
rseg seg_ad
using 0
ad:
mov r6,#00
mov r7,#00
setb p1.1
acall delay
clr p1.1
acall delay
mov r0,#10
rr0:
setb p1.2
nopclr p1.2
djnz r0,rr0
acall delay
mov 30h,r6 ;a/d轉換的高
;兩位儲存在r6中
acall cir
mov r6,30h
setb p1.2
nopclr p1.2
mov 30h,r6
acall cir
mov r6,30h
mov r0,#8 ;a/d轉換的低
;8位儲存在r7中
rr2:
setb p1.2
nopclr p1.2
mov 30h,r7
acall cir
mov r7,30h
djnz r0,rr2
retcir:
clr c
mov c,p1.0
mov a,30h
rlc a
mov 30h,a
retend
3 c51中斷處理過程
c51編譯器支援在c源程式中直接開發中斷過程,因此減輕了使用組合語言的繁瑣工作,提高了開發效率。中斷服務函式的完整語法如下:
void 函式名(void)[模式]
[再入]interrupt n [using r]
其中n(0~31)代表中斷號。c51編譯器允許32個中斷,具體使用哪個中斷由80c51系列的晶元決定。r(0~3)代表第r組暫存器。在呼叫中斷函式時,要求中斷過程呼叫的函式所使用的暫存器組必須與其相同。"再入"用於說明中斷處理函式有無"再入"能力。c51編譯器及其對c語言的擴充允許程式設計者對中斷所有方面的控制和暫存器組的使用。這種支援能使程式設計者建立高效的中斷服務程式,使用者只須在c語言下關心中斷和必要的暫存器組切換操作。
例3 設微控制器的fosc=12mhz,要求用t0的方式1程式設計,在p1.0腳輸出週期為2ms的方波。
用c語言編寫的中斷服務程式如下:
#include在編寫中斷服務程式時必須注意不能進行引數傳遞,不能有返回值。sbit p1_0=p1^0;
void timer0(void)interrupt 1 using 1
void main(void)
while(1);
}
4 結論
c51編譯器不但可以縮短微控制器控制系統的開發周期,而且易於除錯和維護。此外,c51語言還有許多強大的功能,如提供豐富的庫函式供使用者直接呼叫,完整的編譯控制指令為程式除錯提供必要的符號資訊等等。總之,c51語言是廣大微控制器開發人員的強有力的工具。
C 網路程式設計 UDP應用程式設計簡介
udp user datagram protocol,使用者資料報協議 是乙個簡單的 面向資料報的無連線協議,提供了快速但不一定可靠的傳輸服務。位於system.net.sockets命名空間下 udpclient類提供了傳送和接收無連線的udp資料報的方便的方法。封裝了底層的套接字,並分別提供了對...
linux應用程式設計中的非同步IO
前面有提到io的多路復用,解決了阻塞式訪問的困境。這裡再介紹一種解決方法 非同步io 1 非同步io的實現原理很想硬體上的中斷。非同步io就是作業系統用軟體實現的一套中斷響應系統,工作方法是當前程序註冊乙個非同步io事件 使用signal註冊乙個訊號sigio的處理函式 然後當前程序可以正常處理自己...
基於C 的Qt(二)GUI應用程式設計基礎
字尾為 pro 的檔案是專案的管理檔案,檔名就是專案的名稱。專案管理檔案用於記錄專案的一些設定,以及專案包含檔案的組織管理。字尾為 ui 的檔案是視覺化設計的窗體的定義檔案,如widget.ui。雙擊專案檔案目錄樹中的檔案widget.ui,會開啟乙個整合在qt creator中的qt design...