單片機(jī)的C語(yǔ)言應(yīng)用程序設(shè)計(jì)的知識(shí)_第1頁(yè)
單片機(jī)的C語(yǔ)言應(yīng)用程序設(shè)計(jì)的知識(shí)_第2頁(yè)
單片機(jī)的C語(yǔ)言應(yīng)用程序設(shè)計(jì)的知識(shí)_第3頁(yè)
單片機(jī)的C語(yǔ)言應(yīng)用程序設(shè)計(jì)的知識(shí)_第4頁(yè)
單片機(jī)的C語(yǔ)言應(yīng)用程序設(shè)計(jì)的知識(shí)_第5頁(yè)
已閱讀5頁(yè),還剩97頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、1專(zhuān)題1:?jiǎn)纹瑱C(jī)的C語(yǔ)言應(yīng)用程序設(shè)計(jì) 1.1 C51特點(diǎn)1.2 C51數(shù)據(jù)類(lèi)型1.3 C51數(shù)據(jù)的存儲(chǔ)類(lèi)型與MCS-51存儲(chǔ)結(jié)構(gòu)1.4 特殊功能寄存器(SFR)的C51定義1.5 位變量的C51定義1.6 MCS-51并行接口的C51定義1.7 MCS-51 C語(yǔ)言編程實(shí)例21.1 C51特點(diǎn)用匯編程序設(shè)計(jì)MCS51系列單片機(jī)應(yīng)用程序時(shí),必須要考慮其存儲(chǔ)器結(jié)構(gòu),尤其必須考慮其片內(nèi)數(shù)據(jù)存儲(chǔ)器與特殊功能寄存器正確、合理的使用以及按實(shí)際地址處理端口數(shù)據(jù)。使用匯編語(yǔ)言會(huì)遇到很多問(wèn)題,首先它的可讀性和可維護(hù)性不強(qiáng),特別是當(dāng)程序沒(méi)有很好標(biāo)注的時(shí)候,其次就是代碼的可重用性也比較低。使用C語(yǔ)言就可以很好地解決

2、這些問(wèn)題。用C語(yǔ)言編寫(xiě)單片機(jī)應(yīng)用程序與編寫(xiě)標(biāo)準(zhǔn)的C語(yǔ)言程序的不同之處就在于根據(jù)單片機(jī)存儲(chǔ)結(jié)構(gòu)及內(nèi)部資源定義相應(yīng)的C語(yǔ)言中的數(shù)據(jù)類(lèi)型和變量,其它的語(yǔ)法規(guī)定、程序結(jié)構(gòu)及程序設(shè)計(jì)方法都與標(biāo)準(zhǔn)的C語(yǔ)言程序設(shè)計(jì)相同。3使用C語(yǔ)言與使用匯編語(yǔ)言相比具有如下優(yōu)點(diǎn):(1) 不需要了解處理器的指令集,也不必了解存儲(chǔ)器結(jié)構(gòu)。(2) 寄存器分配和尋址方式由編譯器進(jìn)行管理,編程時(shí)不需要考慮存儲(chǔ)器的尋址和數(shù)據(jù)類(lèi)型等細(xì)節(jié)。(3) 指定操作的變量選擇組合提高了程序的可讀性。(4) 可使用與人的思維更接近的關(guān)鍵字和操作函數(shù)。(5) 與使用匯編語(yǔ)言編程相比,程序的開(kāi)發(fā)和調(diào)試時(shí)間大大縮短。4(6) C語(yǔ)言中的庫(kù)文件提供許多標(biāo)準(zhǔn)的

3、例程,例如格式化輸出、數(shù)據(jù)轉(zhuǎn)換和浮點(diǎn)運(yùn)算等。(7) 通過(guò)C語(yǔ)言可實(shí)現(xiàn)模塊化編程技術(shù),從而可將已編制好的程序加入到新程序中。(8) C語(yǔ)言可移植性好且非常普及,C語(yǔ)言編譯器幾乎適用于所有的目標(biāo)系統(tǒng),已完成的軟件項(xiàng)目可以和容易地轉(zhuǎn)換到其他的處理器或環(huán)境中。用C語(yǔ)言編寫(xiě)MCS51單片機(jī)的應(yīng)用程序,雖然不像用匯編語(yǔ)言那樣具體地組織、分配存儲(chǔ)器資源和處理端口數(shù)據(jù),但在C語(yǔ)言編程中,對(duì)數(shù)據(jù)類(lèi)型與變量的定義,必須要與單片機(jī)的存儲(chǔ)結(jié)構(gòu)相關(guān)聯(lián),否則編譯器不能正確地映射定位。5C51特點(diǎn):與C語(yǔ)言基本語(yǔ)法相同,在特定的硬件結(jié)構(gòu)上有所擴(kuò)展,如關(guān)鍵字sbit、data、idata、pdata、xdata、code等。

4、C51具有標(biāo)準(zhǔn)C語(yǔ)言的所有標(biāo)準(zhǔn)數(shù)據(jù)類(lèi)型,還加入了特殊的數(shù)據(jù)類(lèi)型。 bit位變量值為0或1。 sbit從字節(jié)中聲明的位變量0或1。 sfr特殊功能寄存器,sfr字節(jié)地址為0255。 sfr16同上,只是sfr字節(jié)地址為065535。bit、sbit、sfr和sfr16數(shù)據(jù)類(lèi)型專(zhuān)門(mén)用于8051硬件和C51編譯器,并不是標(biāo)準(zhǔn)C語(yǔ)言的一部分,不能通過(guò)指針進(jìn)行訪(fǎng)問(wèn)。bit、sbit、sfrs和sfr16數(shù)據(jù)類(lèi)型用于訪(fǎng)問(wèn)8051的特殊功能寄存器。6用C語(yǔ)言編寫(xiě)的應(yīng)用程序必須經(jīng)單片機(jī)的C語(yǔ)言編譯器(簡(jiǎn)稱(chēng)C51),轉(zhuǎn)換生成單片機(jī)可執(zhí)行的代碼程序。支持MCS51系列單片機(jī)的C語(yǔ)言編譯器有很多種。如America

5、n Automation、Auocet、BSO/TASKING、DUNFIELD SHAREWARE、KEIL/Franklin等。其中KEIL/Franklin以它的代碼緊湊和使用方便等特點(diǎn)優(yōu)于其它編譯器。本章是針對(duì)這種編譯器介紹 MCS51單片機(jī)C語(yǔ)言程序設(shè)計(jì)。 71.2 C51數(shù)據(jù)類(lèi)型1.2.1 Franklin C51編譯器具體支持的數(shù)據(jù)類(lèi)型有:位型(bit)、無(wú)符號(hào)字符(unsigned char)、有符號(hào)字符(singed char)、無(wú)符號(hào)整型(unsigned int )、有符號(hào)整型(signed int )、無(wú)符號(hào)長(zhǎng)整型(unsigned long )、有符號(hào)長(zhǎng)整型(sign

6、ed long )、浮點(diǎn)型、指針類(lèi)型等。8Franklin C51的數(shù)據(jù)類(lèi)型數(shù)據(jù)類(lèi)型長(zhǎng)度(bit)長(zhǎng)度(byte)值域bit110,1unsigned char810255signed char81128127unsigned int 162065535signed int 1623276832767unsigned long32404294967295signed long 32421474836482147483647float 3241.176E383.40E+38(6位數(shù)字)double6481.176E383.40E+38(10位數(shù)字)一般指針243存儲(chǔ)空間06553591.2.2

7、C51數(shù)據(jù)在MCS-51中的存儲(chǔ)方式 位變量(bit):與MCS-51硬件特性操作有關(guān)的可以定義成位變量。位變量定位在MCS-51單片機(jī)片內(nèi)RAM的位尋址空間20H-2FH中。 字符變量(char):字符變量的長(zhǎng)度為1byte即8位。對(duì)于無(wú)符號(hào)變量(unsigned char)的值域范圍是0255。對(duì)于有符號(hào)字符變量(signed char),其最高位是符號(hào)標(biāo)志位(msb),1代表“負(fù)”,0代表“正”。有符號(hào)字符變量和無(wú)符號(hào)字符變量在表示0127的數(shù)值時(shí),含義一樣,都是00 x7F。進(jìn)行有符號(hào)字符變量乘除法運(yùn)算時(shí),C51編譯器會(huì)自動(dòng)地將相應(yīng)的庫(kù)函數(shù)調(diào)入程序中來(lái)進(jìn)行運(yùn)算。10 整型變量(int)

8、: 整型變量的長(zhǎng)度為16位。與8080和8086 CPU系列不同,MCS-51系列單片機(jī)將int型變量的高位字節(jié)數(shù)存放在低地址字節(jié)中,低位字節(jié)數(shù)存放在高地址字節(jié)中。有符號(hào)整型變量(signed int)也使用msb位作符號(hào)標(biāo)志位,并使用二進(jìn)制補(bǔ)碼表示數(shù)值。可直接使用幾種專(zhuān)用的機(jī)器指令來(lái)完成多字節(jié)的加、減、乘、除運(yùn)算。整型變量值0 x1234以圖1.1所示的方式存放在內(nèi)存中。11整型數(shù)的存儲(chǔ)結(jié)構(gòu) 0 x120 x34+0+1地址 0 x120 x340 x560 x78.+0+1+2+3地址 長(zhǎng)整型變量的存儲(chǔ)結(jié)構(gòu) 12 浮點(diǎn)型變量(float): 浮點(diǎn)型變量為32位,占4個(gè)字節(jié),許多復(fù)雜的數(shù)學(xué)表

9、達(dá)式都采用浮點(diǎn)變量數(shù)據(jù)類(lèi)型。 在編程時(shí),如果只強(qiáng)調(diào)運(yùn)算速度而不進(jìn)行負(fù)數(shù)運(yùn)算時(shí),最好采用無(wú)符號(hào)(unsigned)格式。 無(wú)符號(hào)字符類(lèi)型的使用:無(wú)論何時(shí),應(yīng)盡可能使用無(wú)符號(hào)字符變量,因?yàn)樗苤苯颖籑CS-51所接受。基于同樣的原因,也應(yīng)盡量使用位變量。有符號(hào)字符變量雖然也只占用一個(gè)字節(jié),但需要進(jìn)行額外的操作來(lái)進(jìn)行測(cè)試代碼的符號(hào)位。這無(wú)疑會(huì)降低代碼效率。13 可使用簡(jiǎn)化形式定義數(shù)據(jù)類(lèi)型。其方法是在源程序開(kāi)頭使用#define語(yǔ)句自定義簡(jiǎn)化的類(lèi)型標(biāo)識(shí)符。例如:#define uchar unsigned char #define uint unsigned int 這樣,在編程中,就可以用uchar

10、代替unsigned char,用uint代替unsigned int來(lái)定義變量。141.3 C51數(shù)據(jù)的存儲(chǔ)類(lèi)型與MCS-51存儲(chǔ)結(jié)構(gòu)C51存儲(chǔ)類(lèi)型與MCS-51存儲(chǔ)空間的對(duì)應(yīng)關(guān)系存儲(chǔ)類(lèi)型與存儲(chǔ)空間的對(duì)應(yīng)關(guān)系 data 直接尋址片內(nèi)數(shù)據(jù)存儲(chǔ)區(qū),訪(fǎng)問(wèn)速度快(128字節(jié)) bdata 可位尋址片內(nèi)數(shù)據(jù)存儲(chǔ)區(qū),允許位與字節(jié)混合訪(fǎng)問(wèn)(16字節(jié)) idata 間接尋址片內(nèi)數(shù)據(jù)存儲(chǔ)區(qū),可訪(fǎng)問(wèn)片內(nèi)全部RAM地址空間(256字節(jié)) pdata 分頁(yè)尋址片外數(shù)據(jù)存儲(chǔ)區(qū)(256字節(jié)) ,通過(guò)P0口的地址對(duì)其尋址 xdata 片外數(shù)據(jù)存儲(chǔ)區(qū)(64 KB) code 程序存儲(chǔ)器64 KB空間15DATA區(qū)的尋址是最

11、快的,所以應(yīng)該把經(jīng)常使用的變量放在DATA區(qū);DATA區(qū)的空間是有限的,DATA區(qū)除了包含程序變量外,還包含了堆棧和寄存器組。DATA區(qū)聲明中的存儲(chǔ)類(lèi)型標(biāo)識(shí)符data,通常指低128B的內(nèi)部數(shù)據(jù)區(qū)存儲(chǔ)的變量,可直接尋址。聲明舉例如下: unsigned char data system_status=0; unsigned int data unit_id2;16BDATA區(qū)實(shí)際就是DATA區(qū)中的位尋址區(qū),在這個(gè)區(qū)聲明變量就可進(jìn)行位尋址。位變量的聲明對(duì)狀態(tài)寄存器來(lái)說(shuō)十分有用的,因?yàn)樗赡軆H僅需要使用某一個(gè)位,而不是整個(gè)字節(jié)。BDATA區(qū)聲明中的存儲(chǔ)類(lèi)型標(biāo)識(shí)符為bdata,指內(nèi)部可位尋址的16B

12、存儲(chǔ)區(qū)(20H2FH)可位尋址變量的數(shù)據(jù)類(lèi)型。在BDATA區(qū)聲明位變量和使用位變量的例子: unsigned char bdata status_buye; unsigned int bdata status_word; sbit stat_flag=status_byte4;編譯器不允許在BDATA區(qū)中聲明float和double型的變量。對(duì)變量位進(jìn)行尋址產(chǎn)生的匯編代碼比聲明DATA區(qū)的字節(jié)所產(chǎn)生的匯編代碼要好17PDATA區(qū)和XDATA區(qū)屬于外部存儲(chǔ)區(qū),外部數(shù)據(jù)區(qū)可讀寫(xiě)的存儲(chǔ)區(qū),最多可有64KB,當(dāng)然這些地址不是必須用作存儲(chǔ)區(qū)的。訪(fǎng)問(wèn)外部數(shù)據(jù)存儲(chǔ)區(qū)比訪(fǎng)問(wèn)內(nèi)部數(shù)據(jù)存儲(chǔ)區(qū)慢,因?yàn)橥獠繑?shù)據(jù)存儲(chǔ)區(qū)

13、是通過(guò)數(shù)據(jù)指針加載地址來(lái)間接訪(fǎng)問(wèn)的。在這兩個(gè)區(qū),變量的聲明和在其他區(qū)的語(yǔ)法是一樣的,但PDATA區(qū)只有256B,而XDATA區(qū)可達(dá)到65535B。對(duì)PDATA和XDATA的操作是相似的。對(duì)PDATA區(qū)的尋址比對(duì)XDATA區(qū)的尋址要快,因?yàn)閷?duì)PDATA區(qū)尋址只需要裝入8位地址,而對(duì)XDATA區(qū)尋址需裝入16位地址,所以要盡量把外部數(shù)據(jù)存儲(chǔ)在PDATA區(qū)中。18PDATA和XDATA區(qū)聲明中的存儲(chǔ)類(lèi)標(biāo)識(shí)符分別為pdata和xdata,xdata存儲(chǔ)類(lèi)型標(biāo)識(shí)符可以指定外部數(shù)據(jù)區(qū)64KB內(nèi)的任何地址,而pdata存儲(chǔ)類(lèi)型標(biāo)識(shí)符僅指定1頁(yè)或256B的外部數(shù)據(jù)區(qū)。聲明舉例如下: unsigned char

14、 xdata system_status=0; unsigned int pdata unit_id2; 外部地址段中除了包含存儲(chǔ)器地址外,還包含I/O器件的地址。對(duì)外部器件尋址可通過(guò)指針或C51提供的宏,使用宏對(duì)外部器件進(jìn)行尋址更具可讀性。 inp_byte=XBYTE0 x8500; /從地址8500H讀一字節(jié) XBYTE0 x7500=out_val; /寫(xiě)一字節(jié)到7500H 如果要對(duì)BDATA和BIT段之外的其他數(shù)據(jù)區(qū)尋址,則要包含頭文件absacc.h,并采用以上方法尋址。19物理存儲(chǔ)區(qū)最大長(zhǎng)度地址區(qū)段類(lèi)型程序64 KB00FFFFHCODE外部數(shù)據(jù)64 KB00FFFFHXDATA

15、直接尋址片內(nèi)數(shù)據(jù)128字節(jié)07FHDATA間接尋址片內(nèi)數(shù)據(jù)256字節(jié)00FFHIDATA片內(nèi)數(shù)據(jù)的位空間128位07FHBIT MCS-51系列的物理存儲(chǔ)區(qū)20C51存儲(chǔ)類(lèi)型及其數(shù)據(jù)長(zhǎng)度和值域存儲(chǔ)類(lèi)型長(zhǎng)度(bit)長(zhǎng)度(byte)值域范圍data810255idata810255pdata810255xdata162065 535code162065 53521帶存儲(chǔ)類(lèi)型的變量的定義的一般格式為 數(shù)據(jù)類(lèi)型 存儲(chǔ)類(lèi)型 變量名帶存儲(chǔ)類(lèi)型的變量定義舉例:char data var1;bit bdata flags;float idata x,y,z;unsigned int pdata var2;u

16、nsigned char vector34;22存儲(chǔ)模式說(shuō)明存儲(chǔ)模式說(shuō) 明SMALL默認(rèn)的存儲(chǔ)類(lèi)型是data,參數(shù)及局部變量放入可直接尋址片內(nèi)RAM的用戶(hù)區(qū)中(最大128字節(jié))。另外所有對(duì)象(包括堆棧),都必須嵌入片內(nèi)RAM。棧長(zhǎng)很關(guān)鍵,因?yàn)閷?shí)際棧長(zhǎng)依賴(lài)于函數(shù)嵌套調(diào)用層數(shù)COMPACT默認(rèn)的存儲(chǔ)類(lèi)型是pdata,參數(shù)及局部變量放入分頁(yè)的外部數(shù)據(jù)存儲(chǔ)區(qū),通過(guò)R0或R1間接訪(fǎng)問(wèn),??臻g位于片內(nèi)數(shù)據(jù)存儲(chǔ)區(qū)中LARGE默認(rèn)的存儲(chǔ)類(lèi)型是xdata,參數(shù)及局部變量直接放入片外數(shù)據(jù)存儲(chǔ)區(qū),使用數(shù)據(jù)指針DPTR來(lái)進(jìn)行尋址。用此數(shù)據(jù)指針進(jìn)行訪(fǎng)問(wèn)效率較低,尤其對(duì)兩個(gè)或多個(gè)字節(jié)的變量,這種數(shù)據(jù)類(lèi)型的訪(fǎng)問(wèn)機(jī)制直接影響

17、代碼的長(zhǎng)度231.4 特殊功能寄存器(SFR)的C51定義 MCS-51單片機(jī)中,除了程序計(jì)數(shù)器PC和4組工作寄存器組外,其它所有的寄存器均為特殊功能寄存器(SFR),分散在片內(nèi)RAM區(qū)的高128字節(jié)中,地址范圍為80H0FFH。SFR中有11個(gè)寄存器具有位尋址能力,它們的字節(jié)地址都能被8整除,即字節(jié)地址是以8或0為尾數(shù)的。 為了能直接訪(fǎng)問(wèn)這些SFR,F(xiàn)ranklin C51提供了一種自主形式的定義方法,這種定義方法與標(biāo)準(zhǔn)C語(yǔ)言不兼容,只適用于對(duì)MCS-51系列單片機(jī)進(jìn)行C語(yǔ)言編程。24特殊功能寄存器C51定義的一般語(yǔ)法格式如下:sfr sfr-name = int constant;“sfr

18、”( sfr16)是定義語(yǔ)句的關(guān)鍵字,=后面必須是一個(gè)整型常數(shù),不允許帶有運(yùn)算符的表達(dá)式,是特殊功能寄存器sfr-name的字節(jié)地址,這個(gè)常數(shù)值的范圍必須在SFR地址范圍內(nèi),位于0 x800 xFF。例如:sfr SCON=0 x98; /* 串口控制寄存器地址98H */sfr TMOD=0 x89;/* 定時(shí)器/計(jì)數(shù)器方式控制寄存器地址89H */reg51.h頭文件包括MCS-51單片機(jī)中SFR定義。25/*-REG51.HHeader generic 80C51 and 80C31 microcontroller.Copyright (c) 1988-1997 Keil Elektro

19、nik GmbH and Keil Software, Inc.All rights reserved.-*/* BYTE Register */sfr P0 = 0 x80;sfr P1 = 0 x90;sfr P2 = 0 xA0;sfr P3 = 0 xB0;sfr PSW = 0 xD0;sfr ACC = 0 xE0;sfr B = 0 xF0;sfr SP = 0 x81;sfr DPL = 0 x82;sfr DPH = 0 x83;sfr PCON = 0 x87;sfr TCON = 0 x88;sfr TMOD = 0 x89;sfr TL0 = 0 x8A;sfr TL1

20、 = 0 x8B;sfr TH0 = 0 x8C;sfr TH1 = 0 x8D;sfr IE = 0 xA8;sfr IP = 0 xB8;sfr SCON = 0 x98;sfr SBUF = 0 x99;26/* BIT Register */* PSW */sbit CY = 0 xD7;sbit AC = 0 xD6;sbit F0 = 0 xD5;sbit RS1 = 0 xD4;sbit RS0 = 0 xD3;sbit OV = 0 xD2;sbit P = 0 xD0;/* IP */ sbit PS = 0 xBC;sbit PT1 = 0 xBB;sbit PX1 = 0

21、 xBA;sbit PT0 = 0 xB9;sbit PX0 = 0 xB8;/* IE */sbit EA = 0 xAF;sbit ES = 0 xAC;sbit ET1 = 0 xAB;sbit EX1 = 0 xAA;sbit ET0 = 0 xA9;sbit EX0 = 0 xA8;/* TCON */sbit TF1 = 0 x8F;sbit TR1 = 0 x8E;sbit TF0 = 0 x8D;sbit TR0 = 0 x8C;sbit IE1 = 0 x8B;sbit IT1 = 0 x8A;sbit IE0 = 0 x89;sbit IT0 = 0 x88;/* P3 *

22、/sbit RD = 0 xB7;sbit WR = 0 xB6;sbit T1 = 0 xB5;sbit T0 = 0 xB4;sbit INT1 = 0 xB3;sbit INT0 = 0 xB2;sbit TXD = 0 xB1;sbit RXD = 0 xB0;/* SCON */sbit SM0 = 0 x9F;sbit SM1 = 0 x9E;sbit SM2 = 0 x9D;sbit REN = 0 x9C;sbit TB8 = 0 x9B;sbit RB8 = 0 x9A;sbit TI = 0 x99;sbit RI = 0 x98;27對(duì)于位尋址的SFR中的位,C51使用“

23、sbit”來(lái)定義位尋址單元。第一種格式: sbit bit-name = sfr-nameint constant; sbit是定義語(yǔ)句的關(guān)鍵字,后跟一個(gè)尋址位符號(hào)名,=后的sfr-name必須是已定義過(guò)的SFR的名字,后的整常數(shù)是尋址位在特殊功能寄存器sfr-name中的位號(hào),必須是07范圍中的數(shù)。例如:sfr PSW=0 xD0 ; /* 定義PSW寄存器地址為D0H */sbit OV=PSW2 ; /* 定義OV為PSW.2,地址為D2H */sbit CY=PSW7 ; /* 定義CY為PSW.7,地址為D7H */28 第二種格式:sbit bit-name = int const

24、antint constant; =后的int constant為尋址地址位所在的特殊功能寄存器的字節(jié)地址,符號(hào)后的int constant為尋址位在特殊功能寄存器中的位號(hào)。例如: sbit OV=0XD02 ;/* 定義OV位地址是D0H字節(jié)中的第2位 */ sbit CY=0XD07 ;/* 定義CY位地址是D0H字節(jié)中的第7位 */29 第三種格式:sbit bit-name = int constant; =后的int constant為尋址位的絕對(duì)位地址。例如: sbit OV=0XD2 ;/* 定義OV位地址為D2H */ sbit CY=0XD7 ;/* 定義CY位地址為D7H

25、*/ 特殊功能位代表了一個(gè)獨(dú)立的定義類(lèi),不能與其它位定義和位域互換。30 (1) 位變量C51定義。使用C51編程時(shí),定義了位變量后,就可以用定義了的變量來(lái)表示MCS-51的位尋址單元。 位變量的C51定義的一般語(yǔ)法格式如下: 位類(lèi)型標(biāo)識(shí)符(bit) 位變量名; 例如:bit direction_bit ;/* 把direction_bit定義為位變量 */bit look_pointer ;/* 把look_pointer定義為位變量 */1.5 位變量的C51定義31 (2) 函數(shù)可包含類(lèi)型為bit的參數(shù),也可以將其作為返回值。例如: bit func(bit b0, bit b1) /*

26、 變量b0,b1作為函數(shù)的參數(shù) */ return (b1); /* 變量b1作為函數(shù)的返回值 */ 32 (3) 對(duì)位變量定義的限制。位變量不能定義成一個(gè)指針,如不能定義:bit * bit_pointer。不存在位數(shù)組,如不能定義:bit b_array 。 在位定義中,允許定義存儲(chǔ)類(lèi)型,位變量都被放入一個(gè)位段,此段總位于MCS-51片內(nèi)的RAM區(qū)中。因此,存儲(chǔ)類(lèi)型限制為data和idata,如果將位變量的存儲(chǔ)類(lèi)型定義成其它存儲(chǔ)類(lèi)型都將編譯出錯(cuò)。33例1 先定義變量的數(shù)據(jù)類(lèi)型和存儲(chǔ)類(lèi)型:bdata int ibase; /* 定義ibase為bdata整型變量 */bdata char b

27、ary4;/* bary4定義為bdata字符型數(shù)組 */然后可使用sbit定義可獨(dú)立尋址訪(fǎng)問(wèn)的對(duì)象位:sbit mybit0 = ibase0 ;/* mybit0定義為ibase的第0位 */sbit mybit15 = ibase15;/* mybit0定義為ibase的第15位 */sbit Ary07 = bary07 ;/* Ary07定義為abry0的第7位 */sbit Ary37 = bary37 ;/* Ary37定義為abry3的第7位 */34 對(duì)象ibase和bary也可以字節(jié)尋址: ary37=0; /* bary3的第7位賦值為0 */ bary3=a; /* 字

28、節(jié)尋址,bary3 賦值為a */ sbit定義要位尋址對(duì)象所在字節(jié)基址對(duì)象的存儲(chǔ)類(lèi)型為bdata,否則只有絕對(duì)的特殊位定義(sbit)是合法的。操作符后的最大值依賴(lài)于指定的基類(lèi)型,對(duì)于char/uchar而言是07,對(duì)于int/uint而言是015,對(duì)于long/ulong而言是031。351.6 MCS-51并行接口的C51定義 MCS-51系列單片機(jī)并行I/O接口除了芯片上的4個(gè)I/O口(P0 P3)外,還可以在片外擴(kuò)展I/O口。MCS-51單片機(jī)I/O口與數(shù)據(jù)存儲(chǔ)器統(tǒng)一編址,即把一個(gè)I/O口當(dāng)作數(shù)據(jù)存儲(chǔ)器中的一個(gè)單元來(lái)看待。 使用C51進(jìn)行編程時(shí),MCS-51片內(nèi)的I/O口與片外擴(kuò)展的

29、I/O可以統(tǒng)一在一個(gè)頭文件中定義,也可以在程序中(一般在開(kāi)始的位置)進(jìn)行定義,其定義方法如下: 對(duì)于MCS-51片內(nèi)I/O口按特殊功能寄存器方法定義。例如:sfr P0=0 x80 ; /* 定義P0口,地址為80H */sfr P1=0 x90 ; /* 定義P1口,地址為90H */36 對(duì)于片外擴(kuò)展I/O口,則根據(jù)硬件譯碼地址,將其視作為片外數(shù)據(jù)存儲(chǔ)器的一個(gè)單元,使用#define語(yǔ)句進(jìn)行定義。例如#include #define PORTA XBYTE 0 xFFC0 absacc.h是C51中絕對(duì)地址訪(fǎng)問(wèn)函數(shù)的頭文件,將PORTA定義為外部I/O口,地址為 FFC0H,長(zhǎng)度為8位。

30、一旦在頭文件或程序中對(duì)這些片外I/O口進(jìn)行定義后,在程序中就可以自由使用變量名與其實(shí)際地址的聯(lián)系,以便使程序員能用軟件模擬MCS-51的硬件操作。371.7 MCS-51 C語(yǔ)言編程實(shí)例Franklin C51的編譯庫(kù)庫(kù)說(shuō) 明C51S.LIBSMALL模式,無(wú)浮點(diǎn)運(yùn)算C51FPS.LIB浮點(diǎn)數(shù)學(xué)運(yùn)算庫(kù)(SMALL模式)C51C.LIBCOMPACT模式,無(wú)浮點(diǎn)運(yùn)算C51FPC.LIB浮點(diǎn)運(yùn)算庫(kù)(COMPACT模式)C51L.LIBLARGE模式,無(wú)浮點(diǎn)運(yùn)算C51FPL.LIB浮點(diǎn)運(yùn)算庫(kù)(LARGE模式)38程序優(yōu)化 (1) 盡量選擇小存儲(chǔ)模式以避免使用MOVX指令。 (2) 使用大模式(COM

31、PACT/LARGE)應(yīng)仔細(xì)考慮要放在內(nèi)部數(shù)據(jù)存儲(chǔ)器的變量要求是經(jīng)常用的或是用于中間結(jié)果的。訪(fǎng)問(wèn)內(nèi)部數(shù)據(jù)存儲(chǔ)器要比訪(fǎng)問(wèn)外部數(shù)據(jù)存儲(chǔ)器快得多。內(nèi)部RAM由寄存器組、位數(shù)據(jù)區(qū)和其它用戶(hù)用“data”類(lèi)型定義的變量共享。由于內(nèi)部RAM容量的限制(128256字節(jié),由使用的單片機(jī)決定),必須權(quán)衡利弊以解決訪(fǎng)問(wèn)效率和這些對(duì)象的數(shù)量之間的矛盾。39 (3) 要考慮操作順序,完成一件事后再做一件事。 (4) 注意程序編寫(xiě)細(xì)則。例如,若使用for(;)循環(huán),DJNZ指令比CJNE指令更有效,可減少重復(fù)循環(huán)次數(shù)。 (5) 若編譯器不能使用左移和右移完成乘除法,應(yīng)立即修改,例如,左移為乘2。 (6) 用邏輯AND

32、/&取模比用MOD / %操作更有效。 (7) 因計(jì)算機(jī)基于二進(jìn)制,仔細(xì)選擇數(shù)據(jù)存儲(chǔ)器和數(shù)組大小可節(jié)省操作。40 (8) 盡可能使用最小的數(shù)據(jù)類(lèi)型,MCS-51系列是8位機(jī),顯然對(duì)具有char類(lèi)型的對(duì)象的操作比int或long類(lèi)型的對(duì)象的操作要方便得多。 (9) 盡可能使用unsigned數(shù)據(jù)類(lèi)型。MCS-51系列CPU并不直接支持有符號(hào)數(shù)的運(yùn)算。因而C51編譯器必須產(chǎn)生與之相關(guān)的更多的程序代碼以解決這個(gè)問(wèn)題。 (10) 盡可能使用局部函數(shù)變量。編譯器總是嘗試在寄存器里保持局部變量。這樣,將循環(huán)變量(如for和while循環(huán)中的計(jì)數(shù)變量)說(shuō)明為局部變量是最好的。使用unsigned char/

33、int的對(duì)象通常能獲得最好的結(jié)果。41MCS-51中斷源編號(hào)編 號(hào)中 斷 源入 口 地 址0外部中斷00003H1定時(shí)器/計(jì)數(shù)器0000BH2外部中斷10013H3定時(shí)器/計(jì)數(shù)器1001BH4串行口中斷0023H1.7.1 中斷應(yīng)用的C語(yǔ)言編程421、 中斷允許寄存器IE(A8H)CPU對(duì)中斷系統(tǒng)所有中斷以及某個(gè)中斷源的開(kāi)放和屏蔽是由中斷允許寄存器(IE)控制的。IE的狀態(tài)可通過(guò)程序由軟件設(shè)定;某位設(shè)定為“1”,相應(yīng)的中斷源中斷允許;某位設(shè)定為“0”,相應(yīng)的中斷源中斷屏蔽;CPU復(fù)位時(shí),IE各位清“0”,禁止所有中斷。位D7D6D5D4D3D2D1D0字節(jié)地址IEEAESET1EX1ET0EX

34、0A8H位地址AFHAEHADHACHABHAAHA9HA8H432、 中斷優(yōu)先級(jí)寄存器IP(B8H)MCS-51單片機(jī)有兩個(gè)中斷優(yōu)先級(jí),即可實(shí)現(xiàn)二級(jí)中斷服務(wù)嵌套。每個(gè)中斷源的中斷優(yōu)先級(jí)都是由中斷優(yōu)先級(jí)寄存器(IP)中的相應(yīng)位的狀態(tài)來(lái)規(guī)定的。某位設(shè)定為“1”,則相應(yīng)的中斷源為高優(yōu)先級(jí)中斷;某位設(shè)定為“0”,則相應(yīng)的中斷源為低優(yōu)先級(jí)中斷。單片機(jī)復(fù)位時(shí),IP各位清“0”,各中斷源同為低優(yōu)先級(jí)中斷。位D7D6D5D4D3D2D1D0字節(jié)地址IPPSPT1PX1PT0PX0B8H位地址BFHBEHBDHBCHBBHBAHB9HB8H443、定時(shí)器工作方式寄存器 TMOD(89H):用于設(shè)置定時(shí)/計(jì)數(shù)器

35、的工作方式,低4位用于T0,高4位用于T1。(1) GATE:門(mén)控位。GATE0時(shí),當(dāng)軟件使TCON中的TR0或TR1設(shè)置為“1”,則啟動(dòng)定時(shí)/計(jì)數(shù)器工作;GATA1時(shí),軟件使TR0或TR1設(shè)置為“1”,同時(shí)外部中斷引腳也為高電平時(shí),才能啟動(dòng)定時(shí)/計(jì)數(shù)器工作。(2) C/ :定時(shí)/計(jì)數(shù)模式選擇位。C/0為定時(shí)模式;C/=1為計(jì)數(shù)模式。位D7D6D5D4D3D2D1D0字節(jié)地址TMODGATE C/M1M0GATE C/M1M089H45定時(shí)/計(jì)數(shù)器工作方式設(shè)置表M1M0工作方式功能說(shuō)明00方式013位定時(shí)/計(jì)數(shù)器01方式116位定時(shí)/計(jì)數(shù)器10方式28位自動(dòng)重裝初值定時(shí)/計(jì)數(shù)器11方式3T0分

36、成兩個(gè)獨(dú)立的8位定時(shí)/計(jì)數(shù)器;T1此方式停止計(jì)數(shù)(3) M1M0 :工作方式設(shè)置位。定時(shí)/計(jì)數(shù)器有4種工作方式,由M1M0進(jìn)行設(shè)置 。464、 定時(shí)/計(jì)數(shù)器控制寄存器TCON(88H)TCON的低4位用于控制外部中斷,TCON的高4位用于控制定時(shí)/計(jì)數(shù)器的啟動(dòng)和中斷申請(qǐng)。TR1:定時(shí)/計(jì)數(shù)器T1運(yùn)行控制位。TR1置“1”時(shí),定時(shí)/計(jì)數(shù)器T1開(kāi)始工作;TR1置“0”時(shí),定時(shí)/計(jì)數(shù)器T1停止工作。TR1由軟件置“1”或清“0”。 TR0 :定時(shí)/計(jì)數(shù)器T0運(yùn)行控制位,其功能與TR1類(lèi)同。位D7D6D5D4D3D2D1D0字節(jié)地址TCONTF1TR1TF0TR0IE1IT1IE0IT088H位地址8

37、FH8EH8DH8CH8BH8AH89H88H47TF0:定時(shí)/計(jì)數(shù)器T0溢出中斷請(qǐng)求標(biāo)志位。在T0啟動(dòng)后就開(kāi)始由初值加“1”計(jì)數(shù),直至最高位產(chǎn)生溢出由硬件置位(TF0),向CPU請(qǐng)求中斷。CPU響應(yīng)中斷時(shí),TF0由硬件自動(dòng)清“0”。 ;若用于查詢(xún)方式,此位可作為狀態(tài)位供查詢(xún),但應(yīng)注意查詢(xún)后由軟件清“0”。TF1:定時(shí)/計(jì)數(shù)器T1溢出中斷請(qǐng)求標(biāo)志位。其操作功能與TF0類(lèi)同。 IT0:外部中斷0觸發(fā)方式控制位。IE0:外部中斷0中斷請(qǐng)求標(biāo)志位。IE0=1時(shí),表示向CPU請(qǐng)求中斷。IT1:外部中斷1觸發(fā)方式控制位。IE1:外部中斷1中斷請(qǐng)求標(biāo)志位。IE1=1時(shí),表示向CPU請(qǐng)求中斷。48C51編譯

38、器支持在C源程序中直接開(kāi)發(fā)中斷程序。中斷服務(wù)程序是通過(guò)按規(guī)定語(yǔ)法格式定義的一個(gè)函數(shù)。 中斷服務(wù)程序的函數(shù)定義的語(yǔ)法格式如下: 返回值 函數(shù)名(參數(shù)) interrupt musing n 49 using n 選項(xiàng)用于實(shí)現(xiàn)工作寄存器組的切換,n是中斷服務(wù)子程序中選用的工作寄存器組號(hào)(0 3)。在許多情況下,響應(yīng)中斷時(shí)需保護(hù)有關(guān)現(xiàn)場(chǎng)信息,以便中斷返回后,能使中斷前的源程序從斷點(diǎn)處繼續(xù)正確地執(zhí)行下去。這在MCS-51單片機(jī)中,能很方便地利用工作寄存器組的切換來(lái)實(shí)現(xiàn)。即在進(jìn)入中斷服務(wù)程序前的程序中使用一組工作寄存器,進(jìn)入中斷服務(wù)程序后,由using n切換到另一組寄存器,中斷返回后又恢復(fù)到原寄存器組

39、。這樣互相切換的兩組寄存器中的內(nèi)容彼此都沒(méi)有被破壞。50圖 1.5 擴(kuò)展多個(gè)中斷源 例1 圖1.5所示是利用優(yōu)先權(quán)解碼芯片,在單片機(jī)8031的一個(gè)外部中斷INT1上擴(kuò)展多個(gè)中斷源的原理電路圖。圖中是以開(kāi)關(guān)閉合來(lái)模擬中斷請(qǐng)求信號(hào)。當(dāng)有任一中斷源產(chǎn)生中斷請(qǐng)求,能給8031的INT1引腳送一個(gè)有效中斷信號(hào),由P1的低3位可得對(duì)應(yīng)中斷源的中斷號(hào)。51 在中斷服務(wù)程序中僅設(shè)置標(biāo)志,并保存I/O口輸入狀態(tài)。Franklin C51編譯器提供定義特定MCS-51系列成員的寄存器頭文件。MCS-51頭文件為reg51.h。C51程序如下: # include unsigned char status; bit

40、 flag; void service_int1( ) interrupt 2 using 2 /* INT1中斷服務(wù)程序,使用第2組工作寄存器 */ flag=1; /* 設(shè)置標(biāo)志 */ status=p1; /* 存輸入口狀態(tài) */ 52void main(void) IP=0 x04 ; /* 置INT1為高優(yōu)先級(jí)中斷 */ IE=-0 x84 ; /* INT1開(kāi)中斷,CPU開(kāi)中斷 */ for(; ;) if(flag) /* 有中斷 */ switch(status&0 x3) /* 根據(jù)中斷源分支 */ case 0 : break ; /* 處理IN0 */ case 1 :

41、break ; /* 處理IN1 */ case 2 : break; /* 處理IN2 */ case 3 : break; /* 處理IN3 */ default : ; flag=0 ; /* 處理完成清標(biāo)志 */ 531.7.2 定時(shí)器/計(jì)數(shù)器(T/C)應(yīng)用的C語(yǔ)言編程例2 設(shè)單片機(jī)的fosc=12 MHz晶振,要求在P1.0腳上輸出周期為2 ms的方波。 周期為2 ms的方波要求定時(shí)時(shí)間隔1 ms,每次時(shí)間到P1.0取反。 機(jī)器周期=12/fosc=1 s 需計(jì)數(shù)次數(shù)=1000/(12/fosc)=1000/1=1000 54(1) 用定時(shí)器0的方式1編程,采用查詢(xún)方式,程序如下:

42、# include sbit P1_0=P10 ; void main(void) TMOD=0 x01 ; /* 設(shè)置定時(shí)器1為非門(mén)控制方式1*/ TR0=1 ; /* 啟動(dòng) T/C0 */ for( ; ;) TH0= 0 xfc ; /* 裝載計(jì)數(shù)器初值 */ TL0= 0 x18 ; do while (!TF0) ; /* 查詢(xún)等待TF0置位 */ P1_0=!P1_0; /* 定時(shí)時(shí)間到P1.0反相 */ TF0=0; /* 軟件清 TF0 */ 55(2) 用定時(shí)器0的方式1編程,采用中斷方式。程序如下: # include sbit P1_0=P10 ; void time (

43、void) interrupt 1 using 1 /* T/C0中斷服務(wù)程序入口 */ P1_0=!P1_0 ; /* P1.0取反 */ TH0= -(1000/256); / * 重新裝載計(jì)數(shù)初值 */ void main( void ) TMOD=0 x01 ; /* T/C0工作在定時(shí)器非門(mén)控制方式1 */ P1_0=0; TH0= 0 xfc ; /* 預(yù)置計(jì)數(shù)初值 */ TL0= 0 x18; ET0= 1 ; /* T/C0中斷開(kāi)放 */ TR0=1 ; /* 啟動(dòng)T/C0開(kāi)始定時(shí) */ EA=1 ; /* CPU中斷開(kāi)放 */ do while(1) ; /* 等待中斷 */

44、 561.7.3 ADC0809與8031接口的數(shù)據(jù)采集程序舉例。57程序如下: # include # include # define uchar unsigned char # define IN0 XBYTE 0 x7ff8 /* 設(shè)置0809的通道0地址 */ sbit ad_busy =P33 ; /* 即EOC狀態(tài) */ void ad0809 ( uchar idata *x ) /* A/D采集函數(shù) */ uchar i ; uchar xdata *ad_adr ; ad_adr= & IN0 ; 58 for ( i=0 ; i8 ;i+ ) /* 處理8通道 */ *a

45、d_adr=0 ; /* 啟動(dòng)轉(zhuǎn)換 */ while (ad_busy = =0 ) ; /* 查詢(xún)等待轉(zhuǎn)換結(jié)束 */ xi = * ad_adr ; /* 存轉(zhuǎn)換結(jié)果 */ ad_adr + ; /* 下一通道 */ void main ( void ) static uchar idata ad 8 ; ad0809 ( ad ) ; /* 采樣AD0809通道的值 */ 591.7.4 AD574與8031接口的數(shù)據(jù)采集程序舉例。60源程序如下:# include # inlucde # define uint unsigned int # define ADCOM XBYTE 0 xf

46、f7c /* 使R/C=0, A0=0 ,CS=0 */# define ADLO XBYTE 0 xff7f /* 使 R/C =1,A0=1, CS=0 */# define ADHI XBYTE 0 xff7d /* 使R/C=1,A0=0,CS =0 */sbit r = P3 7 ;sbit w = P3 6 ;sbit adbusy = P1 0 ;61uint ad574 ( void ) /* AD574轉(zhuǎn)換器 */ r = 0 ; /* 產(chǎn)生CE=1 */ w = 0 ; ADCOM = 0 ; /* 啟動(dòng)轉(zhuǎn)換 */ while ( adbusy = =1 ) ; /* 等待

47、轉(zhuǎn)換*/ return ( ( uint )(ADHI4 )+( ADLO &0 x0f ) ); /* 返回12位采樣值*/ main ( ) uint idata result ; result =ad574 ( ) ; /* 啟動(dòng)AD574進(jìn)行一次轉(zhuǎn)換,得轉(zhuǎn)換結(jié)果 */ 621.7.5 8031與DAC0832雙緩沖接口的數(shù)據(jù)轉(zhuǎn)換程序舉例63將data1和data2數(shù)據(jù)同時(shí)轉(zhuǎn)換為模擬量的C51程序如下:# include # include # define INPUTR1 XBYTE 0 x8fff # define INPUTR2 XBYTE 0 xa7ff# define DACR

48、 XBYTE 0 x2fff # define uchar unsigned char void dac2b (uchar data1 , uchar data2 ) INPUTR1 = data1 ; /* 送數(shù)據(jù)到一片0832 */ INPUTR2 = data2 ; /* 送數(shù)據(jù)到另一片0832 */ DACR= 0 ; /* 啟動(dòng)兩路D/A 同時(shí)轉(zhuǎn)換 * /641.7.6 8031與DAC0832單緩沖區(qū)接口的數(shù)據(jù)轉(zhuǎn)換舉例65按片選線(xiàn)確定FFFEH為DAC0832的端口地址。使運(yùn)行輸出端輸出一個(gè)鋸齒波電壓信號(hào)的C51程序如下:# include # include # define D

49、A0832 XBYTE 0 xfffe # define uchar unsigned char # define uint unsigned int void main (void ) uchar i ; while ( 1 ) for ( i=0 ; i=255 ; i+ ) /* 形成鋸齒波輸出值,最大值為255 */ DA0832 = i ; /* D/A轉(zhuǎn)換輸出 */ 661.7.7 行列式鍵盤(pán)與8031的接口 鍵盤(pán)輸入信息的主要過(guò)程是: (1) 單片機(jī)判斷是否有鍵按下。 (2) 確定按下的是哪一個(gè)鍵。 (3) 把此步驟代表的信息翻譯成計(jì)算機(jī)所能識(shí)別的代碼,如ASCII或其它特征碼。

50、678031與行列式鍵盤(pán)的接口 6844鍵盤(pán)的掃描程序。 掃描程序查詢(xún)的內(nèi)容為: (1) 查詢(xún)是否有鍵按下。首先單片機(jī)向行掃描P1.0 P1.3輸出全為0掃描碼F0H,然后從列檢查口P1.4 P1.7輸入列掃描信號(hào),只要有一列信號(hào)不為1,即P1口不為F0H,則表示有鍵按下。接著要查出按下鍵所在的行、列位置。69 (2) 查詢(xún)按下鍵所在的行列位置。單片機(jī)將得到的信號(hào)取反,P1.4P1.7中的為1的位便是鍵所在的列。接下來(lái)要確定鍵所在的行,需要進(jìn)行逐行掃描。單片機(jī)首先使P1.0為0,P1.1P1.7為1,即向P1口發(fā)送掃描碼FEH,接著輸入列檢查信號(hào),若全為1,表示不在第一行。接著使P1.1接地,

51、其余為1,再讀入列信號(hào)這樣逐行發(fā)0掃描碼,直到找到按下鍵所在的行,將該行掃描碼取反保留。當(dāng)各行都掃描以后仍沒(méi)有找到,則放棄掃描,認(rèn)為是鍵的誤動(dòng)作。70 (3) 對(duì)得到的行號(hào)和列號(hào)譯碼,得到鍵值。 (4) 鍵的抖動(dòng)處理。當(dāng)用手按下一個(gè)鍵時(shí),往往會(huì)出現(xiàn)所按鍵在閉合位置和斷開(kāi)位置之間跳幾下才穩(wěn)定到閉合狀態(tài)的情況。在釋放一個(gè)鍵時(shí),也會(huì)出現(xiàn)類(lèi)似的情況,這就是鍵抖動(dòng),抖動(dòng)的持續(xù)時(shí)間不一,通常不會(huì)大于10 ms,若抖動(dòng)問(wèn)題不解決,就會(huì)引起對(duì)閉合鍵的多次讀入,對(duì)于鍵抖動(dòng)最方便的解決方法就是當(dāng)發(fā)現(xiàn)有鍵按下后,不是立即進(jìn)行逐行掃描,而是延時(shí)10 ms后再進(jìn)行。由于鍵按下的時(shí)間持續(xù)上百毫秒,延時(shí)后再處理也不遲。71

52、掃描函數(shù)的返回值為鍵特征碼,若無(wú)鍵按下,返回值為0。# include # define uchar unsigned char # define uint unsigned int void dlms( void )void kbscan( void ) ;void main ( void ) uchar key ;while( 1 ) key =kbscan ( ) ; dlms( ) ; void dlms( void ) uchar i ; for ( i=200 ; i0 ; i- -) 72uchar kbscan ( void ) /* 鍵掃描函數(shù) */ uchar scode

53、,recode ; P1=oxf0 ; if ( (P1 & 0 xf0 ) ! =0 xf0 ) /* 若有鍵按下 */ dlms ( ) ; /* 延時(shí)去抖動(dòng) */ if ( P1 & 0 xf0 )! = 0 xf0 ) scode =0 xfe ; /* 逐行掃描初值 */ while ( scode & 0 x10 ) !=0 ) P1=scode ; /* 輸出掃描碼 */ if ( P1 & 0 xf0 )! =0 xf0 ) /* 本行有鍵按下 */ recode= ( P1 & 0 xf0 ) | 0 x0f ; return ( scode ) + ( recode ) )

54、; /* 返回特征字節(jié)碼 */ else scode = ( scode 1) | 0 x01 ; /* 行掃描左移一位 */ return ( 0 ) ; 731.7.8 可編程鍵盤(pán)/顯示器接口INTEL 8279INTEL 8279是一種可編程鍵盤(pán)/顯示器接口芯片,它含有鍵盤(pán)輸入和顯示器輸出兩種功能 。 使用它可以簡(jiǎn)化系統(tǒng)的軟硬件設(shè)計(jì),充分提高CPU的工作效率。741、引腳功能:(1)與CPU總線(xiàn)接口部分D0D7:雙向、三態(tài)數(shù)據(jù)總線(xiàn),與系統(tǒng)數(shù)據(jù)總線(xiàn)相連,用于CPU與8279之間傳送控制、狀態(tài)和數(shù)據(jù)信息。CLK:系統(tǒng)的時(shí)鐘輸入線(xiàn),用于產(chǎn)生內(nèi)部時(shí)鐘。RESET:復(fù)位信號(hào),輸入線(xiàn),高電平有效。當(dāng)

55、RESET為1時(shí),8279復(fù)位。其復(fù)位狀態(tài)為16字符顯示,左端輸入,編碼掃描鍵盤(pán),雙鍵鎖定,程序時(shí)鐘編程為31。CS:片選輸入線(xiàn),低電平有效。CS=0時(shí),8279才能工作。 75A0: D0D7數(shù)據(jù)選擇輸入線(xiàn)。當(dāng)A0=0,表示傳送的是數(shù)據(jù);當(dāng)A0=1,表示輸入、輸出命令或狀態(tài)。RD:讀控制信號(hào),低電平有效。CPU從8279讀數(shù)據(jù)。WR:寫(xiě)控制信號(hào),低電平有效。CPU向8279寫(xiě)數(shù)據(jù)。IRQ:中斷請(qǐng)求信號(hào),高電平有效。在鍵盤(pán)工作方式中,當(dāng)FIFO/傳感器RAM存有數(shù)據(jù)時(shí),IRQ為高電平。CPU每次從RAM中讀出數(shù)據(jù)時(shí),IRQ變?yōu)榈碗娖?。若RAM中仍有數(shù)據(jù),則IRQ再次恢復(fù)為高電平。在傳感器工作方

56、式中,每當(dāng)檢測(cè)到傳感器狀態(tài)變化時(shí),IRQ就出現(xiàn)高電平。76(2)數(shù)據(jù)顯示接口部分OUTA0OUTA3:A組顯示信號(hào)輸出線(xiàn)。OUTB0OUTB3:B組顯示信號(hào)輸出線(xiàn)。BD:顯示器消隱指示,輸出。用于在數(shù)字轉(zhuǎn)換時(shí)指示消隱,或用于由顯示消隱命令控制下的消隱指示。SL0SL3:用于鍵盤(pán)/傳感器矩陣或顯示器的掃描輸出線(xiàn),可編程設(shè)定為編碼方式或內(nèi)部譯碼方式。77(3)鍵盤(pán)接口部分RL0RL7:鍵盤(pán)返回輸入線(xiàn),是鍵盤(pán)陣列或傳感器陣列的列(或行)的輸入線(xiàn)。內(nèi)部設(shè)置有上拉電路,平時(shí)保持為“1”,當(dāng)矩陣結(jié)點(diǎn)上有開(kāi)關(guān)閉合時(shí)變?yōu)?。SHIFT:移位輸入線(xiàn),通常用來(lái)擴(kuò)充鍵功能,可以用做鍵盤(pán)上、下檔功能鍵。CNTL/ST

57、B:控制/選通輸入線(xiàn)。在鍵盤(pán)工作方式時(shí),該信號(hào)是鍵盤(pán)數(shù)據(jù)的最高位,通常用來(lái)擴(kuò)充鍵開(kāi)關(guān)的控制功能,作為控制功能鍵使用。在選通輸入工作方式時(shí),該信號(hào)的上升沿可將來(lái)自RL0RL7的數(shù)據(jù)存入FIFO RAM中。788279與單片機(jī)、鍵盤(pán)/顯示器的接口79 2、8279的內(nèi)部結(jié)構(gòu)框圖80(1) I/O控制及數(shù)據(jù)緩沖器 數(shù)據(jù)緩沖器是雙向緩沖器,連接內(nèi)外總線(xiàn),用于傳送CPU和8279之間的命令或數(shù)據(jù),對(duì)應(yīng)的引腳為數(shù)據(jù)總線(xiàn)D0D7。 I/O控制線(xiàn)是CPU對(duì)8279進(jìn)行控制的引線(xiàn),對(duì)應(yīng)的引腳為數(shù)據(jù)選擇線(xiàn)A0、片選線(xiàn) 、讀/寫(xiě)信號(hào)線(xiàn)和。(2) 控制與定時(shí)寄存器及定時(shí)控制 控制與定時(shí)寄存器用來(lái)寄存鍵盤(pán)及顯示工作方式

58、控制字,同時(shí)還用來(lái)寄存其它操作方式控制字 。(3) 掃描計(jì)數(shù)器:鍵盤(pán)和顯示器共用,提供鍵盤(pán)和顯示器的掃描信號(hào)。81(4) 回復(fù)緩沖器、鍵盤(pán)去抖及控制 在鍵盤(pán)工作方式中,回復(fù)線(xiàn)作為行列式鍵盤(pán)的列輸入線(xiàn),相應(yīng)的列輸入信號(hào)稱(chēng)為回復(fù)信號(hào),由回復(fù)緩沖器緩沖并鎖存。在逐行列掃描時(shí),回復(fù)線(xiàn)用來(lái)搜尋每一行列中閉合的鍵。 (5) FIFO/傳感器及其狀態(tài)寄存器 FIFO/傳感器RAM是一個(gè)雙重功能的88 RAM。在鍵盤(pán)選通工作方式時(shí),它是FIFO存儲(chǔ)器,其輸入/輸出遵循先入先出的原則 。82(6) 顯示RAM和顯示寄存器,16X8。 8279內(nèi)部有16X8的顯示RAM,通過(guò)顯示寄存器和兩個(gè)四位端口0UT A0-

59、3,0UT BO-3來(lái)刷新顯示,顯示器可以是LED,也可以是8段數(shù)碼管,顯示RAM可以是16X8的形式,也可以構(gòu)成兩個(gè)16x4的RAM形式,顯示RAM可由CPU進(jìn)行讀寫(xiě),被讀寫(xiě)的RAM字節(jié)地址由顯示地址寄存器指示. 顯示地址寄存器保存當(dāng)前CPU讀或?qū)懙哪莻€(gè)RAM地址,以及正顯示著的那兩個(gè)4位半字節(jié)的地址, 讀寫(xiě)地址由CPU命令編程,也可置為每次讀寫(xiě)后地址自動(dòng)加1的工作方式,在設(shè)置了正確的工作方式后,顯示RAM可直接由CPU讀出,半字節(jié)A和半字節(jié)B地址自動(dòng)由8279更新,以適應(yīng)由CPU送入的數(shù)據(jù),A和B半字節(jié)可獨(dú)立送入,也可作為一個(gè)字送入,隨CPU所設(shè)置的工作方式而定。83 3、8279工作方式

60、(1)鍵盤(pán)工作方式鍵盤(pán)掃描方式,雙鍵互鎖:在這種方式,如果只有一個(gè)鍵被按下,則此鍵值連同CTRL和SHIFT的狀態(tài)一起送到FIFO RAM中,如果FIFO空,IRQ=1;如果FIFO滿(mǎn),便置錯(cuò)誤標(biāo)志,鍵值不會(huì)送入FIFO RAM中。若有兩個(gè)或兩個(gè)以上鍵同時(shí)被按下,則不管這些鍵是以什么次序按下的,它只識(shí)別最后一個(gè)釋放的鍵,并把此鍵值送入FIFO RAM中。鍵盤(pán)掃描方式,N鍵巡回:在這種方式,一次可以按下任意個(gè)鍵,這些鍵均被識(shí)別,并按鍵掃描的順序把鍵值送入FIFO RAM 中。D7D6D5D4D3D2D1D0CNTLSHIFT行號(hào)列號(hào)84(2)顯示器的工作方式 CPU將顯示數(shù)據(jù)寫(xiě)入顯示緩沖器時(shí)有左

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論