?? mcs-51單片機實用子程序庫.txt
字號:
接口技術的基本知識
CPU 與外部設備、存儲器的連接和數據交換都需要通過接口設備來實現,前者被稱為I/O接口,而后者則被稱為存儲器接口。存儲器通常在CPU的同步控制下工作,接口電路比較簡單;而I/O設備品種繁多,其相應的接口電路也各不相同,因此,習慣上說到接口只是指I/O接口。
一、I/0接口的概念
1.接口的分類
I/O接口的功能是負責實現CPU通過系統總線把I/O電路和 外圍設備聯系在一起,按照電路和設備的復雜程度,I/O接口的硬件主要分為兩大類:
1)I/O接口芯片
這些芯片大都是集成電路,通過CPU輸入不同的命令和參數,并控制相關的I/O電路和簡單的外設作相應的操作,常見的接口芯片如定時/計數器、中斷控制器、DMA控制器、并行接口等。
2)I/O接口控制卡
有若干個集成電路按一定的邏輯組成為一個部件,或者直接與CPU同在主板上,或是一個插件插在系統總線插槽上。
按照接口的連接對象來分,又可以將他們分為串行接口、并行接口、鍵盤接口和磁盤接口等。
2.接口的功能
由于計算機的外圍設備品種繁多,幾乎都采用了機電傳動設備,因此,CPU在與I/O設備進行數據交換時存在以下問題:
速度不匹配:I/O設備的工作速度要比CPU慢許多,而且由于種類的不 同,他們之間的速度差異也很大,例如硬盤的傳輸速度就要比打印機快出很多。
時序不匹配:各個I/O設備都有自己的定時控制電路,以自己的速度傳 輸數據,無法與CPU的時序取得統一。
信息格式不匹配:不同的I/O設備存儲和處理信息的格式不同,例如可以分為串行和并行兩種;也可以分為二進制格式、ACSII編碼和BCD編碼等 。
信息類型不匹配:不同I/O設備采用的信號類型不同,有些是數字信號,而 有些是模擬信號,因此所采用的處理方式也不同。
基于以上原因,CPU與外設之間的數據交換必須通過接口來完成,通常接口有以下一些功能:
1)設置數據的寄存、緩沖邏輯,以適應CPU與外設之間的速度差異,接口通常由一些寄存器或RAM芯片組成,如果芯片足夠大還可以實現批量數據的傳輸;
2)能夠進行信息格式的轉換,例如串行和并行的轉換;
3)能夠協調CPU和外設兩者在信息的類型和電平的差異,如電平轉換驅動器、數/模或模/數轉換器等;
4)協調時序差異;
5)地址譯碼和設備選擇功能;
6)設置中斷和DMA控制邏輯,以保證在中斷和DMA允許的情況下產生中斷和DMA請求信號,并在接受到中斷和DMA應答之后完成中斷處理和DMA傳輸。
3.接口的控制方式
CPU通過接口對外設進行控制的方式有以下幾種:
1)程序查詢方式
這種方式下,CPU通過I/O指令詢問指定外設當前的狀態,如果外設準備就緒,則進行數據的輸入或輸出,否則CPU等待,循環查詢。
這種方式的優點是結構簡單,只需要少量的硬件電路即可,缺點是由于CPU的速度遠遠高于外設,因此通常處于等待狀態,工作效率很低。
2)中斷處理方式
在這種方式下,CPU不再被動等待,而是可以執行其他程序,一旦外設為數據交換準備就緒,可以向CPU提出服務請求,CPU如果響應該請求,便暫時停止當前程序的執行,轉去執行與該請求對應的服務程序,完成后,再繼續執行原來被中斷的程序。
中斷處理方式的優點是顯而易見的,它不但為CPU省去了查詢外設狀態和等待外設就緒所花費的時間,提高了CPU的工作效率,還滿足了外設的實時要求。但需要為每個I/O設備分配一個中斷請求號和相應的中斷服務程序,此外還需要一個中斷控制器(I/O接口芯片)管理I/O設備提出的中斷請求,例如設置中斷屏蔽、中斷請求優先級等。
此外,中斷處理方式的缺點是每傳送一個字符都要進行中斷,啟動中斷控制器,還要保留和恢復現場以便能繼續原程序的執行,花費的工作量很大,這樣如果需要大量數據交換,系統的性能會很低。
3)DMA(直接存儲器存取)傳送方式
DMA最明顯的一個特點是它不是用軟件而是采用一個專門的控制器來控制內存與外設之間的數據交流,無須CPU介入,大大提高CPU的工作效率。
在進行DMA數據傳送之前,DMA控制器會向CPU申請總線控制 權,CPU如果允許,則將控制權交出,因此,在數據交換時,總線控制權由DMA控制器掌握,在傳輸結束后,DMA控制器將總線控制權交還給CPU。
二、常見接口
1.并行接口
目前,計算機中的并行接口主要作為打印機端口,接口使用的不再是36針接頭而是25針D形接頭。所謂“并行”,是指8位數據同時通過并行線進行傳送,這樣數據傳送速度大大提高,但并行傳送的線路長度受到限制,因為長度增加,干擾就會增加,容易出錯。
現在有五種常見的并口:4位、8位、半8位、EPP和ECP,大多數PC機配有4位或8位的并口,許多利用Intel386芯片組的便攜機配有EPP口,支持全部IEEE1284并口規格的計算機配有ECP并口。
標準并行口4位、8位、半8位:
4位口一次只能輸入4位數據,但可以輸出8位數據;8位口可以一次輸入和輸出8位數據;半8位也可以。
EPP口(增強并行口):由Intel等公司開發,允許8位雙向數據傳送,可以連接各種非打印機設備,如掃描儀、LAN適配器、磁盤驅動器和CDROM 驅動器等。
ECP口(擴展并行口):由Microsoft、HP公司開發,能支持命令周期、數據周期和多個邏輯設備尋址,在多任務環境下可以使用DMA(直接存儲器 訪問)。
目前幾乎所有的586機的主板都集成了并行口插座,標注為 Paralle1或LPT1,是一個26針的雙排針插座。
2.串行接口
計算機的另一種標準接口是串行口,現在的PC機一般至少有兩個串行口COM1和COM2。串行口不同于并行口之處在于它的數據和控制信息是一位接一位串行地傳送下去。這樣,雖然速度會慢一些,但傳送距離較并行口更長,因此長距離的通信應使用串行口。通常COM1使用的是9針D形連接器,而COM2有些使用的是老式的DB25針連接器。
3.磁盤接口
1)IDE接口
IDE接口也叫做ATA端口,只可以接兩個容量不超過528M的硬盤驅動器,接口的成本很低,因此在386、486時期非常流行。但大多數IDE接口不支持DMA數據傳送,只能使用標準的PCI/O端口指令來傳送所有的命令、狀態、數據。幾乎所有的586主板上都集成了兩個40針的雙排針IDE接口插座,分別標注為IDE1和IDE2。
2)EIDE接口
EIDE接口較IDE接口有了很大改進,是目前最流行的接口。
首先,它所支持的外設不再是2個而是4個了,所支持的設備除了硬盤,還包括CD-ROM驅動器磁盤備份設備等。
其次,EIDE標準取消了528MB的限制,代之以8GP限制。
第三,EIDE有更高的數據傳送速率,支持PIO模式3和模式4標準。
4.SCSI接口
SCSI(SmallComputerSystemInterface)小計算機系統接口,在做圖形處理和網絡服務的計算機中被廣泛采用SCSI接口的硬盤。除了硬盤以外,SCSI接口還可以連接CD-ROM驅動器、掃描儀和打印機等,它具有以下特點:
*可同時連接7個外設;
*總線配置為并行8位、16位或32位;
*允許最大硬盤空間為8.4GB(有些已達到9.09GB);
*更高的數據傳輸速率,IDE是2MB每秒,SCSI通常可以達到5MB每秒,FASTSCSI(SCSI-2)能達到10MB每秒,最新的SCSI-3甚至能夠達到40MB每秒,而EIDE最高只能達到16.6MB每秒;
*成本較IDE和EIDE接口高很多,而且,SCSI接口硬盤必須和SCSI接口卡配合使用,SCSI接口卡也比IED和EIDE接口貴很多。
*SCSI接口是智能化的,可以彼此通信而不增加CPU的負擔。在IDE和EIDE設備之間傳輸數據時,CPU必須介入,而SCSI設備在數據傳輸過程中起主動作用,并能在SCSI總線內部具體執行,直至完成再通知CPU。
5.USB接口
最新的USB串行接口標準是由Microsoft、Intel、Compaq、IBM等大公司共同推出,它提供機箱外的熱即插即用連接,用戶在連接外設時不用再打開機箱、關閉電源,而是采用“級聯”方式,每個USB設備用一個USB插頭連接到一個外設的USB插座上,而其本身又提供一個USB插座給下一個 USB設備使用,通過這種方式的連接,一個USB控制器可以連接多達127個外設,而每個外設間的距離可達5米。USB統一的4針圓形插頭將取代機箱后的眾多的串/并口(鼠標、MODEM)鍵盤等插頭。USB能智能識別USB鏈上外圍設備的插入或拆卸。 除了能夠連接鍵盤、鼠標等,USB還可以連接 ISDN、電話系統、數字音響、打印機以及掃描儀等低速外設。
三、I/O擴展槽
I/O擴展槽即I/O信號傳輸的路徑,是系統總線的延伸,可以插入任意的標準選件,如顯示卡、解壓卡、MODEM卡和聲卡等。通過I/O擴展槽,CPU可對連接到該通道的所有I/O接口芯片和控制卡尋址訪問,進行讀寫。
根據總線的類型不同,主板上的擴展槽可分為ISA、EISA、MAC、VESA和PCI幾種。
1)ISA插槽
黑色,分為8位、16位兩種。16位的擴展槽可以插8位和16位的控制卡,但8位的擴展槽只能插8位卡。
2)EISA插槽
棕色,外型、長度與16位的ISA卡一樣,但深度較大,可插入ISA與EISA控制卡。
3)VESA插槽
棕色,位于16位ISA擴展插槽的下方,與ISA插槽配合使用。
4)PCI插槽
白色,與VESA插槽一樣長,與ISA插槽平行,不需要與ISA插槽配合使用,而且只能插入PCI控制卡。由于主板的空間有限,PCI插槽要占用ISA插槽的位置
相關資料:
MCS-51單片機實用子程序庫
內容
目前已有若干版本的子程序庫公開發表,它們各有特色。本程序庫中的開平方算法為快速逼近算法,它能達到牛頓迭代法同樣的精度,而速度加快二十倍左右,超過雙字節定點除法的速度。
本子程序庫對《單片機應用程序設計技術》一書附錄中的子程序庫作了重大修訂:
(1)按當前流行的以 IBM PC 為主機的開發系統對匯編語言的規定,讀者不必再進行修改,便可直接使用。
(2)對浮點運算子程序庫進行了進一步的測試和優化,對十進制浮點數和二進制浮點數的相互轉換子程序進行了徹底改寫,提高了運算精度和可靠性。
(3)新增添了若干個浮點子程序(傳送、比較、清零、判零等),使編寫數據處理程序的工作變得更簡單直觀。
在使用說明中開列了最主要的幾項:標號、入口條件、出口信息、影響資源、堆棧需求,各項目的意義請參閱《單片機應用程序設計技術》第六章 6.3.7 節的內容。程序清單中開列了四個欄目:標號、指令、操作數、注釋。為方便讀者理解,注釋盡力詳細。
子程序庫的使用方法如下:
1.將子程序庫全部內容鏈接在應用程序之后,統一編譯即可。優點是簡單方便,缺點是程序太長,大量無關子程序也包含在其中。
2.僅將子程序庫中的有關部分內容鏈接在應用程序之后,統一編譯即可。有些子程序需要調用一些低級子程序,這些低級子程序也應該包含在內。優點是程序緊湊,缺點是需要對子程序庫進行仔細刪節。
(一) MCS-51定點運算子程序庫及其使用說明
定點運算子程序庫文件名為DQ51.ASM,為便于使用,先將有關約定說明如下:
1.多字節定點操作數:用[R0]或[R1]來表示存放在由R0或R1指示的連續單元中的數
據。地址小的單元存放數據的高字節。例如:[R0]=123456H,若(R0)=30H,則(30H)=12H,
(31H)=34H,(32H)=56H。
2.運算精度:單次定點運算精度為結果最低位的當量值。
3.工作區:數據工作區固定在PSW、A、B、R2~R7,用戶只要不在工作區中存放無關的或非消耗性的信息,程序就具有較好的透明性。
(1) 標號: BCDA 功能:多字節BCD碼加法
入口條件:字節數在R7中,被加數在[R0]中,加數在[R1]中。
出口信息:和在[R0]中,最高位進位在CY中。
影響資源:PSW、A、R2 堆棧需求: 2字節
BCDA: MOV A,R7 ;取字節數至R2中
MOV R2,A
ADD A,R0 ;初始化數據指針
MOV R0,A
MOV A,R2
ADD A,R1
MOV R1,A
CLR C
BCD1: DEC R0 ;調整數據指針
DEC R1
MOV A,@R0
ADDC A,@R1 ;按字節相加
DA A ;十進制調整
MOV @R0,A ;和存回[R0]中
DJNZ R2,BCD1 ;處理完所有字節
RET
(2) 標號: BCDB 功能:多字節BCD碼減法
入口條件:字節數在R7中,被減數在[R0]中,減數在[R1]中。
出口信息:差在[R0]中,最高位借位在CY中。
影響資源:PSW、A、R2、R3 堆棧需求: 6字節
BCDB: LCALL NEG1 ;減數[R1]十進制取補
LCALL BCDA ;按多字節BCD碼加法處理
CPL C ;將補碼加法的進位標志轉換成借位標志
MOV F0,C ;保護借位標志
LCALL NEG1 ;恢復減數[R1]的原始值
MOV C,F0 ;恢復借位標志
RET
NEG1: MOV A,R0 ;[R1]十進制取補子程序入口
XCH A,R1 ;交換指針
XCH A,R0
LCALL NEG ;通過[R0]實現[R1]取補
MOV A,R0
XCH A,R1 ;換回指針
XCH A,R0
RET
(3) 標號: NEG 功能:多字節BCD碼取補
入口條件:字節數在R7中,操作數在[R0]中。
出口信息:結果仍在[R0]中。
影響資源:PSW、A、R2、R3 堆棧需求: 2字節
NEG: MOV A,R7 ;取(字節數減一)至R2中
DEC A
MOV R2,A
MOV A,R0 ;保護指針
MOV R3,A
NEG0: CLR C
MOV A,#99H
SUBB A,@R0 ;按字節十進制取補
MOV @R0,A ;存回[R0]中
INC R0 ;調整數據指針
DJNZ R2,NEG0 ;處理完(R2)字節
MOV A,#9AH ;最低字節單獨取補
SUBB A,@R0
MOV @R0,A
MOV A,R3 ;恢復指針
MOV R0,A
RET
(4) 標號: BRLN 功能:多字節BCD碼左移十進制一位(乘十)
入口條件:字節數在R7中,操作數在[R0]中。
出口信息:結果仍在[R0]中,移出的十進制最高位在R3中。
影響資源:PSW、A、R2、R3 堆棧需求: 2字節
BRLN: MOV A,R7 ;取字節數至R2中
MOV R2,A
ADD A,R0 ;初始化數據指針
MOV R0,A
MOV R3,#0 ;工作單元初始化
BRL1: DEC R0 ;調整數據指針
MOV A,@R0 ;取一字節
SWAP A ;交換十進制高低位
MOV @R0,A ;存回
MOV A,R3 ;取低字節移出的十進制高位
XCHD A,@R0 ;換出本字節的十進制高位
MOV R3,A ;保存本字節的十進制高位
DJNZ R2,BRL1 ;處理完所有字節
RET
(5) 標號: MULD 功能:雙字節二進制無符號數乘法
入口條件:被乘數在R2、R3中,乘數在R6、R7中。
出口信息:乘積在R2、R3、R4、R5中。
影響資源:PSW、A、B、R2~R7 堆棧需求: 2字節
MULD: MOV A,R3 ;計算R3乘R7
MOV B,R7
MUL AB
MOV R4,B ;暫存部分積
MOV R5,A
MOV A,R3 ;計算R3乘R6
MOV B,R6
MUL AB
ADD A,R4 ;累加部分積
MOV R4,A
CLR A
ADDC A,B
MOV R3,A
MOV A,R2 ;計算R2乘R7
MOV B,R7
MUL AB
ADD A,R4 ;累加部分積
MOV R4,A
MOV A,R3
ADDC A,B
MOV R3,A
CLR A
RLC A
XCH A,R2 ;計算R2乘R6
MOV B,R6
MUL AB
ADD A,R3 ;累加部分積
MOV R3,A
MOV A,R2
ADDC A,B
MOV R2,A
RET
(6) 標號: MUL2 功能:雙字節二進制無符號數平方
入口條件:待平方數在R2、R3中。
出口信息:結果在R2、R3、R4、R5中。
影響資源:PSW、A、B、R2~R5 堆棧需求: 2字節
MUL2: MOV A,R3 ;計算R3平方
MOV B,A
MUL AB
MOV R4,B ;暫存部分積
MOV R5,A
MOV A,R2 ;計算R2平方
MOV B,A
MUL AB
XCH A,R3 ;暫存部分積,并換出R2和R3
XCH A,B
XCH A,R2
MUL AB ;計算2×R2×R3
CLR C
RLC A
XCH A,B
RLC A
JNC MU20
INC R2 ;累加溢出量
MU20: XCH A,B ;累加部分積
ADD A,R4
MOV R4,A
MOV A,R3
ADDC A,B
MOV R3,A
CLR A
ADDC A,R2
MOV R2,A
RET
(7) 標號:DIVD 功能:雙字節二進制無符號數除法
入口條件:被除數在R2、R3、R4、R5中,除數在R6、R7中。
出口信息:OV=0 時,雙字節商在R2、R3中,OV=1 時溢出。
影響資源:PSW、A、B、R1~R7 堆棧需求: 2字節
DIVD: CLR C ;比較被除數和除數
MOV A,R3
SUBB A,R7
MOV A,R2
SUBB A,R6
JC DVD1
SETB OV ;溢出
RET
DVD1: MOV B,#10H ;計算雙字節商
DVD2: CLR C ;部分商和余數同時左移一位
MOV A,R5
RLC A
MOV R5,A
MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
XCH A,R2
RLC A
XCH A,R2
MOV F0,C ;保存溢出位
CLR C
SUBB A,R7 ;計算(R2R3-R6R7)
MOV R1,A
MOV A,R2
SUBB A,R6
ANL C,/F0 ;結果判斷
JC DVD3
MOV R2,A ;夠減,存放新的余數
MOV A,R1
MOV R3,A
INC R5 ;商的低位置一
DVD3: DJNZ B,DVD2 ;計算完十六位商(R4R5)
MOV A,R4 ;將商移到R2R3中
MOV R2,A
MOV A,R5
MOV R3,A
CLR OV ;設立成功標志
RET
(8) 標號: D457 功能:雙字節二進制無符號數除以單字節二進制數
入口條件:被除數在R4、R5中,除數在R7中。
出口信息:OV=0 時,單字節商在R3中,OV=1 時溢出。
影響資源:PSW、A、R3~R7 堆棧需求: 2字節
D457: CLR C
MOV A,R4
SUBB A,R7
JC DV50
SETB OV ;商溢出
RET
DV50: MOV R6,#8 ;求平均值(R4R5/R7-→R3)
DV51: MOV A,R5
RLC A
MOV R5,A
MOV A,R4
RLC A
MOV R4,A
MOV F0,C
CLR C
SUBB A,R7
ANL C,/F0
JC DV52
MOV R4,A
DV52: CPL C
MOV A,R3
RLC A
MOV R3,A
DJNZ R6,DV51
MOV A,R4 ;四舍五入
ADD A,R4
JC DV53
SUBB A,R7
JC DV54
DV53: INC R3
DV54: CLR OV
RET
(9) 標號: DV31 功能:三字節二進制無符號數除以單字節二進制數
入口條件:被除數在R3、R4、R5中,除數在R7中。
出口信息:OV=0 時,雙字節商在R4、R5中,OV=1 時溢出。
影響資源:PSW、A、B、R2~R7 堆棧需求: 2字節
DV31: CLR C
MOV A,R3
SUBB A,R7
JC DV30
SETB OV ;商溢出
RET
DV30: MOV R2,#10H ;求R3R4R5/R7-→R4R5
DM23: CLR C
MOV A,R5
RLC A
MOV R5,A
MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
MOV F0,C
CLR C
SUBB A,R7
ANL C,/F0
JC DM24
MOV R3,A
INC R5
DM24: DJNZ R2,DM23
MOV A,R3 ;四舍五入
ADD A,R3
JC DM25
SUBB A,R7
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -