?? i5_5_01_01.htm
字號:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>MC51程序庫</title>
<meta name="GENERATOR" content="Microsoft FrontPage 3.0">
<meta name="Microsoft Theme" content="none"><meta name="Microsoft Border" content="tlb, default"></head>
<body><!--msnavigation--><table border="0" cellpadding="0" cellspacing="0" width="100%"><tr><td>
<!--msnavigation--></table><!--msnavigation--><table border="0" cellpadding="0" cellspacing="0" width="100%"><tr><td valign="top" width="1%">
<p style="line-height: 2">
<applet code="fphover.class" codebase="_fpclass/" width="150" height="30">
<param name="text" value="電子文摘">
<param name="color" value="#008000">
<param name="hovercolor" value="#0000FF">
<param name="textcolor" value="#FFFFFF">
<param name="effect" value="glow">
<param name="url" value="newpage1.htm" valuetype="ref">
<param name="font" value="Dialog">
<param name="fontstyle" value="bold">
<param name="fontsize" value="18">
<param name="bgcolor" value="#008000">
</applet>
</p>
<p style="line-height: 2">
<applet code="fphover.class" codebase="_fpclass/" width="150" height="30">
<param name="text" value="電子設計BBS">
<param name="color" value="#008000">
<param name="hovercolor" value="#0000FF">
<param name="textcolor" value="#FFFFFF">
<param name="effect" value="glow">
<param name="url" value="newpage8.htm" valuetype="ref">
<param name="font" value="Dialog">
<param name="fontstyle" value="bold">
<param name="fontsize" value="18">
<param name="bgcolor" value="#008000">
</applet>
</p>
<p style="line-height: 2">
<applet code="fphover.class" codebase="_fpclass/" width="150" height="30">
<param name="text" value="印制板設計">
<param name="color" value="#008000">
<param name="hovercolor" value="#0000FF">
<param name="textcolor" value="#FFFFFF">
<param name="effect" value="glow">
<param name="url" value="newpage2.htm" valuetype="ref">
<param name="font" value="Dialog">
<param name="fontstyle" value="bold">
<param name="fontsize" value="18">
<param name="bgcolor" value="#008000">
</applet>
</p>
<p style="line-height: 2">
<applet code="fphover.class" codebase="_fpclass/" width="150" height="30">
<param name="text" value="EDA軟件應用">
<param name="color" value="#008000">
<param name="hovercolor" value="#0000FF">
<param name="textcolor" value="#FFFFFF">
<param name="effect" value="glow">
<param name="url" value="newpage3.htm" valuetype="ref">
<param name="font" value="Dialog">
<param name="fontstyle" value="bold">
<param name="fontsize" value="18">
<param name="bgcolor" value="#008000">
</applet>
</p>
<p style="line-height: 2">
<applet code="fphover.class" codebase="_fpclass/" width="150" height="30">
<param name="text" value="電路入門">
<param name="color" value="#008000">
<param name="hovercolor" value="#0000FF">
<param name="textcolor" value="#FFFFFF">
<param name="effect" value="glow">
<param name="url" value="newpage4.htm" valuetype="ref">
<param name="font" value="Dialog">
<param name="fontstyle" value="bold">
<param name="fontsize" value="18">
<param name="bgcolor" value="#008000">
</applet>
</p>
<p style="line-height: 2">
<applet code="fphover.class" codebase="_fpclass/" width="150" height="30">
<param name="text" value="單片機應用">
<param name="color" value="#008000">
<param name="hovercolor" value="#0000FF">
<param name="textcolor" value="#FFFFFF">
<param name="effect" value="glow">
<param name="url" value="newpage5.htm" valuetype="ref">
<param name="font" value="Dialog">
<param name="fontstyle" value="bold">
<param name="fontsize" value="18">
<param name="bgcolor" value="#008000">
</applet>
</p>
<p style="line-height: 2">
<applet code="fphover.class" codebase="_fpclass/" width="150" height="30">
<param name="text" value="軟件下載">
<param name="color" value="#008000">
<param name="hovercolor" value="#0000FF">
<param name="textcolor" value="#FFFFFF">
<param name="effect" value="glow">
<param name="url" value="newpage7.htm" valuetype="ref">
<param name="font" value="Dialog">
<param name="fontstyle" value="bold">
<param name="fontsize" value="18">
<param name="bgcolor" value="#008000">
</applet>
</p>
<p style="line-height: 2">
<applet code="fphover.class" codebase="_fpclass/" width="150" height="30">
<param name="text" value="實用電路">
<param name="color" value="#008000">
<param name="hovercolor" value="#0000FF">
<param name="textcolor" value="#FFFFFF">
<param name="effect" value="glow">
<param name="url" value="newpage6.htm" valuetype="ref">
<param name="font" value="Dialog">
<param name="fontstyle" value="bold">
<param name="fontsize" value="18">
<param name="bgcolor" value="#008000">
</applet>
</p>
<p style="line-height: 2">
<applet code="fphover.class" codebase="_fpclass/" width="150" height="30">
<param name="text" value="器件與應用">
<param name="color" value="#008000">
<param name="hovercolor" value="#0000FF">
<param name="textcolor" value="#FFFFFF">
<param name="effect" value="glow">
<param name="url" value="newpage18.htm" valuetype="ref">
<param name="font" value="Dialog">
<param name="fontstyle" value="bold">
<param name="fontsize" value="18">
<param name="bgcolor" value="#008000">
</applet>
</p>
<p style="line-height: 2">
<applet code="fphover.class" codebase="_fpclass/" width="150" height="30">
<param name="text" value="留言簿">
<param name="color" value="#008000">
<param name="hovercolor" value="#0000FF">
<param name="textcolor" value="#FFFFFF">
<param name="effect" value="glow">
<param name="url" value="http://member.shangdu.net/home1/azhu/guestbook.htm" valuetype="ref">
<param name="font" value="Dialog">
<param name="fontstyle" value="bold">
<param name="fontsize" value="18">
<param name="bgcolor" value="#008000">
</applet>
</p>
</td><td valign="top" width="24"></td><!--msnavigation--><td valign="top">
<font FACE="宋體" SIZE="3">
<p ALIGN="center"></font><font FACE="宋體" size="4"><strong>《MCS-51單片機實用子程序庫(96年版)》</strong></p>
</font><font FACE="宋體" SIZE="3">
<p ALIGN="right">周 航 慈</p>
<p ALIGN="JUSTIFY">
目前已有若干版本的子程序庫公開發表,它們各有特色。筆者在1988年也編制了兩個子程序庫(定點子程序庫和浮點子程序庫),并在相容性、透明性、容錯性和算法優化方面作了一些工作。本程序庫中的開平方算法為筆者研究的快速逼近算法,它能達到牛頓迭代法同樣的精度,而速度加快二十倍左右,超過雙字節定點除法的速度。經過八年來全國廣大用戶的實際使用,反饋了不少信息,陸續擴充了一些新的子程序,糾正了一些隱含錯誤,成為現在這個最新版本。</p>
<p ALIGN="JUSTIFY">本子程序庫對《單片機應用程序設計技術》一書附錄中的子程序庫作了重大修訂:</p>
<p ALIGN="JUSTIFY">(1)按當前流行的以 IBM PC
為主機的開發系統對匯編語言的規定,將原子程序庫的標號和位地址進行了調整,讀者不必再進行修改,便可直接使用。</p>
<p ALIGN="JUSTIFY">(2)對浮點運算子程序庫進行了進一步的測試和優化,對十進制浮點數和二進制浮點數的相互轉換子程序進行了徹底改寫,提高了運算精度和可靠性。</p>
<p ALIGN="JUSTIFY">(3)新增添了若干個浮點子程序(傳送、比較、清零、判零等),使編寫數據處理程序的工作變得更簡單直觀。</p>
<p ALIGN="JUSTIFY">在使用說明中開列了最主要的幾項:標號、入口條件、出口信息、影響資源、堆棧需求,各項目的意義請參閱《單片機應用程序設計技術》第六章
6.3.7
節的內容。程序清單中開列了四個欄目:標號、指令、操作數、注釋。為方便讀者理解,注釋盡力詳細。</p>
<p ALIGN="JUSTIFY">子程序庫的使用方法如下:</p>
<p ALIGN="JUSTIFY">1.將子程序庫全部內容鏈接在應用程序之后,統一編譯即可。優點是簡單方便,缺點是程序太長,大量無關子程序也包含在其中。</p>
<p ALIGN="JUSTIFY">2.僅將子程序庫中的有關部分內容鏈接在應用程序之后,統一編譯即可。有些子程序需要調用一些低級子程序,這些低級子程序也應該包含在內。優點是程序緊湊,缺點是需要對子程序庫進行仔細刪節。</p>
<p ALIGN="JUSTIFY">(一) MCS-51定點運算子程序庫及其使用說明 </p>
<p ALIGN="JUSTIFY">定點運算子程序庫文件名為DQ51.ASM,為便于使用,先將有關約定說明如下:</p>
<p ALIGN="JUSTIFY">1.多字節定點操作數:用[R0]或[R1]來表示存放在由R0或R1指示的連續單元中的數</p>
<p ALIGN="JUSTIFY">據。地址小的單元存放數據的高字節。例如:[R0]=123456H,若(R0)=30H,則(30H)=12H,</p>
<p ALIGN="JUSTIFY">(31H)=34H,(32H)=56H。</p>
<p ALIGN="JUSTIFY">2.運算精度:單次定點運算精度為結果最低位的當量值。</p>
<p ALIGN="JUSTIFY">3.工作區:數據工作區固定在PSW、A、B、R2~R7,用戶只要不在工作區中存放無關的或非消耗性的信息,程序就具有較好的透明性。</p>
<p ALIGN="JUSTIFY"> </p>
<p ALIGN="JUSTIFY">(1) 標號: BCDA 功能:多字節BCD碼加法</p>
<p ALIGN="JUSTIFY">入口條件:字節數在R7中,被加數在[R0]中,加數在[R1]中。</p>
<p ALIGN="JUSTIFY">出口信息:和在[R0]中,最高位進位在CY中。</p>
<p ALIGN="JUSTIFY">影響資源:PSW、A、R2 堆棧需求: 2字節</p>
<p ALIGN="JUSTIFY"> </p>
<p ALIGN="JUSTIFY">BCDA: MOV A,R7 ;取字節數至R2中</p>
<p ALIGN="JUSTIFY">MOV R2,A</p>
<p ALIGN="JUSTIFY">ADD A,R0 ;初始化數據指針</p>
<p ALIGN="JUSTIFY">MOV R0,A</p>
<p ALIGN="JUSTIFY">MOV A,R2</p>
<p ALIGN="JUSTIFY">ADD A,R1</p>
<p ALIGN="JUSTIFY">MOV R1,A</p>
<p ALIGN="JUSTIFY">CLR C</p>
<p ALIGN="JUSTIFY">BCD1: DEC R0 ;調整數據指針</p>
<p ALIGN="JUSTIFY">DEC R1</p>
<p ALIGN="JUSTIFY">MOV A,@R0</p>
<p ALIGN="JUSTIFY">ADDC A,@R1 ;按字節相加</p>
<p ALIGN="JUSTIFY">DA A ;十進制調整</p>
<p ALIGN="JUSTIFY">MOV @R0,A ;和存回[R0]中</p>
<p ALIGN="JUSTIFY">DJNZ R2,BCD1 ;處理完所有字節</p>
<p ALIGN="JUSTIFY">RET</p>
<p ALIGN="JUSTIFY"> </p>
<p ALIGN="JUSTIFY">(2) 標號: BCDB 功能:多字節BCD碼減法</p>
<p ALIGN="JUSTIFY"> </p>
<p ALIGN="JUSTIFY">入口條件:字節數在R7中,被減數在[R0]中,減數在[R1]中。</p>
<p ALIGN="JUSTIFY">出口信息:差在[R0]中,最高位借位在CY中。</p>
<p ALIGN="JUSTIFY">影響資源:PSW、A、R2、R3 堆棧需求: 6字節</p>
<p ALIGN="JUSTIFY"> </p>
<p ALIGN="JUSTIFY">BCDB: LCALL NEG1 ;減數[R1]十進制取補</p>
<p ALIGN="JUSTIFY">LCALL BCDA ;按多字節BCD碼加法處理</p>
<p ALIGN="JUSTIFY">CPL C ;將補碼加法的進位標志轉換成借位標志</p>
<p ALIGN="JUSTIFY">MOV F0,C ;保護借位標志</p>
<p ALIGN="JUSTIFY">LCALL NEG1 ;恢復減數[R1]的原始值</p>
<p ALIGN="JUSTIFY">MOV C,F0 ;恢復借位標志</p>
<p ALIGN="JUSTIFY">RET</p>
<p ALIGN="JUSTIFY">NEG1: MOV A,R0 ;[R1]十進制取補子程序入口</p>
<p ALIGN="JUSTIFY">XCH A,R1 ;交換指針</p>
<p ALIGN="JUSTIFY">XCH A,R0</p>
<p ALIGN="JUSTIFY">LCALL NEG ;通過[R0]實現[R1]取補</p>
<p ALIGN="JUSTIFY">MOV A,R0</p>
<p ALIGN="JUSTIFY">XCH A,R1 ;換回指針</p>
<p ALIGN="JUSTIFY">XCH A,R0</p>
<p ALIGN="JUSTIFY">RET</p>
<p ALIGN="JUSTIFY"> </p>
<p ALIGN="JUSTIFY">(3) 標號: NEG 功能:多字節BCD碼取補</p>
<p ALIGN="JUSTIFY"> </p>
<p ALIGN="JUSTIFY">入口條件:字節數在R7中,操作數在[R0]中。</p>
<p ALIGN="JUSTIFY">出口信息:結果仍在[R0]中。</p>
<p ALIGN="JUSTIFY">影響資源:PSW、A、R2、R3 堆棧需求: 2字節</p>
<p ALIGN="JUSTIFY"> </p>
<p ALIGN="JUSTIFY">NEG: MOV A,R7 ;取(字節數減一)至R2中</p>
<p ALIGN="JUSTIFY">DEC A</p>
<p ALIGN="JUSTIFY">MOV R2,A</p>
<p ALIGN="JUSTIFY">MOV A,R0 ;保護指針</p>
<p ALIGN="JUSTIFY">MOV R3,A</p>
<p ALIGN="JUSTIFY">NEG0: CLR C </p>
<p ALIGN="JUSTIFY">MOV A,#99H</p>
<p ALIGN="JUSTIFY">SUBB A,@R0 ;按字節十進制取補</p>
<p ALIGN="JUSTIFY">MOV @R0,A ;存回[R0]中</p>
<p ALIGN="JUSTIFY">INC R0 ;調整數據指針</p>
<p ALIGN="JUSTIFY">DJNZ R2,NEG0 ;處理完(R2)字節</p>
<p ALIGN="JUSTIFY">MOV A,#9AH ;最低字節單獨取補</p>
<p ALIGN="JUSTIFY">SUBB A,@R0</p>
<p ALIGN="JUSTIFY">MOV @R0,A</p>
<p ALIGN="JUSTIFY">MOV A,R3 ;恢復指針</p>
<p ALIGN="JUSTIFY">MOV R0,A</p>
<p ALIGN="JUSTIFY">RET</p>
<p ALIGN="JUSTIFY"> </p>
<p ALIGN="JUSTIFY">(4) 標號: BRLN
功能:多字節BCD碼左移十進制一位(乘十)</p>
<p ALIGN="JUSTIFY"> </p>
<p ALIGN="JUSTIFY">入口條件:字節數在R7中,操作數在[R0]中。</p>
<p ALIGN="JUSTIFY">出口信息:結果仍在[R0]中,移出的十進制最高位在R3中。</p>
<p ALIGN="JUSTIFY">影響資源:PSW、A、R2、R3 堆棧需求: 2字節</p>
<p ALIGN="JUSTIFY"> </p>
<p ALIGN="JUSTIFY">BRLN: MOV A,R7 ;取字節數至R2中</p>
<p ALIGN="JUSTIFY">MOV R2,A</p>
<p ALIGN="JUSTIFY">ADD A,R0 ;初始化數據指針</p>
<p ALIGN="JUSTIFY">MOV R0,A</p>
<p ALIGN="JUSTIFY">MOV R3,#0 ;工作單元初始化</p>
<p ALIGN="JUSTIFY">BRL1: DEC R0 ;調整數據指針</p>
<p ALIGN="JUSTIFY">MOV A,@R0 ;取一字節</p>
<p ALIGN="JUSTIFY">SWAP A ;交換十進制高低位</p>
<p ALIGN="JUSTIFY">MOV @R0,A ;存回</p>
<p ALIGN="JUSTIFY">MOV A,R3 ;取低字節移出的十進制高位</p>
<p ALIGN="JUSTIFY">XCHD A,@R0 ;換出本字節的十進制高位</p>
<p ALIGN="JUSTIFY">MOV R3,A ;保存本字節的十進制高位</p>
<p ALIGN="JUSTIFY">DJNZ R2,BRL1 ;處理完所有字節</p>
<p ALIGN="JUSTIFY">RET</p>
<p ALIGN="JUSTIFY"> </p>
<p ALIGN="JUSTIFY">(5) 標號: MULD
功能:雙字節二進制無符號數乘法</p>
<p ALIGN="JUSTIFY"> </p>
<p ALIGN="JUSTIFY">入口條件:被乘數在R2、R3中,乘數在R6、R7中。</p>
<p ALIGN="JUSTIFY">出口信息:乘積在R2、R3、R4、R5中。</p>
<p ALIGN="JUSTIFY">影響資源:PSW、A、B、R2~R7 堆棧需求: 2字節</p>
<p ALIGN="JUSTIFY"> </p>
<p ALIGN="JUSTIFY">MULD: MOV A,R3 ;計算R3乘R7</p>
<p ALIGN="JUSTIFY">MOV B,R7</p>
<p ALIGN="JUSTIFY">MUL AB</p>
<p ALIGN="JUSTIFY">MOV R4,B ;暫存部分積</p>
<p ALIGN="JUSTIFY">MOV R5,A</p>
<p ALIGN="JUSTIFY">MOV A,R3 ;計算R3乘R6</p>
<p ALIGN="JUSTIFY">MOV B,R6</p>
<p ALIGN="JUSTIFY">MUL AB</p>
<p ALIGN="JUSTIFY">ADD A,R4 ;累加部分積</p>
<p ALIGN="JUSTIFY">MOV R4,A</p>
<p ALIGN="JUSTIFY">CLR A</p>
<p ALIGN="JUSTIFY">ADDC A,B</p>
<p ALIGN="JUSTIFY">MOV R3,A</p>
<p ALIGN="JUSTIFY">MOV A,R2 ;計算R2乘R7</p>
<p ALIGN="JUSTIFY">MOV B,R7</p>
<p ALIGN="JUSTIFY">MUL AB</p>
<p ALIGN="JUSTIFY">ADD A,R4 ;累加部分積</p>
<p ALIGN="JUSTIFY">MOV R4,A</p>
<p ALIGN="JUSTIFY">MOV A,R3</p>
<p ALIGN="JUSTIFY">ADDC A,B</p>
<p ALIGN="JUSTIFY">MOV R3,A</p>
<p ALIGN="JUSTIFY">CLR A</p>
<p ALIGN="JUSTIFY">RLC A</p>
<p ALIGN="JUSTIFY">XCH A,R2 ;計算R2乘R6</p>
<p ALIGN="JUSTIFY">MOV B,R6</p>
<p ALIGN="JUSTIFY">MUL AB</p>
<p ALIGN="JUSTIFY">ADD A,R3 ;累加部分積</p>
<p ALIGN="JUSTIFY">MOV R3,A</p>
<p ALIGN="JUSTIFY">MOV A,R2</p>
<p ALIGN="JUSTIFY">ADDC A,B</p>
<p ALIGN="JUSTIFY">MOV R2,A</p>
<p ALIGN="JUSTIFY">RET</p>
<p ALIGN="JUSTIFY"> </p>
<p ALIGN="JUSTIFY">(6) 標號: MUL2
功能:雙字節二進制無符號數平方</p>
<p ALIGN="JUSTIFY"> </p>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -