版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、1專題1:單片機的C語言應用程序設計 1.1 C51特點1.2 C51數(shù)據(jù)類型1.3 C51數(shù)據(jù)的存儲類型與MCS-51存儲結構1.4 特殊功能寄存器(SFR)的C51定義1.5 位變量的C51定義1.6 MCS-51并行接口的C51定義1.7 MCS-51 C語言編程實例21.1 C51特點用匯編程序設計MCS51系列單片機應用程序時,必須要考慮其存儲器結構,尤其必須考慮其片內數(shù)據(jù)存儲器與特殊功能寄存器正確、合理的使用以及按實際地址處理端口數(shù)據(jù)。使用匯編語言會遇到很多問題,首先它的可讀性和可維護性不強,特別是當程序沒有很好標注的時候,其次就是代碼的可重用性也比較低。使用C語言就可以很好地解決
2、這些問題。用C語言編寫單片機應用程序與編寫標準的C語言程序的不同之處就在于根據(jù)單片機存儲結構及內部資源定義相應的C語言中的數(shù)據(jù)類型和變量,其它的語法規(guī)定、程序結構及程序設計方法都與標準的C語言程序設計相同。3使用C語言與使用匯編語言相比具有如下優(yōu)點:(1) 不需要了解處理器的指令集,也不必了解存儲器結構。(2) 寄存器分配和尋址方式由編譯器進行管理,編程時不需要考慮存儲器的尋址和數(shù)據(jù)類型等細節(jié)。(3) 指定操作的變量選擇組合提高了程序的可讀性。(4) 可使用與人的思維更接近的關鍵字和操作函數(shù)。(5) 與使用匯編語言編程相比,程序的開發(fā)和調試時間大大縮短。4(6) C語言中的庫文件提供許多標準的
3、例程,例如格式化輸出、數(shù)據(jù)轉換和浮點運算等。(7) 通過C語言可實現(xiàn)模塊化編程技術,從而可將已編制好的程序加入到新程序中。(8) C語言可移植性好且非常普及,C語言編譯器幾乎適用于所有的目標系統(tǒng),已完成的軟件項目可以和容易地轉換到其他的處理器或環(huán)境中。用C語言編寫MCS51單片機的應用程序,雖然不像用匯編語言那樣具體地組織、分配存儲器資源和處理端口數(shù)據(jù),但在C語言編程中,對數(shù)據(jù)類型與變量的定義,必須要與單片機的存儲結構相關聯(lián),否則編譯器不能正確地映射定位。5C51特點:與C語言基本語法相同,在特定的硬件結構上有所擴展,如關鍵字sbit、data、idata、pdata、xdata、code等。
4、C51具有標準C語言的所有標準數(shù)據(jù)類型,還加入了特殊的數(shù)據(jù)類型。 bit位變量值為0或1。 sbit從字節(jié)中聲明的位變量0或1。 sfr特殊功能寄存器,sfr字節(jié)地址為0255。 sfr16同上,只是sfr字節(jié)地址為065535。bit、sbit、sfr和sfr16數(shù)據(jù)類型專門用于8051硬件和C51編譯器,并不是標準C語言的一部分,不能通過指針進行訪問。bit、sbit、sfrs和sfr16數(shù)據(jù)類型用于訪問8051的特殊功能寄存器。6用C語言編寫的應用程序必須經單片機的C語言編譯器(簡稱C51),轉換生成單片機可執(zhí)行的代碼程序。支持MCS51系列單片機的C語言編譯器有很多種。如America
5、n Automation、Auocet、BSO/TASKING、DUNFIELD SHAREWARE、KEIL/Franklin等。其中KEIL/Franklin以它的代碼緊湊和使用方便等特點優(yōu)于其它編譯器。本章是針對這種編譯器介紹 MCS51單片機C語言程序設計。 71.2 C51數(shù)據(jù)類型1.2.1 Franklin C51編譯器具體支持的數(shù)據(jù)類型有:位型(bit)、無符號字符(unsigned char)、有符號字符(singed char)、無符號整型(unsigned int )、有符號整型(signed int )、無符號長整型(unsigned long )、有符號長整型(sign
6、ed long )、浮點型、指針類型等。8Franklin C51的數(shù)據(jù)類型數(shù)據(jù)類型長度(bit)長度(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存儲空間06553591.2.2
7、C51數(shù)據(jù)在MCS-51中的存儲方式 位變量(bit):與MCS-51硬件特性操作有關的可以定義成位變量。位變量定位在MCS-51單片機片內RAM的位尋址空間20H-2FH中。 字符變量(char):字符變量的長度為1byte即8位。對于無符號變量(unsigned char)的值域范圍是0255。對于有符號字符變量(signed char),其最高位是符號標志位(msb),1代表“負”,0代表“正”。有符號字符變量和無符號字符變量在表示0127的數(shù)值時,含義一樣,都是00 x7F。進行有符號字符變量乘除法運算時,C51編譯器會自動地將相應的庫函數(shù)調入程序中來進行運算。10 整型變量(int)
8、: 整型變量的長度為16位。與8080和8086 CPU系列不同,MCS-51系列單片機將int型變量的高位字節(jié)數(shù)存放在低地址字節(jié)中,低位字節(jié)數(shù)存放在高地址字節(jié)中。有符號整型變量(signed int)也使用msb位作符號標志位,并使用二進制補碼表示數(shù)值。可直接使用幾種專用的機器指令來完成多字節(jié)的加、減、乘、除運算。整型變量值0 x1234以圖1.1所示的方式存放在內存中。11整型數(shù)的存儲結構 0 x120 x34+0+1地址 0 x120 x340 x560 x78.+0+1+2+3地址 長整型變量的存儲結構 12 浮點型變量(float): 浮點型變量為32位,占4個字節(jié),許多復雜的數(shù)學表
9、達式都采用浮點變量數(shù)據(jù)類型。 在編程時,如果只強調運算速度而不進行負數(shù)運算時,最好采用無符號(unsigned)格式。 無符號字符類型的使用:無論何時,應盡可能使用無符號字符變量,因為它能直接被MCS-51所接受。基于同樣的原因,也應盡量使用位變量。有符號字符變量雖然也只占用一個字節(jié),但需要進行額外的操作來進行測試代碼的符號位。這無疑會降低代碼效率。13 可使用簡化形式定義數(shù)據(jù)類型。其方法是在源程序開頭使用#define語句自定義簡化的類型標識符。例如:#define uchar unsigned char #define uint unsigned int 這樣,在編程中,就可以用uchar
10、代替unsigned char,用uint代替unsigned int來定義變量。141.3 C51數(shù)據(jù)的存儲類型與MCS-51存儲結構C51存儲類型與MCS-51存儲空間的對應關系存儲類型與存儲空間的對應關系 data 直接尋址片內數(shù)據(jù)存儲區(qū),訪問速度快(128字節(jié)) bdata 可位尋址片內數(shù)據(jù)存儲區(qū),允許位與字節(jié)混合訪問(16字節(jié)) idata 間接尋址片內數(shù)據(jù)存儲區(qū),可訪問片內全部RAM地址空間(256字節(jié)) pdata 分頁尋址片外數(shù)據(jù)存儲區(qū)(256字節(jié)) ,通過P0口的地址對其尋址 xdata 片外數(shù)據(jù)存儲區(qū)(64 KB) code 程序存儲器64 KB空間15DATA區(qū)的尋址是最
11、快的,所以應該把經常使用的變量放在DATA區(qū);DATA區(qū)的空間是有限的,DATA區(qū)除了包含程序變量外,還包含了堆棧和寄存器組。DATA區(qū)聲明中的存儲類型標識符data,通常指低128B的內部數(shù)據(jù)區(qū)存儲的變量,可直接尋址。聲明舉例如下: unsigned char data system_status=0; unsigned int data unit_id2;16BDATA區(qū)實際就是DATA區(qū)中的位尋址區(qū),在這個區(qū)聲明變量就可進行位尋址。位變量的聲明對狀態(tài)寄存器來說十分有用的,因為它可能僅僅需要使用某一個位,而不是整個字節(jié)。BDATA區(qū)聲明中的存儲類型標識符為bdata,指內部可位尋址的16B
12、存儲區(qū)(20H2FH)可位尋址變量的數(shù)據(jù)類型。在BDATA區(qū)聲明位變量和使用位變量的例子: unsigned char bdata status_buye; unsigned int bdata status_word; sbit stat_flag=status_byte4;編譯器不允許在BDATA區(qū)中聲明float和double型的變量。對變量位進行尋址產生的匯編代碼比聲明DATA區(qū)的字節(jié)所產生的匯編代碼要好17PDATA區(qū)和XDATA區(qū)屬于外部存儲區(qū),外部數(shù)據(jù)區(qū)可讀寫的存儲區(qū),最多可有64KB,當然這些地址不是必須用作存儲區(qū)的。訪問外部數(shù)據(jù)存儲區(qū)比訪問內部數(shù)據(jù)存儲區(qū)慢,因為外部數(shù)據(jù)存儲區(qū)
13、是通過數(shù)據(jù)指針加載地址來間接訪問的。在這兩個區(qū),變量的聲明和在其他區(qū)的語法是一樣的,但PDATA區(qū)只有256B,而XDATA區(qū)可達到65535B。對PDATA和XDATA的操作是相似的。對PDATA區(qū)的尋址比對XDATA區(qū)的尋址要快,因為對PDATA區(qū)尋址只需要裝入8位地址,而對XDATA區(qū)尋址需裝入16位地址,所以要盡量把外部數(shù)據(jù)存儲在PDATA區(qū)中。18PDATA和XDATA區(qū)聲明中的存儲類標識符分別為pdata和xdata,xdata存儲類型標識符可以指定外部數(shù)據(jù)區(qū)64KB內的任何地址,而pdata存儲類型標識符僅指定1頁或256B的外部數(shù)據(jù)區(qū)。聲明舉例如下: unsigned char
14、 xdata system_status=0; unsigned int pdata unit_id2; 外部地址段中除了包含存儲器地址外,還包含I/O器件的地址。對外部器件尋址可通過指針或C51提供的宏,使用宏對外部器件進行尋址更具可讀性。 inp_byte=XBYTE0 x8500; /從地址8500H讀一字節(jié) XBYTE0 x7500=out_val; /寫一字節(jié)到7500H 如果要對BDATA和BIT段之外的其他數(shù)據(jù)區(qū)尋址,則要包含頭文件absacc.h,并采用以上方法尋址。19物理存儲區(qū)最大長度地址區(qū)段類型程序64 KB00FFFFHCODE外部數(shù)據(jù)64 KB00FFFFHXDATA
15、直接尋址片內數(shù)據(jù)128字節(jié)07FHDATA間接尋址片內數(shù)據(jù)256字節(jié)00FFHIDATA片內數(shù)據(jù)的位空間128位07FHBIT MCS-51系列的物理存儲區(qū)20C51存儲類型及其數(shù)據(jù)長度和值域存儲類型長度(bit)長度(byte)值域范圍data810255idata810255pdata810255xdata162065 535code162065 53521帶存儲類型的變量的定義的一般格式為 數(shù)據(jù)類型 存儲類型 變量名帶存儲類型的變量定義舉例:char data var1;bit bdata flags;float idata x,y,z;unsigned int pdata var2;u
16、nsigned char vector34;22存儲模式說明存儲模式說 明SMALL默認的存儲類型是data,參數(shù)及局部變量放入可直接尋址片內RAM的用戶區(qū)中(最大128字節(jié))。另外所有對象(包括堆棧),都必須嵌入片內RAM。棧長很關鍵,因為實際棧長依賴于函數(shù)嵌套調用層數(shù)COMPACT默認的存儲類型是pdata,參數(shù)及局部變量放入分頁的外部數(shù)據(jù)存儲區(qū),通過R0或R1間接訪問,??臻g位于片內數(shù)據(jù)存儲區(qū)中LARGE默認的存儲類型是xdata,參數(shù)及局部變量直接放入片外數(shù)據(jù)存儲區(qū),使用數(shù)據(jù)指針DPTR來進行尋址。用此數(shù)據(jù)指針進行訪問效率較低,尤其對兩個或多個字節(jié)的變量,這種數(shù)據(jù)類型的訪問機制直接影響
17、代碼的長度231.4 特殊功能寄存器(SFR)的C51定義 MCS-51單片機中,除了程序計數(shù)器PC和4組工作寄存器組外,其它所有的寄存器均為特殊功能寄存器(SFR),分散在片內RAM區(qū)的高128字節(jié)中,地址范圍為80H0FFH。SFR中有11個寄存器具有位尋址能力,它們的字節(jié)地址都能被8整除,即字節(jié)地址是以8或0為尾數(shù)的。 為了能直接訪問這些SFR,F(xiàn)ranklin C51提供了一種自主形式的定義方法,這種定義方法與標準C語言不兼容,只適用于對MCS-51系列單片機進行C語言編程。24特殊功能寄存器C51定義的一般語法格式如下:sfr sfr-name = int constant;“sfr
18、”( sfr16)是定義語句的關鍵字,=后面必須是一個整型常數(shù),不允許帶有運算符的表達式,是特殊功能寄存器sfr-name的字節(jié)地址,這個常數(shù)值的范圍必須在SFR地址范圍內,位于0 x800 xFF。例如:sfr SCON=0 x98; /* 串口控制寄存器地址98H */sfr TMOD=0 x89;/* 定時器/計數(shù)器方式控制寄存器地址89H */reg51.h頭文件包括MCS-51單片機中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對于位尋址的SFR中的位,C51使用“
23、sbit”來定義位尋址單元。第一種格式: sbit bit-name = sfr-nameint constant; sbit是定義語句的關鍵字,后跟一個尋址位符號名,=后的sfr-name必須是已定義過的SFR的名字,后的整常數(shù)是尋址位在特殊功能寄存器sfr-name中的位號,必須是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é)地址,符號后的int constant為尋址位在特殊功能寄存器中的位號。例如: sbit OV=0XD02 ;/* 定義OV位地址是D0H字節(jié)中的第2位 */ sbit CY=0XD07 ;/* 定義CY位地址是D0H字節(jié)中的第7位 */29 第三種格式:sbit bit-name = int constant; =后的int constant為尋址位的絕對位地址。例如: sbit OV=0XD2 ;/* 定義OV位地址為D2H */ sbit CY=0XD7 ;/* 定義CY位地址為D7H
25、*/ 特殊功能位代表了一個獨立的定義類,不能與其它位定義和位域互換。30 (1) 位變量C51定義。使用C51編程時,定義了位變量后,就可以用定義了的變量來表示MCS-51的位尋址單元。 位變量的C51定義的一般語法格式如下: 位類型標識符(bit) 位變量名; 例如:bit direction_bit ;/* 把direction_bit定義為位變量 */bit look_pointer ;/* 把look_pointer定義為位變量 */1.5 位變量的C51定義31 (2) 函數(shù)可包含類型為bit的參數(shù),也可以將其作為返回值。例如: bit func(bit b0, bit b1) /*
26、 變量b0,b1作為函數(shù)的參數(shù) */ return (b1); /* 變量b1作為函數(shù)的返回值 */ 32 (3) 對位變量定義的限制。位變量不能定義成一個指針,如不能定義:bit * bit_pointer。不存在位數(shù)組,如不能定義:bit b_array 。 在位定義中,允許定義存儲類型,位變量都被放入一個位段,此段總位于MCS-51片內的RAM區(qū)中。因此,存儲類型限制為data和idata,如果將位變量的存儲類型定義成其它存儲類型都將編譯出錯。33例1 先定義變量的數(shù)據(jù)類型和存儲類型:bdata int ibase; /* 定義ibase為bdata整型變量 */bdata char b
27、ary4;/* bary4定義為bdata字符型數(shù)組 */然后可使用sbit定義可獨立尋址訪問的對象位: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 對象ibase和bary也可以字節(jié)尋址: ary37=0; /* bary3的第7位賦值為0 */ bary3=a; /* 字
28、節(jié)尋址,bary3 賦值為a */ sbit定義要位尋址對象所在字節(jié)基址對象的存儲類型為bdata,否則只有絕對的特殊位定義(sbit)是合法的。操作符后的最大值依賴于指定的基類型,對于char/uchar而言是07,對于int/uint而言是015,對于long/ulong而言是031。351.6 MCS-51并行接口的C51定義 MCS-51系列單片機并行I/O接口除了芯片上的4個I/O口(P0 P3)外,還可以在片外擴展I/O口。MCS-51單片機I/O口與數(shù)據(jù)存儲器統(tǒng)一編址,即把一個I/O口當作數(shù)據(jù)存儲器中的一個單元來看待。 使用C51進行編程時,MCS-51片內的I/O口與片外擴展的
29、I/O可以統(tǒng)一在一個頭文件中定義,也可以在程序中(一般在開始的位置)進行定義,其定義方法如下: 對于MCS-51片內I/O口按特殊功能寄存器方法定義。例如:sfr P0=0 x80 ; /* 定義P0口,地址為80H */sfr P1=0 x90 ; /* 定義P1口,地址為90H */36 對于片外擴展I/O口,則根據(jù)硬件譯碼地址,將其視作為片外數(shù)據(jù)存儲器的一個單元,使用#define語句進行定義。例如#include #define PORTA XBYTE 0 xFFC0 absacc.h是C51中絕對地址訪問函數(shù)的頭文件,將PORTA定義為外部I/O口,地址為 FFC0H,長度為8位。
30、一旦在頭文件或程序中對這些片外I/O口進行定義后,在程序中就可以自由使用變量名與其實際地址的聯(lián)系,以便使程序員能用軟件模擬MCS-51的硬件操作。371.7 MCS-51 C語言編程實例Franklin C51的編譯庫庫說 明C51S.LIBSMALL模式,無浮點運算C51FPS.LIB浮點數(shù)學運算庫(SMALL模式)C51C.LIBCOMPACT模式,無浮點運算C51FPC.LIB浮點運算庫(COMPACT模式)C51L.LIBLARGE模式,無浮點運算C51FPL.LIB浮點運算庫(LARGE模式)38程序優(yōu)化 (1) 盡量選擇小存儲模式以避免使用MOVX指令。 (2) 使用大模式(COM
31、PACT/LARGE)應仔細考慮要放在內部數(shù)據(jù)存儲器的變量要求是經常用的或是用于中間結果的。訪問內部數(shù)據(jù)存儲器要比訪問外部數(shù)據(jù)存儲器快得多。內部RAM由寄存器組、位數(shù)據(jù)區(qū)和其它用戶用“data”類型定義的變量共享。由于內部RAM容量的限制(128256字節(jié),由使用的單片機決定),必須權衡利弊以解決訪問效率和這些對象的數(shù)量之間的矛盾。39 (3) 要考慮操作順序,完成一件事后再做一件事。 (4) 注意程序編寫細則。例如,若使用for(;)循環(huán),DJNZ指令比CJNE指令更有效,可減少重復循環(huán)次數(shù)。 (5) 若編譯器不能使用左移和右移完成乘除法,應立即修改,例如,左移為乘2。 (6) 用邏輯AND
32、/&取模比用MOD / %操作更有效。 (7) 因計算機基于二進制,仔細選擇數(shù)據(jù)存儲器和數(shù)組大小可節(jié)省操作。40 (8) 盡可能使用最小的數(shù)據(jù)類型,MCS-51系列是8位機,顯然對具有char類型的對象的操作比int或long類型的對象的操作要方便得多。 (9) 盡可能使用unsigned數(shù)據(jù)類型。MCS-51系列CPU并不直接支持有符號數(shù)的運算。因而C51編譯器必須產生與之相關的更多的程序代碼以解決這個問題。 (10) 盡可能使用局部函數(shù)變量。編譯器總是嘗試在寄存器里保持局部變量。這樣,將循環(huán)變量(如for和while循環(huán)中的計數(shù)變量)說明為局部變量是最好的。使用unsigned char/
33、int的對象通常能獲得最好的結果。41MCS-51中斷源編號編 號中 斷 源入 口 地 址0外部中斷00003H1定時器/計數(shù)器0000BH2外部中斷10013H3定時器/計數(shù)器1001BH4串行口中斷0023H1.7.1 中斷應用的C語言編程421、 中斷允許寄存器IE(A8H)CPU對中斷系統(tǒng)所有中斷以及某個中斷源的開放和屏蔽是由中斷允許寄存器(IE)控制的。IE的狀態(tài)可通過程序由軟件設定;某位設定為“1”,相應的中斷源中斷允許;某位設定為“0”,相應的中斷源中斷屏蔽;CPU復位時,IE各位清“0”,禁止所有中斷。位D7D6D5D4D3D2D1D0字節(jié)地址IEEAESET1EX1ET0EX
34、0A8H位地址AFHAEHADHACHABHAAHA9HA8H432、 中斷優(yōu)先級寄存器IP(B8H)MCS-51單片機有兩個中斷優(yōu)先級,即可實現(xiàn)二級中斷服務嵌套。每個中斷源的中斷優(yōu)先級都是由中斷優(yōu)先級寄存器(IP)中的相應位的狀態(tài)來規(guī)定的。某位設定為“1”,則相應的中斷源為高優(yōu)先級中斷;某位設定為“0”,則相應的中斷源為低優(yōu)先級中斷。單片機復位時,IP各位清“0”,各中斷源同為低優(yōu)先級中斷。位D7D6D5D4D3D2D1D0字節(jié)地址IPPSPT1PX1PT0PX0B8H位地址BFHBEHBDHBCHBBHBAHB9HB8H443、定時器工作方式寄存器 TMOD(89H):用于設置定時/計數(shù)器
35、的工作方式,低4位用于T0,高4位用于T1。(1) GATE:門控位。GATE0時,當軟件使TCON中的TR0或TR1設置為“1”,則啟動定時/計數(shù)器工作;GATA1時,軟件使TR0或TR1設置為“1”,同時外部中斷引腳也為高電平時,才能啟動定時/計數(shù)器工作。(2) C/ :定時/計數(shù)模式選擇位。C/0為定時模式;C/=1為計數(shù)模式。位D7D6D5D4D3D2D1D0字節(jié)地址TMODGATE C/M1M0GATE C/M1M089H45定時/計數(shù)器工作方式設置表M1M0工作方式功能說明00方式013位定時/計數(shù)器01方式116位定時/計數(shù)器10方式28位自動重裝初值定時/計數(shù)器11方式3T0分
36、成兩個獨立的8位定時/計數(shù)器;T1此方式停止計數(shù)(3) M1M0 :工作方式設置位。定時/計數(shù)器有4種工作方式,由M1M0進行設置 。464、 定時/計數(shù)器控制寄存器TCON(88H)TCON的低4位用于控制外部中斷,TCON的高4位用于控制定時/計數(shù)器的啟動和中斷申請。TR1:定時/計數(shù)器T1運行控制位。TR1置“1”時,定時/計數(shù)器T1開始工作;TR1置“0”時,定時/計數(shù)器T1停止工作。TR1由軟件置“1”或清“0”。 TR0 :定時/計數(shù)器T0運行控制位,其功能與TR1類同。位D7D6D5D4D3D2D1D0字節(jié)地址TCONTF1TR1TF0TR0IE1IT1IE0IT088H位地址8
37、FH8EH8DH8CH8BH8AH89H88H47TF0:定時/計數(shù)器T0溢出中斷請求標志位。在T0啟動后就開始由初值加“1”計數(shù),直至最高位產生溢出由硬件置位(TF0),向CPU請求中斷。CPU響應中斷時,TF0由硬件自動清“0”。 ;若用于查詢方式,此位可作為狀態(tài)位供查詢,但應注意查詢后由軟件清“0”。TF1:定時/計數(shù)器T1溢出中斷請求標志位。其操作功能與TF0類同。 IT0:外部中斷0觸發(fā)方式控制位。IE0:外部中斷0中斷請求標志位。IE0=1時,表示向CPU請求中斷。IT1:外部中斷1觸發(fā)方式控制位。IE1:外部中斷1中斷請求標志位。IE1=1時,表示向CPU請求中斷。48C51編譯
38、器支持在C源程序中直接開發(fā)中斷程序。中斷服務程序是通過按規(guī)定語法格式定義的一個函數(shù)。 中斷服務程序的函數(shù)定義的語法格式如下: 返回值 函數(shù)名(參數(shù)) interrupt musing n 49 using n 選項用于實現(xiàn)工作寄存器組的切換,n是中斷服務子程序中選用的工作寄存器組號(0 3)。在許多情況下,響應中斷時需保護有關現(xiàn)場信息,以便中斷返回后,能使中斷前的源程序從斷點處繼續(xù)正確地執(zhí)行下去。這在MCS-51單片機中,能很方便地利用工作寄存器組的切換來實現(xiàn)。即在進入中斷服務程序前的程序中使用一組工作寄存器,進入中斷服務程序后,由using n切換到另一組寄存器,中斷返回后又恢復到原寄存器組
39、。這樣互相切換的兩組寄存器中的內容彼此都沒有被破壞。50圖 1.5 擴展多個中斷源 例1 圖1.5所示是利用優(yōu)先權解碼芯片,在單片機8031的一個外部中斷INT1上擴展多個中斷源的原理電路圖。圖中是以開關閉合來模擬中斷請求信號。當有任一中斷源產生中斷請求,能給8031的INT1引腳送一個有效中斷信號,由P1的低3位可得對應中斷源的中斷號。51 在中斷服務程序中僅設置標志,并保存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中斷服務程序,使用第2組工作寄存器 */ flag=1; /* 設置標志 */ status=p1; /* 存輸入口狀態(tài) */ 52void main(void) IP=0 x04 ; /* 置INT1為高優(yōu)先級中斷 */ IE=-0 x84 ; /* INT1開中斷,CPU開中斷 */ 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 ; /* 處理完成清標志 */ 531.7.2 定時器/計數(shù)器(T/C)應用的C語言編程例2 設單片機的fosc=12 MHz晶振,要求在P1.0腳上輸出周期為2 ms的方波。 周期為2 ms的方波要求定時時間隔1 ms,每次時間到P1.0取反。 機器周期=12/fosc=1 s 需計數(shù)次數(shù)=1000/(12/fosc)=1000/1=1000 54(1) 用定時器0的方式1編程,采用查詢方式,程序如下:
42、# include sbit P1_0=P10 ; void main(void) TMOD=0 x01 ; /* 設置定時器1為非門控制方式1*/ TR0=1 ; /* 啟動 T/C0 */ for( ; ;) TH0= 0 xfc ; /* 裝載計數(shù)器初值 */ TL0= 0 x18 ; do while (!TF0) ; /* 查詢等待TF0置位 */ P1_0=!P1_0; /* 定時時間到P1.0反相 */ TF0=0; /* 軟件清 TF0 */ 55(2) 用定時器0的方式1編程,采用中斷方式。程序如下: # include sbit P1_0=P10 ; void time (
43、void) interrupt 1 using 1 /* T/C0中斷服務程序入口 */ P1_0=!P1_0 ; /* P1.0取反 */ TH0= -(1000/256); / * 重新裝載計數(shù)初值 */ void main( void ) TMOD=0 x01 ; /* T/C0工作在定時器非門控制方式1 */ P1_0=0; TH0= 0 xfc ; /* 預置計數(shù)初值 */ TL0= 0 x18; ET0= 1 ; /* T/C0中斷開放 */ TR0=1 ; /* 啟動T/C0開始定時 */ EA=1 ; /* CPU中斷開放 */ do while(1) ; /* 等待中斷 */
44、 561.7.3 ADC0809與8031接口的數(shù)據(jù)采集程序舉例。57程序如下: # include # include # define uchar unsigned char # define IN0 XBYTE 0 x7ff8 /* 設置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 ; /* 啟動轉換 */ while (ad_busy = =0 ) ; /* 查詢等待轉換結束 */ xi = * ad_adr ; /* 存轉換結果 */ 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轉換器 */ r = 0 ; /* 產生CE=1 */ w = 0 ; ADCOM = 0 ; /* 啟動轉換 */ while ( adbusy = =1 ) ; /* 等待
47、轉換*/ return ( ( uint )(ADHI4 )+( ADLO &0 x0f ) ); /* 返回12位采樣值*/ main ( ) uint idata result ; result =ad574 ( ) ; /* 啟動AD574進行一次轉換,得轉換結果 */ 621.7.5 8031與DAC0832雙緩沖接口的數(shù)據(jù)轉換程序舉例63將data1和data2數(shù)據(jù)同時轉換為模擬量的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/A 同時轉換 * /641.7.6 8031與DAC0832單緩沖區(qū)接口的數(shù)據(jù)轉換舉例65按片選線確定FFFEH為DAC0832的端口地址。使運行輸出端輸出一個鋸齒波電壓信號的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轉換輸出 */ 661.7.7 行列式鍵盤與8031的接口 鍵盤輸入信息的主要過程是: (1) 單片機判斷是否有鍵按下。 (2) 確定按下的是哪一個鍵。 (3) 把此步驟代表的信息翻譯成計算機所能識別的代碼,如ASCII或其它特征碼。
50、678031與行列式鍵盤的接口 6844鍵盤的掃描程序。 掃描程序查詢的內容為: (1) 查詢是否有鍵按下。首先單片機向行掃描P1.0 P1.3輸出全為0掃描碼F0H,然后從列檢查口P1.4 P1.7輸入列掃描信號,只要有一列信號不為1,即P1口不為F0H,則表示有鍵按下。接著要查出按下鍵所在的行、列位置。69 (2) 查詢按下鍵所在的行列位置。單片機將得到的信號取反,P1.4P1.7中的為1的位便是鍵所在的列。接下來要確定鍵所在的行,需要進行逐行掃描。單片機首先使P1.0為0,P1.1P1.7為1,即向P1口發(fā)送掃描碼FEH,接著輸入列檢查信號,若全為1,表示不在第一行。接著使P1.1接地,
51、其余為1,再讀入列信號這樣逐行發(fā)0掃描碼,直到找到按下鍵所在的行,將該行掃描碼取反保留。當各行都掃描以后仍沒有找到,則放棄掃描,認為是鍵的誤動作。70 (3) 對得到的行號和列號譯碼,得到鍵值。 (4) 鍵的抖動處理。當用手按下一個鍵時,往往會出現(xiàn)所按鍵在閉合位置和斷開位置之間跳幾下才穩(wěn)定到閉合狀態(tài)的情況。在釋放一個鍵時,也會出現(xiàn)類似的情況,這就是鍵抖動,抖動的持續(xù)時間不一,通常不會大于10 ms,若抖動問題不解決,就會引起對閉合鍵的多次讀入,對于鍵抖動最方便的解決方法就是當發(fā)現(xiàn)有鍵按下后,不是立即進行逐行掃描,而是延時10 ms后再進行。由于鍵按下的時間持續(xù)上百毫秒,延時后再處理也不遲。71
52、掃描函數(shù)的返回值為鍵特征碼,若無鍵按下,返回值為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 ( ) ; /* 延時去抖動 */ 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 可編程鍵盤/顯示器接口INTEL 8279INTEL 8279是一種可編程鍵盤/顯示器接口芯片,它含有鍵盤輸入和顯示器輸出兩種功能 。 使用它可以簡化系統(tǒng)的軟硬件設計,充分提高CPU的工作效率。741、引腳功能:(1)與CPU總線接口部分D0D7:雙向、三態(tài)數(shù)據(jù)總線,與系統(tǒng)數(shù)據(jù)總線相連,用于CPU與8279之間傳送控制、狀態(tài)和數(shù)據(jù)信息。CLK:系統(tǒng)的時鐘輸入線,用于產生內部時鐘。RESET:復位信號,輸入線,高電平有效。當
55、RESET為1時,8279復位。其復位狀態(tài)為16字符顯示,左端輸入,編碼掃描鍵盤,雙鍵鎖定,程序時鐘編程為31。CS:片選輸入線,低電平有效。CS=0時,8279才能工作。 75A0: D0D7數(shù)據(jù)選擇輸入線。當A0=0,表示傳送的是數(shù)據(jù);當A0=1,表示輸入、輸出命令或狀態(tài)。RD:讀控制信號,低電平有效。CPU從8279讀數(shù)據(jù)。WR:寫控制信號,低電平有效。CPU向8279寫數(shù)據(jù)。IRQ:中斷請求信號,高電平有效。在鍵盤工作方式中,當FIFO/傳感器RAM存有數(shù)據(jù)時,IRQ為高電平。CPU每次從RAM中讀出數(shù)據(jù)時,IRQ變?yōu)榈碗娖?。若RAM中仍有數(shù)據(jù),則IRQ再次恢復為高電平。在傳感器工作方
56、式中,每當檢測到傳感器狀態(tài)變化時,IRQ就出現(xiàn)高電平。76(2)數(shù)據(jù)顯示接口部分OUTA0OUTA3:A組顯示信號輸出線。OUTB0OUTB3:B組顯示信號輸出線。BD:顯示器消隱指示,輸出。用于在數(shù)字轉換時指示消隱,或用于由顯示消隱命令控制下的消隱指示。SL0SL3:用于鍵盤/傳感器矩陣或顯示器的掃描輸出線,可編程設定為編碼方式或內部譯碼方式。77(3)鍵盤接口部分RL0RL7:鍵盤返回輸入線,是鍵盤陣列或傳感器陣列的列(或行)的輸入線。內部設置有上拉電路,平時保持為“1”,當矩陣結點上有開關閉合時變?yōu)?。SHIFT:移位輸入線,通常用來擴充鍵功能,可以用做鍵盤上、下檔功能鍵。CNTL/ST
57、B:控制/選通輸入線。在鍵盤工作方式時,該信號是鍵盤數(shù)據(jù)的最高位,通常用來擴充鍵開關的控制功能,作為控制功能鍵使用。在選通輸入工作方式時,該信號的上升沿可將來自RL0RL7的數(shù)據(jù)存入FIFO RAM中。788279與單片機、鍵盤/顯示器的接口79 2、8279的內部結構框圖80(1) I/O控制及數(shù)據(jù)緩沖器 數(shù)據(jù)緩沖器是雙向緩沖器,連接內外總線,用于傳送CPU和8279之間的命令或數(shù)據(jù),對應的引腳為數(shù)據(jù)總線D0D7。 I/O控制線是CPU對8279進行控制的引線,對應的引腳為數(shù)據(jù)選擇線A0、片選線 、讀/寫信號線和。(2) 控制與定時寄存器及定時控制 控制與定時寄存器用來寄存鍵盤及顯示工作方式
58、控制字,同時還用來寄存其它操作方式控制字 。(3) 掃描計數(shù)器:鍵盤和顯示器共用,提供鍵盤和顯示器的掃描信號。81(4) 回復緩沖器、鍵盤去抖及控制 在鍵盤工作方式中,回復線作為行列式鍵盤的列輸入線,相應的列輸入信號稱為回復信號,由回復緩沖器緩沖并鎖存。在逐行列掃描時,回復線用來搜尋每一行列中閉合的鍵。 (5) FIFO/傳感器及其狀態(tài)寄存器 FIFO/傳感器RAM是一個雙重功能的88 RAM。在鍵盤選通工作方式時,它是FIFO存儲器,其輸入/輸出遵循先入先出的原則 。82(6) 顯示RAM和顯示寄存器,16X8。 8279內部有16X8的顯示RAM,通過顯示寄存器和兩個四位端口0UT A0-
59、3,0UT BO-3來刷新顯示,顯示器可以是LED,也可以是8段數(shù)碼管,顯示RAM可以是16X8的形式,也可以構成兩個16x4的RAM形式,顯示RAM可由CPU進行讀寫,被讀寫的RAM字節(jié)地址由顯示地址寄存器指示. 顯示地址寄存器保存當前CPU讀或寫的那個RAM地址,以及正顯示著的那兩個4位半字節(jié)的地址, 讀寫地址由CPU命令編程,也可置為每次讀寫后地址自動加1的工作方式,在設置了正確的工作方式后,顯示RAM可直接由CPU讀出,半字節(jié)A和半字節(jié)B地址自動由8279更新,以適應由CPU送入的數(shù)據(jù),A和B半字節(jié)可獨立送入,也可作為一個字送入,隨CPU所設置的工作方式而定。83 3、8279工作方式
60、(1)鍵盤工作方式鍵盤掃描方式,雙鍵互鎖:在這種方式,如果只有一個鍵被按下,則此鍵值連同CTRL和SHIFT的狀態(tài)一起送到FIFO RAM中,如果FIFO空,IRQ=1;如果FIFO滿,便置錯誤標志,鍵值不會送入FIFO RAM中。若有兩個或兩個以上鍵同時被按下,則不管這些鍵是以什么次序按下的,它只識別最后一個釋放的鍵,并把此鍵值送入FIFO RAM中。鍵盤掃描方式,N鍵巡回:在這種方式,一次可以按下任意個鍵,這些鍵均被識別,并按鍵掃描的順序把鍵值送入FIFO RAM 中。D7D6D5D4D3D2D1D0CNTLSHIFT行號列號84(2)顯示器的工作方式 CPU將顯示數(shù)據(jù)寫入顯示緩沖器時有左
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 高考物理總復習專題一直線運動第3講運動學圖像練習含答案
- 蔬菜采購合同的簽訂證明
- 電子地磅工崗位職責
- 江蘇省江陰市七年級體育與健康上冊《蹲踞式跳遠》教案
- 2024-2025學年高中政治 第4單元 第9課 第1框 建設社會主義文化強國教案 新人教版必修3
- 2023一年級數(shù)學上冊 5 6~10的認識和加減法第1課時 6和7的認識教案 新人教版
- 2024六年級語文下冊 第五單元 14 文言文二則說課稿 新人教版
- 2024-2025學年高中生物 第7章 第2節(jié) 現(xiàn)代生物進化理論的主要內容1教案 新人教版必修2
- 2023二年級語文下冊 第三單元 識字2 傳統(tǒng)節(jié)日說課稿 新人教版
- 高考地理一輪復習第十一章交通運輸布局與區(qū)域發(fā)展第一節(jié)區(qū)域發(fā)展對交通運輸布局的影響課件
- 保健按摩師(高級)技能理論考試題庫(含答案)
- 大學生職業(yè)發(fā)展與就業(yè)指導22-23-2學習通超星期末考試答案章節(jié)答案2024年
- 第五單元測試卷(單元測試)-2024-2025學年六年級上冊語文統(tǒng)編版
- 《2023級學生手冊》獎、懲資助、文明部分學習通超星期末考試答案章節(jié)答案2024年
- 國開2024年秋《機械制圖》形考作業(yè)1-4答案
- 大學生生涯發(fā)展展示 (修改版)
- 康復治療技術的職業(yè)規(guī)劃課件
- 義務教育物理課程標準(2022年版)測試題文本版(附答案)
- 大學生職業(yè)生涯規(guī)劃智慧樹知到課后章節(jié)答案2023年下?lián)犴樎殬I(yè)技術學院
- 《珍愛生命》主題班會
- 中藥方劑基本知識
評論
0/150
提交評論