第一章 計(jì)算機(jī)基礎(chǔ)知識
本章簡要闡述計(jì)算機(jī)中最基本的數(shù)學(xué)知識。本章的內(nèi)容是必要的入門知識,是以后各章的基礎(chǔ)。
第一節(jié) 數(shù)制與編碼
數(shù)制是人們利用符號來計(jì)數(shù)的科學(xué)方法。數(shù)制有很多種,但在計(jì)算機(jī)的使用上常使用的則為十進(jìn)制、二進(jìn)制和十六進(jìn)制。
一、數(shù)制的基與權(quán)
數(shù)制所使用的數(shù)碼的個(gè)數(shù)稱為基,數(shù)制每一位所具有的值稱為權(quán)。
1、十進(jìn)制
十進(jìn)制的基為“十”,即它所使用的數(shù)碼為0到9共十個(gè)數(shù)字。
十進(jìn)制中,每個(gè)(位)數(shù)字的值都是以該個(gè)(位)數(shù)字乘以基數(shù)的冪次來表示,通常將基數(shù)的冪次稱為權(quán),即以10為底的0冪、1冪、2冪等。
2、二進(jìn)制
二進(jìn)制的基為“二”,即其使用的數(shù)碼為0、1,共二個(gè)。二進(jìn)制各位的權(quán)是以2為底的
冪。
3、十六進(jìn)制
十六進(jìn)制的基為“十六”,即其數(shù)碼共有16個(gè):0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F。其中A~F相當(dāng)于十進(jìn)制數(shù)的10~15。十六進(jìn)制的權(quán)是以16為底的冪。
4、二一十進(jìn)制
二一十進(jìn)制數(shù)稱為二進(jìn)制編碼的十進(jìn)制數(shù)(Binary Coded Decimal),簡稱BCD碼。在BCD碼中是用四位二進(jìn)制數(shù)給0一9這十個(gè)數(shù)字編碼。
注意:為了區(qū)別以上四種數(shù)制,在數(shù)的后面加寫英文字母來區(qū)別,B、D、H、BCD分別表示為二進(jìn)制數(shù)、十進(jìn)制數(shù)、十六進(jìn)制數(shù)、二一十進(jìn)制數(shù),通常對十進(jìn)制可不加標(biāo)志。同時(shí)若十六進(jìn)制數(shù)如是字母打頭,則前面需加一個(gè)0。
二、數(shù)制的轉(zhuǎn)換
1、二、十六進(jìn)制轉(zhuǎn)換成十進(jìn)制數(shù)
只需將二、十六進(jìn)制數(shù)按權(quán)展開后相加即可。
2、十進(jìn)制數(shù)轉(zhuǎn)換成二、十六進(jìn)制數(shù)
基本方法為:除基取余。
例:試求十進(jìn)制數(shù)45678所對應(yīng)的十六進(jìn)制數(shù)。
3、二、十六進(jìn)制數(shù)相互轉(zhuǎn)換
基本方法為:1位十六進(jìn)制數(shù)轉(zhuǎn)換為4位二進(jìn)制數(shù)。
4、BCD碼與十進(jìn)制的相互轉(zhuǎn)換
按照BCD的十位編碼與十進(jìn)制的關(guān)系,進(jìn)行轉(zhuǎn)換。
三、計(jì)算機(jī)中常用的編碼
1、 BCD碼
BCD碼(十進(jìn)制數(shù)的二進(jìn)制編碼)是一種具有十進(jìn)制權(quán)的二進(jìn)制編碼,即它是一種既能為計(jì)算機(jī)所接受,又基本上符合人們的十進(jìn)制數(shù)運(yùn)算習(xí)慣的二進(jìn)制編碼。
BCD碼的種類較多,常用的有8421碼、2421碼、余3碼和格雷碼等,其中最為常用的是8421 BCD編碼。因十進(jìn)制數(shù)有10個(gè)不同的數(shù)碼0~9,必須要有4位二進(jìn)制數(shù)來表示,而4位二進(jìn)制數(shù)可以有16種狀態(tài),因此取4位二進(jìn)制數(shù)順序編碼的前10種,即0000B-1001B為8421碼的基本代碼,1010B~1111B未被使用,稱為非法碼或冗余碼。8421 BCD編碼表如表所示。
2、ASCII編碼
ASCII碼誕生于1963年,是一種比較完整的字符編碼,現(xiàn)已成為國際通用的標(biāo)準(zhǔn)編碼,已廣泛用于微型計(jì)算機(jī)與外設(shè)的通信。
ASCII碼是“美國信息交換標(biāo)準(zhǔn)代碼”的簡稱。它是用七位二進(jìn)制數(shù)碼來表示的,七位二進(jìn)制數(shù)碼共有128種組合狀態(tài),包括圖形字符96個(gè)和控制字符32個(gè)。96個(gè)圖形字符包括十進(jìn)制數(shù)字符10個(gè)、大小寫英文字母52個(gè)和其他字符34個(gè),這類字符有特定形狀,可以顯示在CRT上和打印在打印紙上。32個(gè)控制字符包括回車符、換行符、退格符、設(shè)備控制符和信息分隔符等,這類字符沒有特定形狀,字符本身不能在CRT上顯示和打印機(jī)上打印。ASCII編碼如表所示。
第二節(jié) 存儲器
存儲器是計(jì)算機(jī)的主要組成部分。其功能是存放程序和數(shù)據(jù)。這些程序和數(shù)據(jù)在存儲器中是以二進(jìn)制代碼表示的。
一、名詞介紹
1、存儲單元和存儲單元地址
存儲器是由大量寄存器組成的,其中每一個(gè)寄存器就稱為一個(gè)存儲單元。它可存放一個(gè)有獨(dú)立意義的二進(jìn)制代碼,稱為一個(gè)字(Word),一個(gè)字由若干位(Bit)組成,代碼的位數(shù)稱為字長。在計(jì)算機(jī)中把一個(gè)8位的二進(jìn)制代碼稱為一個(gè)字節(jié)(Byte)。對一個(gè)8位二進(jìn)制代碼的最低位稱為第0位(位0),最高位稱為第7位(位7)。
在計(jì)算機(jī)的存儲器中有很多存儲單元。為了使存入和取出時(shí)不發(fā)生混淆,必須給每個(gè)存儲單元一個(gè)唯一的固定編號,這個(gè)編號就稱為存儲單元的地址。因?yàn)榇鎯卧獢?shù)量很大,為了減少存儲器向外引出的地址線,在存儲器內(nèi)部都帶有譯碼器。根據(jù)二進(jìn)制編碼譯碼的原理,除地線公用之外,n根導(dǎo)線可譯成2"個(gè)地址號。
2、存儲器速度和存儲器容量
存儲器速度和存儲器容量是存儲器的兩個(gè)主要技術(shù)指標(biāo)。存儲器速度是指讀或?qū)懸粭l信息所需的時(shí)間,它是影響計(jì)算機(jī)速度的主要因素之一。存儲器的容量是指最多能夠存儲多少個(gè)單位信息,二進(jìn)制信息單位多用字節(jié)表示。在計(jì)算機(jī)中,通常把1024字節(jié)稱為1K字節(jié),1024K稱為1M(兆)。
二、存儲器的分類
存儲器的分類方法較多,例如從其組成材料和單元電路類型上可分為磁芯存儲器、半導(dǎo)體存儲器、電荷耦合存儲器等,從其與微處理器的關(guān)系來劃分,又可分為內(nèi)存和外存。
直接同微處理器進(jìn)行信息交換的存儲器稱內(nèi)存。其特點(diǎn)是存取速度快,但容量有限。通過內(nèi)存間接與CPU進(jìn)行信息交換的存儲器稱為外存,其特點(diǎn)是容量大、速度較慢,外存的內(nèi)容根據(jù)需要可隨時(shí)調(diào)入內(nèi)存。
1、只讀存儲器ROM
只讀存儲器即在使用時(shí)只能讀出而不能寫入,斷電后ROM中的信息不會丟失。因此一般用來存放一些固定程序,如監(jiān)控程序、子程序、字庫及數(shù)據(jù)表等。
2、隨機(jī)存儲器RAM
這種存儲器又叫讀寫存儲器,它不僅能讀取存放在存儲單元中的數(shù)據(jù),還能隨時(shí)寫入新的數(shù)據(jù)。斷電后RAM中的信息全部丟失,因此RAM常用于存放經(jīng)常要改變的程序或中間計(jì)算結(jié)果等。
三、只讀存儲器類型
ROM按存儲信息的方法又可分為四種。下面逐一進(jìn)行介紹。
(1)掩膜ROM
掩膜ROM也稱固定ROM,它是由廠家編好程序?qū)懭隦OM(稱固化)供用戶使用,用戶不能更改它。掩膜ROM只能應(yīng)用于有固定程序且批量很大的產(chǎn)品中。
(2)可編程序的只讀存儲器PROM
它在出廠時(shí)不寫入信息,它的內(nèi)容由用戶根據(jù)自己所編程序一次性寫入,一旦寫入,只能讀出,而不能再進(jìn)行更改。
(3)可改寫的只讀存儲器EPROM
用戶可將程序?qū)懭隕PROM。如果要改寫程序,可用紫外線進(jìn)行擦除,然后重新寫人新程序。一片EPROM芯片,可反復(fù)多次被擦除和寫人。
(4)可電改寫只讀存儲器E2 PROM
E2 PROM可用電的方法完成寫入和清除其內(nèi)容的功能,其編程電壓和清除電壓均與微機(jī)CPU的5V工作電壓相同,不需另加電壓,它既有RAM讀寫操作簡便,又有數(shù)據(jù)不會因掉電而丟失的優(yōu)點(diǎn),因而使用極為方便。加之E2 PROM保存的數(shù)據(jù)至少可達(dá)10年以上,每塊芯片可擦寫1萬次以上。
第二章 單片機(jī)概述
第一節(jié) 單片機(jī)的概念
一、單片機(jī)的概念
通常所說的微機(jī)是指由CPU、存儲器、I/O接口電路等各種大型集成電路芯片組裝在一塊或者由幾塊印制電路板組裝而成的機(jī)器。
其中,用幾塊印制電路板組裝成的微機(jī)則稱之為多板微機(jī)或多板機(jī),如現(xiàn)在廣泛使用的臺式或筆記本式PC微機(jī)都是這種結(jié)構(gòu)。
隨著大型集成電路技術(shù)的不斷進(jìn)步,20世紀(jì)80年代開發(fā)出了能在一個(gè)芯片上集成CPU、存儲器、I/O接口等電子電路的超微型計(jì)算機(jī),這種單個(gè)芯片式的微型計(jì)算機(jī)就被命名為單片微型計(jì)算機(jī)。
由于單片機(jī)在應(yīng)用時(shí)通常是處于被控系統(tǒng)的核心地位并融入其中,即以嵌入的方式進(jìn)行使用,為了強(qiáng)調(diào)其“嵌入”的特點(diǎn),也常常將單片機(jī)稱為嵌入式微控制器EMCU。
二、通用單片機(jī)和專用單片機(jī)
根據(jù)控制應(yīng)用的需要,可以將單片機(jī)分成為通用型和專用型兩種類型。
通用型單片機(jī)是一種基本芯片,它的內(nèi)部資源比較豐富,性能全面且適用性強(qiáng),能覆蓋多種應(yīng)用需求。用戶可以根據(jù)需要設(shè)計(jì)成各種不同應(yīng)用的控制系統(tǒng),即通用單片機(jī)有一個(gè)再設(shè)計(jì)的過程。
專用單片機(jī)芯片是針對一種產(chǎn)品或一種控制應(yīng)用而專門設(shè)計(jì)的,設(shè)計(jì)時(shí)已經(jīng)對系統(tǒng)結(jié)構(gòu)的最簡化、軟硬件資源利用的最優(yōu)化、可靠性和成本的最佳化等方面都作了通盤的考慮和論證,所以專用單片機(jī)具有十分明顯的綜合優(yōu)勢。例如電度表和IC卡讀寫器上的單片機(jī)等。
三、單片機(jī)與單片機(jī)系統(tǒng)
單片機(jī)通常是指芯片本身。
單片機(jī)系統(tǒng)則是在單片機(jī)芯片的基礎(chǔ)上擴(kuò)展其它電路或芯片構(gòu)成的具有一定應(yīng)用功能的計(jì)算機(jī)系統(tǒng)。在單片機(jī)系統(tǒng)中,單片機(jī)處于核心地位,是構(gòu)成單片機(jī)系統(tǒng)的硬件和軟件基礎(chǔ)。
四、單片機(jī)應(yīng)用系統(tǒng)與單片機(jī)開發(fā)系統(tǒng)
單片機(jī)應(yīng)用系統(tǒng)是為控制應(yīng)用而設(shè)計(jì)的,該系統(tǒng)與控制對象結(jié)合在一起使用,是單片機(jī)開發(fā)應(yīng)用的成果。
單片機(jī)開發(fā)系統(tǒng)是單片機(jī)應(yīng)用系統(tǒng)開發(fā)調(diào)試的工具。主要有:
邏輯分析儀:只能用于簡單的單片機(jī)系統(tǒng);
微型計(jì)算機(jī):用于復(fù)雜的單片機(jī)系統(tǒng);
在線仿真器:進(jìn)行單片機(jī)應(yīng)用系統(tǒng)的軟硬件開發(fā)和EPROM寫入。
五、單片機(jī)的程序設(shè)計(jì)語言和軟件
機(jī)器語言是用二進(jìn)制代碼表示的單片機(jī)指令,用機(jī)器語言構(gòu)成的程序稱之為目標(biāo)程序。
匯編語言是用符號表示的指令,匯編語言是對機(jī)器語言的改進(jìn),是單片機(jī)最常用的程序設(shè)計(jì)語言。
注意:這兩種語言均與單片機(jī)硬件關(guān)系密切,這就要求程序設(shè)計(jì)人員必須精通單片機(jī)的硬件系統(tǒng)和指令系統(tǒng)。
高級語言:編譯型語言有PL/M51、C-51、C、MBASIC-51等;
解釋型的有MBASIC和MBASIC-52等。
第二節(jié) 單片機(jī)的發(fā)展
一、單片機(jī)的歷史及發(fā)展概況
根據(jù)單片機(jī)發(fā)展過程中各個(gè)階段的特點(diǎn),其發(fā)展歷史大概可劃分為以下四個(gè)階段:
第一階段(1974~1976):單片機(jī)的初級階段。因工藝限制,單片機(jī)采用雙片的形式,而且功能簡單。
第二階段(1976一1978):低性能單片機(jī)階段。以Intel公司制造的MCS-48系列單片機(jī)為代表
第三階段(1978一現(xiàn)在):高性能單片機(jī)階段。這個(gè)階段推出的單片機(jī)普遍帶有串行I/O口,多級中斷處理系統(tǒng),16位定時(shí)器/計(jì)數(shù)器,片內(nèi)ROM、RAM容量加大,且尋址范圍可達(dá)64K字節(jié),有的還內(nèi)置有A/D轉(zhuǎn)換器。這類單片機(jī)的代表是Intel公司的MCS-51系列,Motorola公司的6810和Zilog公司的Z8等。
第四階段(1982一現(xiàn)在):8位單片機(jī)的鞏固發(fā)展以及16位單片機(jī)、32位單片機(jī)推出階段。此階段的主要特征是一方面發(fā)展16位單片機(jī)、32位單片機(jī)及專用型單片機(jī);另一方面不斷完善高檔8位單片機(jī),改善其結(jié)構(gòu),以滿足不同用戶的需要。16位單片機(jī)的典型產(chǎn)品如Intel公司生產(chǎn)的MCS-96系列單片機(jī)。而32位單片機(jī)除了具有更高的集成度外,其振蕩頻率已達(dá)20MHz或更高,這使32位單片機(jī)的數(shù)據(jù)處理速度比16位單片機(jī)快許多,性能同8位、16位單片機(jī)相比,具有更大的優(yōu)越性。
計(jì)算機(jī)廠家已投放市場的產(chǎn)品就有70多個(gè)系列,500多個(gè)品種。單片機(jī)的產(chǎn)品已占整個(gè)微機(jī)(包括一般的微處理器)產(chǎn)品的80%以上,其中8位單片機(jī)的產(chǎn)量又占整個(gè)單片機(jī)的產(chǎn)量的60%以上,因此可以看出,8位單片機(jī)在最近若干年里,在工業(yè)檢測、控制應(yīng)用的上將繼續(xù)占有一定的市場份額。
二、單片機(jī)的特點(diǎn)及應(yīng)用領(lǐng)域
1、單片機(jī)的特點(diǎn):
(1)小巧靈活、成本低、易于產(chǎn)品化。能組裝成各種智能式測控設(shè)備及智能儀器儀表。
(2)可靠性好,應(yīng)用范圍廣。單片機(jī)芯片本身是按工業(yè)測控環(huán)境要求設(shè)計(jì)的,抗干擾性強(qiáng),能適應(yīng)各種惡劣的環(huán)境,這是其他機(jī)種無法比擬的。
(3)易擴(kuò)展,很容易構(gòu)成各種規(guī)模的應(yīng)用系統(tǒng),控制功能強(qiáng)。單片機(jī)的邏輯控制功能很強(qiáng),指令系統(tǒng)有各種控制功能指令,可以對邏輯功能比較復(fù)雜的系統(tǒng)進(jìn)行控制。
(4)具有通訊功能,可以很方便地實(shí)現(xiàn)多機(jī)和分布式控制,形成控制網(wǎng)絡(luò)和遠(yuǎn)程控制。
2、 單片機(jī)的應(yīng)用
(1)工業(yè)方面:各種測控系統(tǒng)。數(shù)據(jù)采集系統(tǒng),工業(yè)機(jī)器人,智能化儀器,機(jī)、電一體化產(chǎn)品。
(2)智能儀器儀表方面。
(3)通訊方面:調(diào)制解調(diào)器、程控交換技術(shù)等。
(4)消費(fèi)產(chǎn)品方面:電動玩具、錄像機(jī)、激光唱機(jī)。
(5)導(dǎo)彈與控制方面:導(dǎo)彈控制、魚雷制導(dǎo)控制、智能武器裝備、飛機(jī)導(dǎo)航系統(tǒng)。
(6)計(jì)算機(jī)外部設(shè)備及電器方面:打印機(jī)、硬盤驅(qū)動器、彩色與黑白復(fù)印機(jī)、磁帶機(jī)等。
(7)多機(jī)分布式系統(tǒng):可用單片機(jī)構(gòu)成分布式測控系統(tǒng),它使單片機(jī)應(yīng)用進(jìn)入了一個(gè)全新的階段。
第三章 單片機(jī)芯片的硬件結(jié)構(gòu)
第一節(jié) MCS-51 單片機(jī)的邏輯結(jié)構(gòu)及信號引腳
一、MCS-51 單片機(jī)的結(jié)構(gòu)框圖
二、MCS-51單片機(jī)的邏輯結(jié)構(gòu)
1、中央處理器(CPU)
中央處理器簡稱CPU,是單片機(jī)的核心,完成運(yùn)算和控制操作。按其功能,中央處理器包括運(yùn)算器和控制器兩部分電路。
1)、運(yùn)算器電路
功能:單片機(jī)的運(yùn)算部件,用于實(shí)現(xiàn)算術(shù)和邏輯運(yùn)算。
2)、控制器電路
功能:單片機(jī)的指揮控制部件,保證單片機(jī)各部分能自動而協(xié)調(diào)地工作。
2、內(nèi)部數(shù)據(jù)存儲器
組成:RAM(128×8)和RAM地址寄存器等。
功能:用于存放可讀寫的數(shù)據(jù)。
3、內(nèi)部程序存儲器
組成:ROM(4K×8))和程序地址寄存器等。
功能:用于存放程序和原始數(shù)據(jù)。
4、定時(shí)器/計(jì)數(shù)器
80C51共有兩個(gè)16位的定時(shí)器/計(jì)數(shù)器。
功能:實(shí)現(xiàn)定時(shí)或計(jì)數(shù)功能,并以其定時(shí)或計(jì)數(shù)結(jié)果對單片機(jī)進(jìn)行控制,以滿足控制應(yīng)用的需要。
5、并行I/O口
MCS-51共有4個(gè)8位的I/O口(P0、P1、P2、P3)
功能:實(shí)現(xiàn)數(shù)據(jù)的并行輸入輸出。
6、串行口
MCS- 51單片機(jī)有一個(gè)全雙工的串行口。
功能;以實(shí)現(xiàn)單片機(jī)和其它數(shù)據(jù)設(shè)備之間的串行數(shù)據(jù)傳送。
7、中斷控制系統(tǒng)
80C51共有5個(gè)中斷源,即外中斷2個(gè),定時(shí)/計(jì)數(shù)中斷2個(gè),串行中斷1個(gè)。全部中斷分為高級和低級共兩個(gè)優(yōu)先級別。
8、時(shí)鐘電路
MCS- 51芯片的內(nèi)部有時(shí)鐘電路,但石英晶體和微調(diào)電容需外接。
功能:時(shí)鐘電路為單片機(jī)產(chǎn)生時(shí)鐘脈沖序列。
典型的晶振頻率:6MHz、11.0592MHz、12MHz。
9、位處理器
位處理器稱為布爾處理器。
功能:以狀態(tài)寄存器中的進(jìn)位標(biāo)志位C為累加位,可進(jìn)行各種位操作。
10、總線
總線:連接計(jì)算機(jī)各部件的一組公共信號線。
分類:地址總線、數(shù)據(jù)總線和控制總線。
作用:減少了單片機(jī)的連線和引腳,提高了集成度和可靠性。
三、MCS-51的信號引腳
80C51是標(biāo)準(zhǔn)的40引腳雙列直插式集成電路芯片,引腳排列如圖所示。
1.信號引腳介紹
·輸入/輸出口線
P0.0~P0.7 P0口8位雙向口線
P1.0~P1.7 P1口8位雙向口線
P2.0~P2.7 P2口8位雙向口線
P3.0~P3.7 P3口8位雙向口線
·ALE 地址鎖存控制信號
功能:a)在系統(tǒng)擴(kuò)展時(shí),ALE用于控制把P0口輸出的低8位地址送入鎖存器鎖存起來,以實(shí)現(xiàn)低位地址和數(shù)據(jù)的分時(shí)傳送。如圖所示。
b)ALE是以六分之一晶振頻率的固定頻率輸出的正脈沖,可作為外部時(shí)鐘或外部定時(shí)脈沖使用。
·/PSEN 外部程序存儲器讀選通信號
在讀外部ROM時(shí)/PSEN有效(低電平),以實(shí)觀外部ROM單元的讀操作。
·/EA 訪問程序存儲器控制信號
當(dāng)/EA信號為低電平時(shí),對ROM的讀操作限定在外部程序存儲器;
當(dāng)/EA信號為高電平時(shí),對ROM的讀操作是從內(nèi)部程序存儲器開始,并可延續(xù)至外部程序存儲器。
·RST 復(fù)位信號
當(dāng)輸入的復(fù)位信號延續(xù)2個(gè)機(jī)器周期以上高電平時(shí)即為有效,用以完成單片機(jī)的復(fù)位操作。
·XTAL1和XTAL2外接晶體引線端
當(dāng)使用芯片內(nèi)部時(shí)鐘時(shí),此二引線端用于外接石英晶體和微調(diào)電容;
當(dāng)使用外部時(shí)鐘時(shí),用于接外部時(shí)鐘脈沖信號。
·VSS 地線
·Vcc+5V電源
2、信號引腳的第二功能
“復(fù)用”即給一些信號引腳賦予雙重功能。第二功能信號定義主要集中在P3口線中,另外再加上幾個(gè)其它信號線。
1、常見的第二功能信號
·P3口線的第二功能
P3口8條口線都定義有第二功能,如表所示。
·EPROM存儲器程序固化所需要的信號
編程脈沖:30腳(ALE/PROG)
編程電壓(25V):31腳(/EA/Vpp)
·備用電源引入
備用電源是通過9腳(RST/VPD)引入的。當(dāng)電源發(fā)生故障,電壓降低到下限值時(shí),備用電源經(jīng)此端向內(nèi)部RAM提供電壓,以保護(hù)內(nèi)部RAM中的信息不丟失。
說明:
a)第一功能信號與第二功能信號是單片機(jī)在不同工作方式下的信號,因此不會發(fā)生使用上的矛盾。
b)P3口線先按需要優(yōu)先選用它的第二功能,剩下不用的才作為I/O口線使用。
第二節(jié) MCS-51 內(nèi)部存儲器
一、 內(nèi)部數(shù)據(jù)存儲器低128 單元
劃分為三個(gè)區(qū):
1、 寄存器區(qū)
地址范圍:4組通用寄存器占據(jù)內(nèi)部RAM的00H~1FH單元地址。每組8個(gè),依次為R0~R7。
使用方法:一種是以寄存器的形式使用,用寄存器符號表示;另一種是以存儲單元的形式使用,以單元地址表示。
說明:任一時(shí)刻,CPU使用其中的一組寄存器,并且把正在使用的那組寄存器稱之為當(dāng)前寄存器。由程序狀態(tài)字寄存器PSW中RSl、RS0位的狀態(tài)組合來決定使用那一組。
2、位尋址區(qū)
地址范圍:內(nèi)部RAM的20H~2FH單元,共有16個(gè)RAM單元,總計(jì)128位,位地址為00H~7FH。位尋址區(qū)的位地址表如表所示。
操作方法:字節(jié)操作和位操作。
使用方式:一種是以位地址的形式;另一種足以存儲單元地址加位的形式表示。
3、用戶RAM區(qū)
地址范圍:內(nèi)部RAM區(qū)單元地址為30H-7FH,共80個(gè)單元。
使用方法:只能以存儲單元的形式來使用。但一般常把堆棧開辟在此區(qū)中。
二、內(nèi)部數(shù)據(jù)存儲器高128 單元
又稱之為專用寄存器區(qū),其單元地址為80H-FFH,用于存放相應(yīng)功能部件的控制命令、狀態(tài)或數(shù)據(jù)。因這些寄存器的功能已作專門規(guī)定,故而稱為專用寄存器(SFR),有時(shí)也稱為特殊功能寄存器。MCS-51中80C51的專用寄存器共有22個(gè),其中可尋址的為21個(gè)。
1、專用寄存器簡介
現(xiàn)把22個(gè)專用寄存器中的5個(gè)介紹如下,其余的將在以后章節(jié)中陸續(xù)說明。
1)、程序計(jì)數(shù)器PC
PC是一個(gè)16位的計(jì)數(shù)器。其內(nèi)容為將要執(zhí)行的指令地址,尋址范圍達(dá)64KB。PC有自動加1功能,以實(shí)現(xiàn)程序的順序執(zhí)行。PC沒有地址,是不可尋址的,因此用戶無法對它進(jìn)行讀寫。但在執(zhí)行轉(zhuǎn)移、調(diào)用、返回等指令時(shí)能自動改變其內(nèi)容,以改變程序的執(zhí)行順序。
2)、累加器A(或ACC)
累加器為8位寄存器,是程序中最常用的專用寄存器,功能較多,地位重要。
3、B寄存器
B寄存器是一個(gè)8位寄存器,主要用于乘除運(yùn)算,也可作為一般數(shù)據(jù)寄存器使用。
4、程序狀態(tài)字(PSW Program Status Word)
程序狀態(tài)字是一個(gè)8位寄存器,用于寄存指令執(zhí)行的狀態(tài)信息。其中有些位狀態(tài)是根據(jù)指令執(zhí)行結(jié)果,由硬件自動設(shè)置的,而有些位狀態(tài)則是使用軟件方法設(shè)定的。PSW的位狀態(tài)可以用專門指令進(jìn)行測試,也可以用指令讀出。PSW的各位定義知下:
除PSW.1位保留未用外,對其余各位的定義及使用介紹如下:
·CY或C、PWS.7進(jìn)位/借位標(biāo)志位
功能:a)存放算術(shù)運(yùn)算的進(jìn)位/借位標(biāo)志;
b)在位操作中,作累加位使用。
·AC(PSW. 6) 輔助進(jìn)位標(biāo)志位
功能:a)在加減運(yùn)算中,當(dāng)有低4位向高4位進(jìn)位或借位時(shí),AC由硬件置位,否則AC 位被清“0”。
b)在進(jìn)行十進(jìn)制數(shù)運(yùn)算時(shí)需要十進(jìn)制調(diào)整,此時(shí)要用到AC位狀態(tài)進(jìn)行判斷。
·F0(PSW. 5) 用戶標(biāo)志位
一個(gè)由用戶定義使用的標(biāo)志位,用戶根據(jù)需要用軟件方法置位或復(fù)位。
·RS1和RS0(PSW.4和PSW.3) 寄存器組選擇位
用于設(shè)定當(dāng)前通用寄存器的組號。通用寄存器共有4組,其對應(yīng)關(guān)系如下表:
這兩個(gè)選擇位的狀態(tài)是由軟件設(shè)置的,被選中的寄存器組即為當(dāng)前通用寄存器組。
·OV(PSW. 2) 溢出標(biāo)志位
在帶符號數(shù)的加減運(yùn)算中,OV=1表示加減運(yùn)算結(jié)果超出了累加器A所能表示的符號數(shù)有效范圍(-128~+127),即產(chǎn)生了溢出,因此運(yùn)算結(jié)果是錯(cuò)誤的;反之,OV=0表示運(yùn)算正確,即無溢出產(chǎn)生。
在乘法運(yùn)算中,0V=1表示乘積超過255,即乘積分別在B與A中;反之,OV=0,表示乘積只在A中。
在除法運(yùn)算中,0V=1表示除數(shù)為0,除法不能進(jìn)行;反之,OV=0,除數(shù)不為0,除法可正常進(jìn)行。
·P(PSW.0) 奇偶標(biāo)志位
表明累加器A中1的個(gè)數(shù)的奇偶性,在每個(gè)指令周期由硬件根據(jù)A的內(nèi)容對P位進(jìn)行里位或復(fù)位。若1的個(gè)數(shù)為偶數(shù),P=0;若1的個(gè)數(shù)為奇數(shù),P=1。
5.數(shù)據(jù)指針(DPTR)
數(shù)據(jù)指針為16位寄存器,它是MCS- 51中唯一一個(gè)供用戶使用的16位寄存器。
DPTR可以分為兩個(gè)8位寄存器使用,即:
DPH DPTR高位字節(jié)
DPL DPTR低位字節(jié)
DPTR在訪問外部數(shù)據(jù)存儲器時(shí)作地址指針使用,在變址尋址方式中,用DPTR作基址寄存器,用于對程序存儲器的訪問。
說明:
a)在22個(gè)專用寄存器中,唯一一個(gè)不可尋址的專用寄存器就是程序計(jì)數(shù)器(PC)。
b)對專用寄存器只能使用直接尋址方式,在指令中既可使用寄存器符號表示,也可使用寄存器地址表示。
c)在21個(gè)可尋址的專用寄存器中,有11個(gè)寄存器是可以位尋址的。
專用寄存器如表所示。
三、MCS-51 的堆棧操作
堆棧是一種數(shù)據(jù)結(jié)構(gòu)。數(shù)據(jù)寫入堆棧稱為入棧(PUSH)。數(shù)據(jù)從堆棧中讀出稱之出棧(POP)。
數(shù)據(jù)操作規(guī)則:“后進(jìn)先出”LIFO。即先入棧的數(shù)據(jù)由于存放在棧的底部,因此后出棧;而后入棧的數(shù)據(jù)存放在棧的頂部,因此先出棧。
1、堆棧的功用
堆棧主要是為子程序調(diào)用和中斷操作而設(shè)立的。其具體功能有兩個(gè):保護(hù)斷點(diǎn)和保護(hù)現(xiàn)場。
2、堆棧的開辟
堆棧只能開辟在芯片的內(nèi)部數(shù)據(jù)存儲器中,即所謂的內(nèi)堆棧形式。
3、堆棧指示器
堆棧指示器SP(Stack Pointer)的內(nèi)容是堆棧棧頂?shù)拇鎯卧刂。SP是一個(gè)8位寄存器。
說明:系統(tǒng)復(fù)位后,SP的內(nèi)容為07H,但由于堆棧最好在內(nèi)部RAM的30H~7FH單元中開辟,所以在程序設(shè)計(jì)時(shí)應(yīng)注意把SP值初始化為30H以后。
4、堆棧使用方式
堆棧的使用有兩種方式。
自動方式:即在調(diào)用子程序或中斷時(shí),返回地址(斷點(diǎn))自動進(jìn)棧。程序返回時(shí),斷點(diǎn)再自動彈回PC。
指令方式:即使用專用的堆棧操作指令,進(jìn)行進(jìn)出棧操作。其進(jìn)棧指令為PUSH,出棧指令為POP。例如保護(hù)現(xiàn)場就是指令方式進(jìn)行操作
四、內(nèi)部程序存儲器
80C51芯片內(nèi)有4KROM存儲單元,其地址為0000H~0FFFH。
0000H~0002H 系統(tǒng)的啟動單元
0003H~000AH 外部中斷0中斷地址區(qū)
000BH~0012H 定時(shí)器/計(jì)數(shù)器0中斷地址區(qū)
0013H~001AH 外部中斷1中斷地址區(qū)
001BH~0022H 定時(shí)器/計(jì)數(shù)器1中斷地址區(qū)
0023H~002AH 串行中斷地址區(qū)
中斷響應(yīng)后,系統(tǒng)能按中斷種類,自動轉(zhuǎn)到各中斷區(qū)的首地址去執(zhí)行程序。
由于各地址區(qū)容量有限,因此一般在第一個(gè)單元放置一條無條件轉(zhuǎn)移指令以轉(zhuǎn)移到程序?qū)嶋H存放位置。
第三節(jié) MCS - 51 并行 1/O 端口
MCS - 51單片機(jī)具有4個(gè)8位準(zhǔn)雙向并行端口(P0~P3),共32根1/O口線。每一根1/O口線都能獨(dú)立地用作輸入或輸出。這4個(gè)端口是單片機(jī)與外部設(shè)備進(jìn)行信息(數(shù)據(jù)、地址、控制信號)交換的輸人或輸出通道。
1、 P0口
功能:
a) 作為通用輸入/輸出口;
b) 地址線/數(shù)據(jù)線分時(shí)復(fù)用。
在擴(kuò)展系統(tǒng)中,低8位地址線與數(shù)據(jù)線分時(shí)使用PO口。PO口先輸出片外存儲器的低8位地址并鎖存到地址鎖存器中,然后再輸出或輸入數(shù)據(jù)。
2、P1口
功能:作為通用輸人/輸出口使用。
3、P2口
功能:
a)通用輸人/輸出口使用;
b)作為高8位地址總線口使用。
在擴(kuò)展系統(tǒng)中,其作為擴(kuò)展系統(tǒng)的高8位地址總線,與P0口低8位地址線一起組成16位地址總線。
3、P3口
功能:
a) 作為通用輸人/輸出口使用;
b)涉及串行口、外部中斷、定時(shí)器的工作(第二功能)。
第四節(jié) MCS-51 單片機(jī)時(shí)鐘電路與時(shí)序
時(shí)鐘電路用于產(chǎn)生單片機(jī)工作所需要的時(shí)鐘信號。
1、時(shí)鐘信號的產(chǎn)生
在MCS- 51芯片內(nèi)部有一個(gè)高增益反相放大器,其輸入端為芯片引腳XTAL1,輸出端為引腳XTAL2,在芯片的外部通過這兩個(gè)引腳跨接晶體振蕩器和微調(diào)電容,形成反饋電路,就構(gòu)成了一個(gè)穩(wěn)定的自激振蕩器。如圖所示。
電路中的電容一般取30pF左右,而晶體的振蕩頻率范圍通常是1.2MHz~12MHz。
2、引入外部脈沖信號
在由多片單片機(jī)組成的系統(tǒng)中,為了各單片機(jī)之間時(shí)鐘信號的同步,引入唯一的外部脈沖信號作為各單片機(jī)的振蕩脈沖。這時(shí)外部的脈沖信號是經(jīng)XTAL2引腳注入,其連接如圖2.13所示。
二、時(shí)序定時(shí)單位
MCS- 51時(shí)序的定時(shí)單位共有4個(gè),從小到大依次是:拍節(jié)、狀態(tài)、機(jī)器周期和指令周期。下面分別加以說明。
1、拍節(jié)與狀態(tài)
振蕩脈沖的周期定義為拍節(jié)(用“P”表示)。
兩個(gè)拍節(jié)定義為狀態(tài)(用“S”表示)。
2、機(jī)器周期
6個(gè)狀態(tài)為一個(gè)機(jī)器周期。
3、指令周期
執(zhí)行一條指令所需要的時(shí)間稱之為指令周期。MCS- 51的指令周期根據(jù)指令的不同,可包含有1、2、3或4個(gè)機(jī)器周期。
第五節(jié) 單片機(jī)的復(fù)位工作方式
一、復(fù)位操作
復(fù)位是單片機(jī)的初始化操作,其主要功能是把PC初始化為0000H,使單片機(jī)從0000H單元開始執(zhí)行程序。
除PC之外,復(fù)位操作還對其它一些專用寄存器有影響,它們的復(fù)位狀態(tài)如表所示:
PC 0000H TCON 00H
ACC 00H TL0 00H
PSW 00H TH0 00H
SP 07H TL1 00H
DPTR 0000H TH1 00H
P0~P3 0FFH SCON 00H
IP XX000000B SBUF 不定
IE 0X000000B PCON 0XXX0000B
TMOD 00H
二、復(fù)位信號
RST引腳是復(fù)位信號的輸入端,復(fù)位信號是高電平有效,其有效時(shí)間應(yīng)持續(xù)2個(gè)機(jī)器周期以上。
三、復(fù)位方式
復(fù)位操作有上電自動復(fù)位和按健手動復(fù)位兩種方式。
上電自動復(fù)位是通過外部復(fù)位電路的電容充電來實(shí)現(xiàn)的。電路如圖2. 17 (a)
按健手動復(fù)位有電平方式和脈沖方式兩種。其中按健電平復(fù)位是通過使復(fù)位端經(jīng)電阻與Vcc電源接通而實(shí)現(xiàn)的,其電路如圖2. 17 (b)所示。而按健脈沖復(fù)位則是利用RC微分電路產(chǎn)生的正脈沖來實(shí)現(xiàn)的,其電路如圖20.17(c)所示。
第四章 MCS 一 51 單片機(jī)的指令系統(tǒng)
第一節(jié) 指令系統(tǒng)概述
指令是CPU控制計(jì)算機(jī)進(jìn)行某種操作的命令。
指令系統(tǒng)則是全部指令的集合。
一、指令的概念
1、匯編語言指令
定義:用助記符來表示的指令。
特點(diǎn):不能被計(jì)算機(jī)硬件直接識別和執(zhí)行,必須通過某種手段(匯編)把它變成機(jī)器碼指令才能被機(jī)器執(zhí)行。由于其和機(jī)器語言指令一一對應(yīng),因此編寫的程序效率高,占用存儲空間小,運(yùn)行速度快,能編寫出最優(yōu)化的程序。
2、匯編語言的語句格式
MCS- 51匯編語言的語句格式表示知下:
〔<標(biāo)號>〕:<操作碼>〔<操作數(shù)>〕;〔<注釋>〕
1)、標(biāo)號
標(biāo)號是語句地址的標(biāo)志符號,有關(guān)標(biāo)號的規(guī)定如下:
標(biāo)號是由1-8個(gè)ASCII字符組成,但頭一個(gè)字符必須是字母,其余字符可以是字母、數(shù)字或其它特定字符。
不能使用本匯編語言已經(jīng)定義了的符號作為標(biāo)號,如指令助記符、偽指令記憶符以及寄存器的符號名稱等。
同一標(biāo)號在一個(gè)程序中只能定義一次,不能重復(fù)定義。
標(biāo)號的有無取決于本程序中的其它語句是否需要訪問這條語句。
2)、操作碼
操作碼用于規(guī)定語句執(zhí)行的操作內(nèi)容,操作碼是以指令助記符或偽指令助記符表示的,操作碼是匯編指令格式中唯一不能空缺的部分。
3)、操作數(shù)
操作數(shù)用于給指令的操作提供數(shù)據(jù)或地址。
4)、注釋
注釋不屬于語句的功能部分,它只是對語句的解釋說明。
5)、分界符(分隔符)
分界符用于把語句格式中的各部分隔開,以便于區(qū)分,包括空格、冒號、分號或逗號等多種符號。
冒號(:)用于標(biāo)號之后
空格( )用于操作碼和操作數(shù)之間
逗號(,)用于操作數(shù)之間
分號(;)用于注釋之前
3、指令的長度
在MCS-51指令系統(tǒng)中,有一字節(jié)、二字節(jié)和三字節(jié)等不同長度的指令。
二、MCS-51單片機(jī)的尋址方式
尋址:如何指定操作數(shù)或其所在單元。
根據(jù)指定方法的不同,MCS- 51單片機(jī)共有7種尋址方式。
1、寄存器尋址方式
定義:操作數(shù)在寄存器中。
尋址范圍:
·通用寄存器,共有4組共32個(gè)通用寄存器。
·部分專用寄存器。例如累加器A、AB寄存器對以及數(shù)據(jù)指針DPTR等。
2、直接尋址方式
定義:指令中操作數(shù)直接以單元地址的形式給出。
尋址范圍:
·低128單元。在指令中直接以單元地址形式給出。
·專用寄存器。專用寄存器除以單元地址形式給出外,還可以以寄存器符號形式給出。
3、寄存器間接尋址方式
定義:寄存器中存放的是操作數(shù)的地址,即操作數(shù)是通過寄存器間接得到的。
注意:在寄存器間接尋址方式中,應(yīng)在寄存器的名稱前面加前緩標(biāo)志“@”。
尋址范圍:
·內(nèi)部RAM低128單元
只能使用R0或R1作間址寄存器(地址指針),其通用形式為@Ri(i=0或1)。
·外部RAM 64 KB
只能使用DPTR作間址寄存器,其形式為@DPTR。
·外部RAM的低256單元
間址寄存器為DPTR、R0、R1,
·堆找操作指令(PUSH和POP)
即以堆找指針(SP)作間址寄存器的間接尋址方式。
4、立即尋址方式
定義:操作數(shù)在指令中直接給出。
5、變址尋址方式
定義:以DPTR或PC作基址寄存器,以累加器A作變址寄存器,并以兩者內(nèi)容相加形成的16位地址作為操作數(shù)地址。
說明:
·變址尋址方式只能對程序存儲器進(jìn)行尋址,尋址范圍可達(dá)64 KB.
·變址尋址的指令只有3條:
MOVC A,@A+DPTR
MOVC A,@A+PC
JMP @A+DPTR
6、位尋址方式
尋址范圍:
·內(nèi)部RAM中的位尋址區(qū),單元地址為20H~2FH,共16個(gè)單元128位,位地址是00H~7FH。兩種表示方法:一種是位地址;另一種是單元地址加位。
·專用寄存器的可尋址位
4種表示方法:
直接使用位地址。例如PSW寄存器位5地址為0D5H。
位名稱表示方法。例如PSW寄存器位5是F0標(biāo)志位,則可使用F0表示該位。
單元地址加位數(shù)的表示方法。例如PSW寄存器位5,表示為0DOH.5。
專用寄存器符號加位數(shù)的表示方法。例如PSW寄存器的位5,表示為PSW.5。
7、相對尋址方式
為解決程序轉(zhuǎn)移而專門設(shè)置的,為轉(zhuǎn)移指令所采用。
目的地址=轉(zhuǎn)移指令地址+轉(zhuǎn)移指令字節(jié)數(shù)+ rel
第二節(jié) MCS-51 單片機(jī)指令分類介紹
MCS- 51單片機(jī)指令系統(tǒng)共有指令111條,分為5大類:
數(shù)據(jù)傳送類指令(29條)
算術(shù)運(yùn)算類指令(24條)
邏輯運(yùn)算及移位類指令(24條)
控制轉(zhuǎn)移類指令(17條)
位操作類指令(17條)
一、指令格式中符號意義說明
Rn—當(dāng)前寄存器組的8個(gè)通用寄存器R0~R7,所以n=0~7。
Ri—可用作間接尋址的寄存器,只能是R0、R1兩個(gè)寄存器,所以i=0、l。
direct—8位直接地址,在指令中表示直接尋址方式,尋址范圍256個(gè)單元。其值包括0~127(內(nèi)部RAM低128單元地址)和128~255(專用寄存器的單元地址或符號)。
#data—8位立即數(shù)。
#datal6—16位立即數(shù)。
addr16—16位目的地址,只限于在LCALL、LJMP指令中使用。
addrl l—11位目的地址,只限于在ACALL和AJMP指令中使用。
rel—相對轉(zhuǎn)移指令中的偏移量,為8位帶符號補(bǔ)碼數(shù)。
DPTR數(shù)據(jù)指針。
bit—內(nèi)部RAM(包括專用寄存器)中的直接尋址位。
A—累加器。ACC直接尋址方式的累加器。
B—寄存器B。
C—進(jìn)位標(biāo)志位,它是布爾處理機(jī)的累加器,也稱之為累加位。
@—間址寄存器的前級標(biāo)志。
/—加在位地址的前面,表示對該位狀態(tài)取反。
(X)—某寄存器或某單元的內(nèi)容。
((X))—由X間接尋址的單元中的內(nèi)容。
—箭頭左邊的內(nèi)容被箭頭右邊的內(nèi)容所取代。
二、數(shù)據(jù)傳送類指令
傳送指令中有從右向左傳送數(shù)據(jù)的約定,即指令的右邊操作數(shù)為源操作數(shù),表達(dá)的是數(shù)據(jù)的來源;而左邊操作數(shù)為目的操作數(shù),表達(dá)的則是數(shù)據(jù)的去向。數(shù)據(jù)傳送指令的特點(diǎn)為:把源操作數(shù)傳送到目的操作數(shù),指令執(zhí)行后,源操作數(shù)不改變,目的操作數(shù)修改為源操作數(shù)。
1.內(nèi)部RAM數(shù)據(jù)傳送指令組
通用格式為:
MOV<目的操作數(shù)>,<源操作數(shù)>
1)以累加器為目的操作數(shù)的指令
MOV A,Rn;A Rn,(n=0~7)
MOV A,direct;A direct)
MOV A,@Ri;A ((Ri)) (i=0、1)
MOV A,#data;A data
2)以寄存器Rn為目的操作的指令
MOV Rn,A;Rn (A),(n=0~7)
MOV Rn,direct;Rn (direct),(n=0~7)
MOV Rn,#data;Rn data,(n=0~7)
3)以直接地址為目的操作數(shù)的指令
MOV direct,A;direct (A)
MOV direct,Rn;direct Rn,(n=0~7)
MOV directl,direct2;direct 1 (direct2)
MOV direct,@Ri;direct (Ri),(i=0、1)
MOV direct,#data;direct data
4)以間接地址為目的操作數(shù)的指令
MOV @Ri,A;(Ri) (A)
MOV @Ri,direct;(Ri) (direct)
MOV @Ri,#data;(Ri) data
5)十六位數(shù)的傳遞指令
MOV DPTR,#data16
功能:將一個(gè)16位的立即數(shù)送人DPTR中去。其中高8位送人DPH,低8位送入DPL。
例 將片內(nèi)RAM的15H單元的內(nèi)容0A7H送55H單元。
解法1 MOV 55H,15H
解法2 MOV R6,15H
MOV 55H,R6
解法3 MOV R1,#15H
MOV 55H,@R1
解法4 MOV A,15H
MOV 55H,A
例 理解表2-8所列指令的執(zhí)行結(jié)果。
2、外部RAM數(shù)據(jù)傳送指令
MOVX A,@Ri;A ((Ri))
MOVX @Ri,A;(R0) (A)
MOVX A,@DPTR;A ((DPTR))
MOVX @DPTR,A;(DPTR) (A)
要點(diǎn)分析:
1)在MCS-51中,與外部存儲器RAM打交道的只可以是累加器A,所有片外RAM數(shù)據(jù)傳送必須通過累加器A進(jìn)行。
2)要訪問片外RAM,必須要知道RAM單元的16位地址,在后兩條指令中,地址是被直接放在DPTR中的。而前兩條指令,由于Ri(即R0或R1)是一個(gè)8位的寄存器,所以只能訪問片外RAM低256個(gè)單元,即0000H~00FFH。
3)使用外部RAM數(shù)據(jù)傳送指令時(shí),應(yīng)當(dāng)首先將要讀或?qū)懙牡刂匪腿薉PTR或Ri中,然后再用讀寫命令。
例 將外部RAM中0010H單元中的內(nèi)容送人外部RAM中2000H單元中。程序如下:
MOV R0,#10H
MOVX A,@R0
MOV DPTR,#2000H
MOVX @DPTR,A
3、程序存儲器數(shù)據(jù)傳送指令
指令介紹:
MOVC A,@A+DPTR;A ((A)十(DPTR))(遠(yuǎn)程查表指令)
MOVC A,@A+ PC;A ((A)+(PC))(近程查表指令)
要點(diǎn)分析:
1)這兩條指令尋址范圍為64KB,指令首先執(zhí)行16位無符號數(shù)的加法操作,獲得基址與變址之和,“和”作為程序存儲器的地址,該地址中的內(nèi)容送人A中。
2)第二條指令與第一條指令相比,由于PC的內(nèi)容不能通過數(shù)據(jù)傳送指令來改變,而且隨該指令在程序中的位置變化而變化,因此在使用時(shí)需對變址寄存器A進(jìn)行修正。
以上兩條MOVC是64KB存儲空間內(nèi)的查表指令,實(shí)現(xiàn)程序存儲器到累加器的常數(shù)傳送,每次傳送一個(gè)字節(jié)。
例 在片內(nèi)20H單元有一個(gè)BCD數(shù),用查表法獲得相應(yīng)的ASCII碼,并將其送入21H單元。其子程序?yàn)椋海ㄔO(shè)當(dāng)(20H)=07H時(shí))
ORG 1000H;指明程序在ROM中存放始地址
1000H BCD_ASCl:MOV A,20H;A (20H),(A)=07H
1002H ADD A,#3;累加器(A)=(A)+3,修正偏移量
1004H MOVC A,@A+PC; PC當(dāng)前值1005H
1005H MOV 21H,A (A)+(PC)=0AH+1005H=100FH
1007H RET (A)=37H,A ROM(100FH)
1008H TAB:DB 30H
1009H DB 31H
100AH DB 32H
100BH DB 33H
100CH DB 34H
100DH DB 35H
100EH DB 36H
100FH DB 37H
1010H DB 38H
1011H DB 39H
一般在采用PC作基址寄存器時(shí),常數(shù)表與MOVC指令放在一起,稱為近程查表。當(dāng)采用DPTR作基址寄存器時(shí),程序如例6所示,TAB可以放在64KB程序存儲器空間的任何地址上,稱為遠(yuǎn)程查表,不用考慮查表指令與表格之間的距離。
例6 同例5用遠(yuǎn)程查表指令如下:
ORG 1000
BCD_ASC2:MOV A,20H
MOV DPTR,#TAB;TAB首址送DPTR
MOVC A,@A+DPTR;查表
MOV 21H,A
RET
TAB:同例5
4、堆棧操作指令
壓入 PUSH direct;(SP) (SP)+1,(SP) (direct)
彈出 POP direct;direct ((SP)),(SP) (SP)-1
要點(diǎn)分析:
堆棧操作的特點(diǎn)是“先進(jìn)后出”,在使用時(shí)應(yīng)注意指令順序。
例 分析以下程序的運(yùn)行結(jié)果
MOV R2,#05H
MOV A,#01H
PUSH ACC
PUSH 02H
POP ACC
POP 02H
結(jié)果是(R2)=01H,而(A)=05H。也就是兩者進(jìn)行了數(shù)據(jù)交換。因此:使用堆棧時(shí),人棧的順序和出棧的順序必須相反,才能保證數(shù)據(jù)被送回原位,即恢復(fù)現(xiàn)場。
5、數(shù)據(jù)交換指令
(1)字節(jié)交換指令
XCH A,Rn;(A) (Rn)
XCH A,@Ri;(A) (Ri)
XCH A,direct;(A) (direct)
(2)半字節(jié)交換指令
XCHD A,@Ri;(A)0-3 (Ri)0-3
(3)累加器A高低半字節(jié)交換指令
SWAP A;(A)0-3 (A)4-7
數(shù)據(jù)交換主要是在內(nèi)部RAM單元與累加器A之間進(jìn)行。
例 將片內(nèi)RAM 60H單元與61H單元的數(shù)據(jù)交換
不能用:XCH 60H,61H
應(yīng)該寫成:MOV A,60H
XCH A,61H
MOV 60H,A
三、算術(shù)運(yùn)算類指令
1、加法指令組
ADD A,Rn ;A (A)+(Rn )
ADD A,direct;A (A)+(direct)
ADD A,@Ri;A (A)+((Ri))
ADD A,#data;A (A)+data
2、帶進(jìn)位加法指令
ADDC A,Rn;A (A)十(Rn)十(CY)
ADDC A,direct;A (A)十(direct)+(CY)
ADDC A,@R;A (A)十((Ri))十(CY)
ADDC A,#data;A (A)十data+(CY)
3、帶借位減法指令組
SUBB A,Rn;A (A)-(Rn)-(CY)
SUBB A,direct;A (A)-(direct)-(CY)
SUBB A,@Ri;A (A)-((Ri))-(CY)
SUBB A,#data;A (A)-data-(CY)
4、加1指令組
INC A;A (A)十1
INC R.;Rn (Rn)+1
INC direct;direct (direct)+1
INC @Ri;(Ri) ((Ri)))+1
INC DPTR;DPTR (DPTR)+1
5、減1指令
DEC A;A (A)-1
DEC direct;direct (direct)-1
DEC @Ri;(Ri) ((Ri))-1
DEC Rn;Rn (Rn)-1
6、乘法、除法指令
MUL AB;A×B=BA
DIV AB;A=B= A. . . B
要點(diǎn)分析:
MUL指令實(shí)現(xiàn)8位無符號數(shù)的乘法操作,兩個(gè)乘數(shù)分別放在累加器A和寄存器B中,乘積為16位,低8位放在A中,高8位放在B中;DIV指令實(shí)現(xiàn)8位無符號數(shù)除法,被除數(shù)放在A中,除數(shù)放在B中,指令執(zhí)行后,商放在A中而余數(shù)放在B中。
7、十進(jìn)制加法調(diào)整指令
DA A
要點(diǎn)分析:
1)這條指令必須緊跟在ADD或ADDC指令之后,且這里的ADD或ADDC的操作是對壓縮的BCD數(shù)進(jìn)行運(yùn)算。
2)DA指令不影響溢出標(biāo)志。
例 設(shè)(A)=56H,(R7)=78H,執(zhí)行指令:
ADD A,R7
DA A
結(jié)果:(A)=34H,(CY)=1
例設(shè)計(jì)將兩個(gè)4位壓縮BCD碼數(shù)相加程序。其中一個(gè)數(shù)存放在30H(存放十位,個(gè)位)、31H(存放千位,百位)存儲器單元,另一個(gè)加數(shù)存放在32H(存放低位)、33H(存放高位)存儲單元,和數(shù)存到30H, 31H單元。
程序如下:
MOV R0,#30H;地址指針指向一個(gè)加數(shù)的個(gè)位、十位
MOV R1,#32H;另一個(gè)地址指針指向第二個(gè)加數(shù)的個(gè)位、十位
MOV A,@R0;一個(gè)加數(shù)送累加器
ADD A,@R1;兩個(gè)加數(shù)的個(gè)位、十位相加
DA A;調(diào)整為BCD碼數(shù)
MOV@R0,A;和數(shù)的個(gè)位、十位送30H單元
INC R0;兩個(gè)地址指針分別指向兩個(gè)加數(shù)的百位、千位
INC R1
MOV A,@R0;一個(gè)加數(shù)的百位、千位送累加器
ADDC A,@R1;兩個(gè)加數(shù)的百位、千位和進(jìn)位相加
DA A;調(diào)整為BCD碼數(shù)
MOV @R0,A;和數(shù)的百位、千位送31H單元
四、邏輯與運(yùn)算指令組
1、邏輯與運(yùn)算指令組
運(yùn)算規(guī)則為:0·0=0 0·1=0 1·0=0 1·1=1
ANL A,Rn;A (A)∧(Rn)
ANL A,direct;A (A)∧(direct)
ANL A,@Ri;A (A)∧((Ri))
ANL A,#data;A (A)∧data
ANL direct,A;direct (direct)∧(A)
ANL direct,#data;direct (direct)∧data
2、邏輯或運(yùn)算指令組
運(yùn)算規(guī)則為:0+0=0 0+1=0 1+0=1 1+1=1
ORL A,Rn;A (A)∨(Rn)
ORL A,direct;A (A)∨(direct)
ORL A,@Ri;A (A)∨((Ri))
ORL A,#data;A (A)∨data
ORL direct,A;direct (direct)∨(A)
ORL direct,#data;direct (direct)∨data
3、邏輯異或運(yùn)算指令組
運(yùn)算規(guī)則為:0⊕0=0,1⊕1=0,0⊕1=1,1⊕0=1
XRL A,Rn;A (A)⊕(Rn)
XRL A,direct;A (A)⊕(direct)
XL A,@Ri;A (A)⊕((Ri))
XRL A,#data;A (A)⊕data
XRL direct,A;direct (direct)⊕(A)
XRL direct,#data;direct (direct)⊕data
例 試分析下列程序執(zhí)行結(jié)果
MOV A,#0FFH;(A)=0FFH
ANL P1,#00H;SFR中P1口清零
ORL P1,#55H;P1口內(nèi)容為55H
XRL P1,A;P1口內(nèi)容為0AAH
4、累加器清"0”和取反指令組
累加器清“0”指令一條:
CLR A;A 0
累加器按位取反指令一條:
CPL A,A (A)
要點(diǎn)分析:
1)邏輯運(yùn)算是按位進(jìn)行的,累加器的按位取反實(shí)際上是邏擇非運(yùn)算。
2)當(dāng)需要只改變字節(jié)數(shù)據(jù)的某幾位,而其余位不變時(shí),不能使用直接傳送方法,只能通過邏樣運(yùn)算完成。
例 將累加器A的低4位傳送到P1口的低4位,但P1口的高4位需保持不變。對此可由以下程序段實(shí)現(xiàn):
MOV R0,A;A內(nèi)容暫存R0
ANL A,#0FH;屏蔽A的高4位(低4位不變)
ANL P1,#0F0H;屏蔽P1口的低4位(高4位不變)
ORL P1,A;實(shí)現(xiàn)低4位傳送
MOV A,R0;恢復(fù)A的內(nèi)容
5、移位指令
(1)累加器內(nèi)容循環(huán)左移
RL A;An+1 An n=0~6,A0 A7
(2)累加器帶進(jìn)位標(biāo)志循環(huán)左移
RLC A;An+1 An n=0~6,A0 C C A7
(3)累加器內(nèi)容循環(huán)右移
RR A;An An+1 n=0~6,A7 A0
(4)累加器帶進(jìn)位標(biāo)志循環(huán)右移
RRC A;An An+1 n=0~6,A7 C C A0
例 試用三種方法將累加器A中無符號數(shù)乘2。
答:方法1:
CLR C
RLC A
方法2:
CLR C
MOV R0,A
ADD A,R0
方法3:
MOV B,#2
MUL AB
五、控制轉(zhuǎn)移指令組
1、無條件轉(zhuǎn)移指令組
不規(guī)定條件的程序轉(zhuǎn)移稱之為無條件轉(zhuǎn)移。MCS- 51共有4條無條件轉(zhuǎn)移指令:
1)、長轉(zhuǎn)移指令
LJMP addr16;PC addrl6
轉(zhuǎn)移范圍64KB,因此稱之為“長轉(zhuǎn)移”。
2)、絕對轉(zhuǎn)移指令
AJMP addrll;PC (PC)+2;PC0 ~10 addr1l
轉(zhuǎn)移范圍2KB
3)、短轉(zhuǎn)移指令
SJ MP rel
rel為相對偏移量。
計(jì)算目的地址,并按計(jì)算得到的目的地址實(shí)現(xiàn)程序的相對轉(zhuǎn)移。計(jì)算公式為:
目的地址= (PC) + 2+rel
4)、變址尋址轉(zhuǎn)移指令
JMP @A+DPTR;PC (A)+(DPTR)
指令以DPTR內(nèi)容為基址,而以A的內(nèi)容作變址,轉(zhuǎn)移的目的地址由A的內(nèi)容和DPTR內(nèi)容之和來確定,即目的地址=(A)+(DPTR)
例 ORG 1000H
MOV DPTR,#TAB;將TAB所代表的地址送人數(shù)據(jù)指針DPTR
MOV A,R1;從R1中取數(shù)
MOV B,#2
MUL AB;A乘以2,AJMP語句占2個(gè)字節(jié),且是連續(xù)存放的
JMP@A+DPTR;跳轉(zhuǎn)
TAB: AJMP S0;跳轉(zhuǎn)表格
AJMP S1
AJMP S2
S0:S0子程序段
S1:S1子程序段
S2:S2子程序段
END
2、條件轉(zhuǎn)移指令組
所謂條件轉(zhuǎn)移就是程序轉(zhuǎn)移是有條件的。執(zhí)行條件轉(zhuǎn)移指令時(shí),如指令中規(guī)定的條件滿足,則進(jìn)行程序轉(zhuǎn)移,否則程序順序執(zhí)行。條件轉(zhuǎn)移有如下指令:
1)、累加器判零轉(zhuǎn)移指令
JZ rel;若(A)=0,則 PC (PC)+2+rel 轉(zhuǎn)移
若(A)≠0,則PC (PC)+2 順序執(zhí)行
JNZ rel;若(A)≠0,則PC (PC)+2+rel 轉(zhuǎn)移
若(A)=0,則PC (PC)+2 順序執(zhí)行
例 將外部RAM的一個(gè)數(shù)據(jù)塊(首址為DATAl)傳送到內(nèi)部RAM(首址為DATA2),遇到傳送的數(shù)據(jù)為零時(shí)停止。
START:MOV R0,#DATA2;置內(nèi)部RAM數(shù)據(jù)指針
MOV DPTR,#DATAl;置外部RAM數(shù)據(jù)指針
LOOPl:MOVX A,@DPTR;外部RAM單元內(nèi)容送A
JZ LOOP2;判傳送數(shù)據(jù)是否為零,A為零則轉(zhuǎn)移
MOV @R0,A;傳送數(shù)據(jù)不為零,送內(nèi)部RAM
INC R0;修改地址指針
INC DPTR
SJMP LOOP1;繼續(xù)傳送
LOOP2:RET;結(jié)束傳送,返回主程序
2)、數(shù)值比較轉(zhuǎn)移指令
數(shù)值比較轉(zhuǎn)移指令把兩個(gè)操作數(shù)進(jìn)行比較,比較結(jié)果作為條件來控制程序轉(zhuǎn)移。
共有四條指令:
CJNE A, # data, rel
CJNE A, direct, rel
CJNE Rn, # data, rel
CJNE @R, # data, rel
指令的轉(zhuǎn)移可按以下3種情況說明:
若左操作數(shù)=右操作數(shù),則:程序順序執(zhí)行PC (PC)十3
進(jìn)位標(biāo)志位清“0”(CY)=0
若左操作數(shù)>右操作數(shù),則:程序轉(zhuǎn)移 PC (PC)+3+rel
進(jìn)位標(biāo)志位清“0”(CY)=0
若左操作數(shù)<右操作數(shù),則:程序轉(zhuǎn)移PC (PC)+3+rel
進(jìn)位標(biāo)志位里“1”(CY)=1
3)、減1條件轉(zhuǎn)移指令
把減1與條件轉(zhuǎn)移兩種功能結(jié)合在一起的指令。共兩條:
·寄存器減1條件轉(zhuǎn)移指令
DJNZ Rn,rel
其功能為:寄存器內(nèi)容減1,如所得結(jié)果為0,則程序順序執(zhí)行,如沒有減到0,則程序轉(zhuǎn)移。具體表示如下:
Rn (Rn)-1若(Rn)≠0,則PC (PC)+2+rel
若(Rn)=0,則PC (PC)十2
·直接尋址單元減1條件轉(zhuǎn)移指令
DJNZ direct,rel
其功能為:直接尋址單元內(nèi)容減1,如所得結(jié)果為0,則程序順序執(zhí)行;如沒有減到0,則程序轉(zhuǎn)移。具體表示如下:
direct (direct)-1若(direct)≠0,則PC (PC)+3+rel
若(direct)=0,則PC (PC)+3
要點(diǎn)分析:這兩條指令主要用于控制程序循環(huán)。如預(yù)先把寄存器或內(nèi)部RAM單元賦值循環(huán)次數(shù),則利用減1條件轉(zhuǎn)移指令,以減1后是否為0作為轉(zhuǎn)移條件,即可實(shí)現(xiàn)按次數(shù)控制循環(huán)。
例如 把2000H開始的外部RAM單元中的數(shù)據(jù)送到3000H開始的外部RAM單元中,數(shù)據(jù)個(gè)數(shù)已在內(nèi)部RAM35H單元中。
MOV DPTR,#2000H;源數(shù)據(jù)區(qū)首址
PUSH DPL;源首址暫存堆棧
PUSH DPH
MOV DPTR,#3000H;目的數(shù)據(jù)區(qū)首址
MOV R2 ,DPL;目的首址暫存寄存器
MOV R3 ,DPH
LOOP: POP DPH;取回源地址
POP DPL
MOVX A,@DPTR;取出數(shù)據(jù)
INC DPTR;源地址增量
PUSH DPL;源地址暫存堆找
PUSH DPH
MOV DPL,R2 ;取回目的地址
MOV DPH,R3
MOVX @DPTR,A;數(shù)據(jù)送目的區(qū)
INC DPTR;目的地址增量
MOV R2 ,DPL;目的地址暫存寄存器
MOV R3 ,DPH
DJNZ 35H,LOOP;沒完,繼續(xù)循環(huán)
RET;返回主程序
3、子程序調(diào)用與返回指令組
子程序結(jié)構(gòu),即把重復(fù)的程序段編寫為一個(gè)子程序,通過主程序調(diào)用而使用它。減少了編程工作量,縮短了程序的長度。
調(diào)用指令在主程序中使用,而返回指令則應(yīng)該是子程序的最后一條指令。執(zhí)行完這條指令之后,程序返回主程序斷點(diǎn)處繼續(xù)執(zhí)行。如圖所示。
1)、絕對調(diào)用指令
ACALL addr11
子程序調(diào)用范圍是2KB,其構(gòu)造目的地址是在PC+2的基礎(chǔ)上,以指令提供的11位地址取代PC的低11位,而PC的高5位不變。即:
PC (PC)+2
SP (SP)+1,(SP) (PC)7 ~0
SP (SP)+1,(SP) (PC)15 ~8
PC10 ~0 addr11
2)、長調(diào)用指令
LCALL addr16
調(diào)用地址在指令中直接給出,子程序調(diào)用范圍是64KB。
3)、返回指令
RET;子程序返回指令
RETI;中斷服務(wù)子程序返回指令
功能:子程序返回指令執(zhí)行子程序返回功能,從堆找中自動取出斷點(diǎn)地址送給程序計(jì)數(shù)器PC,使程序在主程序斷點(diǎn)處繼續(xù)向下執(zhí)行。
4、空操作指令
NOP;PC (PC)+1
空操作指令也算一條控制指令,即控制CPU不作任何操作,只消耗一個(gè)機(jī)器周期的時(shí)間?詹僮髦噶钍菃巫止(jié)指令,因此執(zhí)行后PC加1,時(shí)間延續(xù)一個(gè)機(jī)器周期。NOP指令常用于程序的等待或時(shí)間的延遲。
六、位操作類指令
1、位傳送指令組
MOV C,bit;CY (bit)
MOV bit,C;bit (CY)
2、位置位復(fù)位指令組
SETB C;CY 1
SETB bit;bit 1
CLR C;CY 0
CLR bit;bit 0
3.位運(yùn)算指令組
與: ANL C,bit;CY (CY)∧(bit)
ANL C,/bit;CY (CY)∧(bit)
或: ORL C,bit;CY (CY)∨(bit)
ORL C,/bit;CY (CY)∨(bit)
非 CPL C;CY (/CY)
CPL bit;bit (/bit)
例 試編程將內(nèi)部數(shù)據(jù)存儲器40H單元的第0位和第7位置“1”,其余位變反。
答:根據(jù)題意編制程序如下:
MOV A,40H
CPL A
SETB ACC. 0
SETB ACC. 7
MOV 40H,A
例 請用位操作指今,求下面邏輯方程:
P1.7=ACC.0×(B.0十P2.1)+P3.2
MOV C,B.0
ORL C,P2.1
ANL C,ACC.0
ORL C,/P3.2
MOV P1.7,C
4、位控制轉(zhuǎn)移指令組
位控制轉(zhuǎn)移指令就是以位的狀態(tài)作為實(shí)現(xiàn)程序轉(zhuǎn)移的判斷條件。
1)、以C狀態(tài)為條件的轉(zhuǎn)移指令
JC rel;(CY)=1轉(zhuǎn)移,否則順序執(zhí)行
JNC rel;(CY)=0轉(zhuǎn)移,否則順序執(zhí)行
2)、以位狀態(tài)為條件的轉(zhuǎn)移指令
JB bit,rel;位狀態(tài)為“1”轉(zhuǎn)移
JNB bit,rel;位狀態(tài)為“0”轉(zhuǎn)移
JBC bit,rel;位狀態(tài)為“1”轉(zhuǎn)移,并使該位清“0”。
第五章 匯編語言程序設(shè)計(jì)
計(jì)算機(jī)程序設(shè)計(jì)語言通常分為三類:
機(jī)器語言:能被計(jì)算機(jī)直接識別和執(zhí)行,但它不易為人們編寫和閱讀,因此,人們一般不再用它來進(jìn)行程序設(shè)計(jì)。
高級語言:一種面向過程和問題并能獨(dú)立于機(jī)器的通用程序設(shè)計(jì)語言,是一種接近人們自然語言和常用數(shù)字表達(dá)式的計(jì)算機(jī)語言。編程的速度快而且編程者不必熟悉機(jī)器內(nèi)部的硬件結(jié)構(gòu)而可以把主要精力集中于掌握語言的語法規(guī)則和程序的結(jié)構(gòu)設(shè)計(jì)方面。但程序執(zhí)行的速度慢且占據(jù)的存儲空間較大。
匯編語言:一種面向機(jī)器的語言,它的助記符指令和機(jī)器語言保持著一一對應(yīng)的關(guān)系。也就是說,匯編語言實(shí)際上就是機(jī)器語言的符號表示。用匯編語言編程時(shí),編程者可以直接操作到機(jī)器內(nèi)部的寄存器和存儲單元,能把處理過程描述得非常具體。因此通過優(yōu)化能編制出高效率的程序,即可節(jié)省存儲空間又可提高程序執(zhí)行的速度,在空間和時(shí)間上都充分發(fā)揮了計(jì)算機(jī)的潛力。在實(shí)時(shí)控制的場合下,計(jì)算機(jī)的監(jiān)控程序大多采用匯編語言編寫。
第一節(jié) 偽指令及匯編語言源程序匯編
一、偽指令
偽指令:不屬于指令集中的指令,在匯編時(shí)不產(chǎn)生目標(biāo)代碼,不影響程序的執(zhí)行,僅指明在匯編時(shí)執(zhí)行一些特殊的操作。
1、定義起始地址偽指令ORG
格式:ORG 操作數(shù)
說明:操作數(shù)為一個(gè)16位的地址,它指出了下面的那條指令的目標(biāo)代碼的第一個(gè)字節(jié)的程序存儲器地址。在一個(gè)源程序中,可以多次定義ORG偽指令,但要求規(guī)定的地址由小到大安排,各段之間地址不允許重復(fù)。
2、定義賦值偽指令EQU
格式:字符名稱 EQU 操作數(shù)
說明:該指令是用來給字符名稱賦值。在同一個(gè)源程序中,任何一個(gè)字符名稱只能賦值一次。賦值以后,其值在整個(gè)源程序中的值是固定的,不可改變。對所賦值的字符名稱必須先定義賦值后才能使用。其操作數(shù)可以是8位或16位的二進(jìn)制數(shù),也可以是事先定義的表達(dá)式。
3、定義數(shù)據(jù)地址賦值偽指令DATA
格式:字符名稱 DATA 操作數(shù)
說明:DATA偽指令的功能和EQU偽指令相似,不同之處是DATA偽指令所定義的字符名稱可先使用后定義,也可先定義后使用。在程序中它常用來定義數(shù)據(jù)地址。
4、定義字節(jié)數(shù)據(jù)偽指令DB
格式:[標(biāo)號:]DB數(shù)據(jù)表
說明:該偽指令是用來定義若干字節(jié)數(shù)據(jù)從指定的地址單元開始存放在程序存儲器中。數(shù)據(jù)表是由8位二進(jìn)制數(shù)或由加單引號的字符組成,中間用逗號間隔,每行的最后一個(gè)數(shù)據(jù)不用逗號。
DB偽指令確定數(shù)據(jù)表中第一個(gè)數(shù)據(jù)的單元地址有兩種方法,一是由ORG偽指令規(guī)定首地址,二是由DB前一條指令的首地址加上該指令的長度。
5、定義雙字節(jié)數(shù)據(jù)偽指令DW
格式:[標(biāo)號:]DW數(shù)據(jù)表
說明:該偽指令與DB偽指令的不同之處是,DW定義的是雙字節(jié)數(shù)據(jù),而DB定義的是單字節(jié)數(shù)據(jù),其他用法都相同。在匯編時(shí),每個(gè)雙字節(jié)的高8位數(shù)據(jù)要排在低地址單元,低8位數(shù)據(jù)排在高地址單元。
6、定義預(yù)留空間偽指令DS
格式:〔標(biāo)號:〕DS操作數(shù)
說明:該偽指令是用于告訴匯編程序,從指定的地址單元開始(如由標(biāo)號指定首址),保留由操作數(shù)設(shè)定的字節(jié)數(shù)空間作為備用空間。要注意的是DB、DW、DS偽指令只能用于程序存儲器,而不能用于數(shù)據(jù)存儲器。
7、定義位地址賦值偽指令BIT
格式:字符名稱BIT位地址
說明:該偽指令只能用于有位地址的位(片內(nèi)RAM和SFR塊中),把位地址賦予規(guī)定的字符名稱,常用于位操作的程序中。
8、定義匯編結(jié)束偽指令END
格式:〔標(biāo)號:〕END
說明:匯編結(jié)束偽指令END是用來告訴匯編程序,此源程序到此結(jié)束。在一個(gè)程序中,只允許出現(xiàn)一條END偽指令,而且必須安排在源程序的末尾。
二、匯編語言源程序匯編
用匯編語言編寫的源程序稱為匯編語言源程序。但是單片機(jī)不能直接識別,需要通過匯編將其轉(zhuǎn)換成用二進(jìn)制代碼表示的機(jī)器語言程序,才能夠識別和執(zhí)行。匯編通常由專門的匯編程序來進(jìn)行,通過編譯后自動得到對應(yīng)于匯編源程序的機(jī)器語言目標(biāo)程序,這個(gè)過程叫機(jī)器匯編。另外還可用人工匯編。
一、匯編程序的匯編過程
匯編過程是將匯編語言源程序翻譯成目標(biāo)程序的過程。機(jī)器匯編通常是在計(jì)算機(jī)上(與MCS一51單片機(jī)仿真器聯(lián)機(jī))通過編譯程序?qū)崿F(xiàn)匯編。
二、人工匯編
由程序員根據(jù)MCS - 51的指令集將匯編語言源程序的指令逐條人工翻譯成機(jī)器碼的過程叫人工匯編。
第三節(jié) 匯編語言程序設(shè)計(jì)舉例
匯編語言程序設(shè)計(jì)通常的步驟是:
(1)建立數(shù)學(xué)模型:根據(jù)課題要求,用適當(dāng)?shù)臄?shù)學(xué)方法來描述和建立數(shù)學(xué)模型。
(2)確定算法:繪制程序流程圖算法是程序設(shè)計(jì)的基本依據(jù)。程序流程圖是編程時(shí)的思路體現(xiàn)。
(3)編寫源程序合理選擇和分配內(nèi)存單元、工作寄存器。按模塊結(jié)構(gòu)具體編寫源程序。
(4)匯編及調(diào)試程序通過匯編生成目標(biāo)程序,經(jīng)過多次調(diào)試,對程序運(yùn)行結(jié)果進(jìn)行分析,不斷修正源程序中的錯(cuò)誤,最后得到正確結(jié)果,達(dá)到預(yù)期目的。
編寫一個(gè)應(yīng)用系統(tǒng)的匯編語言源程序,其程序結(jié)構(gòu)一般有順序結(jié)構(gòu)、分支結(jié)構(gòu)、循環(huán)結(jié)構(gòu)、子程序結(jié)構(gòu)等,如圖所示。
一、順序程序設(shè)計(jì)
順序程序:各類結(jié)構(gòu)化程序塊中最簡單的一種。它按程序執(zhí)行的順序依次編寫,在執(zhí)行程序過程中不使用轉(zhuǎn)移指令,只是順序執(zhí)行。
例 把A中的壓縮BCD碼轉(zhuǎn)換成二進(jìn)制數(shù)。
解:此程序采用將A中的高半節(jié)(十位)乘以10,再加上A的低半字節(jié)(個(gè)位)的方法。編程如下:
MOV R2,A;暫存
ANL A,#F0H;屏蔽低4位
SWAP A
MOV B,#10
MUL AB;A中高半字節(jié)乘10
MOV R3,A
MOV A,R2;取原BCD數(shù)
ANL A,#0FH;取BCD數(shù)個(gè)位
ADD A,R3;個(gè)位與十位數(shù)相加
RET
二、分支程序的設(shè)計(jì)
分支程序主要是根據(jù)判斷條件的成立與否來確定程序的走向。因此在分支程序中需要使用控制轉(zhuǎn)移類指令?山M成簡單分支結(jié)構(gòu)和多分支結(jié)構(gòu)。
1 、單分支選擇結(jié)構(gòu)
當(dāng)程序的判斷僅有兩個(gè)出口,兩者選一,稱為單分支結(jié)構(gòu)。通常用條件判斷指令來選擇并確定程序的分支出口。這類單分支選擇結(jié)構(gòu)有三種典型的形式,見圖。
(1)圖a,當(dāng)條件滿足時(shí)執(zhí)行分支程序2,否則執(zhí)行分支程序1。
(2)圖b,當(dāng)條件滿足時(shí)跳過程序段1,從程序段2執(zhí)行,否則順序執(zhí)行程序段1,再執(zhí)行程序段2。
(3)圖c,這是分支結(jié)構(gòu)的一種特殊形式。當(dāng)條件滿足時(shí),停止執(zhí)行程序段1。
例 設(shè)內(nèi)部RAM 40H和41H單元中存放2個(gè)8位無符號二進(jìn)制數(shù),試編程找出其中的大數(shù)存人30H單元中。
解: MOV A,40H
CJNE A,41H,LOOP;取2個(gè)數(shù)進(jìn)行比較
LOOP: JNC LOOP1;根據(jù)CY值,判斷單分支出口
MOV A,41H;41H單元中是大數(shù)
LOOPl:MOV 30H,A;40H單元中是大數(shù)
2 、多分支選擇結(jié)構(gòu)
當(dāng)程序的判別部分有兩個(gè)以上的出口流向時(shí),稱為多分支選擇結(jié)構(gòu)。一般有兩種形式,見圖。
例 設(shè)變量X的值存放在內(nèi)部RAM的30H單元中,編程求解下列函數(shù)式,將求得的函數(shù)值Y存人40H單元。
X+1 (X≥100)
Y= 0 (10≤X<100)
X一1 (X<10)
解:自變量X的值在三個(gè)不同的區(qū)間所得到的函數(shù)值Y不同,編程時(shí)要注意區(qū)間的劃分。程序流程圖如圖4一4所示。程序如下:
MOV A,30H;取自變量X值
CJNE A,#10,LOOP;與10比較,A中值不改變
LOOP:JC LOOP2;若X< 10,轉(zhuǎn)LOOP2
CJNE A,#100,LOOP1;與100比較
LOOP1:JNC LOOP3;若X>100,轉(zhuǎn)LOOP3
MOV 40H,#00H;因10≤X<100,故Y=0
SJMP EXIT
LOOP2:DEC A;因X<10,故Y=X一1
MOV 40H,A
SJMP EXIT,
LOOP3:INC A;若X>100,故Y=X+1
MOV 40H, A
EXET:RET
例 某溫度控制系統(tǒng),采集的溫度值Ta放在累加器A中。此外,在內(nèi)部RAM54H單元存放控制溫度下限值(T54),在55H單元存放控制溫度上限值(T55)。若Ta>T55,程序轉(zhuǎn)向JW(降溫處理程序);若Ta<T54,則程序轉(zhuǎn)向SW(升溫處理程序);若T55≥Ta≥T54,則程序轉(zhuǎn)向FH(返回主程序)。有關(guān)程序段如下:
CJNE A,55H,I.OOP1;Ta≠55,轉(zhuǎn)向LOOP1
AJMP FH;Ta=T55,返回
I.OOPl:JNC JW;(CY)=0,表明Ta>T55,轉(zhuǎn)降溫處理程序
CJNE A,54H,LOOP2;Ta≠T54,轉(zhuǎn)向LOOP2
AJMP FH;Ta=T54,返回
LOOP2:JC SW;(CY)=1,表明Ta<T54,轉(zhuǎn)升溫處理程序
FH:RET;T55≥Ta≥T54,返回主程序
三、循環(huán)程序設(shè)計(jì)
1 、循環(huán)結(jié)構(gòu)的組成
循環(huán)結(jié)構(gòu)由4部分組成:初始化部分、循環(huán)處理部分、循環(huán)控制部分和循環(huán)結(jié)束部分。循環(huán)結(jié)構(gòu)組成圖見圖。
(1)初始化部分用來設(shè)置循環(huán)處理之前的初始狀態(tài),如循環(huán)次數(shù)的設(shè)置、變量初值的設(shè)置、地址指針的設(shè)置等。
(2)循環(huán)處理部分又稱為循環(huán)體,是重復(fù)執(zhí)行的數(shù)據(jù)處理程序段,它是循環(huán)程序的核心部分。
(3)循環(huán)控制部分這部分用來控制循環(huán)繼續(xù)與否。
(4)結(jié)束部分這部分是對循環(huán)程序全部執(zhí)行結(jié)束后的結(jié)果進(jìn)行分析、處理和保存。
典型循環(huán)結(jié)構(gòu)見圖所示。圖a為先處理后判斷的結(jié)構(gòu),圖b為先判斷后處理的結(jié)構(gòu)。
根據(jù)循環(huán)程序的結(jié)構(gòu)不同也可分為單重循環(huán)和多重循環(huán)。
對循環(huán)次數(shù)的控制有多種:循環(huán)次數(shù)是已知的,可用循環(huán)次數(shù)計(jì)數(shù)器控制循環(huán);若循環(huán)次數(shù)是未知的,可以按條件控制循環(huán)。
2.循環(huán)程序設(shè)計(jì)
在一個(gè)循環(huán)程序的循環(huán)體中不包含另外的循環(huán)結(jié)構(gòu)稱為單重循環(huán)。
例 設(shè)有一字符串以回車符為結(jié)束標(biāo)志,并存放在內(nèi)部RAM40H單元開始的連續(xù)存儲單元中,編寫測試字符串長度的程序。
分析:為測試字符串的長度,應(yīng)使用逐個(gè)字符依次與回車符(ODH)比較的方法。為此需要設(shè)里一個(gè)字符串指針和一個(gè)長度計(jì)數(shù)器,字符串指針用于指定字符,長度計(jì)數(shù)器用于累加字符串的長度。如比較不相等,則長度計(jì)數(shù)器和字符串指針都加1,以繼續(xù)往下比較;如果比較相等,則表示該字符為回車符,字符串結(jié)束,長度計(jì)數(shù)器的值就是字符串的長度。
MOV R7,#0FFH;設(shè)里長度計(jì)數(shù)器初值
MOV R0,#3FH;Al字符串指針初值
LOOP:INC R7
INC R0
CJNE @R0,#ODH,LOOP
RET
例 設(shè)內(nèi)部RAM存有一無符號數(shù)數(shù)據(jù)塊,長度為128字節(jié),在以30H單元為首址的連續(xù)單元中。試編程找出其中最小的數(shù),并放在20H單元。
解: MOV R7,#7FH;設(shè)置比較次數(shù)
MOV R0,#30H;設(shè)置數(shù)據(jù)塊首址
MOV A,@R0;取第一個(gè)數(shù)
MOV 20H,A;第一個(gè)數(shù)暫存于20H單元,作為最小數(shù)
LOOPl:INC R0
MOV A,@R0;依次取下一個(gè)數(shù)
CJNE A,20H,LOOP
LOOP:JNC LOOP2;兩數(shù)比較后,其中小的數(shù)放在20H單元
MOV 20H,A
LOOP2:DJNZ R7,LOOP1;R7中內(nèi)容為零則比較完
SJMP$
例 80C51單片機(jī)的P1端口作檢出,經(jīng)驅(qū)動電路接8只發(fā)光二極管,如圖4-2所示。當(dāng)輸出為“1”時(shí),發(fā)光二極管點(diǎn)亮;輸出位是“0”時(shí)為暗。試分析下述程序執(zhí)行過程及發(fā)光二極管點(diǎn)亮的工作規(guī)律。
LP:MOV P1,#81H
LCALL DELAY
MOV P1,#42H
LCALL DELAY
MOV P1,# 24H
LCALL DELAY
MOV P1,#18H
LCALL DELAY
MOV P1,#24H
LCALL DELAY
MOV P1,#42H
LCALL DELAY
SJMP LP
子程序:
DELAY:MOV R2,#0FAH
L1:MOV R3,# 0FAH
L2:DJNZ R3,L2
DJNZ R2,L1
RET
答:上述程序執(zhí)行過程及發(fā)光二極管點(diǎn)亮的工作規(guī)律為:首先是第1和第8個(gè)燈亮;延時(shí)一段時(shí)間后,第2和第7個(gè)燈亮;延時(shí)一段時(shí)間后,第3和第6個(gè)燈亮;延時(shí)一段時(shí)間后,第4和第5個(gè)燈亮;延時(shí)一段時(shí)間后,重復(fù)上述過程。
若系統(tǒng)的晶振頻率為6MHz,延時(shí)子程序DELAY的延時(shí)時(shí)間計(jì)算如下:
DELAY:MOV R2,#0FAH
L1:MOV R3,#0FAH
L2:DJNZ R3,L2
DJNZ R2,L1
RET
因?yàn)镕AH=250,所以總時(shí)間T計(jì)算如下:
T=4+(250×4+4)×250十4=251008 us
若想加長延時(shí)時(shí)間,可以增加循環(huán)次數(shù)。若想縮短延時(shí)時(shí)間,可以減少循環(huán)次數(shù)。
例 根據(jù)圖4-2所示的線路,試編寫燈移位程序,即8個(gè)發(fā)光二極管依次亮一個(gè),循環(huán)左移,一個(gè)一個(gè)地亮,循環(huán)不止。
答:根據(jù)題圖4一2所示的線路,編制燈亮移位程序如下:
MOV A,#1
L1:MOV P1,A
RL A
LCALL DELAY;DELAY同上題中的延時(shí)程序
SJMP Ll
例 編制一個(gè)循環(huán)閃爍燈的程序。有8個(gè)發(fā)光二極管,每次其中某個(gè)燈閃爍點(diǎn)亮10次后,轉(zhuǎn)移到下一個(gè)閃爍10次,循環(huán)不止。
解:本程序的硬件連接如圖5-16所示,8031的P1口輸出經(jīng)74LS240 8路反相驅(qū)動后,點(diǎn)燃發(fā)光二極管。由圖可見,低電平時(shí)發(fā)光二極管可被點(diǎn)亮。編程如下:
MOV A,#01;初值
SHIM:LCALL FLASH;閃亮10次
RRA;右移
SJMP SHIM;循環(huán)
FLASH:MOV R2,#0AH;閃爍10次
FLASH1:MOV P1,A;點(diǎn)亮
LCALL DELAY;延時(shí)
MOV P1,#00H;熄滅
LCALL DELAY;延時(shí)
DJNZ R2,F(xiàn)LASH1;循環(huán)
RET
本程序中DELAY為延時(shí)子程序,初值可以自己按延時(shí)要求編制。
第六章 MCS-51 單片機(jī)中斷系統(tǒng)
第一節(jié) 概述
一、中斷的概念
中斷是指計(jì)算機(jī)暫時(shí)停止原程序的執(zhí)行轉(zhuǎn)而為外部設(shè)備服務(wù),并在服務(wù)完以后自動返回原程序執(zhí)行的過程。
一個(gè)資源(CPU)面對多項(xiàng)任務(wù),但由于資源有限,因此就可能出現(xiàn)資源競爭的局面,即幾項(xiàng)任務(wù)來爭奪一個(gè)CPU。而中斷技術(shù)就是解決資源競爭的有效方法,采用中斷技術(shù)可以使多項(xiàng)任務(wù)共享一個(gè)資源,所以中斷技術(shù)實(shí)質(zhì)上就是一種資源共享技術(shù)。
二、引入中斷技術(shù)的優(yōu)點(diǎn):
1)提高了CPU的工作效率,實(shí)現(xiàn)了CPU和外部設(shè)備的并行工作。
2)實(shí)現(xiàn)實(shí)時(shí)控制。所謂實(shí)時(shí)控制,就是要求計(jì)算機(jī)能及時(shí)地響應(yīng)被控對象提出的分析、計(jì)算和控制等請求,使被控對象保持在最佳工作狀態(tài),以達(dá)到預(yù)定的控制效果。由于這些控制參數(shù)的請求都是隨機(jī)發(fā)出的,而且要求單片機(jī)必須作出快速響應(yīng)并及時(shí)處理,對此,只有靠中斷技術(shù)才能實(shí)現(xiàn)。
3)便于突發(fā)故障(如硬件故障、運(yùn)算錯(cuò)誤、電源掉電、程序故障等)的及時(shí)發(fā)現(xiàn),提高系統(tǒng)可靠性。
4)能使用戶通過鍵盤發(fā)出請求,隨時(shí)可以對運(yùn)行中的計(jì)算機(jī)進(jìn)行干預(yù)。
三、中斷源
向CPU發(fā)出中斷請求的來源稱之為中斷源。MCS- 51是一個(gè)多中斷源的單片機(jī),以80C51為例,共5個(gè)中斷源,分別是外部中斷2個(gè),定時(shí)中斷2個(gè)和串行中斷1個(gè)。
1、外中斷
外中斷是由外部信號引起的,共有2個(gè)中斷源,即外部中斷0和外部中斷1。中斷請求信號分別由引腳INT0(P3.2)INT1(P3.3)引入。
外部中斷請求有兩種信號方式,即電平方式和脈沖方式。可通過設(shè)置有關(guān)控制位進(jìn)行定義。
電平方式的中斷請求是低電平有效。只要單片機(jī)在中斷請求引入端上采樣到有效的低電平時(shí),就激活外部中斷。
脈沖方式的中斷請求則是脈沖的后沿負(fù)跳有效。CPU在兩個(gè)相隨機(jī)器周期對中斷請求引入端進(jìn)行的采樣中,如前一次為高電平,后一次為低電平,即為有效中斷請求。
2、定時(shí)中斷
定時(shí)中斷足為滿足定時(shí)或計(jì)數(shù)的需要而設(shè)置的。當(dāng)計(jì)數(shù)結(jié)構(gòu)發(fā)生計(jì)數(shù)溢出時(shí),即表明定時(shí)時(shí)間到或計(jì)數(shù)值已滿,請求是在單片機(jī)芯片內(nèi)部發(fā)生的,無需在芯片上設(shè)里引入端。
3、串行中斷
串行中斷是為串行數(shù)據(jù)傳送的需要而設(shè)置的。每當(dāng)串行口接收或發(fā)送完一組串行數(shù)據(jù)時(shí),就產(chǎn)生一個(gè)中斷請求。請求是在單片機(jī)芯片內(nèi)部自動發(fā)生的,不需在芯片上設(shè)里引入端。
第二節(jié) 中斷控制
一、定時(shí)器控制寄存器(TCON )
該寄存器用于保存外部中斷請求以及定時(shí)器的計(jì)數(shù)溢出。寄存器的內(nèi)容及位地址表示如下:
1、IE0和IE1 外中斷請求標(biāo)志位
當(dāng)CPU采樣到INT0(INT1)端出現(xiàn)有效中斷請求時(shí),IE0(IE1)位由硬件置“1”。在中斷響應(yīng)完成后轉(zhuǎn)向中斷服務(wù)時(shí),再由硬件自動清“0”。
2、IT0和IT1 外中斷請求觸發(fā)方式控制位
IT0(IT1)=1 脈沖觸發(fā)方式,后沿負(fù)跳有效。
IT0(IT1)=0 電平觸發(fā)方式,低電平有效。
由軟件置“1”或清“0"。
3、TF0和TF1 計(jì)數(shù)溢出標(biāo)志位
當(dāng)計(jì)數(shù)器產(chǎn)生計(jì)數(shù)溢出時(shí),相應(yīng)的溢出標(biāo)志位由硬件置“1”。當(dāng)轉(zhuǎn)向中斷服務(wù)時(shí),再由硬件自動清“0"。計(jì)數(shù)溢出標(biāo)志位的使用有兩種情況:
采用中斷方式時(shí),作中斷請求標(biāo)志位來使用;
采用查詢方式時(shí),作查詢狀態(tài)位來使用。
二、串行口控制寄存器(SCON )
寄存器的內(nèi)容及位地址表示如下:
1、TI 串行口發(fā)送中斷請求標(biāo)志位
當(dāng)發(fā)送完一幀串行數(shù)據(jù)后,由硬件置“1”;在轉(zhuǎn)向中斷服務(wù)程序后,用軟件清“0”。
2、RI 串行口接收中斷請求標(biāo)志位
當(dāng)接收完一幀串行數(shù)據(jù)后,由硬件置“1”;在轉(zhuǎn)向中斷服務(wù)程序后,用軟件清“0”。
串行中斷請求由TI和RI的邏輯或得到。就是說,無論是發(fā)送標(biāo)志還是接收標(biāo)志,都會產(chǎn)生串行中斷請求。
三、中斷允許控制寄存器(IE )
寄存器地址0A8H,位地址0AFH~0A8H。寄存器的內(nèi)容及位地址表示如下:
1、EA中斷允許總控制位
EA=0 中斷總禁止,禁止所有中斷。
EA=1 中斷總允許,總允許后中斷的禁止或允許由各中斷源的中斷允許控制位進(jìn)行設(shè)里。
2、EX0(EX1)外部中斷允許拉制位
EX0(EX1)=0 禁止外中斷
EX0(EX1)=l 允許外中斷
3、ET1和ET2 定時(shí)/計(jì)數(shù)中斷允許控制位
ET0(ET1)=0 禁止定時(shí)(或計(jì)數(shù))中斷
ET0(ET1)=1 允許定時(shí)(或計(jì)數(shù))中斷
4、ES串行中斷允許控制位
ES=0禁止串行中斷
ES=1允許串行中斷
四、中斷優(yōu)先級控制寄存器IP
IP寄存器地址0B8H,位地址為0BFH~0B8H。寄存器的內(nèi)容及位地址表示如下:
PX0外部中斷0優(yōu)先級設(shè)定位;
PT0定時(shí)中斷0優(yōu)先級設(shè)定位,
PX1外部中斷1優(yōu)先級設(shè)定位;
PT1定時(shí)中斷1優(yōu)先級設(shè)定位;
PS串行中斷優(yōu)先級設(shè)定位。
為“0”的位優(yōu)先級為低;為"1"的位優(yōu)先級為高。
五、中斷優(yōu)先級控制原則和控制邏輯
MCS- 51具有兩級優(yōu)先級,具備兩級中斷服務(wù)嵌套的功能。其中斷優(yōu)先級的控制原則是:
·低優(yōu)先級中斷請求不能打斷高優(yōu)先級的中斷服務(wù);但高優(yōu)先級中斷請求可以打斷低優(yōu)先級的中斷服務(wù),從而實(shí)現(xiàn)中斷嵌套。
·如果一個(gè)中斷請求已被響應(yīng),則同級的其它中斷服務(wù)將被禁止。即同級不能嵌套。
·如果同級的多個(gè)中斷請求同時(shí)出現(xiàn),則按CPU查詢次序確定那個(gè)中斷請求被響應(yīng)。其查詢次序?yàn)椋和獠恐袛? 定時(shí)中斷0 外部中斷1 定時(shí)中斷1 串行中斷。
六、中斷初始化與中斷控制寄存器狀態(tài)設(shè)置
外中斷初始化共有三項(xiàng)內(nèi)容:中斷總允許、外中斷允許和中斷方式設(shè)定。定時(shí)中斷則只有兩項(xiàng)內(nèi)容,沒有中斷方式控制。
第三節(jié) 中斷系統(tǒng)的結(jié)構(gòu)
一、 MCS-51中斷系統(tǒng)的響應(yīng)過程
中斷過程:
中斷過程的三步曲:中斷響應(yīng)、執(zhí)行中斷服務(wù)程序及中斷返回。圖中的中斷源,就是指能提出中斷請求的計(jì)算機(jī)內(nèi)部電路與外部設(shè)備。
下面分析一下中斷過程中的技術(shù)細(xì)節(jié)。
1、 中斷響應(yīng)
中斷響應(yīng)的條件:
基本條件有:
·有中斷源提出中斷請求;
·中斷總允許位EA=1,即CPU開放中斷;
·申請中斷的中斷源的中斷允許位為1,即沒有被屏蔽。
MCS- 51的CPU在每個(gè)機(jī)器周期采樣各中斷請求標(biāo)志位,如有置位,只要以上條件滿足,且下列三種情況都不存在,那么,在下一周期CPU響應(yīng)中斷。否則,采樣的結(jié)果被取消。這3種情況是:
·CPU正在處理同級或高級優(yōu)先級的中斷。
·現(xiàn)行的機(jī)器周期不是所執(zhí)行指令的最后一個(gè)機(jī)器周期。
·正在執(zhí)行的指令是RETI或訪問IE、IP指令。CPU在執(zhí)行RETI或訪問IE、IP的指令后,至少需要再執(zhí)行一條其他指令后才會響應(yīng)中斷請求。
MCS-51中斷系統(tǒng)在中斷響應(yīng)時(shí)的技術(shù)措施為:
1)當(dāng)前PC值送堆棧,也就是將CPU本來要取用的指令地址暫存到堆棧中保護(hù)起來,以便中斷結(jié)束時(shí),CPU能找到原來程序的斷點(diǎn)處,繼續(xù)執(zhí)行下去。這一措施是中斷系統(tǒng)自動保存完成。
2)保護(hù)現(xiàn)場時(shí)關(guān)閉中斷,以防其他中斷信號干擾。此時(shí),中斷系統(tǒng)關(guān)閉該中斷源接收電路,其他中斷請求均被禁止。這一措施需用指令完成
3)按中斷源入口地址進(jìn)人中斷服務(wù)程序。
2、中斷服務(wù)程序
在中斷響應(yīng)后,計(jì)算機(jī)調(diào)用的子程序稱為中斷服務(wù)程序。這是專門為外部設(shè)備或其他內(nèi)部部件中斷源服務(wù)的程序段,其結(jié)尾必須是中斷返回指令RETI。
3、中斷返回
計(jì)算機(jī)在中斷響應(yīng)時(shí)執(zhí)行到RETI指令時(shí),立即結(jié)束中斷并從堆棧中自動取出在中斷響應(yīng)時(shí)壓入的PC當(dāng)前值,從而使CPU返回原程序中斷點(diǎn)繼續(xù)進(jìn)行下去。
二、中斷采樣、中斷查詢
1、中斷采樣
采樣就是CPU在每個(gè)機(jī)器周期對引腳INT0(P3.2)和INT1(P3.3)進(jìn)行信號檢測,根據(jù)采樣結(jié)果設(shè)置TCON寄存器中相應(yīng)的標(biāo)志位,以便CPU在下一個(gè)機(jī)器周期檢測這些中斷標(biāo)志位的狀態(tài),了解是否有外部中斷申請,然后根據(jù)中斷初始化情況決定是否響應(yīng)。
對于T0、T1、串行口中斷的中斷請求,都發(fā)生在芯片內(nèi)部,可以直接設(shè)置TCON寄存器和SCON寄存器中相應(yīng)的標(biāo)志位,無須采樣。
2、 中斷查詢
CPU檢測TCON寄存器和SCON寄存器中各標(biāo)志位的狀態(tài),來決定有沒有中斷請求發(fā)生及是哪一個(gè)中斷請求。
三、中斷響應(yīng)時(shí)間
定義:從檢測到中斷申請到轉(zhuǎn)去執(zhí)行中斷服務(wù)程序所需的時(shí)間。
一般情況下中斷響應(yīng)時(shí)間在3-8個(gè)機(jī)器周期之間。
四、中斷標(biāo)志的清除方式
中斷標(biāo)志清除方式有三種情況:
1)定時(shí)器T0、T1及邊沿觸發(fā)方式的外部中斷標(biāo)志,TF0、TF1、IE0、IE1在中斷響應(yīng)后由硬件自動清除,無需采取其他措施。
2)電平觸發(fā)方式的外部中斷標(biāo)志IE1、IE0不能自動清除,必須撤除/INT0或/INT1的電平信號。
3)串行口中斷標(biāo)志TI、RI不能由硬件清除,需用指令清除,
第四節(jié) 應(yīng)用舉例
例 在下圖中有開關(guān)K,每扳動一次開關(guān),就產(chǎn)生一個(gè)外部中斷請求。經(jīng)P1.3~P1.0讀入開關(guān)K0~K3的狀態(tài),取反后再由P1.7~P1.4輸出,驅(qū)動相應(yīng)的發(fā)光二極管。主程序流程如圖
程序清單為:
ORG 1000H
STAR:AJMP MAIN
ORG 1003H
AJMP EXTR
ORG 1030H
MAIN:SETB IT0;脈沖邊沿觸發(fā)
SETB EX0;外部中斷0允許
SETB EA;總中斷允許
HERE:AJMP HERE;等待中斷
ORG 1200H
P1 EQU 90H
EXTR:MOV A,#0FH;中斷服務(wù)程序
MOV P1,A;熄發(fā)光二極管
MOV A,P1;輸入開關(guān)狀態(tài)
CPL A;狀態(tài)取反
ANL A,#0FH;屏蔽A的高半字節(jié)
SWAP A;A高低半字節(jié)交換
MOV P1,A;開關(guān)狀態(tài)愉出
RETI;中斷返回
第七章 MCS-51 單片機(jī)定時(shí)器 / 計(jì)數(shù)器
第一節(jié) 概 述
一、 定時(shí)方法
在單片機(jī)的控制應(yīng)用中,可供選擇的定時(shí)方法有:
1、軟件定時(shí)
軟件定時(shí):靠執(zhí)行一個(gè)循環(huán)程序以進(jìn)行時(shí)間延遲。
特點(diǎn):時(shí)間精確,且不需外加硬件電路。但占用CPU,定時(shí)的時(shí)間不宜太長。
2、硬件定時(shí)
硬件定時(shí):使用硬件電路完成時(shí)間較長的定時(shí)。
特點(diǎn):定時(shí)功能全部由硬件電路完成,不占CPU時(shí)間。但需通過改變電路中的元件參數(shù)來調(diào)節(jié)定時(shí)時(shí)間,在使用上不夠靈活方便。
3、可編程定時(shí)器定時(shí)
可編程定時(shí)器定時(shí):通過對系統(tǒng)時(shí)鐘脈沖的計(jì)數(shù)來實(shí)現(xiàn)的。
特點(diǎn):計(jì)數(shù)值通過程序設(shè)定,改變計(jì)數(shù)值,也就改變了定時(shí)時(shí)間,靈活、方便。
MCS-51單片機(jī)采用的是可編程定時(shí)器定時(shí)方法。
二、MCS-51 定時(shí)器/計(jì)數(shù)器功能
1、計(jì)數(shù)功能
所謂計(jì)數(shù)是指時(shí)外部脈沖進(jìn)行計(jì)數(shù)。外部脈沖通過T0(P3.4)、T1(P3.5)兩個(gè)信號引腳輸入。
輸入的脈沖在負(fù)跳變時(shí)有效,進(jìn)行計(jì)數(shù)器加1(加法計(jì)數(shù))。
計(jì)數(shù)脈沖的頻率不能高于晶振頻率的1/24。
2、定時(shí)功能
定時(shí)功能也是通過計(jì)數(shù)器的計(jì)數(shù)來實(shí)現(xiàn)的,不過此時(shí)的計(jì)數(shù)脈沖來自單片機(jī)的內(nèi)部,即每個(gè)機(jī)器周期產(chǎn)生一個(gè)計(jì)數(shù)脈沖。也就是每個(gè)機(jī)器周期計(jì)數(shù)器加1。
第二節(jié) 定時(shí)器/計(jì)數(shù)器的控制寄存器
一、定時(shí)器控制寄存器(TCON )
1、TF0(TF1)計(jì)數(shù)溢出標(biāo)志位
當(dāng)計(jì)數(shù)器計(jì)數(shù)溢出(計(jì)滿)時(shí),該位置“1”
查詢方式時(shí),此位作狀態(tài)位供查詢,軟件清“0”;
中斷方式時(shí),此位作中斷標(biāo)志位,硬件自動清“0”。
2、TR0(TR1) 定時(shí)器運(yùn)行控制位
TR0(TR1)=0 停止定時(shí)器/計(jì)數(shù)器工作
TR0(TR1)=1 啟動定時(shí)器/計(jì)數(shù)器工作
軟件方法使其置“1”或清“0”。
二、工作方式控制寄存器(TMOD )
各位定義如下:
1、GATE 門控位
GATE=0以運(yùn)行控制位TR啟動定時(shí)器
GATE=1以外中斷請求信號(/IMT0或/INT1)啟動定時(shí)器
2、C/T 定時(shí)方式或計(jì)數(shù)方式選擇位
C/T=0定時(shí)工作方式
C/T=l計(jì)數(shù)工作方式
3、M1、M0 工作方式選擇位
M1、M0=00 方式0
M1、M0=01 方式1
M1、M0=10 方式2
M1、M0=11 方式3
三、中斷允許控制寄存器(IE )
1、EA中斷允許總控制位
2、ET0和ET1定時(shí)/計(jì)數(shù)中斷允許控制位
ET0(ET1)=0禁止定時(shí)/計(jì)數(shù)中斷
ET0(ET1)=1允許定時(shí)/計(jì)數(shù)中斷
第三節(jié) 定時(shí)器 / 計(jì)數(shù)器的工作方式
一、方式0
1、電路邏輯結(jié)構(gòu)
方式0是13位計(jì)數(shù)結(jié)構(gòu)的工作方式,其計(jì)數(shù)器由TH0全部8位和TL0的低5位構(gòu)成。TH0的高3位棄之不用。
下圖是定時(shí)器/計(jì)數(shù)器0在工作方式0的邏樣結(jié)構(gòu)(定時(shí)器/計(jì)數(shù)器1與此完全相同)。
在方式0下
當(dāng)為計(jì)數(shù)工作方式時(shí),計(jì)數(shù)值的范圍是:
1~8192(213 )
當(dāng)為定時(shí)工作方式時(shí),定時(shí)時(shí)間的計(jì)算公式為:
(213 一計(jì)數(shù)初值)×晶振周期×12 或 (213 -計(jì)數(shù)初值)×機(jī)器周期
二、 方式1
16位計(jì)數(shù)結(jié)構(gòu)的工作方式,計(jì)數(shù)器由TH0全部8位和TL0全部8位構(gòu)成。
其邏樣電路和工作情況與方式0完全相同。
在方式1下
當(dāng)為計(jì)數(shù)工作方式時(shí),計(jì)數(shù)值的范圍是:
1~65536(216 )
當(dāng)為定時(shí)工作方式時(shí),定時(shí)時(shí)間的計(jì)算公式為:
(216 一計(jì)數(shù)初值)×晶振周期×12 或 (216 -計(jì)數(shù)初值)×機(jī)器周期
三、 方式2
1、電路邏輯結(jié)構(gòu)
初始化時(shí),8位計(jì)數(shù)初值同時(shí)裝入TL0和TH0中。當(dāng)TL0計(jì)數(shù)溢出時(shí),置位TF0,同時(shí)把保存在預(yù)置寄存器TH0中的計(jì)數(shù)初值自動加載TL0,然后TL0重新計(jì)數(shù)。
四、方式3
1.工作方式3下的定時(shí)器/計(jì)數(shù)器0
在工作方式3下,定時(shí)器/計(jì)數(shù)器0被拆成兩個(gè)獨(dú)立的8位計(jì)數(shù)器TL0和TH0。其中TL0既可以計(jì)數(shù)使用,又可以定時(shí)使用,定時(shí)器/計(jì)數(shù)器0的各控制位和引腳信號全歸它使用。TH0則只能作為簡單的定時(shí)器使用。
2.工作方式3下的定時(shí)器/計(jì)數(shù)器1
如果定時(shí)器/計(jì)數(shù)器0已工作在工作方式3,則定時(shí)器/計(jì)數(shù)器1只能工作在方式0、方式1或方式2下,因?yàn)樗倪\(yùn)行控制位TR1及計(jì)數(shù)溢出標(biāo)志位TF1已被定時(shí)器/計(jì)數(shù)器0借用,如圖所示。在這種情況下,定時(shí)器/計(jì)數(shù)器1通常是作為串行口的波特率發(fā)生器使用,以確定串行通信的速率。
第四節(jié) 定時(shí)器 / 計(jì)數(shù)器的編程應(yīng)用舉例
定時(shí)器/計(jì)數(shù)器初始化的步驟:
(1)確定工作方式、操作模式、啟動控制方式一寫入TMOD寄存器。
(2)設(shè)置定時(shí)器或計(jì)數(shù)器的初值一可直接將初值送人TH0、TL0或TH1、TL1
(3)根據(jù)要求是否采用中斷方式一直接對IE寄存器賦值。
(4)啟動定時(shí)器工作—可使用SETB TR0、SETB TR1。
例1 設(shè)單片機(jī)晶振頻率為6MHz,使用定時(shí)器1以方式。產(chǎn)生周期為500Hz的等寬正方波連續(xù)脈沖,并由P1.0輸出。以查詢方式完成。
1.計(jì)算計(jì)數(shù)初值
欲產(chǎn)生500Hz的等寬正方波脈沖,只需在P1.0端以250Hz為周期交替輸出高低電平即可實(shí)現(xiàn),為此定時(shí)時(shí)間應(yīng)為250Hz。使用6MHz晶振,則一個(gè)機(jī)器周期為2us。方式0為13位計(jì)數(shù)結(jié)構(gòu)。設(shè)待求的計(jì)數(shù)初值為X,則:
(213 -X)×2×106 =250×106
求解得:X=8067。二進(jìn)制數(shù)表示為1111110000011B。十六進(jìn)制表示為0FC03H。
2.TMOD
M1M0=00 C/T=0 GATE=0 TMOD=00H.
3.由定時(shí)器控制寄存器TCON中的TR1位控制定時(shí)的啟動和停止
TR1=1啟動,TR1=0停止。
4.程序設(shè)計(jì)
MOV TMOD,#00H
MOV TH1,#0FCH
MOV TL1,#03H
MOV IE,#00H;禁止中斷
LOOP:SETB TR1;啟動定時(shí)
JBC TF1,LOOP1;查詢計(jì)數(shù)溢出
AJMP LOOP
LOOP1:MOV TH1,#0FCH;重新設(shè)豆計(jì)數(shù)初值
MOV TL1,#03H
CLR TF1;計(jì)數(shù)溢出標(biāo)志位清“0"
CPL P1.0;
AJMP LOOP;重復(fù)循環(huán)
例2 題目同上,但以中斷方式完成。即單片機(jī)晶振頻率為6MHz,使用定時(shí)器1以工作方式1產(chǎn)生周期為500的等寬連續(xù)正方波脈沖,P1.0端輸出。
1.計(jì)算計(jì)數(shù)初值
TH1=0FFH TL1=83H
2. TMOD寄存器初始化
TMOD=10H
3.程序設(shè)計(jì)
主程序: MOV TMOD,#10H;定時(shí)器1工作方式1
MOV TH1,#0FFH;設(shè)里計(jì)數(shù)初值
MOV TL1,#83H
SETB EA;開中斷
SETB ET1;定時(shí)器1允許中斷
SETB TR1;定時(shí)開始
HERE:SJMP$;等待中斷
中斷服務(wù)程序:
MOV TH1,#0FFH;重新設(shè)里計(jì)數(shù)初值
MOV TL1,#83H
CPL P1.0;輸出取反
RETI;中斷返回
例4 使用定時(shí)器T0定時(shí),每隔l0s便與P1.0口連接的發(fā)光二極管閃爍10次。設(shè)P1.0高電平燈亮,反之燈滅。
程序如下:
ORG 0000H;程序起始地址
LJMP MAIN;
ORG 000BH;T0中斷入口地址
LJMP INT;中斷入口地址
ORG 0100H
MAIN: MOV R0,#200;l0s循環(huán)次數(shù)
MOV TMOD,#01H;T0定時(shí)方式1
MOV TH0,#3CH;50ms初值高位
MOV TL0,#0B0H;50ms初值低位
MOV Rl,#10;閃爍次數(shù)
SETB EA;開總中斷
SETB ET0;開T0中斷
SETB TR0;啟動
LP:SJMP LP;循環(huán)等待中斷
INT:MOV TH0,#3CH
MOV TL0,#0B0H
DJNZ R0,DE;R0≠0,不到l0s,燈不閃,直接返回
DE0:SETB Pl.0;R0=0,l0s到,燈閃爍
LCALL DELAY、
CLR Pl.0
LCALL DELAY
DJNZ R1,DE0
DE:RETI
DELAY:MOV R6,#0FFH
DL0:MOV R7,#0FFH
DL1:NOP
DJNZ R7,DL1
DJNZ R6,DL0
RET
例5 利用T0門控位測試/INT0引腳上出現(xiàn)的正脈沖寬度,已知晶振頻率為12MHz,將所測得值高位存入片內(nèi)71H,低位存入片內(nèi)70H。
解:程序如下:
MOV TMOD,#09H;設(shè)T0為方式1,GATE =1
MOV TL0,#00H
MOV TH0,#00H
MOV R0,#70H
JB P3.2,$;等P3.2變低
SETB TR0;啟動T0準(zhǔn)備工作
JNB P3. 2,$;等待P3. 2變高
JB P3. 2,$;等待 P3. 2再次變低
CLR TR0;停止計(jì)數(shù)
MOV @R0,TL0;存放計(jì)數(shù)的低字節(jié)
INC R0
MOV @R0,TH0;存放計(jì)數(shù)的高字節(jié)
SJMP$
例:設(shè)計(jì)一個(gè)節(jié)日彩燈循環(huán)閃爍的應(yīng)用系統(tǒng)。
解:
分析:該題可以有多種循環(huán)方式,延時(shí)時(shí)間及左右移不同會有不同的循環(huán)效果。以下只是其中的一種形式編程。電路見圖,由P1口的8位控制8路電燈電路,在每一路中都通過一個(gè)可控硅SCR控制N路并聯(lián)電燈的開關(guān)。單片機(jī)工作頻率12MHz,該程序延時(shí)選為200 ms,用定時(shí)器T0作為定時(shí)器,初值為50 ms。編程如下:
START:MOV P1,#0FEH;初始化為第0位的一組燈亮
L1:ACALL DELAY;調(diào)延時(shí)子程序
MOV A,P1
RL A;順序左移一位
MOV P1,A
AJMP L1
DELAY:MOV TMOD,#01H
MOV R1,#04H
DELAY-1:MOV TH0,#3CH
MOV TL0,#0B0H
SETB TR0
JNB TF0,$
CLR TF0
DJNZ R1,DELAY_1
RET
第八章 單片機(jī)串行數(shù)據(jù)通信
第一節(jié) 概 述
一、串行通信基本原理
計(jì)算機(jī)與外界的信息交換稱為通信;镜耐ㄐ欧椒ㄓ胁⑿型ㄐ藕痛型ㄐ艃煞N。
并行通信的特點(diǎn)是:各數(shù)據(jù)位同時(shí)傳送,傳送速度快、效率高。但并行數(shù)據(jù)傳送有多少數(shù)據(jù)位就需多少根數(shù)據(jù)線,因此傳送成本高。并行數(shù)據(jù)傳送的距離小于30米。并行通信依靠并行1/O接口實(shí)現(xiàn)。
例:CPU在執(zhí)行如MOV P1,A的指令時(shí),將A中的8位數(shù)據(jù)寫人P1口鎖存器中,并經(jīng)P1口的8個(gè)引腳將8位數(shù)據(jù)并行輸出到外部設(shè)備。同樣,CPU也可執(zhí)行如MOV A,P1的指令,將外部設(shè)備送到P1上腳上的8位數(shù)據(jù)并行地讀入累加器A。
串行通信的特點(diǎn)是:數(shù)據(jù)傳送按位順序進(jìn)行,最少只需一根傳輸線即可完成,成本低但速度慢。計(jì)算機(jī)與外界的數(shù)據(jù)傳送大多數(shù)是串行的,其傳送的距離可以從幾米到幾千公里。
二、兩種串行通信方式
串行通信根據(jù)數(shù)據(jù)傳送時(shí)的編碼格式不同又分為異步通信和同步通信兩種方式。
1、異步通信方式
異步通信用起始位"0”表示字符的開始,然后從低位到高位逐位傳送數(shù)據(jù),最后用停止位“1”表示字符結(jié)束,見圖。一個(gè)字符又稱一幀。圖中a,一幀信息包括1位起始位、8位數(shù)據(jù)位和1位停止位。圖b中,數(shù)據(jù)位增加到9位。在MCS-51計(jì)算機(jī)系統(tǒng)中,第九位數(shù)據(jù)D8可以用作奇偶校驗(yàn)位,也可以用作地址/數(shù)據(jù)幀標(biāo)志,D8=1表示該幀信息傳送的是地址,D8=0表示傳送的是數(shù)據(jù)。兩幀信息之間可以無間隔,也可以有間隔,且間隔時(shí)間可任意改變,間隔用空閑位1來填充。
1)、波特率(Baud rate):每秒傳送的位數(shù)。每秒傳送一個(gè)格式位就是1波特。即:
1波特=lbps(位/秒)
例如電傳打字機(jī)的傳送速率每秒10個(gè)字符,若每個(gè)字符為11位,則波特率為
11位/字符×10字符/s=110位/s.
2)、幀(frame):從起始位開始到停止位結(jié)束的全部內(nèi)容稱之為一幀,幀是一個(gè)字符的完整通信格式,因此也就把串行通信的字符格式稱之為幀格式。
起始位:發(fā)送器是通過發(fā)送起始位而開始一個(gè)字符的傳送。起始位使數(shù)據(jù)線處于“space”狀態(tài)。
數(shù)據(jù)位:起始位之后就傳送數(shù)據(jù)位。在數(shù)據(jù)位中,低位在前(左),高位在后(右)。數(shù)據(jù)位可以是5、6、7或8位。
奇偶校驗(yàn)位:用于對字符傳送作正確性檢查。共有3種可能,即奇校驗(yàn)、偶校驗(yàn)和無校驗(yàn)。
停止位:停止位在最后,用以標(biāo)志一個(gè)字符傳送的結(jié)束,它對應(yīng)于mark狀態(tài)。停止位可能是1、1. 5或2位,在實(shí)際應(yīng)用中根據(jù)需要確定。
2、同步通信方式
在同步通信中,每一數(shù)據(jù)塊開頭時(shí)發(fā)送一個(gè)或兩個(gè)同步字符,使發(fā)送與接收雙方取得同步。數(shù)據(jù)塊的各個(gè)字符間取消了起始位和停止位,所以通信速度得以提高,見圖7一3。同步通信時(shí),如果發(fā)送的數(shù)據(jù)塊之間有間隔時(shí)間,則發(fā)送同步字符填充。
三、串行通信的數(shù)據(jù)通路形式
串行數(shù)據(jù)通信共有以下幾種數(shù)據(jù)通路形式。
1、單工(Simplex)形式
單工形式的數(shù)據(jù)傳送是單向的。通信雙方中一方固定為發(fā)送端,另一方則固定為接收端。單工形式的串行通信,只需要一條數(shù)據(jù)線。如圖8.4所示。例如計(jì)算機(jī)與打印機(jī)之間的串行通信就是單工形式,因?yàn)橹荒苡杏?jì)算機(jī)向打印機(jī)傳送數(shù)據(jù),而不可能有相反方向的數(shù)據(jù)傳送。
2、全雙工(Full-duplex)形式
全雙工形式的數(shù)據(jù)傳送是雙向的,且可以同時(shí)發(fā)送和接收數(shù)據(jù),因此全雙工形式的串行通信需要兩條數(shù)據(jù)線。如圖8. 5所示。
3.半雙工(Half-duplex)形式
半雙工形式的數(shù)據(jù)傳送也是雙向的。但任何時(shí)刻只能由其中的一方發(fā)送數(shù)據(jù),另一方接收數(shù)據(jù)。因此半雙工形式既可以使用一條數(shù)據(jù)線,也可以使用兩條數(shù)據(jù)線。如圖8.6所示。
四、異步串行通信的信號形式
1、近程通信
近程通信又稱本地通信。近程通信采用數(shù)字信號直接傳送形式,在傳送過程中不改變原數(shù)據(jù)代碼的波形和頻率。這種數(shù)據(jù)傳送方式稱之為基帶傳送方式。圖8. 2就是兩臺計(jì)算機(jī)近程串行通信的連接和代碼波形圖。
2、遠(yuǎn)程通信
在遠(yuǎn)程串行通信中,應(yīng)使用專用的通信電纜,但出于經(jīng)濟(jì)考慮也可以使用電話線作為傳輸線。如圖8.3所示。遠(yuǎn)距離直接傳送數(shù)字信號,信號會發(fā)生崎變,因此要把數(shù)字信號轉(zhuǎn)變?yōu)槟M信號再進(jìn)行傳送。信號形式的轉(zhuǎn)變通常使用頻率調(diào)制法,即以不同頻率的載波信號代表數(shù)字信號的兩種不同電平狀態(tài)。這種數(shù)據(jù)傳送方式就稱之為頻帶傳送方式。
調(diào)制器:把電平信號調(diào)制為頻率信號
解調(diào)器:把頻率信號解調(diào)為電平信號
在遠(yuǎn)程串行通信線路的兩端都應(yīng)設(shè)置調(diào)制器和解調(diào)器,并且把二者合在一起稱之為調(diào)制解調(diào)器(Modem)。
1270Hz 或2225Hz mark
1070Hz或2025Hz space
第二節(jié) MCS-51 串行結(jié)構(gòu)與工作原理
一、 串行口結(jié)構(gòu)
如上所述,MCS - 51串行1/O接口的基本工作是:發(fā)送時(shí),將CPU送來的并行數(shù)據(jù)轉(zhuǎn)換成一定格式的串行數(shù)據(jù),從引腳TXD(P3.1)上按規(guī)定的波特率逐位輸出;接收時(shí),要監(jiān)視引腳RXD(P3.0),一旦出現(xiàn)起始位“0”,就將外圍設(shè)備送來的一定格式的串行數(shù)據(jù)轉(zhuǎn)換成并行數(shù)據(jù),等待CPU讀人。
接收緩沖器是雙緩沖的,是為了避免在接收下一幀數(shù)據(jù)之前,CPU未能及時(shí)響應(yīng)接收器的中斷,把上幀數(shù)據(jù)讀走,而產(chǎn)生兩幀數(shù)據(jù)重疊的問題而設(shè)置的雙緩沖結(jié)構(gòu)。對于發(fā)送緩沖器,為了保持最大傳輸率,一般不需要雙緩沖,這是因?yàn)榘l(fā)送時(shí)CPU是主動的,不會產(chǎn)生寫重疊的問題。
二、串行接口控制與狀態(tài)寄存器
1、串行口控制寄存器SCON
功能說明如下:
·SM0、SM1—串行口工作方式選擇位
其狀態(tài)組合所對應(yīng)的工作方式為:
·SM2—多機(jī)通信控制位
SM2位主要用于方式2和方式3。當(dāng)串行口方式2或方式3接收時(shí),如SM2=1,則只有當(dāng)接收到的第九位數(shù)據(jù)(RB8)為1,才將接收到的前8位數(shù)據(jù)送入SBUF,并置位RI產(chǎn)生中斷請求;否則,將接收到的前8位數(shù)據(jù)丟棄。而當(dāng)SM2=0時(shí),則不論第九位數(shù)據(jù)為0還是為1,都將前8位數(shù)據(jù)裝入SBUF中,并產(chǎn)生中斷請求。
·REN—允許接收位
REN=0 禁止接收
REN=1 允許接收
該位由軟件置位或復(fù)位。
·TB8 —發(fā)送數(shù)據(jù)位8
在方式2和方式3時(shí),TB8 的內(nèi)容是要發(fā)送的第9位數(shù)據(jù),其值由用戶通過軟件設(shè)置。在雙機(jī)通信時(shí),TB8 一般作為奇偶校驗(yàn)位使用;在多機(jī)通信中,常以TB8 位的狀態(tài)表示主機(jī)發(fā)送的是地址幀還是數(shù)據(jù)幀,且一般約定:TB8 =0為數(shù)據(jù)幀 TB8 =1為地址幀。
·RB8 —接收數(shù)據(jù)位8
在方式2或方式3時(shí),RB8 存放接收到的第9位數(shù)據(jù),代表著接收數(shù)據(jù)的某種特征(與TB8 的功能類似),故應(yīng)根據(jù)其狀態(tài)對接收數(shù)據(jù)進(jìn)行操作。
·TI—發(fā)送中斷標(biāo)志
當(dāng)方式0時(shí),發(fā)送完第8位數(shù)據(jù)后,該位由硬件置位。在其它方式下,于發(fā)送停止位之前,由硬件置位。因此TI=1,表示幀發(fā)送結(jié)束,其狀態(tài)既可供軟件查詢使用,也可請求中斷。TI位由軟件清“0”。
·RI—接收中斷標(biāo)志
當(dāng)方式0時(shí),接收完第8位數(shù)據(jù)后,該位由硬件置位。在其它方式下,當(dāng)接收到停止位時(shí),該位由硬件置位。因此RI=1,表示幀接收結(jié)束。其狀態(tài)既可供軟件查詢使用,也可以請求中斷。RI位由軟件清“0”。
2、電源控制寄存器PCON
SMOD—串行口波特率的倍增位
當(dāng)SMOD=1時(shí),串行口波特率加倍。系統(tǒng)復(fù)位時(shí),SMOD=0。
3、中斷允許寄存器IE
ES=0 禁止串行中斷
ES=1 允許串行中斷
第三節(jié) 波特率設(shè)計(jì)
一、串行接口的功能
MCS - 51單片機(jī)中的異步通信串行接口能方便地與其他計(jì)算機(jī)或傳送信息的外圍設(shè)備(如串行打印機(jī)、CPU終端等)實(shí)現(xiàn)雙機(jī)、多機(jī)通信。
串行口有4種工作方式,見表7一1。
方式0并不用于通信,而是通過外接移位寄存器芯片實(shí)現(xiàn)擴(kuò)展并行1/O接口的功能。該方式又稱為移位寄存器方式。
方式1、方式2、方式3都是異步通信方式。
方式1是8位異步通信接口。一幀信息由10位組成,其格式見圖7一2a。方式1用于雙機(jī)串行通信。
方式2、方式3都是9位異步通信接口、一幀信息中包括9位數(shù)據(jù),1位起始位,1位停止位,其格式見圖7一2b。方式2、方式3的區(qū)別在于波特率不同,方式2、方式3主要用于多機(jī)通信,也可用于雙機(jī)通信。
二、波特率的設(shè)定
方式1的波特率是可變的,以定時(shí)器T1作波特率發(fā)生器使用,其值由定時(shí)器1的計(jì)數(shù)溢出率來決定,其公式為:
2smod
波特率= ×(定時(shí)器1溢出率)
32
當(dāng)定時(shí)器1作波特率發(fā)生器使用時(shí),選用工作方式2(即8位自動加載方式)。假定計(jì)數(shù)初值為X,則計(jì)數(shù)溢出周期為:
12
×(256一X)
fosc
溢出率為溢出周期的倒數(shù)。
則波特率計(jì)算公式為:
2smod fosc
波特率= ×
32 12×(256一X)
實(shí)際使用時(shí),總是先確定波特率,再計(jì)算定時(shí)器1的計(jì)數(shù)初值,然后進(jìn)行定時(shí)器的初始化。根據(jù)上述波特率計(jì)算公式,得出計(jì)數(shù)初值的計(jì)算公式為:
fosc×2smod
X=256-
384×波特率
第四節(jié) 串行口應(yīng)用舉例
例1 使用CD4094的并行輸出端接8支發(fā)光二極管,利用它的串入并出功能,把發(fā)光二極管從左向右依次點(diǎn)亮,并反復(fù)循環(huán)之。假定發(fā)光二極管為共陰極型,則電路連接如圖所示。
分析:使用方式0實(shí)現(xiàn)數(shù)據(jù)的移位輸入輸出時(shí),實(shí)際上是把串行口變成為并行口使用。串行口作為并行輸出口使用時(shí),要有“串入并出”的移位寄存器(例如CD4094或74LS164,74HC164等)配合。
在方式0下,是把串行口作為同步移位寄存器使用,這時(shí)以RXD(P3.0)端作為數(shù)據(jù)移位的入口和出口,而由TXD(P3.1)端提供移位時(shí)鐘脈沖。移位數(shù)據(jù)的發(fā)送和接收以8位為一幀,低位在前高位在后。
使用查詢方法完成的參考程序如下:
MOV SCON , #00H;串行口方式0工作
CLR ES;禁止串行中斷
MOV A,#80H;發(fā)光管從左邊亮起
DELR: CLR P1.0;關(guān)閉并行輸出
MOV SBUF,A;串行輸出
JNB TI,$;狀態(tài)查詢
SETB P1.0;開啟并行輸出
ACALL DELAY;狀態(tài)維持
CLR TI;清發(fā)送中斷標(biāo)志
RR A;發(fā)光組合右移
AJMP DELR;繼續(xù)
例2 設(shè)計(jì)一個(gè)發(fā)送程序,將片內(nèi)RAM50H~5FH中的數(shù)據(jù)串行發(fā)送,串行口設(shè)定為方式2狀態(tài),TB8作奇偶校驗(yàn)位。在數(shù)據(jù)寫人發(fā)送緩沖器之前,先將數(shù)據(jù)的奇偶位P寫入TB8,這時(shí)第9位數(shù)據(jù)作奇偶校驗(yàn)用。
程序清單如下
TRT:MOV SCON,#80H;方式2設(shè)定
MOV PCON,#80H;取波特率為fosc/32
MOV R0,#50H
MOV R7,#10H;數(shù)據(jù)長度10H
LOOP:MOV A,@R0;取數(shù)據(jù)送A
MOV C,PSW.0;
MOV TB8,C
MOV SBUF,A;數(shù)據(jù)送SBUF,啟動發(fā)送
WAIT:JBC TI,CONT;判斷發(fā)送中斷標(biāo)志
SJMP WAIT
CONT:INC R0
DJNZ R7,LOOP
RET
例3 設(shè)計(jì)一個(gè)接收程序,將接收的16個(gè)字節(jié)數(shù)據(jù)送人片內(nèi)RAM50H~5FH單元中。設(shè)串行口方式3狀態(tài)工作,波特率為2400。定時(shí)/計(jì)數(shù)器1作波特率發(fā)生器時(shí),SMOD=0,計(jì)數(shù)常數(shù)為F4H。
程序清單如下:
RVE:MOV TMOD,#20H;T1編程為方式2定時(shí)狀態(tài)
MOV TH1,#0F4H;計(jì)數(shù)常數(shù)送T1
MOV T11,#0F4H
SETB TR1;啟動T1
MOV R0,#50H
MOV R7,#10H;數(shù)據(jù)長度l OH-R7
MOV SCON,#0D0H;串行口編程方式3接收
MOV PCON,#00H;置SMOD=0
WAIT:JBC RI,PRI;等待接收到數(shù)據(jù)
SJMP WAIT
PRI:MOV A,SBUF;奇偶校驗(yàn)判P=RB8?
JNB PSW.0,PNP
JNB RB8,PER
SJMP RIGHT
PNP:JB RB8,PER
RIGHT:MOV @R0,A;數(shù)據(jù)送緩沖器
INC R0
DJNZ R7,WAIT;判斷數(shù)據(jù)塊接收完否?
CLR PSW.5;正確接收完16個(gè)字節(jié)置標(biāo)志位
RET
第九章 存儲器與存儲器擴(kuò)展
第一節(jié) MCS-51 單片機(jī)擴(kuò)展及系統(tǒng)結(jié)構(gòu)
一、單片機(jī)系統(tǒng)的擴(kuò)展結(jié)構(gòu)
擴(kuò)展系統(tǒng)是以單片機(jī)為核心進(jìn)行的;擴(kuò)展內(nèi)容包括ROM、RAM和 I/O接口電路等;擴(kuò)展是通過系統(tǒng)總線進(jìn)行的,通過總線把各擴(kuò)展部件連接起來,并進(jìn)行數(shù)據(jù)、地址和信號的傳送,要實(shí)現(xiàn)擴(kuò)展首先要構(gòu)造系統(tǒng)總線。
1 、系統(tǒng)總線
總線:連接計(jì)算機(jī)各部件的一組公共信號線。MCS- 51使用的是并行總線結(jié)構(gòu),按其功能通常把系統(tǒng)總線分為三組,即地址總線、數(shù)據(jù)總線和控制總線。
1)地址總線AB
在地址總線上傳送的是地址信號,用于存儲單元和I/O端口的選擇。地址總線是單向的,地址信號只能由單片機(jī)向外送出。 地址總線的數(shù)目決定著可直接訪問的存儲單元的數(shù)目,例如n位地址,可以產(chǎn)生2n 個(gè)連續(xù)地址編碼,因此可訪問2n個(gè)存儲單元,即通常所說的尋址范圍為2n地址單元。
2)數(shù)據(jù)總線(Data Bus,簡寫DB)
數(shù)據(jù)總線用于在單片機(jī)與存儲器之間或單片機(jī)與I/O端口之間傳送數(shù)據(jù)。單片機(jī)系統(tǒng)數(shù)據(jù)總線的位數(shù)與單片機(jī)處理數(shù)據(jù)的字長一致。
例如MCS- 51單片機(jī)是8位字長,所以數(shù)據(jù)總線的位數(shù)也是8位。
數(shù)據(jù)總線是雙向的,可以進(jìn)行兩個(gè)方向的數(shù)據(jù)傳送。
3)控制總線(Control Bus,簡寫CB)
控制總線實(shí)際上就是一組控制信號線,包括單片機(jī)發(fā)出的,以及從其它部件傳送給單片機(jī)的。
二、三總線的擴(kuò)展方法
1、以P0口的8位口線作地址/數(shù)據(jù)線
P0口線既作地址線使用又作為數(shù)據(jù)線使用,具有雙重功能,因此需采用復(fù)用技術(shù),對地址和數(shù)據(jù)進(jìn)行分離,為此在構(gòu)造地址總線時(shí)要增加一個(gè)8位鎖存器。首先由鎖存器暫存并為系統(tǒng)提供低8位地址,其后P0口線就作為數(shù)據(jù)線使用。通常使用的鎖存器有74LS273或74LS373。
2、以P2口的口線作高位地址線
如果使用P2口的全部8位口線,再加上P0口提供的低8位地址,則形成了完整的16位地址總線。使單片機(jī)系統(tǒng)的擴(kuò)展尋址范圍達(dá)到64 K單元。
三、控制信號
除了地址線和數(shù)據(jù)線之外,在擴(kuò)展系統(tǒng)中還需要單片機(jī)提供一些控制信號線,以構(gòu)成擴(kuò)
展系統(tǒng)的控制總線。其中包括:
*使用ALE作地址鎖存的選通信號,以實(shí)現(xiàn)低8位地址的鎖存;
*以/PSEN信號作擴(kuò)展程序存儲器的讀選通信號;
*以EA信號作為內(nèi)外程序存儲器的選擇信號;
*以/RD和/WR作為擴(kuò)展數(shù)據(jù)存儲器和1/O端口的讀寫選通信號。
第二節(jié) 擴(kuò)展存儲器編址及映像
一、存儲器編址技術(shù)
編址:使用系統(tǒng)提供的地址線,通過適當(dāng)?shù)倪B接,使得一個(gè)編址唯一對應(yīng)存儲器中一個(gè)存儲單元。
1、線選法
直接以系統(tǒng)的高地址位作為存儲芯片的片選信號。適用小規(guī)模系統(tǒng)的存儲器擴(kuò)展。
2、譯碼法
使用譯碼器對系統(tǒng)的高位地址進(jìn)行譯碼,以其譯碼輸出作為存儲芯片的片選信號。適用于大容量多芯片存儲器擴(kuò)展。
常用的譯碼器:
&# 8226;74LS139譯碼器
/G為使能端,低電平有效。
A、B為選擇端,即譯碼輸入。
Y0、Y1、Y2、Y3為譯碼輸出信號,低電平有效。
&# 8226;74LS138譯碼器
/E1、/E2、E3為使能端, /E1、/E2低電平有效,E3高電平有效。
A、B、C為選擇端,即譯碼輸入。
Y0、Y1、Y2、Y3、Y4、Y5、Y6、Y7為譯碼輸出信號,低電平有效。
第三節(jié) 程序存儲器擴(kuò)展
一、只讀存儲器概述
單片機(jī)的程序存儲器擴(kuò)展使用只讀存儲器芯片。只讀存儲器簡稱為ROM (Read Only Memory)。 ROM中的信息一旦寫入之后就不能隨意更改,特別是不能在程序運(yùn)行過程中寫入新的內(nèi)容,而只能讀存儲單元內(nèi)容,故稱之為只讀存儲器。
1.芯片2716結(jié)構(gòu)
2716的邏輯結(jié)構(gòu)如圖5.6所示,其信號引腳排列如圖5.7所示。
·A0—A11------位地址。
O7—O0 ------數(shù)據(jù)讀出。
CE /PGM-----雙重功能控制線。當(dāng)使用時(shí),它為片選信號(/CE),低電平有效。當(dāng)編程時(shí),它為編程控制信號(PGM),用于引入編程脈沖。
/OE-----輸出允許信號。當(dāng)/OE=0時(shí),輸出緩沖器打開,被尋址單元的內(nèi)容才能被讀出。
VPP-----編程電源。當(dāng)芯片編程時(shí),該端加+25V編程電壓;當(dāng)芯片使用時(shí),該端加+5V電源。
2.2716的工作方式
2716共有5種工作方式,由各信號的狀態(tài)組合來確定。各種工作方式的基本情況如表5
一3所示
·讀方式
當(dāng)/CE及/OE均為低電平, VPP=+5 V 2716芯片被選中并處于讀出工作方式。這時(shí)被尋址單元的內(nèi)容經(jīng)數(shù)據(jù)線O7—O0 讀出。
·未選中方式
當(dāng)/CE為高電平時(shí),芯片不被選中,其數(shù)據(jù)線輸出為高阻抗?fàn)顟B(tài)。
·編程方式
當(dāng)VPP端加25 V高電壓,/OE加TTL高電平時(shí),2716處于編程工作方式,進(jìn)行信息的重新寫入。這時(shí)編程地址和寫入數(shù)據(jù)分別由A0—A11及O7—O0 引入。
二、應(yīng)用舉例
2716芯片的地址范圍是:
最低地址8000 H
(A15 A14 A13 A12 A11 A10 A9 A8 A7 A6 A5 A4 A3 A2 A1 A0=1000000000000000)
最高地址87FFH
(A15 A14 A13 A12 A11 A10 A9 A8 A7 A6 A5 A4 A3 A2 A1 A0=1000011111111111)
第四節(jié) 數(shù)據(jù)存儲器擴(kuò)展舉例
一、靜態(tài)RAM6116
下面以6116為例進(jìn)行說明,其引腳如圖所示。6116芯片為24引腳雙列直播封裝。其中:
·A0—A10 地址線 ·/WE 寫選通信號
·D7—D0 數(shù)據(jù)線 ·Vcc 電源(十5 V)
·/CS 片選信號 ·GND 地
·/OE 數(shù)據(jù)輸出允許信號
6116共有4種工作方式,如表5一4所示。
二、單片數(shù)據(jù)存儲器擴(kuò)展
使用一片6116實(shí)現(xiàn)的2KB RAM擴(kuò)展,其電路連接如圖所示。
三、多片數(shù)據(jù)存儲器擴(kuò)展
第十章 MCS 一 51 單片機(jī)并行 I/O 接口的擴(kuò)展
第一節(jié) 概 述
一、為什么要擴(kuò)展I/O接口
在單片機(jī)系統(tǒng)中主要有兩類數(shù)據(jù)傳送操作,一類是單片機(jī)和存儲器之間的數(shù)據(jù)讀寫操作;另一類則是單片機(jī)和其它設(shè)備之間的數(shù)據(jù)輸入/輸出(I/O)操作。
存儲器是半導(dǎo)體電路,與單片機(jī)具有相同的電路形式和信號形式,能相互兼容直接使用。存儲器與單片機(jī)之間的連接十分簡單,主要包括地址線、數(shù)據(jù)線、讀寫選通信號。
單片機(jī)與控制對象或外部設(shè)備之間的數(shù)據(jù)傳送卻十分復(fù)雜。其復(fù)雜性主要表現(xiàn)在以下幾個(gè)方面:
1、速度差異大
慢速設(shè)備如開關(guān)、繼電器、機(jī)械傳感器等,每秒鐘傳送不了一個(gè)數(shù)據(jù);而高速采樣設(shè)備,每秒鐘要傳送成千上萬個(gè)數(shù)據(jù)位。面對速度差異如此之大的各類設(shè)備,單片機(jī)無法以一個(gè)固定的時(shí)序同它們按同步方式協(xié)調(diào)工作。
2、設(shè)備種類繁多
單片機(jī)應(yīng)用系統(tǒng)中的控制對象或外部設(shè)備種類繁多,它們既可能是機(jī)械式的,又可能是機(jī)電式的,還可能是電子式的。由于不同設(shè)備之間性能各異、對數(shù)據(jù)的要求互不相同,因此無法按統(tǒng)一格式進(jìn)行數(shù)據(jù)傳送。
3、數(shù)據(jù)信號形式多種多樣
單片機(jī)應(yīng)用系統(tǒng)所面對的數(shù)據(jù)形式也是多種多樣的,例如既有電壓信號,也有電流信號;既有數(shù)字形式,還有模擬形式。
二、擴(kuò)展I/O接口電路的功能
在單片機(jī)應(yīng)用系統(tǒng)中,擴(kuò)展1/O接口電路主要是針對如下幾項(xiàng)功能:
1.速度協(xié)調(diào)
由于速度上的差異,使得單片機(jī)的I/O數(shù)據(jù)傳送只能以異步方式進(jìn)行。設(shè)備是否準(zhǔn)備好,需要通過接口電路產(chǎn)生或傳送設(shè)備的狀態(tài)信息,以此實(shí)現(xiàn)單片機(jī)與設(shè)備之間的速度協(xié)調(diào)。
2.輸出數(shù)據(jù)鎖存
在單片機(jī)應(yīng)用系統(tǒng)中,數(shù)據(jù)輸出都是通過系統(tǒng)的公用數(shù)據(jù)通道(數(shù)據(jù)總線)進(jìn)行的,單片機(jī)的工作速度快,數(shù)據(jù)在數(shù)據(jù)總線上保留的時(shí)間十分短暫,無法滿足慢速輸出設(shè)備的需要。在擴(kuò)展I/O接口電路中應(yīng)具有數(shù)據(jù)鎖存器,以保存輸出數(shù)據(jù)直至能為輸出設(shè)備所接收。
3.輸入數(shù)據(jù)三態(tài)緩沖
數(shù)據(jù)輸入時(shí),輸入設(shè)備向單片機(jī)傳送的數(shù)據(jù)要通過數(shù)據(jù)總線,但數(shù)據(jù)總線是系統(tǒng)的公用數(shù)據(jù)通道,上面可能“掛”著多個(gè)數(shù)據(jù)源,工作比較繁忙。為了維護(hù)數(shù)據(jù)總線上數(shù)據(jù)傳送的“次序”,因此只允許當(dāng)前時(shí)刻正在進(jìn)行數(shù)據(jù)傳送的數(shù)據(jù)源使用數(shù)據(jù)總線,其余數(shù)據(jù)源都必須與數(shù)據(jù)總線處于隔離狀態(tài)。為此要求接口電路能為數(shù)據(jù)輸入提供三態(tài)緩沖功能。
4.數(shù)據(jù)轉(zhuǎn)換
單片機(jī)只能輸入和輸出數(shù)字信號,但是有些設(shè)備所提供或所需要的并不是數(shù)字信號形式。為此,需要使用接口電路進(jìn)行數(shù)據(jù)信號的轉(zhuǎn)換,其中包括:模/數(shù)轉(zhuǎn)換和數(shù)/模轉(zhuǎn)換。
三、MCS一51單片機(jī)常用的擴(kuò)展器件
MCS一51單片機(jī)常用的擴(kuò)展器件有如下三類:
常規(guī)邏輯電路、鎖存器,如74LS377,74LS245。
MCS—80/85并行接口電路,如8255。
RAM/IO綜合擴(kuò)展器件,如8155。
第二節(jié) 簡單 I/O 接口的擴(kuò)展
當(dāng)所需擴(kuò)展的外部1/O口數(shù)量不多時(shí),可以使用常規(guī)的邏輯電路、鎖存器進(jìn)行擴(kuò)展。這一類的外圍芯片一般價(jià)格較低而且種類較多,常用的如:74LS377、74LS245、74LS373、74LS244、74LS273、74LS577、74LS573。
一、74LS377芯片及擴(kuò)展舉例
下圖是74LS377的引腳圖和功能表。74LS377是一種8D觸發(fā)器,它的/E端是控制端、CLK端是時(shí)鐘端,當(dāng)它的/E端為低電平時(shí)只要在CLK端產(chǎn)生一個(gè)正跳變,D1—D7將被鎖存到QO—Q7端輸出,在其他情況下Q0—Q7端的輸出保持不變。
如圖使用了一片74LS377擴(kuò)展輸出口,如果將未使用到的地址線都置為1則可以得到該片74LS377的地址為7FFFH。如果要從該片74LS377輸出數(shù)據(jù)到單片機(jī)中可以執(zhí)行如下指令:
MOV DPTR,#7FFFH
MOVX @DPTR,A
二、74LS245芯片及擴(kuò)展舉例
圖是74LS245的引腳圖和功能表。74LS245是一種三態(tài)輸出的8總線收發(fā)驅(qū)動器,無鎖存功能。它的G端和DIR端是控制端,當(dāng)它的G端為低電平時(shí),如果DIR為高電平,則74LS245將A端數(shù)據(jù)傳送至B端;如果DIR為低電平,則74LS245將B端數(shù)據(jù)傳送至A端。在其他情況下不傳送數(shù)據(jù),并輸出高阻態(tài)。
如圖使用了一片74LS245擴(kuò)展輸人口,如果將未使用到的地址線都置為1,則可以得到該片74LS245的地址為7FFFH。如果單片機(jī)要從該片74LS245輸人數(shù)據(jù),可以執(zhí)行如下指令:
三、74LS244芯片及擴(kuò)展舉例
74LS244芯片的引腳排列:
該芯片內(nèi)部有2個(gè)4位的三態(tài)緩沖器,一片74LS244可以擴(kuò)展一個(gè)8位輸入口,其電路連接如圖7.10所示。使用時(shí)以/CE作為數(shù)據(jù)選通信號。
應(yīng)用舉例:
1、使用多片74LS244實(shí)現(xiàn)多個(gè)輸入口擴(kuò)展的電路連接如圖所示,使用或門74LS32的輸出作為輸入口的選通信號;蜷T的兩個(gè)輸入端一個(gè)是讀選通信號/RD,另一個(gè)則為P2口的一條口線(線選法)。當(dāng)它們都為低電平時(shí),才能得到一個(gè)有效的輸入選通,使一片74LS244的8位數(shù)據(jù)進(jìn)行輸入。
2、一個(gè)撥盤可產(chǎn)生一個(gè)BCD碼形式的十進(jìn)制數(shù)(4位)。現(xiàn)有A、B、C、D4個(gè)撥盤,要求把它們產(chǎn)生的BCD碼數(shù)依次輸入到通用寄存器R4(B、A)、R5(D、C)中去。每個(gè)BCD碼需4條輸入線,4個(gè)BCD碼則共需16條愉入線,即2個(gè)8位口(1?诤2?冢虼擞脙善74LS244就可構(gòu)成其輸入接口,電路連接如圖7.12所示。
P2.7、P2.6分別作為1# 口和2# 口的地址選通線(線選法)。假定其它地址線為1,則1# 輸入口地址為7FFFH,2# 輸入口地址為0BFFFH。
數(shù)據(jù)輸入程序:
MOV DPTR,#7FFFH;1?诘刂
MOVX A,@DPTR;從撥盤取數(shù)
MOV R4,A
MOV DPTR,#0BFFFH;2?诘刂
MOVX A,@DPTR;從拔盤取數(shù)
MOV R5,A
第三節(jié) 8155 可編程接口及擴(kuò)展技術(shù)
8155具有3個(gè)可編程I/O口,其中2個(gè)口(A和B)為8位口,1個(gè)口(C)為6位口,256單元的RAM和1個(gè)14位計(jì)數(shù)結(jié)構(gòu)的定時(shí)器/計(jì)數(shù)器。
一、8155芯片結(jié)構(gòu)
在與單片機(jī)接口的方向,8155提供如下信號:
n AD7 —AD0 地址數(shù)據(jù)復(fù)用線。
n ALE—地址鎖存信號。除進(jìn)行AD7 —AD0 的地址鎖存控制外,還用于把片選信號/CE和IO/M等信號進(jìn)行鎖存。
n /RD—讀選通信號。
n /WR—寫選通信號。
n /CE—片選信號。
n IO/M— I/O與RAM選擇信號。IO/M=0對RAM進(jìn)行讀寫;IO/M=l時(shí)I/O口進(jìn)行讀寫。
n RESET—復(fù)位信號。8155以600 ns的正脈沖進(jìn)行復(fù)位,復(fù)位后A、B、C口均置為輸入方式。
二、I/O口及其工作方式
PA和PB是8位通用輸入/輸出口,主要用于數(shù)據(jù)的I/O傳送,是數(shù)據(jù)口,只有輸入/輸出兩種工作方式。
PC口為6位口,它既可作數(shù)據(jù)口用于數(shù)據(jù)的I/O傳送,也可作控制口,用于傳送控制信號和狀態(tài)信號。PC口共具有4種工作方式,即:輸入方式、輸出方式、PA口控制端口方以及PA和PB口控制端口方式。
當(dāng)PA或PB以中斷方式進(jìn)行數(shù)據(jù)傳送時(shí),所需的聯(lián)絡(luò)信號由PC提供,各聯(lián)絡(luò)信號如表:
聯(lián)絡(luò)信號共有3個(gè),其中:、
·INTR—中斷請求信號(輸出),高電平有效。送給MCS- 51單片機(jī)的外中斷請求信號。
·BF—緩沖器滿狀態(tài)信號(輸出),高電平有效。
·STB—選通信號(輸入),低電平有效。數(shù)據(jù)輸入操作時(shí)STB是外設(shè)送來的選通信號;數(shù)據(jù)輸出時(shí)STB是外設(shè)送來的應(yīng)答信號。
三、RAM單元及I/O口編址
8155共有256個(gè)RAM單元,加上6個(gè)可編址的端口,這6個(gè)端口是:命令/狀態(tài)寄存器、PA口、PB口、PC口、定時(shí)器/計(jì)數(shù)器低8位以及定時(shí)器/計(jì)數(shù)器高8位。8155引入8位地址AD7-AD0,無論是RAM還是可編址口都使用這8位地址進(jìn)行編址。如表所示。
四、8155與MCS-51單片機(jī)的連接
信號的對應(yīng)關(guān)系如下:
舉例:
五、8155的命令字及狀態(tài)字的格式及用法
8155的命令字和狀態(tài)字寄存器共用一個(gè)地址,命令字寄存器只能寫不能讀,狀態(tài)字寄存器只能讀不能寫。
六、8155的定時(shí)器/計(jì)數(shù)器
1.定時(shí)器/計(jì)數(shù)器的計(jì)數(shù)結(jié)構(gòu)
8155的定時(shí)器/計(jì)數(shù)器是一個(gè)14位的減法計(jì)數(shù)器,由兩個(gè)8位寄存器構(gòu)成,以其中的低14位組成計(jì)數(shù)器,兩個(gè)高位(M2、M1)用于定義計(jì)數(shù)器輸出的信號形式。
8155定時(shí)器/計(jì)數(shù)器的計(jì)數(shù)結(jié)構(gòu)如下:
2.定時(shí)器/計(jì)數(shù)器的使用
8155的定時(shí)器/計(jì)數(shù)器與MCS-51單片機(jī)芯片內(nèi)部的定時(shí)器/計(jì)數(shù)器在功能上是完全相同的,即同樣具有定時(shí)和計(jì)數(shù)兩種功能。但是在使用上卻與MCS- 51的定時(shí)器/計(jì)數(shù)器有許多不同之處。具體表現(xiàn)在:
·8155的定時(shí)器/計(jì)數(shù)器是減法計(jì)數(shù),MCS-51的定時(shí)器/計(jì)數(shù)器是加法計(jì)數(shù)。確定計(jì)數(shù)初值的方法是不同的。
·MCS - 51的定時(shí)器/計(jì)數(shù)器有多種工作方式。8155的定時(shí)器/計(jì)數(shù)器則只有一種固定的工作方式,即14位計(jì)數(shù),通過軟件方法進(jìn)行計(jì)數(shù)值加載。
·MCS- 51的定時(shí)器/計(jì)數(shù)器有兩種計(jì)數(shù)脈沖。當(dāng)定時(shí)工作時(shí),由芯片內(nèi)部按機(jī)器周期提供固定頻率的計(jì)數(shù)脈沖;當(dāng)計(jì)數(shù)工作時(shí),從芯片外部引入計(jì)數(shù)脈沖。8155的定時(shí)器/計(jì)數(shù)器,不論是定時(shí)工作還是計(jì)數(shù)工作,都由外部提供計(jì)數(shù)脈沖, 其信號引腳就是TIMER IN。
·MCS- 51的定時(shí)器/計(jì)數(shù)器,計(jì)數(shù)溢出自動置位TCON寄存器的計(jì)數(shù)溢出標(biāo)志位(TF),供用戶以查詢或中斷方式使用;但8155的定時(shí)器/計(jì)數(shù)器,計(jì)數(shù)溢出時(shí)向芯片外邊輸出一個(gè)信號(TIMER OUT)。這一信號還有脈沖和方波兩種形式,供用戶進(jìn)行選擇。具體由M2M1,兩位定義:
M2M1=00單個(gè)方波
M2M1=01連續(xù)方波
M2M1=10單個(gè)脈沖
M2M1=11連續(xù)脈沖<, /DIV>
這4種輸出形式如圖7.26所示。
3.定時(shí)器/計(jì)數(shù)器的控制
8155定時(shí)器/計(jì)數(shù)器的工作方式由命令字中的高兩位D7D6進(jìn)行控制。具體說明知下:
D7D6=00不影響計(jì)數(shù)器工作。
D7D6=01停止計(jì)數(shù)。如計(jì)數(shù)器未啟動則無操作,知計(jì)數(shù)器正運(yùn)行則停止計(jì)數(shù)。
D7D6=10達(dá)到計(jì)數(shù)值(計(jì)數(shù)器減為0)后停止。
D7D6=11啟動。如計(jì)數(shù)器沒運(yùn)行,則在裝入計(jì)數(shù)值后開始計(jì)數(shù);如計(jì)數(shù)器已運(yùn)行,則在當(dāng)前計(jì)數(shù)值計(jì)滿后,再以新的計(jì)數(shù)值進(jìn)行計(jì)數(shù)。
七、應(yīng)用舉例
例 要求使用8155定時(shí)器/計(jì)數(shù)器對計(jì)數(shù)脈沖進(jìn)行千分頻,即計(jì)數(shù)1000后,TIMER OUT端電平狀態(tài)變化,并重新送數(shù)以產(chǎn)生連續(xù)方波。此外假定PA口為輸入方式,PB口為輸出方式,PC口為輸入方式,禁止中斷。請編寫初始化程序。
解 此題共兩項(xiàng)任務(wù):計(jì)數(shù)初值的確定和命令字的確定。
計(jì)數(shù)器的最高兩位M2M1=01,計(jì)數(shù)器的其它14位裝入計(jì)數(shù)初值。由于8155計(jì)數(shù)器是減法計(jì)數(shù),所以計(jì)數(shù)初值應(yīng)為十進(jìn)制數(shù)1000,十六進(jìn)制數(shù)為03E8H。則:計(jì)數(shù)器高位字
節(jié)為43H,計(jì)數(shù)器低位字節(jié)為0E8H,按上述要求,8155的命令字為0C2H。各位狀態(tài)為:
由于命令字的高兩位D7D6=11,因此在裝入計(jì)數(shù)值后,計(jì)數(shù)器即開始計(jì)數(shù)。假定命令/狀態(tài)寄存器地址為0FD00H。則初始化程序?yàn)椋?/p>
MOV DPTR,#0FD00H;命令/狀態(tài)寄存器地址
MOV A,#0C2H;命令字
MOVX @DPTR,A;裝入命令字
MOV DPTR,#0FD04H;計(jì)數(shù)器低8位地址
MOV A,#0E8H;低8位計(jì)數(shù)位
MOVX @DPTR,A;寫入計(jì)數(shù)值低8位
INC DPTR;計(jì)數(shù)器高8位地址
MOV A,#43H;高8位計(jì)數(shù)值
MOVX @DPTR,A;寫入計(jì)數(shù)值高8位
例:若A口定義為基本的輸人方式,B口定義為基本的輸出方式,對輸入脈沖進(jìn)行200分頻,寫出8155的1/O初始化程序。
RAM字節(jié)地址:7E00H-7EFFH(P2.0=0)
I/O接口地址:
命令狀態(tài)口:7F00H
PA口:7F01H
PB口:7F02H
PC口:7F03H
定時(shí)器低8位:7F04H
定時(shí)器高8位:7F05H
ORG 1000H
START:MOV SP,#60H
MOV R6,#0FFH
DJNZ R6,START
MAIN:MOV DPTR,#7F04H;指向定時(shí)器低8位
MOV A,#0C8H;計(jì)數(shù)常數(shù)OC8H
MOVX @DPTR,A;計(jì)數(shù)常數(shù)低8位裝人
INC DPL;指向定時(shí)器高8位
MOV A,#40H;設(shè)定時(shí)器連續(xù)方波輸出
MOVX @DPTR,A;指向命令狀態(tài)口
MOV A,# 0C2H;命令控制字設(shè)定
MOVX @DPTR,A;A口為基本的輸人方式,B口為基本的輸出方式,開定時(shí)器
例 如果要實(shí)現(xiàn)L0—L3滅,L4—L7亮,編制程序。
LED:MOV DPTR,#7FFOH;寫方式控制字,PA口為基本1/O口輸出
MOV A,#01H
MOVX @DPTR,A
MOV DPTR,#7FFIH;往PA口寫數(shù),控制燈
MOV A,#0FH
MOVX @DPTR,A
RET
例 如圖9-18,要求使用8155的定時(shí)器/計(jì)數(shù)器使得TO口輸出的脈沖周期是TI輸人脈沖周期的10倍。試編程實(shí)現(xiàn)。
圖中,命令/狀態(tài)字地址:7FF0H,定時(shí)器/計(jì)數(shù)器低、高字節(jié)地址:7FF4H、7FF5H?梢跃幹迫缦伦映绦颍
PUS:MOV DPTR,#7FF4H;寫定時(shí)器/計(jì)數(shù)器工作方式和初值,方式1初值10
MOV A,#10
MOVX @DPTR,A
MOV DPTR,#7FF5H
MOV A,#40H
MOVX @DPTR,A
MOV DPTR,#7FF0H;啟動定時(shí)器/計(jì)數(shù)器
MOV A,#C0H
MOVX @DPTR,A
RET
第十一章 輸入與輸出設(shè)備及其接口技木
在單片機(jī)應(yīng)用系統(tǒng)中,通常都有操作面板。操作人員通過操作面板實(shí)現(xiàn)與應(yīng)用系統(tǒng)的信息交流,包括下達(dá)命令、修改程序和參數(shù)、干預(yù)應(yīng)用系統(tǒng)的狀態(tài)與顯示運(yùn)行狀態(tài)和運(yùn)行結(jié)果。
第一節(jié) 概 述
單片機(jī)應(yīng)用系統(tǒng)的類型多種多樣,如智能儀表、控制單元、數(shù)據(jù)采集系統(tǒng)、分布式檢測系統(tǒng)。但是,對于各種類型的單片機(jī)應(yīng)用系統(tǒng),其人機(jī)通道配置的集合如圖7-1所示。
第二節(jié) 顯示及顯示接口
在單片機(jī)系統(tǒng)中,常用的顯示器有:發(fā)光二極管顯示器,簡稱LED (Light Emitting Diode);液晶顯示器,簡稱LCD (Liquid Crystal Display);熒光管顯示器。三種顯示器中,以熒光管顯示器亮度最高,發(fā)光二極管次之,而液晶顯示器最弱,為被動顯示器,必須有外光源。
一、發(fā)光二極管及LED 顯示器
發(fā)光二極管是由半導(dǎo)體發(fā)光材料做成的PN結(jié),只要在發(fā)光二極管兩端通過正向電流5-20mA就能達(dá)到正常發(fā)光。LED的發(fā)光顏色通常有紅、綠、黃、白,其外形和電氣圖形符號如圖7-2所示。單個(gè)LED通常是通過亮、滅來指示系統(tǒng)運(yùn)行狀態(tài)和用快速閃爍來報(bào)警。
通常所說的LED顯示器由7個(gè)發(fā)光二極管組成,因此也稱之為七段LED顯示器,其
排列形狀如圖所示。顯示器中還有一個(gè)圈點(diǎn)型發(fā)光二極管(在圖中以dp表示),用于顯示小數(shù)點(diǎn)。通過七個(gè)發(fā)光二極管亮暗的不同組合,可以顯示多種數(shù)字、字母以及其它符號。
LED顯示器中的發(fā)光二極管共有兩種連接方法:
·共陽極接法
把發(fā)光二極管的陽極連在一起構(gòu)成公共陽極。使用時(shí)公共陽極接+5V。陰極端輸入低電平的段發(fā)光二極管導(dǎo)通點(diǎn)亮,輸入高電平的則不點(diǎn)亮。
·共陰極接法
把發(fā)光二極管的陰極連在一起構(gòu)成公共陰極。使用時(shí)會共陰極接地,陽極端輸入高電平的段發(fā)光二極管導(dǎo)通點(diǎn)亮,輸入低電平的則不點(diǎn)亮。
用LED顯示器顯示十六進(jìn)制數(shù)的字型代碼如下表所示:
二、七段LED 顯示器的工作原理
七段LED顯示器需要由驅(qū)動電路驅(qū)動。在七段LED顯示器中,共陽極顯示器,用低電平驅(qū)動;共陰極顯示器,用高電平驅(qū)動。點(diǎn)亮顯示器有靜態(tài)和動態(tài)兩種方式。
1.靜態(tài)顯示器
所謂靜態(tài)顯示,就是當(dāng)顯示器顯示某一字符時(shí),相應(yīng)段的發(fā)光二極管恒定地導(dǎo)通或截止。這種顯示方法的每一位都需要有一個(gè)8位輸出口控制。
靜態(tài)顯示器的優(yōu)點(diǎn)是顯示穩(wěn)定,在發(fā)光二極管導(dǎo)通電流一定的情況下顯示器的亮度高,控制系統(tǒng)在運(yùn)行過程中,僅僅在需要更新顯示內(nèi)容時(shí),CPU才執(zhí)行一次顯示更新子程序,這樣大大節(jié)省了CPU的時(shí)間,提高了CPU的工作效率;缺點(diǎn)是位數(shù)較多時(shí),所需的I/O口太多,硬件開銷太大。
舉例:作為MCS-51串行口方式0輸出的應(yīng)用,可以在串行口上擴(kuò)展多片串行輸人并行輸出的移位寄存器74LS164作為靜態(tài)顯示器接口,圖10-2給出了8位共陽極靜態(tài)顯示器的邏輯接口。設(shè)所顯示的字符查表編程量參數(shù)放在相應(yīng)的顯示緩沖區(qū)單元中。
下面列出更新顯示器子程序清單:
DISPLAY:MOV R7,#8;8位顯示計(jì)數(shù)器
MOV R0,#78H;78H-7FH為顯示器緩沖區(qū)
MOV DPTR,#TABLE;顯示字形碼表首地址
LOOP1:MOV A,@R0;取出要顯示的編程量參數(shù)
INC R0;指向緩沖區(qū)下一地址
MOVC A,@A+DPTR;取出顯示字形碼
MOV SBUF,A;送出該LED上的字形碼
LOOP2:JNB TI,LOOP2;輸出完否?
CLR TI;完,清發(fā)送中斷標(biāo)志
DJNZ R7,LOOP1;8位顯示未完,繼續(xù)
RET
TABLE:DB 0C0H,0F9H,0A4H,0BH,99H;0,1,2,3,4
DB 92H,82H,0FBH,80H,90H;5,6,7,8,9
DB 88H,83H,0C6H,0A1H,86H;A, b,C, d,E
DB 8EH,0BFH,8CH,0F7H,0FFH;F,一,P,一,暗
2.動態(tài)顯示器
所謂動態(tài)顯示就是一位一位地輪流點(diǎn)亮各位顯示器(掃描),對于顯示器的每一位而言,每隔一段時(shí)間點(diǎn)亮一次。在同一時(shí)刻只有一位顯示器在工作(點(diǎn)亮),利用人眼的視覺暫留效應(yīng)和發(fā)光二極管熄滅時(shí)的余輝效應(yīng),看到的卻是多個(gè)字符“同時(shí)”顯示。
顯示器亮度既與點(diǎn)亮?xí)r的導(dǎo)通電流有關(guān),也與點(diǎn)亮?xí)r間和間隔時(shí)間的比例有關(guān)。調(diào)整電流和時(shí)間參數(shù),可實(shí)現(xiàn)亮度較高較穩(wěn)定的顯示。
動態(tài)顯示器的優(yōu)點(diǎn)是節(jié)省硬件資源,成本較低。但在控制系統(tǒng)運(yùn)行過程中,要保證顯示器正常顯示,CPU必需每隔一段時(shí)間執(zhí)行一次顯示子程序,占用CPU大量時(shí)間,降低了CPU的工作效率,同時(shí)顯示亮度較靜態(tài)顯示器低。
若顯示器的位數(shù)不大于8位,則控制顯示器公共極電位只需一個(gè)8位I/O口(稱為掃描口或字位口),控制各位LED顯示器所顯示的字形也需要一個(gè)8位口(稱為數(shù)據(jù)口或字形口)。
舉例:
對于圖10一3所示的6位LED顯示器,在單片機(jī)內(nèi)部RAM中設(shè)置6個(gè)顯示緩沖單元78H-7DH,存放6位欲顯示的字符數(shù)據(jù),8155的端口A掃描輸出總是只有一位為高電平,即6位顯示器中僅有一位公共陰極為低電平(只選中一位),其他位為高電平,8155B口輸出相應(yīng)位的顯示字符的段數(shù)據(jù)使該位顯示出相應(yīng)字符,其他位為暗。依次改變端口A輸出為高電平的位及端口B輸出對應(yīng)的段數(shù)據(jù),6位LED顯示器就顯示出緩沖器中字符數(shù)據(jù)所確定的字符。顯示子程序流程圖如圖10一4所示。
程序清單如下:
KDIZHI DATA 7F00H:8155命令口地址(假定)
ADIZHI DATA 7F01H;8155A口地址(假定)
BDIZHI DATA 7F02H;8155B口地址(假定)
DSP:MOV R0,#78H;顯示數(shù)據(jù)緩沖區(qū)首地址送RO
MOV A,#03H
MOV DPTR,#KDIZHI
MOVX@DPTR,A;8155初始化,A口為輸出口,B口為輸出口
MOV R3,#00100000B;使顯示器最左邊位亮
LPl:MOV DPTR,#ADIZHI;數(shù)據(jù)指針指向A口
MOV A,R3
MOVX @DPTR,A;送掃描值
INC DPTR;數(shù)據(jù)指針指向B口
MOV A,@R0;取欲顯示數(shù)據(jù)的字形碼表位序
ADD A,#0DH;加上查表指令地址偏移量
MOVC A,@A+PC;取出字形碼
MOVX @DPTR,A;送出顯示
ACALL DELAY;調(diào)用延時(shí)子程序
INC R0;指向下一個(gè)顯示緩沖區(qū)地址
MOV A,R3
JB ACC.0,LP2;掃描到第六個(gè)顯示器否?
RR A;未到,掃描碼右移1位
MOV R3,A
AJMP LPl
LP2:RET
TAB:DB 3FH,06H,5BH,4FH,66H, 6DH;0,1,2,3,4,5
DB 7DH,07H,7FH,67H,77H,7CH;6,7,8,9,A, b
DB 39H, 5EH, 79H, 71H:C, d,E,F(xiàn)
DELAY:MOV R7,#02H;延時(shí)子程序
DL1:MOV R6,#0FFH
DL2:DJNZ R6,DL2
DJNZ R7,DLl
RET
說明:若某些字符的顯示需要小數(shù)點(diǎn)(dp)及需要數(shù)據(jù)的某些位閃爍時(shí)(亮一段時(shí)間,熄一段時(shí)間),則可建立小數(shù)點(diǎn)位置及數(shù)據(jù)閃爍位置標(biāo)志單元,指出小數(shù)點(diǎn)顯示位置或閃爍位置。當(dāng)顯示掃描到相應(yīng)位時(shí)(字位選擇字與小數(shù)點(diǎn)位置字或閃爍位置字重合),在該位字形碼中加人小數(shù)點(diǎn)(點(diǎn)亮dp段)或控制該位閃爍(定時(shí)給該位送字形碼或熄滅碼),完成帶小數(shù)點(diǎn)或閃爍字符顯示。
第三節(jié) 鍵盤接口技術(shù)
鍵盤是由若干個(gè)按鍵組成的開關(guān)矩陣,它是最簡單的單片機(jī)輸人設(shè)備,操作員可以通過鍵盤輸人數(shù)據(jù)或命令,實(shí)現(xiàn)簡單的人機(jī)通信。若鍵盤閉合鍵的識別是由專用硬件實(shí)現(xiàn)的,則稱為編碼鍵盤;若用軟件實(shí)現(xiàn)閉合鍵識別的,則稱為非編碼鍵盤。非編碼鍵盤又分為行列式和獨(dú)立式兩種。本節(jié)主要討論非編碼鍵盤的工作原理、接口技術(shù)和程序設(shè)計(jì)。
鍵盤接口應(yīng)有以下功能:
·鍵掃描功能,即檢測是否有鍵閉合;
·鍵識別功能,確定被閉合鍵所在的行列位置;
·產(chǎn)生相應(yīng)的鍵的代碼(鍵值)功能;
·消除按鍵抖動及對付多鍵串按(復(fù)鍵)功能。
一、鍵盤工作原理
1、獨(dú)立式鍵盤
獨(dú)立式是一組相互獨(dú)立的按健,這些按健可直接與單片機(jī)的1/O口連接,即每個(gè)按健獨(dú)占一條口線,接口簡單。獨(dú)立式鍵盤因占用單片機(jī)的硬件資源較多,只適合按鍵較少的場合。
舉例:一個(gè)具有4個(gè)按鍵的獨(dú)立式鍵盤如圖10一5a所示,每一個(gè)按鍵的一端都接地,另一端接8032的I/O口。從圖中可以看出,獨(dú)立式鍵盤每一按鍵都需要一根I/O線,占用8032的硬件資源較多。
2、矩陣式健盤
也稱行列式健盤,因?yàn)榻〉臄?shù)目較多,所以健按行列組成矩陣。
鍵盤接口處理的內(nèi)容:
1).鍵掃描
鍵盤上的鍵按行列組成矩陣,在行列的交點(diǎn)上都對應(yīng)有一個(gè)鍵。為判定有無鍵健被按下(閉合。┮约氨话唇〉奈焕,可使用兩種方法:掃描法和翻轉(zhuǎn)法。以掃描法為例,說明查找閉合健的方法。
首先是判定有沒有健被按下。如圖7. 31所示,健盤的行線一端經(jīng)電阻接+5V 電源,另一端接單片機(jī)的輸入口線。各列線的一端接單片機(jī)的輸出口線,另一端懸空。為判定有沒有鍵被按下,可先經(jīng)輸出口向所有列線輸出低電平,然后再輸入各行線狀態(tài)。若行線狀態(tài)皆為高電平,則表明無健按下;若行線狀態(tài)中有低電平,則表明有健被按下。
然后再判定被按鍵的位置。判定健位置的掃描是這樣進(jìn)行的:先使輸出口輸出0FEH,然后輸入行線狀態(tài),測試行線狀態(tài)中是否有低電平的。如果沒有低電平,再使輸出口輸出0FDH,再測試行線狀態(tài)到輸出。輸出0FBH時(shí),行線中有狀態(tài)為低電平者,則閉合健找到),通過此次掃描的列線值和行線值就可以知道閉合健的位置。
2)去抖動
常用鍵盤的鍵是一個(gè)機(jī)械開關(guān)結(jié)構(gòu),被按下時(shí),由于機(jī)械觸點(diǎn)的彈性及電壓突跳等原因,在觸點(diǎn)閉合或斷開的瞬間會出現(xiàn)電壓抖動,如圖7.32所示。抖動時(shí)間長短與健的機(jī)械特性有關(guān),一般為5~10 ms。而健的閉合時(shí)間和操作者的按健動作有關(guān),大約為十分之幾秒到幾秒不等。
去抖動有硬件和軟件兩種方法。硬件方法就是在健盤中附加去抖動電路,從根上消除抖動產(chǎn)生的可能性;而軟件方法則是采用時(shí)間延遲以躲過抖動(大約延時(shí)20-30ms即可),待行線上狀態(tài)確定之后,再進(jìn)行狀態(tài)輸入。一般為簡單起見多采用軟件方法。
3)鍵碼計(jì)算
以鍵的排列順序安排健號,則鍵碼的計(jì)算公式為:
鍵碼=行首號+列號
4)等待健釋放
計(jì)算健碼之后,再以延時(shí)后進(jìn)行掃描的方法等待健釋放。等待健釋放是為了保證健的一次閉合僅進(jìn)行一次處理。
二、鍵盤接口的控制方式
在單片機(jī)的運(yùn)行過程中,何時(shí)執(zhí)行健盤掃描和處理,可有以下3種情況:
·隨機(jī)方式,每當(dāng)CPU空閑時(shí)執(zhí)行健盤掃描程序。
·中斷方式,每當(dāng)有健閉合時(shí)才向CPU發(fā)出中斷請求,中斷響應(yīng)后執(zhí)行健盤掃描程序。
·定時(shí)方式,每隔一定時(shí)間執(zhí)行一次健盤掃描程序,定時(shí)可由單片機(jī)的定時(shí)器完成。
三、應(yīng)用舉例
1.接口電路邏輯圖
以8155作8×4健盤的接口為例。如圖7.35所示。
假定A口地址為0101H,C口地址為0103H.
2.判定有無閉合鍵的子程序
判定有無健閉合的子程序?yàn)镵Sl,供在健盤掃描程序中調(diào)用。程序如下:
KSl:MOV DPTR,#0101H
MOV A,#00H;A口送00H
MOVX @DPTR,A
INC DPTR
INC DPTR;建立C口地址
MOVX A,@DPTR;讀C口
CPL A;A取反,無健按下則全“0”
ANL A,#0FH;屏蔽A高半字節(jié)
RET
執(zhí)行KSl子程序的結(jié)果是:有閉合健則(A)≠0,無閉合健則(A)=00
3.鍵盤掃描程序
假定本系統(tǒng)中顯示程序?yàn)镈IR,執(zhí)行時(shí)間約為6 ms.
健盤掃描程序如下:
KEYl:ACALL KSl;檢查有健閉合否
JNZ LK1;A非0則轉(zhuǎn)移
ACALL DIR,顯示一次(延時(shí)6 ms)
AJMP KEYl
LK1:ACALL DIR;有健閉合二次延時(shí)
ACALL DIR;共12 ms去抖動
ACALL KS1;再檢查有健閉合否
JNZ LK2,有健閉合,轉(zhuǎn)LK2
ACALL DIR
AJMP KEYl;無健閉合,延時(shí)6 ms后轉(zhuǎn)KEYl
LK2:MOV R2,#0FEH;掃描初值送R2
MOVR4,#00H;掃描列號送R4
LK4:MOV DPTR,#0101H;建立A口地址
MOV A,R2
MOVX @DPTR, A;掃描初值送A口
INC DPTR
INC DPTR;指向C口
MOVX A,@DPTR;讀C口
JB ACC.0,LONE;ACC.0=1,第0行無鍵閉合,轉(zhuǎn)LONE
MOV A,#00H;裝第0行行值
AJMP LKP
LONE:JB ACC.1,LTWO;ACC.1=1,第1行無鍵閉合,轉(zhuǎn)LTWO
MOV A,#08H;裝第1行行值
AJMP LKP
LTWO:JB ACC.2,LTHR;ACC.2=1,第2行無鍵閉合,轉(zhuǎn)LTHR
MOV A,#10H;裝第2行行值
AJMP LKP
LTHR:JB ACC.3,NEXT;ACC.3=1,第3行無鍵閉合則轉(zhuǎn)NEXT
MOV A,#18H;裝第3行行值
LKP:ADD A,R4;計(jì)算鍵碼
PUSH ACC;保護(hù)鍵碼
LK3:ACALL DIR;延時(shí)6 ms
ACALL KS1;查鍵是否繼續(xù)閉合,若閉合再延時(shí)
JNZ LK3
POP ACC;若鍵起,則鍵碼送A
RET
NEXT:INC R4;掃描列號加1
MOV A,R2
JNB ACC.7,KND;第7位為0,已掃完最高列則轉(zhuǎn)KND
RL A;循環(huán)左移一位
MOV R2,A
AJMP LK4;進(jìn)行下一列掃描
KND:AJMP KEYl;掃描完畢,開始祈的山輪
說明:健盤掃描程序的運(yùn)行結(jié)果是把閉合健的健碼放在累加器A中。接下來的程序是根
據(jù)健碼進(jìn)行程序轉(zhuǎn)移,轉(zhuǎn)去執(zhí)行該健對應(yīng)的操作。
第十二章 輸入輸出通道接口技術(shù)
當(dāng)以單片機(jī)為核心組成實(shí)時(shí)測控系統(tǒng)時(shí),通常需要對被控對象的狀態(tài)進(jìn)行測試和對控制條件進(jìn)行監(jiān)測,因此需要通過前向輸人通道將被測信號輸人單片機(jī)系統(tǒng)中。
在科學(xué)研究和生產(chǎn)過程中,測控系統(tǒng)的被測參數(shù)可以是溫度、壓力、速度等非電量,也可以是電流、電壓、功率和開關(guān)量等電量。這些參數(shù)信號需通過各類傳感器和變送器變換成相應(yīng)的模擬電量,然后經(jīng)多路開關(guān)匯集送給A/D轉(zhuǎn)換器,轉(zhuǎn)換成相應(yīng)的數(shù)字量送給單片機(jī)。經(jīng)過單片機(jī)處理過的數(shù)字量,送給D/A轉(zhuǎn)換器,變換成相應(yīng)的模擬量對被控系統(tǒng)實(shí)施控
制和調(diào)整,使之處于最佳工作狀態(tài),如圖8-1所示。
知識要點(diǎn):
輸人輸出通道的基本知識,
數(shù)字量輸入輸出通道和模擬量輸人輸出通道的結(jié)構(gòu)
A/D轉(zhuǎn)換器工作原理和MCS-51系列單片機(jī)的連接以及程序設(shè)計(jì)方法。
D/A轉(zhuǎn)換器工作原理和MCS-51系列單片機(jī)的連接以及程序設(shè)計(jì)方法。
第一節(jié) 前向輸入通道接口技術(shù)
一、概述
被測信號分為數(shù)字量和模擬量兩種。
1 .?dāng)?shù)字量輸人
數(shù)字量包括N位并行數(shù)字量、開關(guān)量和頻率信號。
·N位并行數(shù)字量
可以直接送人單片機(jī)的1/O接口。若N位數(shù)字量并行輸人,當(dāng)N=8時(shí),正好利用一個(gè)8位1/O接口輸人單片機(jī)內(nèi);當(dāng)N<8時(shí),可利用一個(gè)8位1/O接口輸人CPU,然后將其他位屏蔽即可得到N位數(shù)據(jù);當(dāng)N>8時(shí),輸人方式有兩種:一種是利用多個(gè)8位I/O接口,另一種是利用一個(gè)I/O接口多次選通輸人。
·開關(guān)量
開關(guān)量是輸入信號為具有TTL電平的狀態(tài)信號,如繼電器的吸合與斷開、光電門的導(dǎo)通與截止、限位開關(guān)、按鈕、轉(zhuǎn)換開關(guān)、接觸器等電器的觸點(diǎn)通斷,其信號電平只有高、低兩種電平。
圖8-2所示是一種開關(guān)量檢測電路。開關(guān)量信號經(jīng)過了光電隔離,適當(dāng)選擇電阻值,使A點(diǎn)電平符合TTL電平的要求,可以將A點(diǎn)接到單片機(jī)I/O接口或經(jīng)三態(tài)門接到單片機(jī)數(shù)據(jù)總線,實(shí)現(xiàn)開關(guān)量信號輸人。
·頻率信號
經(jīng)放大、整形和隔離等處理,即可得到較為理想的矩形波,這種矩形波可直接送人單片機(jī)系統(tǒng),如圖8-3所示。
2.模擬量輸人
所謂模擬量,就是一些連續(xù)變化的物理量,如溫度、速度、電壓、電流和壓力等。這些被測參數(shù),單片機(jī)無法直接處理,需要把這些模擬量通過各類傳感器和變送器變換成相應(yīng)的模擬電量,然后經(jīng)多路開關(guān)匯集送給A/D轉(zhuǎn)換器,轉(zhuǎn)換成相應(yīng)的數(shù)字量送給單片機(jī)。
模擬量輸人通道一般由傳感器、放大器、多路模擬開關(guān)、采樣保持器和A/D轉(zhuǎn)換器組成,其結(jié)構(gòu)形式取決于被測對象的環(huán)境、輸出信號的類型、數(shù)量和大小等,見表8-1。
說明:根據(jù)傳感器輸出信號的大小和類型,選擇前向輸人通道結(jié)構(gòu)。
大信號模擬電壓,能直接滿足A/D轉(zhuǎn)換輸入要求,則可直接送人A/D轉(zhuǎn)換器,經(jīng)過A/D轉(zhuǎn)換后再送人單片機(jī)。也可通過V/F轉(zhuǎn)換成頻率信號送人單片機(jī)。但由于頻率測量響應(yīng)速度慢,多用于一些非快速過程參量的測量,這種通道結(jié)構(gòu)的優(yōu)點(diǎn)是抗干擾能力強(qiáng),便于遠(yuǎn)距離傳輸。
小信號模擬電壓,則首先應(yīng)將該信號電壓放大,放大到能滿足A/D轉(zhuǎn)換、V/F轉(zhuǎn)換要求的輸人電壓。
以電流為輸出信號的傳感器或傳感儀表則首先應(yīng)通過I/V轉(zhuǎn)換,將電流信號轉(zhuǎn)換成電壓信號。最簡單的I/V轉(zhuǎn)換器就是一個(gè)精密電阻,當(dāng)信號電流流過精密電阻時(shí),其電壓降與流過的電流大小成正比,從精密電阻兩端取出的電壓就是I/V變換后的電壓信號。
二、A/D 轉(zhuǎn)換接口技術(shù)
A/D轉(zhuǎn)換接口技術(shù)的主要內(nèi)容是合理選擇A/D轉(zhuǎn)換器和其他外圍器件,實(shí)現(xiàn)與單片機(jī)的正確連接以及編制轉(zhuǎn)換程序。
A/D轉(zhuǎn)換器(Analog-Digital Converter)是一種能把輸人模擬電壓或電流變成與其成正比的數(shù)字量的電路芯片,即能把被控對象的各種模擬信息變成計(jì)算機(jī)可以識別的數(shù)字信息。
分類:計(jì)數(shù)器式A/D轉(zhuǎn)換器、雙積分式A/D轉(zhuǎn)換器、逐次逼近式A/D轉(zhuǎn)換器和并行A/D轉(zhuǎn)換器。
計(jì)數(shù)器式A/D轉(zhuǎn)換器結(jié)構(gòu)很簡單,但轉(zhuǎn)換速度也很慢,所以很少采用。
雙積分式A/D轉(zhuǎn)換器抗干擾能力強(qiáng),轉(zhuǎn)換精度很高,但速度不夠理想,常用于數(shù)字式測量儀表中。
逐次逼近式A/D轉(zhuǎn)換器結(jié)構(gòu)不太復(fù)雜,轉(zhuǎn)換速度也高。計(jì)算機(jī)中廣泛采用其作為接口電路。
并行A/D轉(zhuǎn)換器的轉(zhuǎn)換速度最快,但因結(jié)構(gòu)復(fù)雜而造價(jià)較高,故只用于那些轉(zhuǎn)換速度極高的場合。
1 、概述
1)A/D轉(zhuǎn)換器的技術(shù)指標(biāo):
·量化誤差(Quantizing Error)與分辨率(Resolution)。
A/D轉(zhuǎn)換器的分辨率表示輸出數(shù)字量變化一個(gè)相鄰數(shù)碼所需輸人模擬電壓的變化量,習(xí)慣上以輸出二進(jìn)制位數(shù)或滿量程與2n 之比(其中n為ADC的位數(shù))表示。
例如A/D轉(zhuǎn)換器AD574A的分辨率為12位,即該轉(zhuǎn)換器的輸出數(shù)據(jù)可以用212 個(gè)二進(jìn)制數(shù)進(jìn)行量化,其分辨率為1LSB (1LSB=VFS/212 )。如果用百分?jǐn)?shù)來表示分辨率時(shí),其分辨率為
1/2n ×100%=1/212 ×100%=0.0244%
一個(gè)滿量程VFS=10V的12位ADC能夠分辨輸人電壓變化的最小值為2.4mV。
量化誤差是由于有限數(shù)字對模擬數(shù)值進(jìn)行離散取值(量化)而引起的誤差。因此,量化誤差理論上為一個(gè)單位分辨率,即士(1/2)LSB。提高分辯率可減少量化誤差。
·轉(zhuǎn)換精度(Conversion Accuracy)。
A/D轉(zhuǎn)換器轉(zhuǎn)換精度反映了一個(gè)實(shí)際A/D轉(zhuǎn)換器在量化值上與一個(gè)理想A/D轉(zhuǎn)換器進(jìn)行模/數(shù)轉(zhuǎn)換的差值,由模擬誤差和數(shù)字誤差組成。
模擬誤差是比較器、解碼網(wǎng)絡(luò)中電阻值以及基準(zhǔn)電壓波動等引起的誤差;
數(shù)字誤差主要包括丟失碼誤差和量化誤差,丟失碼誤差屬于非固定誤差,由器件質(zhì)量決定。
·轉(zhuǎn)換時(shí)間與轉(zhuǎn)換速率。
A/D轉(zhuǎn)換器完成一次轉(zhuǎn)換所需要的時(shí)間為A/D轉(zhuǎn)換時(shí)間,是指從啟動A/D轉(zhuǎn)換器開始到獲得相應(yīng)數(shù)據(jù)所需時(shí)間(包括穩(wěn)定時(shí)間)。通常,轉(zhuǎn)換速率是轉(zhuǎn)換時(shí)間的倒數(shù),即每秒轉(zhuǎn)換的次數(shù)。
2) A/D轉(zhuǎn)換器選擇要點(diǎn)
·確定A/D轉(zhuǎn)換器精度及分辨率。
用戶提出的測控精度要求是綜合精度要求,它包括了傳感器精度、信號調(diào)節(jié)電路精度和A/D轉(zhuǎn)換精度及輸出電路、伺服機(jī)構(gòu)精度,而且還包括測控軟件的精度。應(yīng)將綜合精度在各個(gè)環(huán)節(jié)上進(jìn)行分配,以確定對A/D轉(zhuǎn)換器的精度要求,據(jù)此確定A/D轉(zhuǎn)換器的位數(shù)。通常A /D轉(zhuǎn)換器的位數(shù)至少要比綜合精度要求的最低分辨率高一位,而且應(yīng)與其他環(huán)節(jié)所能達(dá)到的精度相適應(yīng)。
·確定A/D轉(zhuǎn)換器的轉(zhuǎn)換速率。
通常根據(jù)被測信號的變化率及轉(zhuǎn)換精度要求,確定A/D轉(zhuǎn)換器的轉(zhuǎn)換速率,以保證系統(tǒng)的實(shí)時(shí)性要求。用不同原理實(shí)現(xiàn)的轉(zhuǎn)換器,其轉(zhuǎn)換速率是不一樣的,如積分型的、跟蹤比較型的A/D轉(zhuǎn)換器轉(zhuǎn)換速率較慢,轉(zhuǎn)換時(shí)間一般為幾毫秒到幾十毫秒,一般用于溫度、壓力、流量等緩變參量的檢測。計(jì)算機(jī)中廣泛采用逐次逼近式A/D轉(zhuǎn)換器為中速轉(zhuǎn)換器,常用于工業(yè)多通道單片機(jī)測控系統(tǒng)等。并行A/D轉(zhuǎn)換器的轉(zhuǎn)換速度最快,故常用于如實(shí)時(shí)瞬態(tài)記錄等轉(zhuǎn)換速度極高的場合。
·確定環(huán)境參數(shù)。
根據(jù)使用環(huán)境條件,確定A/D轉(zhuǎn)換芯片要求的一些環(huán)境:工作溫度、功耗和可靠性等級等。
2、A/D轉(zhuǎn)換典型芯片ADC0809
8位8通道逐次逼近式A/D轉(zhuǎn)換器,CMOS工藝,可實(shí)現(xiàn)8路模擬信號的分時(shí)采集,片內(nèi)有8路模擬選通開關(guān),以及相應(yīng)的通道地址鎖存用譯碼電路,其轉(zhuǎn)換時(shí)間為100us左右。
1)ADC0809的內(nèi)部邏輯結(jié)構(gòu)
ADC 0809內(nèi)部邏輯結(jié)構(gòu)如圖所示。
圖中多路開關(guān)可選通8個(gè)模擬通道,允許8路模擬量分時(shí)輸入,共用一個(gè)A/D轉(zhuǎn)換器進(jìn)行轉(zhuǎn)換。地址鎖存與譯碼電路完成對A、B、C3個(gè)地址位進(jìn)行鎖存和譯碼,其譯碼輸出用于通道選擇。
2)信號引腳
ADC0809芯片為28引腳雙列直插式封裝,其引腳排列見圖9.14.
對ADC0809主要信號引腳的功能說明如下:
·IN0~I(xiàn)N7—模擬量輸入通道信號單極性,電壓范圍0-5V,若信號過小還需進(jìn)行放大。模擬量輸入在A/D轉(zhuǎn)換過程中其值不應(yīng)變化,對變化速度快的模擬量,在輸入前應(yīng)增加采樣保持電路。
·A、B、C地址線
A為低位地址,C為高位地址,模擬通道的選擇信號,引腳圖中為ADDA,ADDB和ADDC。其地址狀態(tài)與通道對應(yīng)關(guān)系見表9-1
·ALE 地址鎖存允許信號
對應(yīng)ALE上跳沿,A、B、C地址狀態(tài)送入地址鎖存器中。
·START 轉(zhuǎn)換啟動信號
START上跳沿時(shí),所有內(nèi)部寄存器清“0”;START下跳沿時(shí),開始進(jìn)行A/D轉(zhuǎn)換;在A/D轉(zhuǎn)換期間,START應(yīng)保持低電平。本信號有時(shí)簡寫為ST。
·D7~D0 數(shù)據(jù)愉出線
為三態(tài)緩沖輸出形式,可以和單片機(jī)的數(shù)據(jù)線直接相連。D0為最低位,D7為最高位。
·OE 輸出允許信號
用于控制三態(tài)輸出鎖存器向單片機(jī)輸出轉(zhuǎn)換得到的數(shù)據(jù)。
OE=0,輸出數(shù)據(jù)線呈高電阻;
OE=1,輸出轉(zhuǎn)換得到的數(shù)據(jù)。
·CLK 時(shí)鐘信號
ADC 0809的內(nèi)部沒有時(shí)鐘電路,所需時(shí)鐘信號由外界提供。通常使用頻率為500kHz的時(shí)鐘信號。
·EOC 轉(zhuǎn)換結(jié)束信號
EOC=0,正在進(jìn)行轉(zhuǎn)換;
EOC=1,轉(zhuǎn)換結(jié)束。
使用中該狀態(tài)信號既可作為查詢的狀態(tài)標(biāo)志,又可以作為中斷請求信號使用。
·Vcc +5V電源
·Vref 參考電源
參考電壓用來與輸入的模擬信號進(jìn)行比較,作為逐次逼近的基準(zhǔn)。其典型值為+5V(Vref(+)=+5V,Vref(一)=0V)。
3) 單片機(jī)與ADC0809接口
三個(gè)問題:
①要給START線送一個(gè)100ns寬的起動正脈沖;
②獲取EOC線上的狀態(tài)信息,因?yàn)樗茿/D轉(zhuǎn)換的結(jié)束標(biāo)志;
③要給“三態(tài)輸出鎖存器”分配一個(gè)端口地址,也就是給OE線上送一個(gè)地址譯碼器輸出信號。
MCS-51和ADC接口通?梢圆捎枚〞r(shí)、查詢和中斷三種方式。
·定時(shí)傳送方式
對于每種A/D轉(zhuǎn)換器,轉(zhuǎn)換時(shí)間作為一項(xiàng)技術(shù)指標(biāo),是已知的和固定的。如ADC0809的轉(zhuǎn)換時(shí)間為128us。可以設(shè)計(jì)一延時(shí)子程序,當(dāng)啟動轉(zhuǎn)換后,CPU調(diào)用該延時(shí)子程序或用定時(shí)器定時(shí),延時(shí)時(shí)間或定時(shí)時(shí)間稍大于A/D轉(zhuǎn)換所需時(shí)間。等時(shí)間一到,轉(zhuǎn)換已經(jīng)完成,就可以從“三態(tài)輸出鎖存器”讀取數(shù)據(jù)。
特點(diǎn):電路連接簡單,但CPU費(fèi)時(shí)較多。
·查詢方式
采用查詢法就是將轉(zhuǎn)換結(jié)束信號接到I/O接口的某一位,或經(jīng)過三態(tài)門接到單片機(jī)數(shù)據(jù)總線上。A/D轉(zhuǎn)換開始之后,CPU就查詢轉(zhuǎn)換結(jié)束信號,即查詢EOC引腳的狀態(tài):若它為低電平,表示A/D轉(zhuǎn)換正在進(jìn)行,則MCS-51應(yīng)當(dāng)繼續(xù)查詢;若查詢到EOC變?yōu)楦唠娖,則給OE線送一個(gè)高電平,以便從線上提取A/D轉(zhuǎn)換后的數(shù)字量。
特點(diǎn):占用CPU時(shí)間,但設(shè)計(jì)程序比較簡單。
·中斷方式
采用中斷方式傳送數(shù)據(jù)時(shí),將轉(zhuǎn)換結(jié)束信號接到單片機(jī)的中斷申請端,當(dāng)轉(zhuǎn)換結(jié)束時(shí)申請中斷,CPU響應(yīng)中斷后,通過執(zhí)行中斷服務(wù)程序,使OE引腳變高電平,以提取A/D轉(zhuǎn)換后的數(shù)字量。
特點(diǎn):在A/D轉(zhuǎn)換過程中不占用CPU的時(shí)間,且實(shí)時(shí)性強(qiáng)。
4) 應(yīng)用舉例
例 分別采用不同方式對8路模擬信號輪流采一遍樣,并依次把轉(zhuǎn)換后的數(shù)據(jù)存放到數(shù)據(jù)存儲區(qū)。ADC0809與8031接口工作方式見圖。
·EOC開始轉(zhuǎn)換時(shí)為低電平,當(dāng)轉(zhuǎn)換結(jié)束時(shí)為高電平。
·查詢方式:查詢EOC引腳,接P1.0。
·中斷方式:EOC經(jīng)反相器接8051的外部中斷引腳INT1。
1)定時(shí)傳送方式
MAIN:MOV R1,#data
MOV DPTR,#7FF8H;P2.7=0,且指向通道0
MOV R7,#08H;置通道數(shù)
LOOP:MOVX @DPTR,A;啟動A/D轉(zhuǎn)換
MOV R6,#0AH
DLAY:NOP
NOP
NOP
NOP
DJNZ R6,DLAY
MOVX A,@DPTR;讀取轉(zhuǎn)換結(jié)果
MOV @R1,A
INC DPTR;指向下一個(gè)通道
INC R1;修改數(shù)據(jù)區(qū)指針
DJNZ R7,LOOP
2)查詢方式
MAIN:MOV R1,#data
MOV DPTR,#7FF8H;P2.7=0,且指向通道0
MOV R7,#08H;置通道數(shù)
LOOP:MOVX @DPTR,A;啟動A/D轉(zhuǎn)換
SETB P1.0
WAIT:JNB P1.0,WAIT;查詢P1.0狀態(tài)
MOVX A,@DPTR;讀取轉(zhuǎn)換結(jié)果
MOV @R1,A
INC DPTR;指向下一個(gè)通道
INC R1;修改數(shù)據(jù)區(qū)指針
DJNZ R7,LOOP;8個(gè)通道全采樣完了嗎?
RET
3)中斷方式
SETB IT1
SETB EX1
SETB EA
MOV DPTR,#7FF8H
MOV A,#0
MOVX @DPTR,A
…
EINT1:MOV DPTR,#7FF8H
MOVX A,@DPTR
MOV 30H,A
MOV A,#00
MOVX @DPTR,A
RETI
第二節(jié) 后向輸出通道接口技術(shù)
在以單片機(jī)為核心組成的測控系統(tǒng)中,單片機(jī)要通過后向輸出通道輸出控制信號對控制對象實(shí)現(xiàn)控制操作。
知識要點(diǎn):
后向輸出通道的作用、結(jié)構(gòu)
D/A轉(zhuǎn)換接口及應(yīng)用
一、概述
1.后向輸出通道的作用分析:
·數(shù)/模轉(zhuǎn)換單片機(jī)輸出的控制信號是數(shù)字信號,需要通過D/A轉(zhuǎn)換器把數(shù)字量轉(zhuǎn)換成控制對象所需的模擬電壓或電流。
·功率放大驅(qū)動經(jīng)數(shù)/模轉(zhuǎn)換得到的模擬電壓或電流控制信號,不能滿足控制對象的功率要求,必須經(jīng)功率放大,驅(qū)動外部伺服系統(tǒng)。
·干擾信號防治后向輸出通道接近控制對象,工作環(huán)境相對惡劣,會出現(xiàn)伺服驅(qū)動系統(tǒng)通過信號通道、電源以及空間電磁場對單片機(jī)應(yīng)用系統(tǒng)的電磁干擾,另外還會出現(xiàn)機(jī)械干擾,因此通常采用信號隔離、電源隔離和大功率開關(guān)實(shí)現(xiàn)過零切換等方法進(jìn)行干擾防治。
2.后向輸出通道的結(jié)構(gòu)
根據(jù)單片機(jī)輸出信號和控制對象的特點(diǎn),后向輸出通道的結(jié)構(gòu)如圖8-12所示。單片機(jī)通過1/0接口或數(shù)據(jù)總線輸出的開關(guān)量、數(shù)字量和頻率量可以直接用于開關(guān)量、數(shù)字量控制系統(tǒng)和頻率調(diào)制系統(tǒng),對于模擬量控制系統(tǒng),需通過D/A、F/V轉(zhuǎn)換成模擬量控制信號。下面對后向輸出通道中的重要部分D/A轉(zhuǎn)換接口進(jìn)行詳細(xì)分析。
二、D/A轉(zhuǎn)換接口
D/A轉(zhuǎn)換接口技術(shù)的主要內(nèi)容是合理選擇D/A轉(zhuǎn)換器和其他有關(guān)器件,實(shí)現(xiàn)與微機(jī)的正確連接以及編制轉(zhuǎn)換程序。
1.概述
(1) D/A轉(zhuǎn)換器
D/A轉(zhuǎn)換器(Digital to Analog Conver)是一種能把數(shù)字量轉(zhuǎn)換成模擬量的電子器件。在單片機(jī)測控系統(tǒng)中經(jīng)常采用的是D/A轉(zhuǎn)換器的集成電路芯片,稱為D/A接口芯片或DAC芯片。
(2) D/A轉(zhuǎn)換器的性能指標(biāo)
·分辨率(Resolution)
指D/A接口芯片能分辨的最小輸出模擬增量。輸人數(shù)量發(fā)生單位數(shù)碼變化時(shí),即LSB(最低有效位)產(chǎn)生一次變化時(shí),所對應(yīng)的輸出的模擬量的變化量。對于線性D/A轉(zhuǎn)換器來說,其分辨率△與數(shù)字量的位數(shù)n的關(guān)系為
在實(shí)際使用中,表示分辨率高低更常用的方法是采用輸入量的位數(shù),如滿量程10V的8位DAC芯片的分辨率為8位。
·轉(zhuǎn)換精度(Conversion Accuracy)
指滿量程時(shí)DAC的實(shí)際模擬輸出量與理論值的接近程度,與D/A轉(zhuǎn)換芯片的結(jié)構(gòu)和接口配置電路有關(guān)。通常,DAC的轉(zhuǎn)換精度為分辨率的一半。
·失調(diào)誤差
指輸人數(shù)字量為零時(shí),模擬輸出量與理想輸出量的偏差。偏差值的大小一般用LSB的份數(shù)或用偏差值表示。
(3)D/A轉(zhuǎn)換器的選擇要點(diǎn)
·輸人信號的形式。
輸人信號有并行和串行兩種形式,根據(jù)實(shí)際要求選定。在實(shí)際應(yīng)用中大多數(shù)為并行輸入。串行輸入節(jié)省數(shù)據(jù)線,但速度較慢,適用于遠(yuǎn)距離數(shù)據(jù)傳輸。
·分辨率和轉(zhuǎn)換精度
根據(jù)對輸出模擬量的精度要求來確定D/A轉(zhuǎn)換器的分辨率和轉(zhuǎn)換精度。常用的分辨率有8位、10位和12位。在精度指標(biāo)方面,零點(diǎn)誤差和滿量程誤差可以通過電路調(diào)整進(jìn)行補(bǔ)償,因此主要看芯片的非線性誤差和微分非線性誤差。
·建立時(shí)間
D/A轉(zhuǎn)換器的電流建立時(shí)間很短,一般為50-500ns。若是輸出電莊形式,加上運(yùn)算放大器電路,電壓建立時(shí)間一般為1us到幾u(yù)s,一般都能滿足系統(tǒng)要求。
·轉(zhuǎn)換結(jié)果的輸出形式
轉(zhuǎn)換結(jié)果的輸出形式有電流或電壓,有單極性或雙極性,有不同量程,還有多通道輸出方式。這可根據(jù)應(yīng)用系統(tǒng)對模擬量形式的實(shí)際要求來確定。
2.D/A轉(zhuǎn)換典型芯片DAC0832芯片
DAC0832是微處理器完全兼容的,具有8位分辨率的D/A轉(zhuǎn)換集成芯片,以其價(jià)廉、接口簡單、轉(zhuǎn)換控制容易等優(yōu)點(diǎn),在單片機(jī)應(yīng)用系統(tǒng)中得到了廣泛的應(yīng)用。
(1) DAC0832的引腳
其邏輯結(jié)構(gòu)及管腳號如圖所示。
它由8位輸人鎖存器、8位DAC寄存器、8位D/A轉(zhuǎn)換電路及轉(zhuǎn)換控制電路構(gòu)成。為20腳雙列直插式封裝結(jié)構(gòu)。各引腳信號說明如下:
·DI7~DI0—轉(zhuǎn)換數(shù)據(jù)輸入。
·/CS—片選信號(輸入),低電平有效。
·ILE—數(shù)據(jù)鎖存允許信號(輸入),高電平有效。
·/WR1—第1寫信號(輸入),低電平有效。該信號與ILE信號共同控制輸入寄存器是數(shù)據(jù)直通方式還是數(shù)據(jù)鎖存方式:
當(dāng)ILE=1和/WR1=0時(shí),為輸入寄存器直通方式;
當(dāng)ILE=1和/WR1=1時(shí),為輸入寄存器鎖存方式。
·/XFER—數(shù)據(jù)傳送控制信號(輸入),低電平有效。
·/WR2—第2寫信號(輸入),低電平有效。該信號與/XFER信號合在一起控制DAC寄存器是數(shù)據(jù)直通方式還是數(shù)據(jù)鎖存方式:
/WR2=0和/XFER=0時(shí),為DAC寄存器直通方式;
/WR2=1和/XFER=0時(shí),為DAC寄存器鎖存方式。
·Iout1—電流輸出“1”;當(dāng)數(shù)據(jù)為全1時(shí),輸出電流最大;為全0時(shí)輸出電流最小。
·Iout2—電流輸出“2”;DAC轉(zhuǎn)換器的特性之一是:Iout1+I(xiàn)out2=常數(shù)。
·Rfb—反饋電阻端。
即運(yùn)算放大器的反饋電阻端,電阻已固化在芯片中。因?yàn)镈AC0832是電流輸出型D/A轉(zhuǎn)換器,為得到電壓的轉(zhuǎn)換輸出,使用時(shí)需在兩個(gè)電流輸出端接運(yùn)算放大器Rfb即為運(yùn)算放大器的反饋電阻,運(yùn)算放大器的接法如圖所示。
·Vref—基準(zhǔn)電壓,是外加高精度電壓源。該電壓可正可負(fù),范圍為-10V~+10V。
·DGND—數(shù)字地。
·AGND—模擬地。
(2)DAC0832內(nèi)部結(jié)構(gòu)
DAC0832的內(nèi)部結(jié)構(gòu)框圖如圖9. 3所示。
“8位輸人寄存器”用于存放CPU送來的數(shù)字量,使輸人的數(shù)字量得到緩沖和鎖存,由/LE1控制。“8位DAC寄存器”用于存放待轉(zhuǎn)換的數(shù)字量,由/LE2控制。“8位D/A轉(zhuǎn)換電路”由T型電阻網(wǎng)絡(luò)和電子開關(guān)組成,電子開關(guān)受“8位DAC寄存器”輸出控制。
(3)DAC0832和MCS-51單片機(jī)的接口方式
·單緩沖方式連接
所謂單緩沖方式就是使DAC0832的兩個(gè)輸入寄存器中有一個(gè)(多為DAC寄存器)處于直通方式,而另一個(gè)處于受控的鎖存方式。
應(yīng)用場合:如果只有一路模擬量輸出,或雖是多路模擬量輸出但并不要求輸出同步的情況下,就可采用單緩沖方式。單緩沖方式連接如圖9.4所示。
單緩沖方式應(yīng)用舉例:
例1產(chǎn)生鋸齒波,其電路連接如圖所示。
圖中的DAC0832工作于單緩沖方式,其中輸入寄存器受控,而DAC寄存器直通。假定輸入寄存器地址為5000H,產(chǎn)生鋸齒波的程序清單如下:
MOV DPTR ,#5000H
MOV R0,#00H
WW:MOV A,R0
MOVX @DPTR , A
INC R0
NOP
NOP
NOP
AJMP WW
例.2小電機(jī)驅(qū)動。
分析:對于小功率直流電機(jī)驅(qū)動,使用單片機(jī)極為方便,其方法就是控制電機(jī)定子電壓接通和斷開時(shí)間的比值(即占空比),以此來驅(qū)動電機(jī)和改變電機(jī)的轉(zhuǎn)速,這種方法稱為脈沖寬度調(diào)速法(或簡稱脈寬調(diào)速法)。占空比以及占空比與電機(jī)轉(zhuǎn)速的關(guān)系如圖所示。
電壓變換周期為T,電壓接通時(shí)間為t,則占空比表示為D=t/T。設(shè)電機(jī)固定接通電源時(shí)的最大轉(zhuǎn)速為Vmax,則用脈沖寬度調(diào)速的電機(jī)轉(zhuǎn)速為:
Vd=Vmax×D
Vd與D的函數(shù)曲線如9.7(b)所示?梢钥闯,實(shí)際上Vd與D并不完全是線性關(guān)系(如圖中實(shí)線所表示),但可以近似地看成是線性關(guān)系,為此我們可以采用控制加電脈沖寬度的辦法來驅(qū)動電機(jī)并調(diào)節(jié)其轉(zhuǎn)速。
按圖9.9的連接,DAC0832輸入寄存器的地址為9000H,則MCS- 51電機(jī)驅(qū)動程序清單如下:
ORG 0000H
AJMP DAMOT
ORG 08100H
DAMOT:MOV DPTR,#9000H;翰入寄存器地址
MOV A,#80H
MOVX @DPTR,A;輸出0V電平
ACALL DELAY1,維持0V電平
MOV A,#0FFH
MOVX @DPTR, A;輸出+5V電平
ACALL DELAY2,維持+5V電平
AJMP DAMOT
說明:按上述程序,改變延時(shí)子程序的延遲時(shí)間就可以改變電機(jī)的轉(zhuǎn)速。如把第二次轉(zhuǎn)換的數(shù)字圣從0FFH改為00H,則輸出脈沖的極性改變(0V~-5V),從而也就改變了電機(jī)的轉(zhuǎn)向。
例3按圖8031與DAC0832的接口編寫程序,在運(yùn)算放大器輸出端輸出一個(gè)三角波電壓。
DAC0832單緩沖方式接口電路:
ORG 1000H
MOV DPTR,#7FFFH;指向0832
MOV R2,#0FFH;循環(huán)次數(shù)
MOV A,#00H;賦初值
LOOP1:MOVX @DPTR,A;D/A轉(zhuǎn)換輸出
INC A
DJNZ R2,LOOP1
MOV R2,#0FEH
LOOP2:DEC A
MOVX GDPTR,A
DJNZ R2,LOOP2
ALMP LOOP1
END
·雙緩沖方式連接
所謂雙緩沖方式,就是把DAC0832的輸入寄存器和DAC寄存器都接成受控鎖存方式。雙緩沖方式DAC0832的連接如圖9.10所示。
應(yīng)用場合:對于多路D/A轉(zhuǎn)換接口,要求同步進(jìn)行D/A轉(zhuǎn)換輸出時(shí),必須采用雙緩沖器同步方式接法。
0832采用這種接法時(shí),數(shù)字量的輸人鎖存和D/A轉(zhuǎn)換輸出是分兩步完成的,即CPU的數(shù)據(jù)總線分時(shí)地向各路D/A轉(zhuǎn)換器輸入要轉(zhuǎn)換的數(shù)字量并鎖存在各自的輸入寄存器中,然后CPU對所有的D/A轉(zhuǎn)換器發(fā)出控制信號,使各個(gè)D/A轉(zhuǎn)換器輸入寄存器中的數(shù)據(jù)送人DAC寄存器,實(shí)現(xiàn)同步轉(zhuǎn)換輸出。
應(yīng)用舉例:下圖是一個(gè)兩路同步輸出的D/A轉(zhuǎn)換接口電路。
P2.5和P2.6分別選擇兩路D/A轉(zhuǎn)換器的輸人寄存器,控制輸人鎖存;P2.7連到兩路D/A轉(zhuǎn)換器的/XFER端控制同步轉(zhuǎn)換輸出;8031的/WR端與所有的/WR1和/WR2端相連。執(zhí)行下面8條指令就能完成D/A的同步轉(zhuǎn)換輸出。
MOV DPTR,#0DFFFH;指向0832 (1)
MOV A,#data11;datal送人0832 (1)中鎖存
MOVX @DPTR,A
MOV DPTR,#0BFFFH;指向0832 (2)
MOV A,data2;data2送人0832 (2)中鎖存
MOVX @DPTR,A
MOV DPTR,#7FFFH;給0832(1)、0832(2)提供信號,同時(shí)完成D/A轉(zhuǎn)換輸出
MOVX @DPTR,A
第七章 單片機(jī)控制系統(tǒng)抗干擾技術(shù)
本章將從干擾源的來源、硬件、軟件以及電源系統(tǒng)各方面研究分析并給出有效可行的解決辦法。
第一節(jié) 干擾的來源及分析
一、 主要的干擾源
影響正常工作的信號稱為噪聲,又稱干擾。
舉例:在單片機(jī)控制系統(tǒng)中,出現(xiàn)了干擾,就會影響指令的正常執(zhí)行,造成控制事故或控制失靈;在測量通道中產(chǎn)生了干擾,就會使測量產(chǎn)生誤差,計(jì)數(shù)器收到干擾有可能亂記數(shù),造成記數(shù)不準(zhǔn),電壓的沖擊有可能使系統(tǒng)遭到致命的破壞。
凡是能產(chǎn)生一定能量,可以影響到周圍電路正常工作的媒體都可認(rèn)為是干擾源。干擾有的來自外部,有的來自內(nèi)部。一般來說,干擾源可分為以下三類:
①自然界的宇宙射線,太陽黑子活動,大氣污染及雷電因素造成的;
②物質(zhì)固有的,即電子元器件本身的熱噪聲和散粒噪聲;
③人為造成的,主要是由電氣和電子設(shè)備引起。
舉例:在系統(tǒng)工作的環(huán)境中廣泛存在,包括動力電網(wǎng)的電暈量放電、絕緣不良的弧光放電、交流接觸器、開關(guān)電感負(fù)載的繼電器接點(diǎn)引起的電火花,照明燈管所引起的放電、變壓器、電焊機(jī)、吊車,大功率設(shè)備啟動浪涌,可控硅開關(guān)造成的瞬間尖峰,都會對電網(wǎng)產(chǎn)生影響。另外像大功率廣播、電視、通訊、雷達(dá)、導(dǎo)航、高頻設(shè)備以及大功率設(shè)備所發(fā)出的空間電磁干擾。系統(tǒng)本身電路的過渡過程,電路在狀態(tài)轉(zhuǎn)換時(shí)引起的尖峰電流,電感或電容所產(chǎn)生的瞬間電壓和瞬變電流也會對系統(tǒng)工作產(chǎn)生千擾。另外,印制電路板布局不合理、布線不周到、排列不合理、粗細(xì)不合理,使電路板自身產(chǎn)生相互影響,系統(tǒng)安裝布線不合理,強(qiáng)弱電走線不能分開,造成相互干擾。
二、 噪聲干擾產(chǎn)生的原因
①電路性干擾。電路性干擾是由于兩個(gè)回路經(jīng)公共阻抗耦合而產(chǎn)生的,干擾量是電流。
②電容性干擾。電容性干擾是由于干擾源與干擾對象之間存在著變化的電場,從而造成了干擾影響,干擾量是電壓。
③電感性干擾。電感性干擾是由于干擾源的交變磁場在干擾對象中產(chǎn)生了干擾感應(yīng)電壓。而產(chǎn)生感應(yīng)電壓的原因則是由于在干擾源中存在著變化電流。
④波干擾。波干擾是傳導(dǎo)電磁波或空間電磁波所引起的。空間電磁波的干擾量是電場強(qiáng)度和磁場強(qiáng)度。傳導(dǎo)波的干擾量是傳導(dǎo)電流和傳導(dǎo)電壓。
三、 干擾竄入系統(tǒng)的渠道
環(huán)境對單片機(jī)控制系統(tǒng)的干擾一般都是以脈沖的形式進(jìn)人系統(tǒng)的,干擾竄入系統(tǒng)的渠道主要有三條,如圖7-1所示。
由圖中可見,空間干擾(場干擾)是通過電磁波輻射入系統(tǒng);過程通道干擾是通過和主機(jī)系統(tǒng)相連接的輸入通道、輸出通道及與其他主機(jī)系統(tǒng)相連的通信通道進(jìn)入單片機(jī)系統(tǒng)的;供電系統(tǒng)干擾,主要通過供電系統(tǒng)的直流電源線路或地線進(jìn)人系統(tǒng)。一般情況下,空間干擾在強(qiáng)度上遠(yuǎn)小于其他兩個(gè)渠道進(jìn)人系統(tǒng)的干擾,而且空間干擾可用良好的屏蔽與正確的接地,或采用高頻濾波器加以解決。因此抗干擾的重點(diǎn)應(yīng)放在供電系統(tǒng)和過程通道的干擾。
第二節(jié) 硬件抗干擾技術(shù)
一、選用可靠的元器件
一般情況下,元器件在出廠前都進(jìn)行了測試。在通常應(yīng)用時(shí),不再進(jìn)行測試,而直接將元器件用于電路中進(jìn)行通電運(yùn)行考驗(yàn)。在考驗(yàn)中發(fā)現(xiàn)問題,直接替換不合格芯片或器件。
按著一般的經(jīng)驗(yàn),如芯片在通電使用一個(gè)月左右而不產(chǎn)生損壞,就可以認(rèn)為比較穩(wěn)定。但在購買時(shí),最好到較正規(guī)的大公司或商店購買元器件,一般都能保證元器件本身質(zhì)量的可靠。
二、接插件的選擇應(yīng)用
單片機(jī)控制系統(tǒng)通?捎蓭讐K印制電路板組成,各板之間以及各板與基準(zhǔn)電源之間經(jīng)常選用接插件相聯(lián)系。在接插件的插針之間也易造成干擾,這些干擾與接插件插針之間的距離以及插針與地線之間的距離都有關(guān)系。在設(shè)計(jì)選用時(shí)要注意以下幾個(gè)問題。
1.合理地設(shè)置插接件
如電源插接件與信號插接件要盡量遠(yuǎn)離,主要信號的接插件外面最好帶有屏蔽。
2.插頭座上要增加接地針數(shù)
在安排插針信號時(shí),用一部分插針為接地針,均勻分布于各信號針之間,起到隔離作用,以減小針間信號互相干擾。最好每一信號針兩側(cè)都是接地針,使信號與接地針理想的比例為1:1。
3.信號針盡量分散配置,增大彼此之間的距離。
4. 設(shè)計(jì)時(shí)考慮信號的翻轉(zhuǎn)時(shí)差,把不同時(shí)刻翻轉(zhuǎn)的插針放在一起。同時(shí)翻轉(zhuǎn)的針盡量離開,因信號同時(shí)翻轉(zhuǎn)會使干擾疊加。
三、印制電路板抗干擾設(shè)計(jì)技術(shù)
印制電路板是器件、信號線、電源線的高密度集合體,布線和布局好壞對可靠性影響很大。
1.印制電路總體布局原則
①印制電路板大小要適中,板面過大印制線路太長,阻抗增加,成本偏高;板子太小,板間相互連線增加,易增加干擾環(huán)境。
②印制板元件布局時(shí)相關(guān)元件盡量靠近。如晶振、時(shí)鐘發(fā)生器及CPU時(shí)鐘輸入端相互靠近,大電流電路要遠(yuǎn)離主板,或另做一塊板。
③考慮電路板在機(jī)箱內(nèi)的位置,發(fā)熱大的元器件放置在易通風(fēng)散熱的位置。
2.電源線和地線與數(shù)據(jù)線傳輸方向一致,有助于增強(qiáng)抗干擾能力。接地線可環(huán)繞印制板一周安排,盡可能就近接地。
3.地線盡量加寬,數(shù)字地、模擬地要分開,根據(jù)實(shí)際情況考慮一點(diǎn)或多點(diǎn)接地。
4.配置必要的去耦電容
①電源進(jìn)線端跨接100up以上的電解電容以吸收電源進(jìn)線引入的脈沖干擾。
②原則上每個(gè)集成電路芯片都配置一個(gè)0.01up的瓷片電容或聚乙烯電容,可吸收高頻干擾。
③電容引線不能太長,高頻旁路電容不能帶引線。
四、執(zhí)行機(jī)構(gòu)抗干擾技術(shù)
在單片機(jī)控制系統(tǒng)輸出回路中,存在著執(zhí)行開關(guān)、線圈等回饋干擾。特別是感性負(fù)載,電機(jī)電樞的反電動勢會損壞電子器件,甚至?xí)茐挠?jì)算機(jī)系統(tǒng)或擾亂程序系統(tǒng),為防止由于電感負(fù)載的瞬間通、斷造成的干擾,常采用以下措施:
1.觸點(diǎn)兩端并聯(lián)阻容吸收電路,控制觸點(diǎn)間放電,如圖7-2(a)所示。
2.電感負(fù)載兩端并聯(lián)反向二極管,形成反電動勢放電回路,保護(hù)設(shè)備。如圖7-2(b)所示,在繼電器線圈兩端并接二極管。當(dāng)開關(guān)斷開時(shí),感應(yīng)電動勢通過二極管放電,防止擊穿電源及開關(guān)。
第三節(jié) 軟件抗干擾技術(shù)
一、設(shè)置軟件陷阱
由于系統(tǒng)干擾可能破壞程序指針PC,PC一旦失控,使程序“亂飛”可能進(jìn)人非程序區(qū),造成系統(tǒng)運(yùn)行的一系列錯(cuò)誤。設(shè)置軟件陷阱,可防止程序“亂飛”。
方法:在ROM或RAM中,每隔一些指令(十幾條即可),就把連續(xù)幾個(gè)單元設(shè)置成空操作(所謂陷阱)。當(dāng)失控的程序掉入“陷阱”,也就是連續(xù)執(zhí)行幾個(gè)空操作后,程序自動恢復(fù)正常,繼續(xù)執(zhí)行后面的程序,也可以在程序芯片沒有被程序指令字節(jié)使用的部分全部置成空操作指令代碼,在最后使用跳轉(zhuǎn)指令,一般跳到程序開頭。一旦程序飛出到非程序區(qū),執(zhí)行空操作之后,最后跳回到程序初始化,重新執(zhí)行程序;蚋粢欢问褂靡粭l跳轉(zhuǎn)到程序開頭的指令。
二、增加程序監(jiān)視系統(tǒng)(Watchdog )
利用設(shè)置軟件陷阱的辦法雖在一定程度上解決了程序“飛出”失控問題,但不能有效地解決死循環(huán)問題。
設(shè)置程序監(jiān)視器(Watchdog看門狗)可比較有效地解決死循環(huán)問題。程序監(jiān)視器系統(tǒng)有的采用軟件解決,大部分都是采用軟硬件相結(jié)合的辦法。下面以兩種解決辦法來分析其結(jié)構(gòu)原理。
1、利用單片機(jī)內(nèi)部定時(shí)器進(jìn)行監(jiān)視
方法:在程序一開始就啟動定時(shí)器工作,在主程序中增設(shè)定時(shí)器賦值指令,使該定時(shí)器維持在非溢出工作狀態(tài)。定時(shí)時(shí)間要稍大于程序一次循環(huán)的執(zhí)行時(shí)間。程序正常循環(huán)執(zhí)行一次給定時(shí)器送一次初值,使其不能溢出。但若程序失控,定時(shí)器則計(jì)滿溢出中斷,在中斷服務(wù)程序中使主程序自動復(fù)位又進(jìn)入初始狀態(tài)。
例8051單片機(jī)若晶振頻率使用6MHz,選定時(shí)器T0定時(shí)監(jiān)視程序。程序如下:
ORG 0000H
START:AJMP .MAIN
ORG 000BH
AJMP START
MAIN:SETB EA
SETB IE0
SETB TR0
MOV TMOD,#01H
MAIN1:MOV TH0,datal
MOV TL0,datal
LJMP MAIN
2、利用單穩(wěn)觸發(fā)器構(gòu)成程序監(jiān)視器
方法:利用軟件經(jīng)常訪問單穩(wěn)電路,一旦程序有問題,CPU不能照常訪問,單穩(wěn)電路則產(chǎn)生翻轉(zhuǎn)脈沖使單片機(jī)復(fù)位,程序重新開始執(zhí)行。
三、軟件冗余技術(shù)
軟件冗余技術(shù),就是多次使用同一功能的軟件指令,以保證指令執(zhí)行的可靠性,這從以下幾個(gè)方面考慮。
1.采取多次讀入法,確保開關(guān)量輸人正確無誤
重要的輸人信息利用軟件多次讀入,比較幾次結(jié)果一致后再讓其參與運(yùn)算。對于按鈕和開關(guān)狀態(tài)讀入時(shí),要配合軟件延時(shí)可消除抖動和誤動作。
2.不斷查詢輸出狀態(tài)寄存器,及時(shí)糾正輸出狀態(tài)
設(shè)置輸出狀態(tài)寄存器,利用軟件不斷查詢,當(dāng)發(fā)現(xiàn)和輸出的正確狀態(tài)不一致時(shí),及時(shí)糾正,防止由于干擾引起的輸出量變化導(dǎo)致設(shè)備誤動作。
3.對于條件控制系統(tǒng),把對控制條件的一次采樣、處理控制輸出改為循環(huán)地采樣、處理輸出。這種方法對于慣性較大的控制系統(tǒng)具有良好的抗偶然干擾作用。
4.為防止計(jì)算錯(cuò)誤,可采用兩組計(jì)算程序,分別計(jì)算,然后將兩組計(jì)算結(jié)果進(jìn)行比較,如兩次計(jì)算結(jié)果相同,則將結(jié)果送出。如出現(xiàn)誤差,則再進(jìn)行一次運(yùn)算,重新比較,直到結(jié)果相同。
四、軟件可靠性設(shè)計(jì)
1、利用軟件提高系統(tǒng)抗干擾能力
在軟件設(shè)計(jì)時(shí)采用如下措施,對提高系統(tǒng)抗干擾能力是積極有力的。
①增加系統(tǒng)信息管理軟件。它與硬件相配合,對系統(tǒng)信息進(jìn)行保護(hù)。其中包括防止信息被破壞,出故障時(shí)保護(hù)信息,故障排除之后恢復(fù)信息等。
②防止信息的輸人輸出過程中出錯(cuò)。如對關(guān)鍵數(shù)據(jù)采用多種校驗(yàn)方式,對信息采用重復(fù)傳送校驗(yàn)技術(shù),從而保證信息的正確無誤。
③編制診斷程序,及時(shí)發(fā)現(xiàn)故障,找出故障位置,以便及時(shí)檢修或啟用冗余軟件。
④用軟件進(jìn)行系統(tǒng)調(diào)度,包括出現(xiàn)故障時(shí)保護(hù)現(xiàn)場,迅速將故障裝置切換成備用裝置,在環(huán)境條件發(fā)生變化時(shí),采取應(yīng)急措施,故障排除后,迅速恢復(fù)系統(tǒng),繼續(xù)投人運(yùn)行等。
2、提高軟件自身的可靠性
1).程序分段和采用層次結(jié)構(gòu)
在進(jìn)行程序設(shè)計(jì)時(shí),將程序分成若干個(gè)具有獨(dú)立功能的子程序塊。各個(gè)程序塊可以
單獨(dú)使用,也可與其他程序塊一起使用。各程序塊之間可通過一固定的通信區(qū)和一些指
定的單元進(jìn)行信息傳遞。每個(gè)程序塊都可單獨(dú)進(jìn)行調(diào)整和修改而不影響其他程序塊。
2).采用可測試性設(shè)計(jì)
軟件在編制過程中會出現(xiàn)一些錯(cuò)誤。為便于查出程序錯(cuò)誤,提高軟件開發(fā)效率,可采用以下三種方法:一是明確軟件規(guī)格,使測試易于進(jìn)行;二是將測試設(shè)計(jì)的程序段作為軟件開發(fā)的一部分;三是把程序結(jié)構(gòu)本身組成便于測試的形式。
3).對軟件進(jìn)行測試
測試軟件的基本方法是,給軟件一個(gè)典型的輸入,觀測輸出是否符合要求。發(fā)現(xiàn)錯(cuò)誤進(jìn)行修改,直至消除錯(cuò)誤,達(dá)到設(shè)計(jì)要求。
測試軟件可按下述步驟進(jìn)行:
①單元測試,即對每個(gè)程序塊單獨(dú)進(jìn)行測試;
②局部或系統(tǒng)測試,即對多個(gè)程序塊組成的局部或系統(tǒng)程序進(jìn)行測試,以發(fā)現(xiàn)塊間連接錯(cuò)誤;
③系統(tǒng)功能測試,按功能對軟件進(jìn)行測試,如控制功能、顯示功能、通信功能、管理功能、報(bào)瞥功能等;
④現(xiàn)場測試,即硬件安裝調(diào)試后將軟件進(jìn)行安裝測試,以便對整個(gè)控制系統(tǒng)的功能及性能作出評價(jià)。
五、軟件自診斷技術(shù)
軟件診斷技術(shù)主要從兩個(gè)方面進(jìn)行考慮,一方面是對系統(tǒng)硬件和過程通道的自診斷,另一方面是對過程軟件本身進(jìn)行診斷和故障排除。
1、對硬件系統(tǒng)進(jìn)行診斷
對硬件系統(tǒng)診斷包含兩個(gè)方面內(nèi)容:一是確定硬件電路是否存在故障,這叫故障測試;二是指出故障的確切位置,給維護(hù)以操作指導(dǎo),這叫故障定位。
單片機(jī)控制系統(tǒng)有的配備有系統(tǒng)測試程序,在系統(tǒng)上電時(shí),首先對系統(tǒng)的主要部件以及外設(shè)I/0端口進(jìn)行測試,以確認(rèn)系統(tǒng)硬件工作是否正常。對接口故障的測試,主要是檢測接口中元器件的故障,這就要求在進(jìn)行接口電路設(shè)計(jì)時(shí)要考慮以下因素:
①在接口設(shè)計(jì)時(shí),除考慮接口的功能外,要考慮提供檢測的寄存器或緩沖器,以便檢測使用;
②可將接口劃分成若干個(gè)檢測區(qū),在每一檢測區(qū)將檢測點(diǎn)逐一編號,進(jìn)行測試;
③可將測試點(diǎn)按順序編制成故障字典,以便按測試結(jié)果給出故障部位,進(jìn)行故障定
位。
2、軟件運(yùn)行自診斷
設(shè)置陷阱、使用程序監(jiān)視器、時(shí)間冗余方法
時(shí)間冗余方法是通過消耗時(shí)間資源達(dá)到糾錯(cuò)的目的。時(shí)間冗余方法通常采用指令復(fù)執(zhí)和程序卷回兩種途徑來實(shí)現(xiàn)。
1)指令復(fù)執(zhí)技術(shù)
所謂復(fù)執(zhí),就是程序中的每條指令都是一個(gè)重新啟動點(diǎn),一旦發(fā)現(xiàn)錯(cuò)誤,就重新執(zhí)行被錯(cuò)誤破壞的現(xiàn)行指令,指令復(fù)執(zhí)既可用編制程序來實(shí)現(xiàn),也可用硬件控制來實(shí)現(xiàn),基本的實(shí)現(xiàn)方法是:
①當(dāng)發(fā)現(xiàn)錯(cuò)誤時(shí),能準(zhǔn)確保留現(xiàn)行指令的地址,以便重新取出執(zhí)行;
②現(xiàn)實(shí)指令使用的數(shù)據(jù)必須保留,以便重新取出執(zhí)行時(shí)使用。
指令復(fù)執(zhí)的次數(shù)通常采用次數(shù)控制和時(shí)間控制兩種方式,如在規(guī)定的復(fù)執(zhí)次數(shù)或時(shí)間之內(nèi)故障沒有消失,稱之復(fù)執(zhí)失敗。
2)程序卷回技術(shù)
程序卷回不是某一條指令的重復(fù)執(zhí)行,而是一小段程序的重復(fù)執(zhí)行。為了實(shí)現(xiàn)卷回,也要保留現(xiàn)場。程序卷回的要點(diǎn)是:
①將程序分成一些小段,卷回時(shí)也要卷回一小段,不是卷回到程序起點(diǎn);
②在第n段之末,將當(dāng)時(shí)各寄存器、程序計(jì)數(shù)器及其他有關(guān)內(nèi)容移人內(nèi)存,并將內(nèi)存中被第n段所更改的單元又在內(nèi)存中另開辟一塊區(qū)域保存起來。如在第(n+1)段中不出問題,則將第(n+1)段現(xiàn)場存檔,并撤消第二段所存內(nèi)容;
③如在第(n+1)段出現(xiàn)錯(cuò)誤,就把第n段的現(xiàn)場送給機(jī)器的有關(guān)部分,然后從第(n+1)段起點(diǎn)開始重復(fù)執(zhí)行第(n十1)段程序。
第四節(jié) 供電系統(tǒng)抗干擾技術(shù)
供電系統(tǒng)干擾分為:
① 過壓、欠壓、停電 使用各種穩(wěn)壓器和不間斷電源UPS
② 浪涌、下陷、降出 快速響應(yīng)的交流電壓調(diào)壓器
③ 尖峰電壓 使用具有噪聲抑制能力的交流穩(wěn)壓器或隔離變壓器
④ 射頻干擾 低通濾波器
一、建議的供電解決方案
為了防止電源系統(tǒng)竄人干擾,影響單片機(jī)控制系統(tǒng)的正常工作,可采用如圖7-5所示的供電配置。
如圖7-5所示,整個(gè)供電系統(tǒng)從以下幾個(gè)方面考慮。
①交流進(jìn)線端加交流濾波器,可濾掉高頻干擾,如電網(wǎng)上大功率設(shè)備啟停造成的瞬間干擾。濾波器市場上的成品有一級、二級濾波之分,安裝時(shí)外殼要加屏蔽并使其良好接地,進(jìn)出線要分開,防止感應(yīng)和輻射耦合。低通濾波器僅允許50Hz交流通過,對高頻和
中頻干擾有很好的衰減作用。
②要求高的系統(tǒng)加交流穩(wěn)壓器。
③采用具有靜電屏蔽和抗電磁干擾的隔離電源變壓器。
④采用集成穩(wěn)壓塊兩級穩(wěn)壓。
⑤主電路板采取獨(dú)立供電,其余部分分散供電,避免一處電源有故障引起整個(gè)系統(tǒng)顛覆。
⑥直流輸出部分采用大容量電解電容進(jìn)行平滑濾波。
⑦線間對地增加小電容濾波消除高頻干擾。
⑧交流電源線與其他線盡量分開,減少再度耦合干擾。
⑨盡量提高接口器件的電源電壓,提高接口的抗干擾能力。
第五節(jié) 接地系統(tǒng)抗干擾技術(shù)
在設(shè)計(jì)時(shí),若能將接地和屏蔽正確地結(jié)合起來使用,可以解決大部分干擾引起的故障。接地問題包括兩個(gè)方面的內(nèi)容:一個(gè)是接地點(diǎn)是否正確;另一個(gè)是接地點(diǎn)是否牢固。接地點(diǎn)選擇正確可防止系統(tǒng)各部分的串?dāng)_,接地點(diǎn)牢固可使接地點(diǎn)處于零阻抗,從而降低了接地電位,防止了接地系統(tǒng)的共模干擾。
一、系統(tǒng)地線分類
兩大類:
保護(hù)接地主要是為了避免工作人員因設(shè)備絕緣損壞或性能下降時(shí)遭受觸電危險(xiǎn)和保證設(shè)備的安全
工作接地主要是保證控制系統(tǒng)穩(wěn)定可靠的運(yùn)行,防止地環(huán)路引起的干擾。
在單片機(jī)控制系統(tǒng)中,地線大致分為以下幾類:
① 數(shù)字地也叫邏輯地,它是數(shù)字電路的零電位;
② 模擬地它是放大器、采樣保持器以及A/D轉(zhuǎn)換器和比較器等的零電位;
③功率地即大電流網(wǎng)絡(luò)元件、功放器件的零電位;
④信號地即傳感器件的地電平;卜
⑤交流地指交流50Hz電源的零線;
⑥直流地指直流電源的地線;
⑦屏蔽地一般同機(jī)殼相聯(lián),為防止靜電感應(yīng)和磁場感應(yīng)而設(shè)置的,常和大地相接。
二、不同地線的處理原則
1.一點(diǎn)接地和多點(diǎn)接地
在低頻(小于1MHz)電路中,布線和元件之間的電感不會產(chǎn)生太大影響,常采用一點(diǎn)接地。
在高頻(高于10MHz)電路中,寄生電容和電感影響較大,易采用多點(diǎn)接地。
2. 數(shù)字地和模擬地必須分開。
3.交流地與信號地不要共用。
4.浮地和接地
系統(tǒng)浮地,是將系統(tǒng)電路的各個(gè)部分地線浮置起來,不與大地相聯(lián)。通常采用系統(tǒng)浮地,機(jī)殼接地,可使抗干擾能力強(qiáng),安全可靠。
5.印制電路板地線布線
其如下所示:
①TTL、CMOS器件的地線要呈輻射網(wǎng)狀,其他地線不要形成環(huán)路;
②地線盡量加寬,最好不要小于3mm;
③旁路電容地線不要太長;
④大規(guī)模集成電路最好跨越平行的地線和電源線,以消除干擾。
6.傳感器信號地
由于傳感器和機(jī)殼之間易引起共模干擾,為提高抗共模干擾能力,一般A/D轉(zhuǎn)換器的模擬地采用浮空隔離,并可采用三線采樣雙層屏蔽浮地技術(shù),就是將地線和信號線一起采樣,可有效地抑制共模干擾。
第六節(jié) 輸入輸出通道抗干擾技術(shù)
一、開關(guān)信號的抗干擾技術(shù)、
1、開關(guān)量的電平轉(zhuǎn)換
提高開關(guān)量電平進(jìn)行開關(guān)信號傳輸,可以降低電磁干擾,而輸人到單片機(jī)中的電平都是TTL電平,因此存在一個(gè)電平轉(zhuǎn)換問題。可采用如圖7-9所示的電路。若提高開關(guān)量輸出的電平可參考圖7-10所示的電路。
二、采用隔離技術(shù)
① 對啟停負(fù)荷不大、響應(yīng)速度不太高的設(shè)備,一般采用繼電器隔離比用光電隔離更直接。繼電器能直接控制動力電路,而驅(qū)動繼電器的集成電路要用集電極開路的集成電路(OC門),并在繼電器線圈兩端加續(xù)流二極管,以保證驅(qū)動電路正常工作,如圖7-11所示。
② 在交流啟停負(fù)荷較大時(shí),大負(fù)荷觸點(diǎn)在接通或斷開時(shí),所產(chǎn)生的火花和電弧具有十分強(qiáng)烈的干擾作用,可采用如圖7-12所示的電路,用兩個(gè)對接的可控硅代替交流接觸器,它們的控制極由小繼電器的一個(gè)觸點(diǎn)控制,觸點(diǎn)接通,兩個(gè)可控硅輪流導(dǎo)通,觸點(diǎn)斷開,兩個(gè)可控硅完全關(guān)斷。固態(tài)繼電器也就是將對接的可控硅封裝在一個(gè)模塊中的器件。
③ 快速直流負(fù)載的光耦合驅(qū)動。如圖7-13所示。
④ 快速驅(qū)動交流負(fù)載的光電耦合驅(qū)動。如圖7-14所示。
二、模擬通道的抗干擾技術(shù)
1 、硬件措施
1)模擬量輸人回路
加入RC濾波器,以減小工頻干擾信號對輸入信號的影響,如圖7-15所示。
2)光電耦合器隔離
在模擬通道使用光電耦合器要按照如圖7-16的安排設(shè)計(jì)。
3)適當(dāng)選用A/D芯片
在干擾嚴(yán)重的場合,可選用雙積分式A/D轉(zhuǎn)換器。要求轉(zhuǎn)換速度快的場合,要選用逐次逼近方式的轉(zhuǎn)換器。
2 、軟件措施
用軟件對輸入量的濾波處理是消除低頻干擾的重要措施,常用的濾波算法有以下幾
種:
1)限幅濾波
規(guī)定在相鄰兩次采樣信號之間的差值不得超過一個(gè)固定數(shù)值。
2)中值濾波
每獲得一個(gè)采樣數(shù)據(jù)時(shí)連續(xù)采樣三次,找出三個(gè)采樣值中的一個(gè)居中的值作為本次采樣值。
3)算術(shù)平均值濾波
連續(xù)記錄幾次采樣值,求其平均值作為本次采樣值。
4)五中取三平均值濾波
該辦法是若得到一個(gè)采樣值,要連續(xù)采樣五次,然后按大小順序排列,去掉一個(gè)最大的,去掉一個(gè)最小的,取其中間三個(gè)數(shù)求其平均值。
5)一階慣性濾波
對于低頻干擾信號,可用此濾波模擬RC濾波,來消除干擾。
三、長線傳輸?shù)目垢蓴_技術(shù)
1 、雙絞線傳輸
在數(shù)字信號傳輸過程中,根據(jù)傳送距離的不同,雙絞線使用方法也有所不同,如圖7-17所示。
當(dāng)傳送距離在5m以下時(shí),發(fā)送和接收端連接負(fù)載電阻。若發(fā)送側(cè)為集電極開路驅(qū)動,則接收側(cè)的集成電路用施密特型電路,抗干擾能力更強(qiáng)。
當(dāng)用雙絞線作遠(yuǎn)距離傳送數(shù)據(jù)時(shí),或有較大噪聲干擾時(shí),可使用平衡輸出的驅(qū)動器和平衡輸入的接收器。發(fā)送和接收信號端都要接匹配電阻,如圖7-17(b)、(c)所示。
用雙絞線傳輸與, 光電耦合器聯(lián)合使用時(shí),可按圖7-18所示的方式連接。圖中(a)是集電極開路驅(qū)動器與光電耦合器的一般情況。(b)是開關(guān)接點(diǎn)通過雙絞線與光電耦合器連接的情況。如在光電耦合器的光敏晶體管的基極上接有電容及電阻,且后面連接施密特集成電路驅(qū)動器,則會大大加強(qiáng)抗噪聲能力,如圖中所示。
二、長線傳輸?shù)淖杩蛊ヅ?/strong>
長線傳輸時(shí)如匹配不好,會使信號產(chǎn)生反射,從而形成嚴(yán)重的失真。為了對傳輸線進(jìn)行阻抗匹配,必須估算出其特性阻抗Rpo利用示波器觀察的方法可以大致測定傳輸線特性阻抗的大小,測試方法如圖7-19所示。調(diào)節(jié)可變電阻R,當(dāng)R與特性阻抗Rp相匹配時(shí),用示波器測量A門輸出波形畸變最小,反射波幾乎消失,這時(shí)R值可認(rèn)為是該傳輸線的特性阻抗Rp。
傳輸線阻抗的匹配有以下四種形式:
1 .終端并聯(lián)匹配
如圖7-20所示,終端匹配電阻Rl、R2的值,按Rp=RI/R2的要求選取。一般Rl為220-330Ω,而R2可在270-390Ω范圍內(nèi)選取。此種方法由于終端阻值偏低,相當(dāng)于負(fù)載加重,使高電平有所下降,使高電平抗干擾能力有所下降。
2 .始端串聯(lián)匹配
如圖7-21所示,匹配電阻R的取值為Rp與A門輸出低電平時(shí)輸出阻抗Rsc(約20Ω)之差值。此方法會使終端低電平抬高,相當(dāng)于增加了輸出阻抗,降低了低電平的抗干擾能力。
3 .終端并聯(lián)隔直匹配
如圖7-22所示,因電容C在較大時(shí)起隔直作用,并不影響匹配。所以只要求匹配電阻R與Rp相等即可。它不會引起輸出低電平的降低,增加了高電平的抗干擾能力。
4 .終端鉗位二極管匹配
如圖7-23所示,利用二極管D把B門輸人端低電平鉗位在0.3V以下,可以減少波的反射和振蕩,可提高動態(tài)抗干擾能力。
三、長線電流傳輸
用電流傳輸代替電壓傳輸,可獲得較好的抗干擾能力。如圖7-24所示,從電流轉(zhuǎn)換器輸出0-10mA(或4-20mA)電流,在接收端并上500Ω(或lkΩ)的精密電阻,將此電流轉(zhuǎn)換為0-5V(或1-5V)的電壓,然后送人A/D轉(zhuǎn)換器。在有的實(shí)用電路里輸出端采用光電耦合器輸出驅(qū)動,也會獲得同樣的效果。此種方法可減少在傳輸過程中的干擾,提高傳輸?shù)目煽啃浴?/p>