機(jī)電之家資源網(wǎng)
單片機(jī)首頁(yè)|單片機(jī)基礎(chǔ)|單片機(jī)應(yīng)用|單片機(jī)開發(fā)|單片機(jī)文案|軟件資料下載|音響制作|電路圖下載 |嵌入式開發(fā)
培訓(xùn)信息
贊助商
C51語(yǔ)言應(yīng)用編程的若干問題
C51語(yǔ)言應(yīng)用編程的若干問題
 更新時(shí)間:2009-10-26 15:13:12  點(diǎn)擊數(shù):0
【字體: 字體顏色

摘 要   簡(jiǎn)要介紹了Franklin C51交叉編譯器的特點(diǎn),較詳細(xì)地討論了C51語(yǔ)言程序設(shè)計(jì)的基本技巧及其與匯編語(yǔ)言程序的混合編程、中斷處理過程等實(shí)際問題,并給出了相應(yīng)的處理程序。

關(guān)鍵詞   Franklin    C51編譯器    匯編語(yǔ)言     結(jié)構(gòu)化設(shè)計(jì)    模塊    中斷  Franklin    C51編譯器    匯編語(yǔ)言     結(jié)構(gòu)化設(shè)計(jì)    模塊    中斷


    在研制單片機(jī)應(yīng)用系統(tǒng)時(shí),匯編語(yǔ)言是一種常用的軟件工具。它能直接操作硬件,指令的執(zhí)行速度快。但其指令系統(tǒng)的固有格式受硬件結(jié)構(gòu)的限制很大,且難于編寫與調(diào)試,可移植性也差。隨著單片機(jī)硬件性能的提高,其工作速度越來越快,因此在編寫單片機(jī)應(yīng)用系統(tǒng)程序時(shí),更著重于程序本身的編寫效率。而Franklin C51交叉編譯器是專為80C51系列單片機(jī)設(shè)計(jì)的一種高效的C語(yǔ)言編譯器,使用它可以縮短開發(fā)周期,降低開發(fā)成本,而且開發(fā)出的系統(tǒng)易于維護(hù),可靠性高,可移植性好,即使在代碼的使用效率上,也完全可以和匯編語(yǔ)言相比,因此目前它已成為開發(fā)80C51系列單片機(jī)的流行工具。

1 C51語(yǔ)言程序設(shè)計(jì)的基本技巧

    C語(yǔ)言是一種高級(jí)程序設(shè)計(jì)語(yǔ)言,它提供了十分完備的規(guī)范化流程控制結(jié)構(gòu)。因此采用C51語(yǔ)言設(shè)計(jì)單片機(jī)應(yīng)用系統(tǒng)程序時(shí),首先要盡可能地采用結(jié)構(gòu)化的程序設(shè)計(jì)方法,這樣可使整個(gè)應(yīng)用系統(tǒng)程序結(jié)構(gòu)清晰,易于調(diào)試和維護(hù)。對(duì)于一個(gè)較大的程序,可將整個(gè)程序按功能分成若干個(gè)模塊,不同的模塊完成不同的功能。對(duì)于不同的功能模塊,分別指定相應(yīng)的入口參數(shù)和出口參數(shù),而經(jīng)常使用的一些程序最好編成函數(shù),這樣既不會(huì)引起整個(gè)程序管理的混亂,還可增強(qiáng)可讀性,移植性也好。

    在程序設(shè)計(jì)過程中,要充分利用C51語(yǔ)言的預(yù)處理命令。對(duì)于一些常用的常數(shù),如TRUE,F(xiàn)ALSE,PI以及各種特殊功能寄存器,或程序中一些重要的依據(jù)外界條件可變的常量,可采用宏定義"#define"或集中起來放在一個(gè)頭文件中進(jìn)行定義,再采用文件包含命令"#include"將其加入到程序中去。這樣當(dāng)需要修改某個(gè)參量時(shí),只須修改相應(yīng)的包含文件或宏定義,而不必對(duì)使用它們的每個(gè)程序文件都作修改,從而有利于文件的維護(hù)和更新,F(xiàn)舉例說明如下:

    例1 對(duì)于不同的單片機(jī)晶振,程序取不同的延時(shí)時(shí)間,而且可根據(jù)外界條件的變化修改延時(shí)時(shí)間的長(zhǎng)短。對(duì)于這樣的程序,可利用宏定義和條件編譯來實(shí)現(xiàn)。程序如下:

#define     flag 1
#ifdef     flag==1
   #define  fosc  6M
  delay=10;
#elif     flag = = 0
#define   fosc    8M
  delay=12;
#else
#define    fosc   12M
  delay=20;
#endif
main()
{
for(I=0;I<delay;I++);
}

    這樣源程序不作任何修改就可適用于不同時(shí)鐘頻率的單片機(jī)系統(tǒng),并可根據(jù)情況的不同取不同的delay值,完成不同的目的。

2 C51語(yǔ)言與匯編語(yǔ)言程序的混合編程

    C51編譯器能對(duì)C語(yǔ)言源程序進(jìn)行高效率的編譯,生成高效簡(jiǎn)潔的代碼,在絕大多數(shù)場(chǎng)合采用C語(yǔ)言編程即可完成預(yù)期的目的。但有時(shí)為了編程直觀或某些特殊地址的處理,還須采用一定的匯編語(yǔ)言編程。而在另一些場(chǎng)合,出于某種目的,匯編語(yǔ)言也可調(diào)用C語(yǔ)言。在這種混合編程中,關(guān)鍵是參數(shù)的傳遞和函數(shù)的返回值。它們必須有完整的約定,否則數(shù)據(jù)的交換就可能出錯(cuò)。下面就以力源公司的10位串行A/D轉(zhuǎn)換器TLC1549 為例說明C語(yǔ)言程序與匯編語(yǔ)言程序的調(diào)用。

圖1 TLC1549管腳圖

    1549的管腳圖和時(shí)序圖分別如圖1和圖2所示,假定DATA OUT接P1.0,CS   接P1.1,CLOCK接P1.2。
1549的具體特性請(qǐng)查閱有關(guān)資料。

 

圖2 TLC1549時(shí)序圖

    例2 C語(yǔ)言程序與匯編語(yǔ)言程序的調(diào)用,其子程序如下:

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
NOP
CLR P1.2
DJNZ R0,RR0
ACALL DELAY
MOV 30H,R6     ;A/D轉(zhuǎn)換的高
              ;兩位保存在R6中
ACALL CIR
MOV R6,30H
SETB P1.2
NOP
CLR P1.2
MOV 30H,R6
ACALL CIR
MOV R6,30H
MOV R0,#8     ;A/D轉(zhuǎn)換的低
             ;8位保存在R7中
   RR2: SETB P1.2
NOP
CLR P1.2
MOV 30H,R7
ACALL CIR
MOV R7,30H
DJNZ R0,RR2
RET
   CIR: CLR C
MOV C,P1.0
MOV A,30H
RLC A
MOV 30H,A
RET
END

    在以上程序中,函數(shù)的返回值為一無符號(hào)整型數(shù),根據(jù)調(diào)用規(guī)則,返回值的高位必須在R6中,低位在R7中,這樣才可保證數(shù)據(jù)的傳遞不出錯(cuò)。另外,在調(diào)用過程中,必須注意寄存器的入棧。這樣在以后用到A/D轉(zhuǎn)換時(shí),在C語(yǔ)言中調(diào)用匯編語(yǔ)言子程序AD()即可。 

3 C51中斷處理過程

    C51編譯器支持在C源程序中直接開發(fā)中斷過程,因此減輕了使用匯編語(yǔ)言的繁瑣工作,提高了開發(fā)效率。中斷服務(wù)函數(shù)的完整語(yǔ)法如下:

    void 函數(shù)名(void)[模式]
    [再入]interrupt n [using r]

    其中n(0~31)代表中斷號(hào)。C51編譯器允許32個(gè)中斷,具體使用哪個(gè)中斷由80C51系列的芯片決定。r(0~3)代表第r組寄存器。在調(diào)用中斷函數(shù)時(shí),要求中斷過程調(diào)用的函數(shù)所使用的寄存器組必須與其相同。"再入"用于說明中斷處理函數(shù)有無"再入"能力。C51編譯器及其對(duì)C語(yǔ)言的擴(kuò)充允許編程者對(duì)中斷所有方面的控制和寄存器組的使用。這種支持能使編程者創(chuàng)建高效的中斷服務(wù)程序,用戶只須在C語(yǔ)言下關(guān)心中斷和必要的寄存器組切換操作。

    例3 設(shè)單片機(jī)的fosc=12MHz,要求用T0的方式1編程,在P1.0腳輸出周期為2ms的方波。

    用C語(yǔ)言編寫的中斷服務(wù)程序如下:

#include <reg51.h>
sbit P1_0=P1^0;
void timer0(void)interrupt 1 using 1 {
     /*T0中斷服務(wù)程序入口*/
P1_0=!P1_0;
TH0=-(1000/256);      /*計(jì)數(shù)初值重裝*/
TL0=-(1000%256);
}
void main(void)
{
TMOD=0x01;     /*T0工作在定時(shí)器方式1*/
P1_0=0;
TH0=-(1000/256);     /*預(yù)置計(jì)數(shù)初值*/
TL0=-(1000%256);
EA=1;            /*CPU開中斷*/
ET0=1;           /*T0開中斷*/
TR0=1;           /*啟動(dòng)T0*/
do{}while(1);
}

  在編寫中斷服務(wù)程序時(shí)必須注意不能進(jìn)行參數(shù)傳遞,不能有返回值。

4 結(jié)論

    C51編譯器不但可以縮短單片機(jī)控制系統(tǒng)的開發(fā)周期,而且易于調(diào)試和維護(hù)。此外,C51語(yǔ)言還有許多強(qiáng)大的功能,如提供豐富的庫(kù)函數(shù)供用戶直接調(diào)用,完整的編譯控制指令為程序調(diào)試提供必要的符號(hào)信息等等?傊珻51語(yǔ)言是廣大單片機(jī)開發(fā)人員的強(qiáng)有力的工具。

  • 上一篇: DS18B20智能溫度控制器
  • 下一篇: 沒有了
  • 發(fā)表評(píng)論   告訴好友   打印此文  收藏此頁(yè)  關(guān)閉窗口  返回頂部
    熱點(diǎn)文章
     
    推薦文章
     
    相關(guān)文章
    網(wǎng)友評(píng)論:(只顯示最新5條。)
    關(guān)于我們 | 聯(lián)系我們 | 廣告合作 | 付款方式 | 使用幫助 | 機(jī)電之家 | 會(huì)員助手 | 免費(fèi)鏈接

    點(diǎn)擊這里給我發(fā)消息66821730(技術(shù)支持)點(diǎn)擊這里給我發(fā)消息66821730(廣告投放) 點(diǎn)擊這里給我發(fā)消息41031197(編輯) 點(diǎn)擊這里給我發(fā)消息58733127(審核)
    本站提供的機(jī)電設(shè)備,機(jī)電供求等信息由機(jī)電企業(yè)自行提供,該企業(yè)負(fù)責(zé)信息內(nèi)容的真實(shí)性、準(zhǔn)確性和合法性。
    機(jī)電之家對(duì)此不承擔(dān)任何保證責(zé)任,有侵犯您利益的地方請(qǐng)聯(lián)系機(jī)電之家,機(jī)電之家將及時(shí)作出處理。
    Copyright 2007 機(jī)電之家 Inc All Rights Reserved.機(jī)電之家-由機(jī)電一體化網(wǎng)更名-聲明
    電話:0571-87774297 傳真:0571-87774298
    杭州濱興科技有限公司提供技術(shù)支持

    主辦:杭州市高新區(qū)(濱江)機(jī)電一體化學(xué)會(huì)
    中國(guó)行業(yè)電子商務(wù)100強(qiáng)網(wǎng)站

    網(wǎng)站經(jīng)營(yíng)許可證:浙B2-20080178-1