<li id="8g3ty"><tbody id="8g3ty"><th id="8g3ty"></th></tbody></li>
    <label id="8g3ty"><samp id="8g3ty"></samp></label>
  • <span id="8g3ty"></span>

    1. <center id="8g3ty"><optgroup id="8g3ty"></optgroup></center>
    2. <bdo id="8g3ty"><meter id="8g3ty"><bdo id="8g3ty"></bdo></meter></bdo><center id="8g3ty"><optgroup id="8g3ty"></optgroup></center>
      <label id="8g3ty"><samp id="8g3ty"></samp></label>

    3. 電子開(kāi)發(fā)網(wǎng)

      電子開(kāi)發(fā)網(wǎng)電子設(shè)計(jì) | 電子開(kāi)發(fā)網(wǎng)Rss 2.0 會(huì)員中心 會(huì)員注冊(cè)
      搜索: 您現(xiàn)在的位置: 電子開(kāi)發(fā)網(wǎng) >> 電子開(kāi)發(fā) >> 單片機(jī) >> 正文

      c語(yǔ)言在單片機(jī)開(kāi)發(fā)中的應(yīng)用

      作者:佚名    文章來(lái)源:本站原創(chuàng)    點(diǎn)擊數(shù):    更新時(shí)間:2011-2-19

      單片機(jī)的開(kāi)發(fā)應(yīng)用中,已逐漸開(kāi)始引入高級(jí)語(yǔ)言,C語(yǔ)言就是其中的一種。對(duì)用慣了匯編的人來(lái)說(shuō),總覺(jué)得高級(jí)語(yǔ)言可控性不好,不如匯編那樣隨心所欲。但是只要我們掌握了一定的C語(yǔ)言知識(shí),有些東西還是容易做出來(lái)的,以下是筆者實(shí)際工作中遇到的幾個(gè)問(wèn)題,希望對(duì)初學(xué)C51者有所幫助。

      一、C51熱啟動(dòng)代碼的編制

      對(duì)于工業(yè)控制計(jì)算機(jī),往往設(shè)有有看門(mén)狗電路,當(dāng)看門(mén)狗動(dòng)作,使計(jì)算機(jī)復(fù)位,這就是熱啟動(dòng)。熱啟動(dòng)時(shí),一般不允許從頭開(kāi)始,這將導(dǎo)致現(xiàn)有的已測(cè)量到或計(jì)算到的值復(fù)位,導(dǎo)致系統(tǒng)工作異常。因而在程序必須判斷是熱啟動(dòng)還是冷啟動(dòng),常用的方法是:確定某內(nèi)存單位為標(biāo)志位(0x7f位和0x7e),啟動(dòng)時(shí)首先讀該內(nèi)存單元的內(nèi)容,如果它等于一個(gè)特定的值(例如兩個(gè)內(nèi)存單元的都是0xaa),就認(rèn)為是熱啟動(dòng),否則就是冷啟動(dòng),程序執(zhí)行初始化部份,并將0xaa賦與這兩個(gè)內(nèi)存單元。

      根據(jù)以上的設(shè)計(jì)思路,編程時(shí),設(shè)置一個(gè)指針,讓其指向特定的內(nèi)存單元如0x7f,然后在程序中判斷,程序如下:

      void main()

      {char data *HotPoint=(char *)0x7f;

      if((*HotPoint==0xaa)&&(*(--HotPoint)==0xaa))

      {/*熱啟動(dòng)的處理*/

      }

      else

      {HotPoint=0x7e;/*冷啟動(dòng)的處進(jìn)

      *HotPoint=0xaa;

      *(++HotPoint)=0xaa;

      }

      }

      然而實(shí)際調(diào)試中發(fā)現(xiàn),無(wú)論是熱啟動(dòng)還是冷啟動(dòng),開(kāi)機(jī)后所有內(nèi)存單元的值都被復(fù)位為0,當(dāng)然也實(shí)現(xiàn)不了熱啟動(dòng)的要求。這是為什么呢?原來(lái),用C語(yǔ)言編程時(shí),開(kāi)機(jī)時(shí)執(zhí)行的代碼并非是從main()函數(shù)的第一句語(yǔ)句開(kāi)始的,在main()函數(shù)的第一句語(yǔ)句執(zhí)行前要先執(zhí)行一段起始代碼。正是這段代碼執(zhí)行了清零的工作。C編譯程序提供了這段起始代碼的源程序,名為CSTARTUP.A51,打開(kāi)這個(gè)文件,可以看到如下代碼:

      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

      可見(jiàn),在執(zhí)行到判斷是否熱啟動(dòng)的代碼之前,起始代碼已將所有內(nèi)存單元清零。如何解決這個(gè)問(wèn)題呢?好在啟動(dòng)代碼是可以更改的,方法是:修改startup.a51源文件,然后用編譯程序所附帶的a51.exe程序?qū)?/FONT>startup.a51編譯,得到startup.obj文件,然后用這段代碼代替原來(lái)的起始代碼。具體步驟是(設(shè)C源程序名為HOTSTART.C):

      1. 修改startup.a51源文件(這個(gè)文件在C51\LIB目錄下)
      2. 執(zhí)行如下命令:
      3. A51 startup.a51 得到startup.obj文件。將此文件拷入HOTSTART.C所在目錄

      4. 將編好的C源程序用C51.EXE編譯好,得到目標(biāo)文件HOTSTART.OBJ。
      5. L51 HOTSTART, STARTUP.OBJ 命令連接,得到絕對(duì)目標(biāo)文件HOTSTART
      6. OHS51 HOTSTART 得到HOTSTART.HEX文件,即可。

      對(duì)于startup.a51的修改,根據(jù)自已的需要進(jìn)行,如將IDATALEN EQU 80H中的80H改為70H,就可以使6F7F16字節(jié)內(nèi)存不被清零。

      二、直接調(diào)用EPROM中已固化的程序

      筆者用的仿真機(jī),由6位數(shù)碼管顯示,在內(nèi)存DE00H處放顯示子程序,只要將要顯示的數(shù)放入顯示緩沖區(qū),然后調(diào)用這個(gè)子程序就可以使用了,匯編指令為:

      LCALL 0DEOOH

      在用C語(yǔ)言編程時(shí),如何實(shí)現(xiàn)這一功能呢?C語(yǔ)言中有指向函數(shù)的指針這一概念,可以利用這種指針來(lái)實(shí)現(xiàn)用函數(shù)指針調(diào)用函數(shù)。指向函數(shù)的指針變量的定義格式為:

      類型標(biāo)識(shí)符 (*指針變量名)();

      在定義好指針后就可以給指針變量賦值,使其指向某個(gè)函數(shù)的開(kāi)始存地址,然后用

      (*指針變量名)()即可調(diào)用這個(gè)函數(shù)。如下例:

      void main(void)

      {

      void (*DispBuffer)();

      DispBuffer=0xde00;

      for(;;)

      {Key();

      DispBuffer();

      }

      }

      三、將浮點(diǎn)數(shù)轉(zhuǎn)化為字符數(shù)組

      筆者在編制應(yīng)用程序時(shí)有這樣的要求:將運(yùn)算的結(jié)果(浮點(diǎn)數(shù))存入EEPROM中。我們知道,浮點(diǎn)數(shù)在C語(yǔ)言中是以IEEE格式存儲(chǔ)的,一個(gè)浮點(diǎn)數(shù)占用四個(gè)字節(jié),例如浮點(diǎn)數(shù)34.526存為(160,26,10,66)這四個(gè)數(shù)。要將一個(gè)浮點(diǎn)數(shù)存入EEPROM,實(shí)際上就是要存這四個(gè)數(shù)。那么如何在程序中得到一個(gè)浮點(diǎn)數(shù)的組成數(shù)呢?

      浮點(diǎn)數(shù)在存儲(chǔ)時(shí),是存儲(chǔ)連續(xù)的字節(jié)中的,只要設(shè)法找到存儲(chǔ)位置,就可以得到這些數(shù)了?梢远x一個(gè)void的指針,將此指針指向需要存儲(chǔ)的浮點(diǎn)數(shù),然后將此指針強(qiáng)制轉(zhuǎn)化為char型,這樣,利用指針就可以得到組成該浮點(diǎn)數(shù)的各個(gè)字節(jié)的值了。具體程序如下:

      #define uchar unsigned char#define uint unsigned intvoid FtoC(void)

      {float a;

      uchar i,*px

      uchar x[4]; /*定義字符數(shù)組,準(zhǔn)備存儲(chǔ)浮點(diǎn)數(shù)的四個(gè)字節(jié)*、

      void *pf;

      px=x;

      pf=&a;

      a=34.526;

      for(i=0;i<4;i++)

      {*(px+i)=*((char *)pf+i);

      }

      }

      如果已將數(shù)存入EEPROM,要將其取出合并,方法也是一樣,可參考下面的程序。

      #define uchar unsigned char#define uint unsigned int

      void CtoF(void)

      {float a;

      uchar i,*px

      uchar x[4]={56,180,150,73};

      void *pf;

      px=x;

      pf=&a;

      for(i=0;i<4;i++)

      {*((char *)pf+i)=*(px+i);

      }

      }

      以上所用C語(yǔ)言為FRANKLIN C51 VER 3.2。

      本文發(fā)表于《電子報(bào)》

      Tags:c語(yǔ)言,單片機(jī)開(kāi)發(fā),應(yīng)用  
      責(zé)任編輯:admin
      請(qǐng)文明參與討論,禁止漫罵攻擊,不要惡意評(píng)論、違禁詞語(yǔ)。 昵稱:
      1分 2分 3分 4分 5分

      還可以輸入 200 個(gè)字
      [ 查看全部 ] 網(wǎng)友評(píng)論
      主站蜘蛛池模板: 亚洲综合色自拍一区| 天天综合天天做天天综合| 久久久久久久综合综合狠狠 | 天天做天天爱天天爽综合网 | 亚洲av永久中文无码精品综合| 亚洲国产综合AV在线观看| 久久久久综合中文字幕 | 97久久久精品综合88久久| 色综久久天天综合绕视看| 亚洲伊人久久综合影院| 久久综合给久久狠狠97色| 国产成人亚洲综合a∨| 一本一道久久精品综合| 八区精品色欲人妻综合网| 奇米综合四色77777久久| 狠狠久久综合伊人不卡| 国产综合一区二区| 国产成人久久综合热| 色综合综合色综合色综合| 久久综合九色综合91| 五月综合色婷婷影院在线观看| 色狠狠色狠狠综合天天| 久久综合综合久久| 麻豆精品久久精品色综合| 久久婷婷综合中文字幕| 久久综合综合久久97色| 综合无码一区二区三区| 精品久久久久久综合日本| 狠狠综合久久AV一区二区三区| 中文字幕亚洲综合久久菠萝蜜 | 亚洲乱码中文字幕综合| 亚洲熟女乱综合一区二区| 热久久综合这里只有精品电影| 亚洲综合久久久久久中文字幕| 亚洲婷婷综合色高清在线| 久久婷婷综合色丁香五月| 久久亚洲综合色一区二区三区| 国产一级a爱做综合| 偷自拍视频区综合视频区| 伊人狠狠色丁香综合尤物| 亚洲综合校园春色|