版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、2008年12月16日C51單片機(jī)技術(shù)教程田希暉薛亮儒人民郵電出版社第1章C51單片機(jī)的組成及結(jié)構(gòu)第2章C51單片機(jī)指令系統(tǒng)第3章單片機(jī)的C程序設(shè)計(jì)第4章C51單片機(jī)內(nèi)部資源第5章單片機(jī)的系統(tǒng)擴(kuò)展第6章單片機(jī)的機(jī)間通信第7章單片機(jī)人機(jī)交互的C編程第8章KeilC51上機(jī)指南第9章單片機(jī)系統(tǒng)綜合實(shí)例筆記不是把所有知識(shí)點(diǎn)都記下。而是記那些需要學(xué)習(xí)的,或者總結(jié)得很好的東西。/指令系統(tǒng)的尋址方式和尋址空間序號(hào)尋址方式使用符號(hào)和變量尋址空間1立即數(shù)#data,#data16程序存儲(chǔ)器(片內(nèi)片外)64KB2直接direct或data,#data16內(nèi)部RAM128B數(shù)據(jù)存儲(chǔ)器(片外RAM)64KB訪問(wèn)SF
2、R的唯一方法3寄存器R0R7,A,B,Cy,DPTR片內(nèi)RAM128B4寄存器間接R0,R1,SP片內(nèi)RAM128BR0,R1,DPTR數(shù)據(jù)存儲(chǔ)器(片外RAM)64KB5相對(duì)PC+rel(偏移量)程序存儲(chǔ)器(片內(nèi)片外)64KB6變址A+DPTR,A+PC同上7位bit內(nèi)部RAM(20H2FH),SFR內(nèi)部RAM數(shù)據(jù)傳送指令示意圖C51的數(shù)據(jù)類型1、基本類型、構(gòu)造類型、指針類型、空類型2、基本類型:位型(bit)、字符型(char)、整型(int)、長(zhǎng)整型(long)、浮點(diǎn)型(float)、雙精度浮點(diǎn)型(double)3、構(gòu)造類型:數(shù)組類型、結(jié)構(gòu)體、共用體、枚舉C51系列單片機(jī)將int型變量的高
3、位字節(jié)數(shù)存放在低地址字節(jié)中。浮點(diǎn)數(shù)存儲(chǔ)格式IEEE754標(biāo)準(zhǔn)。24位精度,尾數(shù)的最高位始終為“1”,因而不保存,內(nèi)存中字節(jié)存儲(chǔ)順序如下:1位符號(hào)位、8位指數(shù)位、23位尾數(shù)地址+0+1+2+3內(nèi)容MMMMEMMSEE其中,S符號(hào)位,E階碼,M尾數(shù)C51的變量的存儲(chǔ)類型存儲(chǔ)類型與存儲(chǔ)空間的對(duì)應(yīng)關(guān)系data直接尋址片內(nèi)數(shù)據(jù)存儲(chǔ)區(qū),訪問(wèn)速度快(128B)bdata可位尋址片內(nèi),允許位與字節(jié)混合訪問(wèn)(16B)idata間接尋址片內(nèi),可訪問(wèn)片內(nèi)全部RAM地址空間(256B)pdata分貝尋址片外(256B)xdata片外(64KB)code程序存儲(chǔ)器(64KB)變量說(shuō)明舉例:datacharvar;/字符
4、變量var定位在片內(nèi)數(shù)據(jù)存儲(chǔ)區(qū)charcodeMSG="PARAMETER"字符數(shù)組MSG口定位在程序存儲(chǔ)區(qū)unsignedlongxdataarray100;無(wú)符號(hào)長(zhǎng)整型數(shù)組定位在片外RAM區(qū)bitlock;unintxdatavector1044;sfrP0=0x80;charbdataflags;sbitflag0=flagsA0;指針變量說(shuō)明舉例:longxdata*px;指針px指向long型xdata區(qū),指針本身位于在默認(rèn)存儲(chǔ)區(qū),指針長(zhǎng)度為2Bcharxdata*datapd;/指針pd指向字符型xdata區(qū),自身在data區(qū),長(zhǎng)度為2Bdatacharxdat
5、a*pd;/同上(等效)dataint*pn;/和int*datapn及intr*pn等效,定義一個(gè)類型為int型的通用型指針,指針本身在data區(qū),長(zhǎng)度為3B。說(shuō)明:指針指向的存儲(chǔ)類型,即指向哪個(gè)存儲(chǔ)區(qū)。存儲(chǔ)類型的聲明位置在數(shù)據(jù)類型和指針名(如*px)之間,如無(wú)此項(xiàng)聲明,則此指針型變量為通用型。指針變量自身的存儲(chǔ)類型,即指針處于什么區(qū)與自身的長(zhǎng)度無(wú)關(guān),該聲明可位于聲明語(yǔ)句的開關(guān),也可在"*"和變量名之間。#include<reg51.h>特殊功能寄存器定義#include<absacc.h>絕對(duì)地址定義位變量及其定義1、位變量C51定義一般語(yǔ)法格式
6、:bit位變量名;如:bitlock_bit;2、采用字節(jié)尋址變量.位的方法。如:bdataintibase;sbitmybit=ibaseA15;3、函數(shù)可包含類型為bit的參數(shù),也可將其作為返回值。但注意,使用(#pragmadisable)或包含明確的寄存器組切換(usingn)的函數(shù)不能返回位值。4、對(duì)特殊功能寄存器的位的定義。例:#include<reg51.h>sbitP1_1=P1A1;/無(wú)名位sbitac=ACCA7;/無(wú)名位RS1=1;RS0=0;有名位sbitOV=0xD0A2;sbitCY=PSWA7;5、對(duì)位變量定義的限制。位變量不能定義為指針、數(shù)組。左移邏
7、輯右移或算術(shù)右移,取決于計(jì)算機(jī)系統(tǒng)。看懂下面的就很容易理解頭文件absacc.h中的絕對(duì)地址訪問(wèn)了。一般指針包括3字節(jié):2字節(jié)偏移和1字節(jié)存儲(chǔ)器類型:即地址+0+1+2內(nèi)容存儲(chǔ)器類型偏移量高位偏移量低位其中,存儲(chǔ)器類型編碼如下:存儲(chǔ)器類型idataxdatapdatadatacode編碼值12345例,以xdata類型的0x1234地址作為指針可以表示如下:地址+0+1+2內(nèi)容0x020x120x34常數(shù)作指針時(shí),必須注意正確定義存儲(chǔ)類型和偏移。例:把常數(shù)0x40寫入地址為0x8000的外部數(shù)據(jù)存儲(chǔ)器。#defineXBYTE(char*)0x20000L)XBYTE0x8000=0x40;其
8、中,XBYTE被定義為(char*)0x20000L,0x20000L為一般指針,其存儲(chǔ)類型為2,偏移量為0x0000,這樣X(jué)BYTE成為指向xdata零地址的指針,而XBYTE0x8000則是外部數(shù)據(jù)存儲(chǔ)器的0x80000絕對(duì)地址。/后面還有頭文件absacc.h中其化存儲(chǔ)區(qū)的絕對(duì)地址訪問(wèn)定義共用體變量可在不同時(shí)間內(nèi)保存不同類型和長(zhǎng)度的數(shù)據(jù),從而提供了在同一存儲(chǔ)單元中可以分時(shí)操作不同類型數(shù)據(jù)的功能。unionUuintword;structucharhi;ucharlo;bytes;unionUnewcount;unitoldcount;newcount.bytes.hi=TH1;newco
9、unt.bytes.lo=TL1;oldcount=newcount.word;這樣,定時(shí)器的計(jì)數(shù)值即可以按字節(jié)使用,也可以按字使用。函數(shù)“聲明”和“定義”:“定義”是指對(duì)函數(shù)功能的確定,包括指定函數(shù)名、函數(shù)值類型,形參及其類型、函數(shù)體等,它是一個(gè)完整的、獨(dú)立的函數(shù)單位;而“聲明”的作用則是把函數(shù)的名字、函數(shù)類型以及形參的類型、個(gè)數(shù)和順序通知編譯系統(tǒng),以使在調(diào)用該函數(shù)時(shí)系統(tǒng)按此對(duì)照檢查。函數(shù)指針即函數(shù)入口地址。對(duì)用函數(shù)的指針變量調(diào)用函數(shù)可歸納為如下幾點(diǎn):(1)指向函數(shù)的指針變量的一般定義形式為:函數(shù)值返回類型(*指針變量名)(函數(shù)形參表);(2)在給函數(shù)指針變量賦值時(shí),只需給出函數(shù)名。(3)對(duì)
10、指向函數(shù)的指針變量進(jìn)行諸如p+n,p+,p-的運(yùn)算是沒(méi)有意義的。C51的庫(kù)函數(shù)1字符函數(shù)庫(kù)CTYPE.HexternbitF(char);其中,F可以為isalpha/isalnum/iscntrl/islower/isupper/isdigitalexterncharF(char);其中,F(xiàn)可以為toint/toupper/tolower2標(biāo)準(zhǔn)函數(shù)庫(kù)STDLIB.HexternTatoX(char*S);其中,T可以是float/long/int,X與T對(duì)應(yīng)分別為f/l/ivoid*malloc(unsignedintsize);/申請(qǐng)內(nèi)存voidfree(void*p);/釋放內(nèi)存void
11、initmempool(void*p,unsignedintsize);/清零內(nèi)存區(qū)3數(shù)學(xué)函數(shù)庫(kù)MATH.HexternTabs(Tval);其中,T可以是float/long/int/charexternfloatexp(floatx);/e的指數(shù)externfloatlog/log10(floatx);/e或10的對(duì)數(shù)externfloatsqrt(floatx);/平方根externfloatsin/cos/tan(floatx);/三角函數(shù)externfloatpow(floatx,floaty);/x的y次方4絕對(duì)地址訪問(wèn)頭文件ABSACC.H#defineXBYTE(unsigne
12、dchar*)0x20000L;PBYTE3DBYTE4CBYTE5以上定義用來(lái)對(duì)C51系列單片機(jī)的存儲(chǔ)空間進(jìn)行地址訪問(wèn),以字節(jié)為單位尋址。只需將BYTE換成WORD,就可以實(shí)現(xiàn)以字為單位尋址。5內(nèi)部函數(shù)庫(kù)INTRINS.H/將變量循環(huán)左/右移n位unsignedchar_crol_(unsignedcharval,unsignedcharn);int_irol_intlong_lrol_longunsignedchar_cror_(unsignedcharval,unsignedcharn);int_iror_intlong_lror_long/對(duì)應(yīng)匯編的NOP指令,延時(shí)一個(gè)機(jī)器周期void
13、_nop_(void);/測(cè)試給定的位參數(shù)x是否為1。若為1,返回1,同時(shí)將該位復(fù)位為0;否則返回0。bit_testbit_(bitx);6訪問(wèn)SFR和SFR_bit地址頭文件REGxxx.H頭文件reg51.h、reg52.h等文件中定義了C51單片機(jī)中的SFR寄存器名和相關(guān)的位變量名。編程舉例循環(huán)隊(duì)列是一種FIFO存儲(chǔ)結(jié)構(gòu),在單片機(jī)應(yīng)用程序中經(jīng)常使用。隊(duì)列需要隊(duì)頭指針listhead、隊(duì)尾指針listtail、隊(duì)列長(zhǎng)度listlen、隊(duì)列空標(biāo)志listempty和隊(duì)列滿標(biāo)志listfull初始時(shí),listhead=listtail=0,listempty=listfull=0。需要定義兩
14、個(gè)函數(shù),操作隊(duì)列l(wèi)istwrite()、listread()。iswrite()函數(shù)的操作思路:if(隊(duì)列滿)退出;else/將數(shù)據(jù)寫入listtail指向的數(shù)組單元listtail+;if(listtail=listlen)listtail=0;listempty=0;if(listhead=listtail)listfull=1;listread()/函數(shù)的操作思路:if(隊(duì)列空)/退出else/將listtail指向的數(shù)組單元的內(nèi)容讀出;listhead+;if(listhead=listlen)listhead=0;listfull=0;if(listtail=listhead)lis
15、tempty=1;函數(shù)的實(shí)現(xiàn):#definelistlen=10;unsignedcharlistlistlen;charlistwrite(charx)if(listfull)return0;else/將數(shù)據(jù)寫入listtail指向的數(shù)組單元listtail+;if(listtail=listlen)listtail=0;listempty=0;if(listhead=listtail)listfull=1;return1;charlistread(char*x)if(listempty)return0;else/將listtail指向的數(shù)組單元的內(nèi)容讀出;listhead+;if(list
16、head=listlen)listhead=0;listfull=0;if(listtail=listhead)listempty=1;return1;習(xí)題與思考:(挑了幾個(gè)問(wèn)答)1 .C語(yǔ)言中的類型是怎么分配的?什么是賦值操作?2 .C語(yǔ)言的函數(shù)有什么特性?函數(shù)的存儲(chǔ)類型和數(shù)據(jù)類型的意義是什么?3 .當(dāng)一個(gè)函數(shù)需要返回多個(gè)值時(shí),可以怎么做?4 .編寫把字符串s逆轉(zhuǎn)的函數(shù)reverse。5 .把上面的函數(shù)寫成遞歸函數(shù)。精選范本第4章C51單片機(jī)的內(nèi)部資源重點(diǎn)及難點(diǎn)單片機(jī)中斷和定時(shí)與單片機(jī)通信的基本概念、單片機(jī)的中斷系統(tǒng)、單片機(jī)的定時(shí)/計(jì)數(shù)器、單片機(jī)外部中斷源的擴(kuò)展、數(shù)據(jù)傳遞的方式、串行通信控制
17、寄存器、MCS-51串行通信工作方式及其應(yīng)用?;疽? .掌握單片機(jī)中斷和定時(shí)與單片機(jī)通信的基本概念2 .掌握單片機(jī)的中斷源、中斷控制、中斷響應(yīng)過(guò)程的基本概念及單片機(jī)系統(tǒng)的功能和使用方法3 .掌握單片機(jī)的定時(shí)/計(jì)數(shù)器的初值計(jì)算、工作方式控制寄存器的初始化、程序的設(shè)計(jì)方法和步驟4 .串行通信的基本方式、數(shù)據(jù)傳送的次序、串行通信控制器的每一位的定義、串行通信的四種工作方式5 .了解單片機(jī)外部中斷源擴(kuò)展的常用方法和步驟教學(xué)內(nèi)容1、中斷系統(tǒng)2、定時(shí)/計(jì)數(shù)器3、串行通信接口無(wú)條件傳送方式、程序查詢方式、中斷傳送方式中斷系統(tǒng):中斷的基本概念、中斷源、外部中斷、內(nèi)部中斷、中斷入口地址中斷控制:TCON、I
18、E、IP,SCON中斷控制寄存器匯總寄存器名稱D7D6D5D4D3D2D1D0定時(shí)/計(jì)數(shù)器TCON(88H)TF1TR1TF0TR0IE1IT1IE0IT0位地址略串行口控制SCON(98H)SM0SM1SM2RENTB8RB8TIRI寄存器位地址略中斷允許寄IE(A8H)EA/ESET1TX1ET0EX0存器位地址略中斷優(yōu)先級(jí)IP(B8H)/PSPT1PX1PT0PX0寄存器位地址略中斷響應(yīng):中斷響應(yīng)的條件、中斷響應(yīng)的過(guò)程、中斷響應(yīng)時(shí)間、中斷請(qǐng)求的撤銷、寄存器組切換/下面的話讓人暈是他沒(méi)講清,還是我沒(méi)搞清呢不要緊看懂后面的就可以了。寄存器組切換,在匯編語(yǔ)言中由編程者選擇。但對(duì)混合語(yǔ)言編程的連
19、接器,匯編程序使用的組可被選定,因而連接器不能像普通存儲(chǔ)器那樣分配寄存器組。在C51中,寄存器組選擇取決于特定的編譯器指令。高優(yōu)先組中斷可以中斷正在處理的低優(yōu)先級(jí)程序,因而必須注意寄存器組。除非可以確定未使用R0R7(用匯編程序),最好給每種優(yōu)先級(jí)程序分配不同的寄存器組。中斷不允許用于外部函數(shù),它對(duì)函數(shù)目標(biāo)代碼影響有收下幾點(diǎn):(1)當(dāng)調(diào)用函數(shù)時(shí),SFR的ACC、B、DPH、DPL、PSW。(當(dāng)需要時(shí))入棧。(2)如果不使用寄存器組切換,甚至中斷函數(shù)所需的所有工作寄存器都入棧。(3)函數(shù)退出前,所有的寄存器內(nèi)容出棧。(4)函數(shù)由8051的指令RETI終止。中斷服務(wù)程序使用的任何程序也使用一寄存器
20、組。遞歸程序可以使用,它們自己調(diào)用自己是因?yàn)樗鼈円蕾嚩褩?。在中斷程序的編寫中?yīng)該注意以下幾點(diǎn):(1)采用開中斷總控制開關(guān)EA置位中斷源的中斷允許位;(2)對(duì)外部中斷INTO、INT1應(yīng)選擇中斷觸發(fā)方式;(3)對(duì)于多個(gè)中斷源中斷,應(yīng)設(shè)定中斷優(yōu)先級(jí)和預(yù)置IP;(4)編寫中斷服務(wù)程序應(yīng)注意保護(hù)現(xiàn)場(chǎng)和恢復(fù)現(xiàn)場(chǎng),以免中斷返回時(shí)丟失原寄存器、累加器中的信息;(具體要保護(hù)哪些東西視CPU中斷機(jī)制和需要而定)(5)若要在掛靠當(dāng)前中斷程序時(shí)禁止更高優(yōu)先級(jí)中斷,可以采用軟件關(guān)CPU中斷或禁止某中斷源中斷,在中斷返回前再開放中斷。中斷服務(wù)程序的完整語(yǔ)法如下:返回值函數(shù)名(參數(shù))模式重入interruptnusing
21、ndate:2008年12月17日要畫圖!如果通用語(yǔ)言簡(jiǎn)述就好了,但要描述準(zhǔn)確哦。電腦畫圖麻煩。但要做筆記,還怕麻煩?EG:圖P1.4P1.7接4個(gè)LED(即發(fā)光二極管),P1.0P1.3接4個(gè)KEY(即開關(guān)),消抖電路用于產(chǎn)生中斷請(qǐng)求信號(hào),通過(guò)每中斷一次,開關(guān)狀態(tài)反映到/INTO/(負(fù)電平輸入不方便)。要求:開始時(shí)LED全黑;中斷編程實(shí)例圖P1 3INTOPl 7EALED上,且開關(guān)斷開時(shí)對(duì)應(yīng)LED亮。#include<reg51.h>sbitP1_0=P1A0;sbitP1_7=P1A7;unsignedcharbreaks;bitflag;voidsevice_intO()i
22、nterrupt0using2/INTO中斷服務(wù)程序,使用第2組寄存器flag=l;/置標(biāo)志breaks=P1;/存狀態(tài)voidmain()IP=0x01;/置INTO高優(yōu)先級(jí)中斷IE=0x81;/INTO開中斷,CPU開中斷for(;)if(flag) / 查詢方式P14=P10P15=P11P16=P12P17=P13flag=0;/處理完成清除標(biāo)志4.3定時(shí)/計(jì)數(shù)器不管是獨(dú)立的定時(shí)器芯片還是單片機(jī)內(nèi)的定時(shí)器都有以下特點(diǎn):(1)定時(shí)/計(jì)數(shù)有多種方式,可以是計(jì)數(shù)方式也可以是定時(shí)方式。(2)計(jì)數(shù)初值可設(shè)定,計(jì)數(shù)溢出時(shí)發(fā)出中斷申請(qǐng)。51單片機(jī)有兩個(gè)加1計(jì)數(shù)器T0、T1。分別由兩個(gè)8位寄存器構(gòu)成。
23、由TMOD、TCON設(shè)定工作方式。兩個(gè)定時(shí)器都有定時(shí)或事件計(jì)數(shù)功能,可用于定時(shí)控制、對(duì)外部事件計(jì)數(shù)和檢測(cè)等場(chǎng)合。1定時(shí)工作方式計(jì)數(shù)機(jī)周期(fosc/12)2計(jì)數(shù)工作方式通過(guò)T0(P3.4)和T1(P3.5)對(duì)外部脈沖信號(hào)計(jì)數(shù)。當(dāng)檢測(cè)到下降沿時(shí),計(jì)數(shù)器加1.由于檢測(cè)一個(gè)1到0的跳變需要2個(gè)機(jī)器周期,故最高計(jì)數(shù)頻率為fosc/24。雖然對(duì)輸入信號(hào)占空比無(wú)特殊要求,但為了確保某個(gè)電平在變化之前至少被采樣一次要求電平保持時(shí)間至少是一個(gè)完整的機(jī)器周期。4.3.1TCON和TMODTCON:TF1TR1TF0TR0IE1IT1IE0IT0TMOD:GATEC/TM1M0工作方式:013位計(jì)數(shù)器(低5位,高
24、8位)1 16位。2 初值自動(dòng)重裝8位3 2個(gè)8位,僅適用于T0/下面描述得很好工作方式3下,T0被拆成2個(gè)獨(dú)立的8位計(jì)數(shù)器TL0和TH0。其中TL0即可以計(jì)數(shù)使用,又可以定時(shí)使用,使用T0的控制位和控制引腳信號(hào)。在方式3下,T0、T1的設(shè)置和使用是不同的。(1) T0方式3TL0:使用T0原有控制資源(控制位和引腳信號(hào))TH0:借用T1的TR1、TF1,只能作8位定時(shí)器。(2) T0方式3下白TT1T0方式3時(shí),T1仍然可工作于方式02.C/T控制位仍可使T1工作在定時(shí)器或計(jì)數(shù)器方式,只是由于其TR1、TF1被T0的TH0占用,因而沒(méi)有計(jì)數(shù)溢出標(biāo)志可供使用,計(jì)數(shù)溢出時(shí)只能將輸出結(jié)果送到串行口
25、,即用作串行口波特率發(fā)生器。T0方式3下的T1方式2,因定時(shí)初值能自動(dòng)恢復(fù),用作波特率發(fā)生器更合適。定時(shí)/計(jì)數(shù)器的應(yīng)用實(shí)例EG設(shè)單片機(jī)的fosc=12MHz,要求在P1.0腳上輸出周期為2ms的方波。分析:周期為2ms的方波要求定時(shí)時(shí)間間隔1ms,每次時(shí)間到P1.0取反。定時(shí)器計(jì)數(shù)率=fosc/12,機(jī)器周期=12/fosc=1us計(jì)數(shù)次數(shù)=1000/(12/fosc)=1000/1=1000定時(shí)初值-1000(1)用定時(shí)器0的方式1編程,采用查詢方式#include<reg51.h>sbitP1_0=P1A0;voidmain()TMOD=0x01;/T0方式1TR0=1;/啟動(dòng)
26、T0for(;)TH0=-(1000/256);TL0=-(1000%256);while(!TF0);/查詢等待TF0置位P1_0=!P1_0;/TF0=0;/軟件清TF0(2)用定時(shí)器0的方式1編程,采用中斷方式voidinclude<reg51.h>sbitP1_0=P1A0;voidtimer0()interrupt1using1P1_0=!P1_0;/TH0=-(1000/256);TL0=-(1000%256);voidmain()TMOD=0x01;TH0=-(1000/256);TL0=-(1000%256);EA=1;ET0=1;TR0=1;dowhile(1);
27、EG:采用10MHz晶振,在P1.0腳上輸出周期為2.5s,占空比20%的脈沖信號(hào)。分析:由于采用10MHz晶振,使用定時(shí)器最大定時(shí)幾十ms。即10ms定時(shí),周期2.5s需要250次中斷,占空比20%,高電平應(yīng)為50次中斷。采用10ms定時(shí),晶振fosc=10MHz,因此需定時(shí)器計(jì)數(shù)次數(shù)=8333#include<reg51.h>#defineuncharunsignedcharuchartime;/計(jì)數(shù)中斷次數(shù)ucharperiod=250;/周期為2.5s,中斷周期10ms,250次ucharhigh=50;/占空比20%voidtimer0()interrupt1using1
28、TH0=-8333/256;TL0=-8333%256;if(+time=high)P1=0;elseif(time=period)time=0;P1=1;voidmain()TMOD=0x01;TH0=-8333/256;TL0=-8333%256;EA=1;ET0=1;TR0=1;while(1);EG:設(shè)P1口的P1.0和P1.1上有2個(gè)開關(guān)S1和S2,周期開始時(shí)全關(guān)。2s以后S1開,0.1s后S2開,S1保持開2.0s,S2保持開2.4s,周而復(fù)始。采用10MHz晶振。分析:根據(jù)要求,P1.0和P1.1開始順序?yàn)椋海P(guān)關(guān))2s后(關(guān)開)0.1s后(開開)1.9s后(開關(guān))0.5s后(關(guān)
29、關(guān))采用10MHz晶振,每10ms中斷一次,0.1s對(duì)應(yīng)10次,開關(guān)變化對(duì)應(yīng)的中斷次數(shù)位置為0、200、210、400、450;相應(yīng)的P1.0輸出0、1、3、2#include<reg51.h>#defineucharunsignedchar#defineuintunsignedintuchari;/當(dāng)前狀態(tài)uinttime;/中斷次數(shù)codestructintposition;charpattern;next尸/采用結(jié)構(gòu)數(shù)組定義時(shí)間和輸出的對(duì)應(yīng)關(guān)系0,0X00,200,0X01,210,0X03,400,0X02,450,0XFF;voidtime0()interrupt1usi
30、ng1TH0=-8333/256;TL0=-8333%256;time+;if(time=nexti.position)if(nexti.pattern=0xff)i=time=0;/以0XFF判斷周期的結(jié)束P1=nexti+.pattern;voidmain()P1=0;time=0;i=1;TMOD=0x01;TH0=-8333/256;TL0=-8333%256;EA=1;ET0=1;TR0=1;for(;)4.4串行通信接口4.4.1 串行通信基礎(chǔ)知識(shí)1 .數(shù)據(jù)通信的基本概念通信是指CPU與外圍設(shè)備之間的數(shù)據(jù)傳送、轉(zhuǎn)換和處理。數(shù)據(jù)通信方式有兩種:并行數(shù)據(jù)通信和串行數(shù)據(jù)通信。串行數(shù)據(jù)通信
31、是指數(shù)據(jù)按位順序進(jìn)行傳送的通信方式。其特點(diǎn)是數(shù)據(jù)傳送是一位一位進(jìn)行傳送的,最少只需要一根傳輸線即可完成,成本低但速度慢。并行數(shù)據(jù)通信是指數(shù)據(jù)的各位同時(shí)進(jìn)行傳送的通信方式。其特點(diǎn)是各數(shù)據(jù)位同時(shí)傳送,傳送速度快、效率高。2 .異步通信和同步通信 異步串行通信以字符為單位。/*串行異步傳送的字符格式*/書上有,網(wǎng)上有,理解了才是實(shí)在。對(duì)異步串行通信的字符格式作如下說(shuō)明:起始位、數(shù)據(jù)位(低位在前/左)、奇偶校驗(yàn)位、停止位、空閑位 同步通信收發(fā)時(shí)鐘同步,字符與字符之間沒(méi)有間隙,也不用起始位和停止位,僅在數(shù)據(jù)塊開始時(shí)用同步字符SYNC來(lái)指示。3 .串行通信的數(shù)據(jù)通路形式單工(Simplex)形式、全雙工(
32、Full-duplex)形式、半雙工(Half-duplex)形式。串行通信數(shù)據(jù)通踣形式單工方式半雙工方式全雙工方式4 .串行接口的基本任務(wù)在串行通信中,通信雙方都按通信協(xié)議進(jìn)行。所謂通信協(xié)議就是通信雙方必須共同遵守的一種約定,約定包括數(shù)據(jù)的格式、同步的方式、傳送的步驟、檢糾錯(cuò)方式及控制字符的定義串行接口的任務(wù)主要包括以下幾個(gè)方面。(1)實(shí)現(xiàn)數(shù)據(jù)格式化(2)進(jìn)行串、并轉(zhuǎn)換(3)控制數(shù)據(jù)的傳輸速率(4)進(jìn)行傳送錯(cuò)誤檢測(cè)5 .波特率和接收/發(fā)送時(shí)鐘異步串行通信的傳送速率一般為509600波特,常用于計(jì)算機(jī)到CRT終端和字符打印機(jī)之間的通信、直通電報(bào)以及無(wú)線電通信的數(shù)據(jù)發(fā)送等。6 .4.2C51串行
33、接口C51單片機(jī)有一個(gè)強(qiáng)編程的全雙工異步串行通信接口,它可作UART用,也可作同步移位寄存器,其幀格式可有8位、10位或11位,并能設(shè)置各種波特率,給使用者帶來(lái)很大的設(shè)計(jì)靈活性。1 .串行口寄存器結(jié)構(gòu)2 .串行接口控制SBUFSCON:SM0SM1SM2REMTB8RB8TIRIPCON:SMOD/GF1GF0PDIDL(由于PCON寄存器不能進(jìn)行位尋址,因此,表中寫出的是“位序”而不是“位地址”)3.串行接口的工作方式方式0 8位同步移位寄存器,串行數(shù)據(jù)通過(guò)定波特率fosc/12方式1 10位異步通信方式,1位起始位(方式2和3 9位異步通信接口,一幀信息由RXD輸入/輸出,TXD輸出移位時(shí)
34、鐘脈沖。固0)、8位數(shù)據(jù)位和1位停止位(1)。11位組成。多機(jī)通信4.波特率的設(shè)計(jì)方式0、2波特率固定;方式1、3波特率由定時(shí)器T1的溢出率確定。(1)方式0的波特率不受SMOD位的影響。固定為fosc/12(2)方式2的波特率2Asmod*fosc/64(3)方式1、3的波特率2Asmod*定時(shí)器T1的溢出率T1的溢出周期=12/fosc*(M-X)5.串行口初始化(1)串行口波特率表串行口常用的波特串行口波特率常用于和微機(jī)的通信,選用晶振和波特率都相對(duì)固定。率及相應(yīng)的設(shè)置串行口的常用波特率串行口工作方式波特率fosc=6MHzfosc=12MHzfosc=11.059MHzSMODTMOD
35、TH1SMODTMODTH1SMODTMODTH1方式01MHzXXX方式2375k1XX187.5k1XX0XX方式1或方式362.5k120FFH19.2k120FDH9.6k020FDH4.8k120F3H020FAH2.4k120F3H120F3H020F4H1.2k120FFH020E6H020F8H600120E6H020CCH020D0H300020CCH02098H020A0H137.51201DH0201DH0202EH110020E6H010FEEBH010FEFFH(2)初始化步驟確定定時(shí)器T1的工作方式,即編程TMOD寄存器;計(jì)算定時(shí)器T1的初值,即裝載TH1、TL1;
36、 啟動(dòng)定時(shí)器T1,即編程TCON中的TR1位; 確定串行口的控制,即編程SCON; 串行口中中斷方式工作時(shí),須開CPU和源中斷,即編程IE寄存器。6.串行口的應(yīng)用編程EG:單片機(jī)fosc=11.0592MHz,波特率9600,各設(shè)置32個(gè)字節(jié)的隊(duì)列緩沖區(qū)用于發(fā)送接收。設(shè)計(jì)單片機(jī)和終端或另一計(jì)算機(jī)通信的程序。分析:?jiǎn)纹瑱C(jī)串行口初始化為9600波特,中斷程序雙向處理字符,程序雙向緩沖字符。背景程序可以“放入”和“提取”在緩沖區(qū)的字符串,而實(shí)際傳入和傳出SBUF的動(dòng)作由中斷完成。Loadmsg函數(shù)加載緩沖數(shù)組,標(biāo)志發(fā)送開始。緩沖區(qū)分為發(fā)(t)和U(r)緩沖。緩沖區(qū)通過(guò)兩種指示(進(jìn)in和出out)和一
37、些標(biāo)志(滿full、空empty、完成done)管理。隊(duì)列緩沖區(qū)32字節(jié)長(zhǎng)為循環(huán)隊(duì)列,由簡(jiǎn)單的邏輯與(&)操作管理,它比取模()操作運(yùn)行更快。當(dāng)r_in=r_out接收緩沖(r_buf)區(qū)滿,不能再有字符插入;當(dāng)t_in=t_out,發(fā)送緩沖區(qū)(t_buf)空,發(fā)送中斷清除,停止UART請(qǐng)求。具體程序如下:#include<reg51.h>#defineucharunsignedcharucharxdatar_buf32;/背景程序“放入”和“提取”字符的隊(duì)列緩沖區(qū)ucharxdatat_buf32;ucharr_in,r_out,t_in,t_out;/隊(duì)歹1J指針bit
38、r_full,t_empty,t_done;/緩沖區(qū)狀態(tài)標(biāo)志codeucharm尸"thisisatestprogramrn"voidserial。interrupt4using1/*串行口中斷服務(wù)程序,從RI、TI判別接收或發(fā)送中斷,由軟件清除。判別緩沖區(qū)狀態(tài)(滿full和空empty)和全部發(fā)送完成(done);*/if(RI&&!r_full)r_bufr_in尸SBUF;RI=0;r_in=+r_in&0x1f;if(r_in=r_out)r_full=1;elseif(TI&&!t_empty)SBUF=t_buft_out
39、;TI=0;t_out=+t_out&0x1f;if(t_out=t_in)t_empty=1;elseif(TI)TI=0;t_done=1;voidloadmsg(ucharcode*msg)/*此函數(shù)把字符放入發(fā)送緩沖區(qū),準(zhǔn)備發(fā)送*/while(*msg!=0)&&(t_in+1)At_out)&0x1f)!=0)/*測(cè)試緩沖區(qū)滿*/tbuftin=*msg;msg+;t_in=+t_in&0x1f;if(t_done)TI=1;t_empty=t_done=0;/*若完成重新開始*/voidprocess(ucharch)return;/*接收字
40、符的處理程序,實(shí)際應(yīng)用自定義*/voidprocessmsg(void)/*此函數(shù)逐一處理接收緩沖區(qū)的字符*/while(r_out)+1Fr_in)!=0)/*接收緩沖區(qū)非空*/process(r_bufr_out);r_out=+r_out&0x1f;voidmain()/*主程序即背景程序,進(jìn)行串行口的初始化、載入字符、處理接收的字符串*/TMOD=0x20;/T0方式2TH1=0xfd;/9600波特11.0592MHzTCON=0x40;/啟動(dòng)T1SCON=0x50;/允許接收IE=0x90;/允許串行口中斷t_empty=t_done=1;r_full=0;r_out=t_
41、in=t_out=0;r_in=1;/接收緩沖區(qū)和發(fā)送緩沖區(qū)置空f(shuō)or(;)loadmsg(&m);/&m?processmsg();習(xí)題和思考題:1 .C51系列單片機(jī)有幾個(gè)中斷源,各中斷標(biāo)志是如何產(chǎn)生的,又是如何清0的?CPU響應(yīng)中斷時(shí),它們的中斷矢量地址分別是多少?2 .C51系列單片機(jī)有幾個(gè)中斷優(yōu)先級(jí)?如何設(shè)定?3 .設(shè)fosc=6MHz,外部中斷采用電平觸發(fā)方式,那么中斷請(qǐng)求信號(hào)的低電平至少應(yīng)持續(xù)多少us?4 .希望8051單片機(jī)定時(shí)器T0的定時(shí)值以內(nèi)部RAM的20H單元的內(nèi)容為條件而可變:當(dāng)(20H)=00H時(shí),定時(shí)值為10ms;當(dāng)(20H)=01H時(shí),定時(shí)值為20
42、ms。請(qǐng)根據(jù)以上要求對(duì)定時(shí)器T0初始化。設(shè)fosc=12MHz。5 .串行接口有哪幾種工作方式?各有什么特點(diǎn)?6 .若異步通信接口按方式3傳送,已知每分鐘傳送3600個(gè)字符,其波特率是多少?C51單片機(jī)的系統(tǒng)擴(kuò)展重點(diǎn)與難點(diǎn)單片機(jī)系統(tǒng)擴(kuò)展的基本概念、程序存儲(chǔ)器擴(kuò)展、數(shù)據(jù)存儲(chǔ)器擴(kuò)展、I/O口擴(kuò)展?;疽? .掌握單片機(jī)系統(tǒng)擴(kuò)展的基本概念2 .掌握程序存儲(chǔ)器擴(kuò)展方法3 .掌握數(shù)據(jù)存儲(chǔ)器擴(kuò)展方法4 .掌握常用擴(kuò)展芯片8255、8253、8155、I2C接口芯片24C02、SPI接口芯片X5045和單片機(jī)配置FPGA的使用方法本章內(nèi)容1 .系統(tǒng)擴(kuò)展概述2 .程序存儲(chǔ)器的擴(kuò)展3 .數(shù)據(jù)存儲(chǔ)器的擴(kuò)展4 .
43、可編程外圍并行接口82555 .可編程外圍定時(shí)器82536 .可編程并行接口芯片81557 .I2C接口芯片AT24C018 .SPI接口芯片X50459.單片機(jī)配置FPGA5.1 系統(tǒng)擴(kuò)展概述(1) C51單片機(jī)的最小系統(tǒng)(2)系統(tǒng)擴(kuò)展結(jié)構(gòu):系統(tǒng)總線(AB、DB、CB)和總線構(gòu)造(單片機(jī)沒(méi)有提供專用的地址線和數(shù)據(jù)線,而是采用I/O口線的復(fù)用技術(shù),把I/O口改造為總線)“構(gòu)造”總線的具體方法包括以下幾個(gè)方面:以P0口的8位口線作地址/數(shù)據(jù)線以P2口的口線作高位地址線控制信號(hào)線:使用ALE作地址鎖存的選通信號(hào),以實(shí)現(xiàn)低8位地址的鎖存;以/PSEN信號(hào)作擴(kuò)展程序存儲(chǔ)器的讀選通信號(hào);以/EA信號(hào)作內(nèi)
44、外程序存儲(chǔ)器的選通信號(hào);以/RD和/WR作為擴(kuò)展數(shù)據(jù)存儲(chǔ)器和I/O端口的讀寫選通信號(hào)。(3)單片機(jī)的串行擴(kuò)展技術(shù)串行接口可以減少封裝引腳,降低成本,簡(jiǎn)體系統(tǒng)結(jié)構(gòu),增加系統(tǒng)擴(kuò)展的靈活性。5.1.3C51單片機(jī)存儲(chǔ)器擴(kuò)展與編址技術(shù)1單片機(jī)存儲(chǔ)器系統(tǒng)圖單片機(jī)系統(tǒng)的存儲(chǔ)器結(jié)構(gòu)和存儲(chǔ)空間分配FFFFHcoco H64KB片外RAM2擴(kuò)展存儲(chǔ)器編址技術(shù)線選法、譯碼法常用譯碼芯片有74LS139(雙24譯碼器)和74LS138(38譯碼器)等,它們的CMOS型芯片分別是74HC139和74HC138.線選法譯碼法5.2程序存儲(chǔ)器的擴(kuò)展1 .單片程序存儲(chǔ)器擴(kuò)展EPROM是單片機(jī)最常選用的程序存儲(chǔ)器芯片,它是一
45、種紫外線可擦除、電可編程的存儲(chǔ)器,最經(jīng)常使用是的27C系統(tǒng)的EPROM,如27C16(2K)、27C32(4K)、27C64(8K)、27C128(16K)、27C256(32K),其芯片引腳如圖(略A0Ax、O0O8、/CE、/OE、Vcc、GND)。除了27C16和27C32為24腳外,其余均為28腳。芯片型號(hào)的高兩位數(shù)字27表示EPROM,位數(shù)字表示存儲(chǔ)容量的Kbit值。2 .多片程序存儲(chǔ)器擴(kuò)展/這個(gè)很簡(jiǎn)單的3 .2.2擴(kuò)展(E2PROM)E2PROM是一種電可編程的存儲(chǔ)器,最經(jīng)常使用的并口E2PROM有高壓編程的28C16(2K)、28C17(2K)和28C64(8K),低壓編程的28
46、C16A(2K)、28C17A(2K)和28C64A(8K)等;最經(jīng)常使用的串口E2PROM有24C01(1K)、24C02(2K)、24C04(4K)等,它們將在5.7節(jié)中進(jìn)行介紹。其中,28C16和28C17都是2K的存儲(chǔ)器,它們的區(qū)別在于:一種有28個(gè)引腳,另一種只有24個(gè)引腳;另外28C17增加了一種檢測(cè)寫周期結(jié)束的方法,利用增加的引腳RDY/BUSY來(lái)表示寫操作何時(shí)完成。當(dāng)寫操作開始后,該引腳輸出為低電平,當(dāng)寫操作結(jié)束時(shí),該引腳輸出高電平,這樣通過(guò)該引腳的信號(hào)就可以指示與其接口的微處理器進(jìn)行合適的操作。當(dāng)使用E2PROM作為存儲(chǔ)器使用時(shí),它與CPU的接線和使用EPROM的擴(kuò)展接線非常
47、相似,也是按照三總線的擴(kuò)展原則進(jìn)行接線,不同之處在于為了在線改寫,單片機(jī)的/WR端與E2PROM的/WE端相接。5.3 數(shù)據(jù)存儲(chǔ)器的擴(kuò)展隨機(jī)存儲(chǔ)器(RandomAccessMemory)簡(jiǎn)稱為RAM,在單片機(jī)系統(tǒng)中用于存放可隨機(jī)修改的數(shù)據(jù),因此在單片機(jī)領(lǐng)域中也稱為數(shù)據(jù)存儲(chǔ)器。按照半導(dǎo)體工藝,RAM分為MOS型和雙極型兩種,MOS集成度高、功耗低、價(jià)格便宜,但速度慢,而雙極型的特點(diǎn)則正好相反。在單片機(jī)系統(tǒng)中使用的大多數(shù)是MOS型的RAM,它們的輸入輸出信號(hào)能與TTL相兼容,所以在擴(kuò)展信號(hào)連接時(shí)很方便。數(shù)據(jù)存儲(chǔ)器擴(kuò)展常使用RAM芯片,用得較多的是Intel公司的6116(靜態(tài)RAM)和6264。芯
48、片引腳圖略,6116弓I腳有D0D8,A0A10,/CE片選信號(hào),/WE寫選通信號(hào),/OE數(shù)據(jù)輸出允許信號(hào),Vcc,GND。有數(shù)據(jù)讀出、數(shù)據(jù)寫入、高阻3種工作方式。單片數(shù)據(jù)存儲(chǔ)器擴(kuò)展多片數(shù)據(jù)存儲(chǔ)器擴(kuò)展5.4 可編程外圍并行接口8255A5.4.18255A的引腳功能和邏輯結(jié)構(gòu)8255A是可編程的并行I/O接口芯片,常用來(lái)實(shí)現(xiàn)C51系列單片機(jī)的并行I/O口擴(kuò)展。封裝DIP40,有A、B、C三個(gè)可編程的8位I/O接口。8255A引腳圖略(Protel元件符號(hào))8255A引腳功能表名稱引腳功能D7D027-34雙向數(shù)據(jù)總線PA7PA0PA7PA0PA7PA037-40,1-425-181013,17
49、14AB口的8位I/O引腳C/CSA1A068、9片選端地址線,選擇控制寄存器或A、B、C口中的一個(gè)/RD5讀,使8255A送數(shù)據(jù)或狀態(tài)信息到CPU。/WRRESET3635寫,使CPU輸出數(shù)據(jù)或控制字到8255A復(fù)位,使擴(kuò)展字寄存器等各內(nèi)部寄存清除,置A、B、C口為輸入GNDVcc726地線+5V電源8255A的內(nèi)部結(jié)構(gòu)按功能可分為3個(gè)邏輯電路部分,即口電路、總線接口電路和控制電路。如下圖。8255A內(nèi)部邏輯結(jié)構(gòu)圖(略,網(wǎng)上找)1.口電路8255A有3個(gè)8位口,其中A、B是單純的數(shù)據(jù)口,供數(shù)據(jù)I/O使用;而C口既可作數(shù)據(jù)口,又可作控制口使用,用于實(shí)現(xiàn)A口和B口的控制功能。因此,在使用中常把C
50、口分為上下兩部分:C口高位部分(PC7PC4),和A口組成A組;C口低位部分(PC3PC0),和B口組成B組。2.總線接口電路(1)數(shù)據(jù)總線緩沖器(2)讀寫控制邏輯8255A讀/寫控制邏輯/CSA1A0所選端口/RD/WR操作000A口01A001B口01讀端口B010C口01C000A口10A001B口10寫端口B010C口10C011控制寄存器10寫控制字1XX/XX數(shù)據(jù)總線緩沖器輸出高阻抗3.控制邏輯電路包才A級(jí)控制和B組控制,合在一起構(gòu)成8位控制寄存器,用于存放各口的工作方式控制字。5.4.28255A的工作方式及數(shù)據(jù)I/O操作1.8255A的工作方式(1)方式0:基本輸入/輸出方式方式0下,可供使用的是兩個(gè)8位口(A口和B口)及兩個(gè)4位口(C口高低位部分)。4個(gè)口可以是輸入和輸出的任何組合。方式
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年全民國(guó)家安全教育日的法律考試答題活動(dòng)總結(jié)
- 化工工廠后勤服務(wù)全面總結(jié)
- 軟件行業(yè)工程師工作體會(huì)
- 急診護(hù)士守護(hù)生命安全
- KTV前臺(tái)服務(wù)心得體會(huì)
- 書籍《外婆的道歉信》的讀書筆記感想
- 2023年企業(yè)主要負(fù)責(zé)人安全培訓(xùn)考試題帶答案(考試直接用)
- 2023-2024年項(xiàng)目部治理人員安全培訓(xùn)考試題及完整答案【名校卷】
- 2023年員工三級(jí)安全培訓(xùn)考試題(預(yù)熱題)
- 2023-2024年項(xiàng)目部安全培訓(xùn)考試題原創(chuàng)題
- 2024版智能硬件產(chǎn)品研發(fā)合作協(xié)議3篇
- 甘肅省蘭州市第一中學(xué)2023-2024學(xué)年高一上學(xué)期期末考試 物理 含解析
- 草地調(diào)查規(guī)劃學(xué)知到智慧樹章節(jié)測(cè)試課后答案2024年秋東北農(nóng)業(yè)大學(xué)
- 2024年礦產(chǎn)資源開發(fā)咨詢服務(wù)合同
- 上海市2024-2025學(xué)年高一語(yǔ)文下學(xué)期期末試題含解析
- 國(guó)家電網(wǎng)招聘之財(cái)務(wù)會(huì)計(jì)類題庫(kù)含完整答案(必刷)
- 建筑物拆除的拆除工廠考核試卷
- 廣東省深圳市2023-2024學(xué)年高二上學(xué)期期末測(cè)試英語(yǔ)試卷(含答案)
- 乘風(fēng)化麟 蛇我其誰(shuí) 2025XX集團(tuán)年終總結(jié)暨頒獎(jiǎng)盛典
- 人教版一年級(jí)數(shù)學(xué)2024版上冊(cè)期末測(cè)評(píng)(提優(yōu)卷一)(含答案)
- 醫(yī)療護(hù)理員理論知識(shí)考核試題題庫(kù)及答案
評(píng)論
0/150
提交評(píng)論