第7章-SOC單片機實驗介紹_第1頁
第7章-SOC單片機實驗介紹_第2頁
第7章-SOC單片機實驗介紹_第3頁
第7章-SOC單片機實驗介紹_第4頁
第7章-SOC單片機實驗介紹_第5頁
已閱讀5頁,還剩113頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第七章C8051F系列單片機應(yīng)用系統(tǒng)的開發(fā)7.1C8051F020實驗系統(tǒng)7.2C8051F單片機實驗項目7.3在KeiluVision2中進(jìn)行C8051F系列單片機的軟件開發(fā)和調(diào)試7.1C8051F020實驗系統(tǒng)NMC-20XX核心模塊壓力傳感器和調(diào)理電路電位調(diào)節(jié)直流電機測速和控制模塊步進(jìn)電機實驗?zāi)K輕觸按鍵和撥動開關(guān)12864點陣液晶顯示模塊HD7279芯片、按鍵和七段碼顯示模塊紅綠LED數(shù)碼管RS232串口以太網(wǎng)接口電源開關(guān)7.1C8051F020實驗系統(tǒng)實驗系統(tǒng)可進(jìn)行SOC單片機典型應(yīng)用的實驗,包含三部分:SiliconLaboratories的SOC單片機開發(fā)工具;可用于以太網(wǎng)測控的NMC-20XX核心模塊;系統(tǒng)實驗板。系統(tǒng)性能和運行環(huán)境系統(tǒng)的主要性能指標(biāo):系統(tǒng)時鐘最高可達(dá)25MHz。通過RS232接口(或USB)與PC機連接。支持匯編語言和C51源代碼級調(diào)試。支持第三方軟件工具(KeilC)。IDE軟件運行環(huán)境Windows2000/XP操作系統(tǒng)32MbRAM40Mb自由硬盤空間空閑的COM口,配USB接口的調(diào)試電纜可以用USB接口。C8051F020實驗系統(tǒng)連接和使用將JTAG扁平電纜一端與適配器(EC2)連接,另一端與目標(biāo)系統(tǒng)連接;將RS232串行電纜的一端與EC2連接,另一端接到PC機;給目標(biāo)系統(tǒng)上電;插入CD并運行“SETUP.EXE”,將IDE軟件安裝到您的PC機,在PC機的開始菜單的“程序”項中選擇SiliconLaboratoriesIDE,運行IDE軟件。7.1.1C8051F單片機開發(fā)工具SiliconLaboratories的開發(fā)工具由IDE調(diào)試環(huán)境軟件、適配器和電纜組成。C8051F系列所有的單片機片內(nèi)均設(shè)計有調(diào)試電路,該調(diào)試電路通過邊界掃描方式獲取單片機片內(nèi)信息,通過4線的JTAG接口(有的型號使用二線(C2)接口)與開發(fā)工具連接,對單片機在片編程調(diào)試。適配器(EC2)一端與計算機相連,另一端與C8051F單片機JTAG口相連,應(yīng)用SiliconLaboratories提供的IDE調(diào)試環(huán)境或Keil

的uVision2調(diào)試環(huán)境就可以進(jìn)行非侵入式、全速的在系統(tǒng)編程(ISP)和調(diào)試。IDE調(diào)試環(huán)境運行在PC機的Windows系統(tǒng)下,在調(diào)試狀態(tài)下可以觀察和修改單片機的存儲器和寄存器;支持?jǐn)帱c設(shè)置、觀察點設(shè)置、堆棧指示器設(shè)置及單步運行、全速運行和停止運行等命令。調(diào)試時不需要額外的目標(biāo)RAM、程序存儲器、定時器或通信通道,并且所有的模擬和數(shù)字外設(shè)都能正常工作。開發(fā)工具支持所有C8051Fxxx系列單片機,根據(jù)不同單片機型號的調(diào)試接口,采用JTAG或C2接口的適配器。7.1.2NMC-20XX核心模塊簡介NMC-20XX核心模塊的外觀可參見圖中的標(biāo)注,結(jié)構(gòu)框圖。該模塊是為用于工業(yè)測控(包括以太網(wǎng)測控功能)而設(shè)計的,模塊中使用C8051F020單片機,片外擴展了128KB的SRAM(UT62L1024芯片),以串行方式擴展了1MB的Flash存儲器(AT45DB081芯片);模塊用4層PCB板設(shè)計,面積僅為42.5mm×53.8mm,模塊上設(shè)計有連接C8051F020單片機的JTAG調(diào)試接口,有用于擴展和應(yīng)用連接的2×40P雙排針,該雙排針可與不同用戶設(shè)計的應(yīng)用系統(tǒng)連接,在該實驗系統(tǒng)上和系統(tǒng)實驗板連接。NMC-20XX核心模塊示意圖單片機(C8051F020)F020I/O、AD引出2×40P雙5排插針SRAM(UT6L1024)Flash(AT45DB081)網(wǎng)絡(luò)芯片(RTL8019)日歷時鐘(P3530)JTAG調(diào)試接口實驗箱實驗?zāi)K步進(jìn)電機NMC-20XX

核心模塊直流電機RJ-45以太網(wǎng)測控RS-485串行口通訊RS232串行口通訊壓力傳感器模擬量輸入JTAG適配器HD7279(4×4鍵6位LED)16個LED(D1~D16)8路開關(guān)量入(K1~K8)溫度傳感器DS18B20電位器電位AD輸入實驗箱和核心模塊資源介紹(1)系統(tǒng)實驗板除與NMC-20XX核心模塊連接外,還配置了豐富的硬件資源,可根據(jù)需要安排多個實驗內(nèi)容。系統(tǒng)實驗板與核心模塊組成實驗的目標(biāo)系統(tǒng),然后由運行在PC機上的集成開發(fā)軟件、JTAG口的協(xié)議轉(zhuǎn)換器(EC2),實現(xiàn)在系統(tǒng)開發(fā)調(diào)試。實驗者可參照本章后面的實驗例程編譯和下載各應(yīng)用程序,也可獨立設(shè)計程序(C或匯編),然后就可開始在系統(tǒng)調(diào)試了。該系統(tǒng)實驗板由多個相對獨立,又能組合的實驗硬件模塊組成。實驗箱模塊資源介紹(2)(1)HD7279芯片,6位LED數(shù)碼顯示與4×4鍵盤掃描電路;(2)開關(guān)量輸出的D1~D16發(fā)光二極管;(3)8路開關(guān)量輸入接口K1~K8,AN1~AN8;(4)DS18B20數(shù)字溫度傳感器;(5)電位器測量電壓模擬輸入電路;(6)壓力應(yīng)變片傳感器模擬輸入電路;(7)128×64點陣液晶顯示模塊;(8)RS-232通訊接口;(9)RS-485通訊接口;(10)RJ-45以太網(wǎng)接口;(11)直流電機及調(diào)速電路;(12)步進(jìn)電機及控制電路;7.2C8051F單片機實驗項目下面介紹7個典型的C8051F020單片機的實驗實驗一:數(shù)據(jù)傳送實驗;實驗二:查表實驗;實驗三:HD7279鍵盤和顯示實驗;實驗四:定時器和走馬燈實驗;實驗五:步進(jìn)電機實驗;實驗六:直流電機測速和控制實驗;實驗七:溫度數(shù)據(jù)采集實驗。 實驗一和實驗二采用匯編語言編寫代碼和實現(xiàn);實驗三~實驗七采用C51語言編寫代碼。7.2.1數(shù)據(jù)傳送實驗實驗?zāi)康恼莆諏8051F020內(nèi)部RAM及外部RAM的數(shù)據(jù)操作方法。實驗內(nèi)容本例程將內(nèi)部RAM地址為70H~7FH的16個字節(jié)數(shù)據(jù)依次送到外部RAM地址為7000H~700FH的單元中。實驗分析本實驗中要訪問單片機的內(nèi)外部RAM,涉及到的匯編語言指令是MOV和MOVX,訪問內(nèi)部RAM使用指令MOV,而訪問外部RAM使用指令MOVX。實驗分析(1)MOV指令較為靈活、變化較多,但是本實驗中要求進(jìn)行讀取內(nèi)部RAM并且需要連續(xù)讀取多個字節(jié),適合使用間接尋址的“MOVA,@R0”或者“MOVA,@R1”指令,此處R0或者R1作為間接尋址寄存器,存放要讀取的RAM單元的地址。比如本實驗采用R1來間接尋址訪問內(nèi)部RAM。寫外部RAM的MOVX指令相對而言格式較為固定,本實驗使用DPTR間接尋址的“MOVX@DPTR,A”指令,能夠較容易的實現(xiàn)對相應(yīng)單元的訪問,DPTR作為將要訪問的外部RAM的地址寄存器。實驗分析(2)因為實驗要求傳送16個字節(jié),可以考慮采用循環(huán)程序結(jié)構(gòu)。而實現(xiàn)循環(huán)結(jié)構(gòu)較容易想到的MCS-51的匯編語言指令是“DJNZRn,label”,這里Rn是循環(huán)計數(shù)器,可以是R0~R7中間的任何一個,一般使用R2~R7中任何一個,而把R0和R1留給間接尋址使用;而標(biāo)號label代表跳轉(zhuǎn)的目的標(biāo)號,用于循環(huán)結(jié)構(gòu)中就是循環(huán)體部分的首條指令。本實驗選用R7作為循環(huán)計數(shù)器。實驗分析(3)作為一個結(jié)構(gòu)完整的匯編語言程序,必須指令程序的入口點,對于MCS-51系列單片機,因為程序存儲器的開始部分一般預(yù)留給中斷入口的向量區(qū)域,故初始化一般安排在處理器的中斷向量區(qū)域之后,可以使用匯編語言的偽指令“ORGxxxxH”的形式進(jìn)行匯編語言指令的定位??紤]到C8051F020單片機一共有21個中斷,每個中斷入口的8個字節(jié)不宜安排它用,最好程序跳過這些區(qū)域。比如從0100H這個地址開始就完全不會和中斷的區(qū)域重疊。本實驗主程序就從0100H的程序存儲器地址開始安排。單片機復(fù)位后執(zhí)行的第一條指令是程序存儲器地址為0的指令,所以一般安排一個跳轉(zhuǎn)指令,轉(zhuǎn)移到主程序開始的地方執(zhí)行。程序的流程圖開始結(jié)束傳送完成?跳轉(zhuǎn)到主程序R7<-16R1<-70HDPTR<-7000H@R1->@DPTRR1自增1DPTR自增1實驗參考程序

ORG

0000H

AJMPMAIN

ORG

0100HMAIN:

MOVR7,#16

MOVR1,#70H

;內(nèi)部RAM地址70H送R1

MOVDPTR,#7000H

;DPTR指向XRAM地址7000HLOOP1:

MOVA,@R1;內(nèi)部RAM內(nèi)容送累加器A

MOVX@DPTR,A;將累加器A的值送到XRAM

INCDPTR

INCR1

DJNZR7,LOOP1;判斷數(shù)據(jù)是否送完HERE:

AJMPHERE

END調(diào)試要點(1)可單步執(zhí)行、可設(shè)斷點執(zhí)行程序。(2)打開RAM及EXTERNALMEMORY窗口,觀察相對應(yīng)的數(shù)據(jù)區(qū)的數(shù)據(jù)在程序執(zhí)行前后是否一致。7.3.2查表實驗

實驗?zāi)康氖煜CS-51的查表指令功能和使用方法,掌握查表程序的設(shè)計和調(diào)試。實驗內(nèi)容程序存儲器中存放有一常數(shù)表,表中的每個元素為一個字(兩個字節(jié)),表的內(nèi)容與索引號的對應(yīng)關(guān)系如下表所示?,F(xiàn)已經(jīng)將索引號放入工作寄存器R0中,試用匯編語言編寫根據(jù)R0的值查找表中對應(yīng)元素的程序,將結(jié)果放入內(nèi)部RAM的20H(高字節(jié))和21H(低字節(jié))單元中。比如給定索引6,則查表得到最終結(jié)果在內(nèi)部RAM中的(20H)=8BH,(21H)=0DCH。查表實驗的表格01234567898000H1001H8002H5203H4817H69A2H8BDCH7FEDH30F3H04BFH實驗分析(1) 本實驗主要練習(xí)MOVC指令。查表指令有兩條:“MOVCA,@A+DPTR”和“MOVCA,@A+PC”這兩條指令都采用基址加變址的尋址方式,并且訪問的是程序存儲器空間,因為程序存儲器空間一般是只讀存儲器,所以往往存放一些常數(shù)表格,進(jìn)行代碼轉(zhuǎn)換的應(yīng)用。使用查表指令時,一般使用DPTR或者PC作為基址寄存器存放表格的起始地址(首個字節(jié)的地址),而用變址寄存器A存放待查的偏移量,二者之和就是待查項的地址,然后通過間接尋址的形式取得對應(yīng)的字節(jié)值。實驗分析(2)而本實驗中,一個索引對應(yīng)連續(xù)的兩個字節(jié)內(nèi)容,一次查表指令的執(zhí)行只能取得一個字節(jié)內(nèi)容,要完成要求必須通過執(zhí)行兩次查表指令來完成。待查元素的地址=表格首地址+2×索引值+字節(jié)索引。這里索引值乘以2是因為每個待查項占用程序存儲器連續(xù)的兩個字節(jié)空間,而字節(jié)索引為0或者1,可以在取第二個字節(jié)使地址寄存器加1獲得。本實驗采用“MOVCA,@A+DPTR”的形式訪問程序存儲器。實驗程序參考框圖開始DPTR+1→DPTR表格首址送DPTR結(jié)果目的地址送R1結(jié)束索引送A查表得數(shù)據(jù)高位并送入RAM查表得數(shù)據(jù)低位并送入RAMA左移一位實驗參考程序ORG

0000H

AJMPMAIN

ORG

0100HMAIN:

MOVR0,#6

;假如要查表格中第6項

MOVR1,#20H

;將查表所得結(jié)果存入內(nèi)部RAM,地址分別為20H、21H

MOV

DPTR,#Table

;DPTR指向表格首地址

MOVA,R0;R0內(nèi)容送累加器A

RL A

MOVCA,@A+DPTR;查表指令

MOV@R1,A;存放結(jié)果

MOVA,R0;下面進(jìn)行第二次查表

RLA

INCDPTR

MOVCA,@A+DPTR;查表得第二字節(jié)

INCR1;間接尋址指針自增

MOV@R1,A;存放第二個字節(jié)的結(jié)果HERE:

AJMPHERETABLE:

DW

8000H,1001H,8002H,5203H,4817H,69A2H,8BDCH,7FEDH,30F3H,04BFH

END調(diào)試要點(1)在讀取鍵后設(shè)置斷點,觀察DATA_IN的內(nèi)容與鍵入值是否相同。(2)在調(diào)用查表程序后設(shè)置斷點,觀察R2,R3的內(nèi)容與表中的內(nèi)容是否相同。(3)全速運行程序,鍵入數(shù)字鍵,觀察顯示器上的內(nèi)容是否為鍵值對應(yīng)的數(shù)值。7.3.3七段碼顯示與按鍵實驗實驗?zāi)康母鶕?jù)實驗電路,閱讀HD7279芯片的數(shù)據(jù)手冊,使用C51語言編程實現(xiàn)按鍵的讀取和七段碼顯示器的控制,加深對HD7279芯片功能的理解,培養(yǎng)單片機應(yīng)用設(shè)計的能力。HD7279A介紹HD7279A是一片具有串行接口的、可同時驅(qū)動8位共陰式數(shù)碼管(或64只獨立LED)的顯示驅(qū)動芯片,該芯片同時還可連接多達(dá)64鍵的鍵盤矩陣。HD7279A內(nèi)部含有譯碼器,可直接接受16進(jìn)制碼,HD7279A還同時具有2種譯碼方式,HD7279A還具有多種控制指令,如消隱、閃爍、左移、右移、段尋址等。HD7279芯片外觀和引腳HD7279引腳介紹和功能說明引腳名稱說明1,2VDD正電源3,5NC無連接,必須懸空4VSS接地6CS片選輸入端,此引腳為低電平時,可以向芯片發(fā)送指令和讀取鍵盤數(shù)據(jù)7CLK同步時鐘輸入端,向芯片發(fā)送數(shù)據(jù)及讀取鍵盤數(shù)據(jù)時,此引腳電平上升沿表示數(shù)據(jù)有效8DATA串行數(shù)據(jù)輸入/輸出端,芯片接收指令時,為輸入端,讀取鍵盤數(shù)據(jù)時,此引腳在讀指令的最后一個時鐘周期的下降沿變?yōu)檩敵龆?KEY按鍵有效輸出端,平時為高電平,當(dāng)檢測到有效按鍵時,此引腳變?yōu)榈碗娖?0-16SG-SA段g-段a驅(qū)動輸出17DP小數(shù)點驅(qū)動輸出18-25DIG0-DIG7數(shù)碼管0-數(shù)碼管7驅(qū)動輸出26CLKO振蕩器輸出端27RCRC振蕩器連接端28RESET復(fù)位端HD7279應(yīng)用電路圖圖中用藍(lán)色框圈中的是本實驗箱安裝的數(shù)碼管和按鍵HD7279指令介紹(1)HD7279A的顯示以及各種控制是靠接收到的指令來完成的,指令有不帶數(shù)據(jù)的純指令和帶有數(shù)據(jù)的指令,詳細(xì)指令和指令格式請參考HD7279A數(shù)據(jù)手冊,下面介紹本實驗中用到的幾個7279的指令。(1)復(fù)位指令A(yù)4HD7D6D5D4D3D2D1D010100100HD7279指令介紹(2)(2)下載顯示數(shù)據(jù)但不譯碼其中a2,a1,a0是位地址,選擇顯示到哪一個七段碼上,DP,A,B,C,D,E,F,G是段碼,對應(yīng)了選中的七段碼的各段,當(dāng)相應(yīng)的段對應(yīng)的位是1是,點亮,否則熄滅。D7D6D5D4D3D2D1D0D7D6D5D4D3D2D1D010010a2a1a0DPABCDEFG段的定義HD7279指令介紹(3)(3)閃爍控制指令此命令控制各個數(shù)碼管的閃爍特性,d0~d7分別對應(yīng)數(shù)碼管1~8,值是1表示不閃爍,為0表示閃爍,開機默認(rèn)是不閃爍。D7D6D5D4D3D2D1D0D7D6D5D4D3D2D1D010001000d7d6d5d4d3d2d1d0HD7279指令介紹(4)(4)讀鍵盤數(shù)據(jù)指令從HD7279A讀出當(dāng)前的按鍵代碼,與其他指令不同,此命令的前一個字節(jié)15H是送給HD7279A的指令,而后一個字節(jié)d0~d7是HD7279A返回的按鍵代碼,范圍是0~3FH(無鍵按下時返回FFH),各個按鍵的鍵盤代碼的定義如圖所示,圖中的鍵號就是鍵的代碼。指令的前半段,HD7279A的DATA引腳處于高阻輸入狀態(tài),接收來自微處理器的指令,指令的后半段,DATA引腳從輸入狀態(tài)轉(zhuǎn)為輸出狀態(tài),輸出鍵盤的代碼。當(dāng)HD7279A檢測到有效的按鍵時,KEY引腳從高電平變?yōu)榈碗娖?,保持到按鍵結(jié)束,在此期間,如果HD7279A收到讀鍵盤數(shù)據(jù)的指令,則輸出當(dāng)前按鍵的代碼,如果在收到讀鍵盤指令的時候沒有按鍵,則輸出FFH。D7D6D5D4D3D2D1D0D7D6D5D4D3D2D1D000011111d7d6d5d4d3d2d1d0HD7279的讀寫時序(1)HD7279A采用串行方式與微處理器通訊,串行數(shù)據(jù)從DATA引腳送入芯片,并與CLK引腳同步,當(dāng)片選信號變?yōu)榈碗娖胶?,DATA引腳上的數(shù)據(jù)在CLK引腳的上升沿被寫入HD7279A的緩沖寄存器。HD7279A的指令結(jié)構(gòu)有三種類型:①不帶數(shù)據(jù)的純指令,指令的寬度為8個BIT,即微處理器需發(fā)送8個CLK脈沖,時序如下;HD7279的讀寫時序(2)②帶有數(shù)據(jù)的指令,寬度為16個BIT,即微處理器需發(fā)送16個CLK肪沖,時序如下;HD7279的讀寫時序(3)③讀取鍵盤數(shù)據(jù)指令,寬度為16個BIT,前8個為微處理器發(fā)送到HD7279的指令,后8個BIT為HD7279A返回的鍵盤代碼,時序如下圖所示。實驗系統(tǒng)上使用的顯示和按鍵的控制芯片就是HD7279A,在實驗板上采用了6位共陰式數(shù)碼管和16個按鍵。實驗內(nèi)容(1)本實驗例程通過C8051F020的P1.6,P1.7連接7279A的CLK和DATA實現(xiàn)串行數(shù)據(jù)編程,而HD7279A的片選引腳CS連在P5.7,KEY連在比較器1的同相輸入端CP1P,比較器1的反相輸入端CP1N接2.4V,利用比較器的輸出來判斷有無按鍵按下,當(dāng)無鍵按下時,KEY引腳保持高電平,所以比較器CP1輸出高電平,而當(dāng)有鍵按下時,KEY引腳輸出低電平,比較器CP1輸出低電平??梢圆捎弥袛嗟姆绞揭部梢圆捎貌樵兊姆绞剑緦嶒炛胁捎貌樵兊姆绞絹砼袛喟存I。實現(xiàn)數(shù)據(jù)的顯示,左移,右移及閃爍。(2)編寫并調(diào)試一個實驗程序,完成數(shù)據(jù)的顯示,左移,右移及閃爍。完成從鍵盤上輸入數(shù)據(jù)并顯示的功能。開始時閃爍顯示“—”(即最右邊的LED閃爍顯示“-”),等待用戶輸入數(shù)據(jù)。每輸入一個數(shù)據(jù)后原數(shù)據(jù)左移一位,新輸入的數(shù)據(jù)顯示在右起第二位,最右邊的一位仍然閃爍顯示“-”,等待輸入下一個數(shù)據(jù)。實驗箱上HD7279接口電路程序流程圖開始關(guān)看門狗初始化時鐘使能比較器復(fù)位7229在最右端數(shù)碼管閃爍顯示“-”讀取按鍵有效按鍵?數(shù)碼管更新顯示按鍵是否參考程序分析(1)①實驗主程序main.c//-------------------------------------------------------------------------//包含頭文件聲明//-------------------------------------------------------------------------#include"c8051f020.h"#include<intrins.h>//-------------------------------------------------------------------------//外部函數(shù)聲明//-------------------------------------------------------------------------extern

voidTest7279(void);參考程序分析(2)//-------------------------------------------------------------------------//函數(shù)定義//-------------------------------------------------------------------------//系統(tǒng)時鐘初始化函數(shù)void

SYSCLK_Init

(void){

inti;

//延遲計數(shù)

OSCXCN=

0x67;

//啟動外部晶體振蕩器,頻率11.0592MHz

for

(i=0;i<

256;i++)

;

//等待外部晶振啟動

while

(!(OSCXCN&

0x80))

;

//等待外部晶振穩(wěn)定

OSCICN=

0x88;

//選擇外部晶振作為系統(tǒng)時鐘

//使能丟失時鐘檢測器}//端口初始化函數(shù)void

PORT_Init

(void){XBR2=

0x40;

//使能交叉開關(guān)和弱上拉}參考程序分析(3)//主函數(shù)voidmain(void)

{WDTCN=

0xde;WDTCN=

0xad;

//關(guān)看門狗

SYSCLK_Init

();

//初始化時鐘

PORT_Init();

//初始化端口

CPT1CN|=0x80;

//使能比較器1Test7279();}參考程序分析(4)②HD7279的測試程序test7279.c//------------------------------------------------------------------------//包含頭文件聲明//------------------------------------------------------------------------#include<c8051f020.h>#include<intrins.h>//------------------------------------------------------------------------//特殊功能位聲明//------------------------------------------------------------------------sbitHD7279_DAT=P1^7;sbitHD7279_CLK=P1^6;參考程序分析(5)//------------------------------------------------------------------------//宏定義//------------------------------------------------------------------------#defineNOSELECT7279P5|=0x80//SPICS4(P57)=1#defineSELECT7279P5&=~(0x80)//SPICS4(P57)=0;#defineSet7279DATHD7279_DAT=1#defineClr7279DATHD7279_DAT=0#defineSet7279CLKHD7279_CLK=1#defineClr7279CLKHD7279_CLK=0//------------------------------------------------------------------------//全局變量定義//------------------------------------------------------------------------unsigned

charcodeBdSeg[]={

0x7e,0x30,0x6d,0x79,

//0123的七段碼

0x33,0x5b,0x5f,0x70,

//4567的七段碼

0x7f,0x7b,0x77,0x1f,

//89ab的七段碼

0x4e,0x3d,0x4f,0x47,

//cdef的七段碼

0x00,0x01};

參考程序分析(6)//------------------------------------------------------------------------//函數(shù)定義//------------------------------------------------------------------------//延時1us函數(shù)voidDelay1us(unsigned

charus){

while

(us){_nop_();_nop_();_nop_();_nop_();_nop_();

--us;

}}//給7279發(fā)送一個字節(jié)函數(shù)voidSend7279Byte(unsigned

char

ch)

{

chari;SELECT7279;

//置CS低電平

Delay1us(50);

//延時50μ

for

(i=0;i<8;i++)

{

if

(ch&0x80)Set7279DAT;

//輸出7位到HD7279A的DATA端

elseClr7279DAT;Set7279CLK;

//置CLK高電平

ch=ch<<1;

//待發(fā)數(shù)據(jù)左移

Delay1us(8);

//延時8μClr7279CLK;

//置CLK低電平

Delay1us(8);

//延時50μ

}Clr7279DAT;

//發(fā)送完畢,DATA端置低,返回}參考程序分析(7)//從7279接收一個字節(jié)函數(shù)unsigned

charReceive7279Byte(void)

{

unsigned

char

i,ch;

ch=0;

Set7279DAT;

//DATA端置為高電平,輸入狀態(tài)

Delay1us(50);

//延時50μ

for

(i=0;i<8;i++)

{Set7279CLK;

//置CLK高電平

Delay1us(8);

//延時8μ

ch=ch<<1;

//接收數(shù)據(jù)左移1位

if

(HD7279_DAT)

ch+=1;

//接收1位數(shù)據(jù)

Clr7279CLK;

//置CLK低電平

Delay1us(8);

//延時8μ

}Clr7279DAT;

//接收完畢,DATA端重新置成低電平(輸出狀態(tài))

return

ch;}參考程序分析(8)void

DispLED(char

*DispBuf,char

ShowDot)

{

//ShowDot

顯示小數(shù)點位

char

i,ch;

ShowDot--;

for

(i=0;i<6;i++)

{

ch=DispBuf[i];

if

((ch>='a')

&&

(ch<='f'))

{

ch-='a';ch+=0xa;

}

if

((ch>='A')

&&

(ch<='F'))

{

ch-='A';ch+=0xa;

}Send7279Byte(0x90+5-i);

//不譯碼

if

(ch=='')Send7279Byte(0x00);

else

if

(ch=='-')Send7279Byte(0x01);

else

{

if

(ShowDot==i)Send7279Byte(0x80|BdSeg[ch&0x0f]);

elseSend7279Byte(BdSeg[ch&0x0f]);

}

}NOSELECT7279;

//置CS高電平}

//控制6個七段碼顯示的函數(shù)/*;b6;----;b1|b0|b5;----small;b2|b3|b4;----.b7*/參考程序分析(9)//讀取按鍵函數(shù),無鍵按下返回-1,否則返回鍵值char

GetKeyValue(void)

{

char

KeyValue;

if

(CPT1CN&0x40)

return

-1;

//無鍵按下返回-1,否則返回鍵值

Send7279Byte(0x15);

//發(fā)讀鍵盤指令

KeyValue=Receive7279Byte();NOSELECT7279;

//置CS高電平

return

KeyValue;

}//等待按鍵釋放函數(shù)void

WaitKeyOff(void)

{

while

(!(CPT1CN&0x40));

//判斷按鍵是否釋放}

參考程序分析(10)//HD7279測試/演示函數(shù)voidTest7279(void)

{

chari,KeyValue,buf[6]="-";

Send7279Byte(0xA4);

//發(fā)復(fù)位指令

DispLED(buf,0);

//顯示"-"Send7279Byte(0x88);

//發(fā)閃爍指令

Send7279Byte(0xFE);

//最右邊一個七段碼閃爍顯示

while(1)

{

KeyValue=GetKeyValue();

//讀取鍵盤按鍵

if(KeyValue!=-1)

{

//如果有按鍵則刷新顯示

for(i=0;i<4;i++)

buf[i]=buf[i+1];

//數(shù)據(jù)左移一位

buf[4]=0x30|KeyValue;

//新輸入的顯示到右端

DispLED(buf,0);

//更新顯示內(nèi)容

WaitKeyOff();

//等待按鍵釋放

}

}}

調(diào)試要點(1)運行程序,觀察顯示的數(shù)值是否與框圖一致,若有錯可單步執(zhí)行,排除程序錯誤。(2)全速運行程序,實現(xiàn)所要求的顯示功能。7.3.4定時器實驗實驗?zāi)康恼莆斩〞r器T0~T4的方式選擇和編程方法、定時器中斷服務(wù)程序的設(shè)計方法。實驗內(nèi)容(1)使用片內(nèi)T3定時器產(chǎn)生中斷,控制軟件計數(shù),計數(shù)器每0.1秒加1,當(dāng)計數(shù)器加到5時,改變P2、P3口的狀態(tài),P2,P3口驅(qū)動發(fā)光管實現(xiàn)走馬燈效果。(2)設(shè)置定時器T3的時鐘基準(zhǔn)為系統(tǒng)時鐘的12分頻。系統(tǒng)時鐘采用片內(nèi)2MHz的時鐘源。(3)試編寫一個程序,可采用T0~T4中任一個定時器,實現(xiàn)上述效果。實驗分析將撥碼開關(guān)S1和S2置于OFF位置,用連接線將CN7(CN8)及CN10(CN11)按順序連到發(fā)光管。CN7(CN8)在實驗箱的電路板上被連接到了C8051F020單片機的P2端口,CN10(CN11)被連接到了單片機的P3端口。程序流程圖開始關(guān)看門狗初始化端口初始化定時器T3結(jié)束開中斷等待計數(shù)器等于5?開始清TF3計數(shù)器加1返回計數(shù)器清零驅(qū)動P2、P3口實現(xiàn)走馬燈效果NY參考程序分析(1)//---------------------------------------------------------------------//Blinky.c//本程序使用定時器3的中斷服務(wù)實現(xiàn)走馬燈的效果,//P2口和P3口所連接的指示燈0.5秒改變一次狀態(tài)//---------------------------------------------------------------------//---------------------------------------------------------------------//包含頭文件//---------------------------------------------------------------------#include<c8051f020.h>//SFR的聲明在該頭文件中//---------------------------------------------------------------------//為方便賦值,進(jìn)行C8051F020的16位SFR定義//---------------------------------------------------------------------sfr16TMR3RL=

0x92;

//Timer3重裝特殊功能寄存器sfr16TMR3=

0x94;

//Timer3計數(shù)器特殊功能寄存器//---------------------------------------------------------------------//常量聲明//---------------------------------------------------------------------#undefSYSCLK#defineSYSCLK2000000//系統(tǒng)時鐘2MHz參考程序分析(2)//---------------------------------------------------------------------//函數(shù)原型聲明//---------------------------------------------------------------------void

PORT_Init

(void);voidTimer3_Init(intcounts);voidTimer3_ISR(void);unsigned

int

xdatap2led[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//---------------------------------------------------------------------//函數(shù)定義//---------------------------------------------------------------------//main函數(shù)voidmain(void)

{

//禁用看門狗定時器

WDTCN=

0xde;WDTCN=

0xad;

PORT_Init

();Timer3_Init(SYSCLK/

12

/

10);

//初始化定時器3以0.1秒為周期產(chǎn)生中斷

EA=

1;

//全局中斷使能

while

(1)

{

}

//循環(huán)等待中斷發(fā)生}參考程序分析(3)//配置交叉開關(guān)和IO端口void

PORT_Init

(void)

{XBR2=

0x40;

//使能交叉開關(guān)和端口弱上拉}//配置定時器3:自動重裝,定時中斷周期由counts指明,//以系統(tǒng)時鐘的12分頻為計數(shù)時鐘voidTimer3_Init(intcounts)

{TMR3CN=

0x00;

//停止定時器3并且清零TF3

//使用SYSCLK/12作為計數(shù)時鐘

TMR3RL=

-counts;

//初始化重裝寄存器

TMR3=

0xffff;

//使得定時器立即溢出重裝初值

EIE2|=

0x01;

//使能定時器3中斷

TMR3CN|=

0x04;

//啟動定時器3開始定時}參考程序分析(4)//-----------------------------------------------------------------------//中斷服務(wù)子程序//-----------------------------------------------------------------------//定時器3的中斷服務(wù)子程序當(dāng)定時器3溢出時改變LED指示燈的狀態(tài).voidTimer3_ISR(void)interrupt14

{

static

intcount;

static

inti=9,j=0;

static

intled=0xff;

TMR3CN&=

~(0x80);

//清除定時器3的溢出標(biāo)志位TF3count++;

if(count==5)

{count=0;P3=led;P2=p2led[j];led=led<<1;i--;j++;

if(j==8)j=0;

if(i==0){i=9;led=0xff;

}

}}

調(diào)試要點觀察發(fā)光管的顯示是否實現(xiàn)了走馬燈的效果。如有錯誤應(yīng)檢查定時器的配置是否正確及P2、P3口的輸出是否正確。7.3.5直流電機轉(zhuǎn)速測量控制實驗實驗?zāi)康牧私庵绷麟姍C的工作方式,掌握轉(zhuǎn)速測量及控制的基本原理。轉(zhuǎn)速測量和控制的基本原理直流電機的轉(zhuǎn)速與施加于電機兩端的電壓大小有關(guān)。本例程采用片內(nèi)的D/A轉(zhuǎn)換器DAC0的輸出控制直流電機的電壓,從而控制電機的轉(zhuǎn)速。本例程中采用差動方法調(diào)節(jié)DAC0的輸出控制電機的轉(zhuǎn)速。實際操作中可調(diào)整算法為PI或PID算法,以達(dá)到較好的動態(tài)特性和靜態(tài)特性。轉(zhuǎn)速單位為:轉(zhuǎn)/分。實驗板中選用美國普拉格公司生產(chǎn)的3013霍爾開關(guān)傳感器測量轉(zhuǎn)速,根據(jù)霍爾效應(yīng)原理,將一塊磁鋼固定在電機轉(zhuǎn)軸的邊沿,在轉(zhuǎn)盤下方安裝一個霍爾器件,當(dāng)轉(zhuǎn)盤旋轉(zhuǎn)到霍爾元件上方時,霍爾器件輸出脈沖信號,其頻率和轉(zhuǎn)速成正比,測量輸出脈沖的周期和頻率即可計算出轉(zhuǎn)速。直流電機的接口電路測速霍爾元件3013直流電機控制電路實驗準(zhǔn)備和實驗內(nèi)容實驗準(zhǔn)備用線將JH端子的CKMOT(轉(zhuǎn)速的反饋信號)與P10(INT0)連接。實驗內(nèi)容(1)采用INT0中斷對轉(zhuǎn)速脈沖CKMOT計數(shù),每秒讀一次計數(shù)值,將此值與預(yù)設(shè)的轉(zhuǎn)速值比較,若大于預(yù)設(shè)的轉(zhuǎn)速值則減小DAC0的數(shù)值,若小于預(yù)設(shè)的轉(zhuǎn)速值則增加DAC0的值,不斷調(diào)整電機的轉(zhuǎn)速,直到轉(zhuǎn)速值等于預(yù)設(shè)定的值。(2)編寫并調(diào)試一個實驗程序,將電機當(dāng)前的轉(zhuǎn)速值在七段數(shù)碼管上顯示出來,在電機的可控范圍內(nèi)控制電機轉(zhuǎn)速等于預(yù)設(shè)值。程序流程圖結(jié)束開始初始化系統(tǒng)時鐘初始化定時器0初始化I/O端口使能比較器1使能片內(nèi)參考電壓使能DAC0初始化7279調(diào)用電機控制程序到1S?開始返回讀取轉(zhuǎn)速值并與設(shè)定值比較,若轉(zhuǎn)速高則減少ADC轉(zhuǎn)換值,若轉(zhuǎn)速低則增加ADC轉(zhuǎn)化值NY參考程序分析(1)實驗參考程序①主程序main.c//-------------------------------------------------------------------//包含頭文件//-------------------------------------------------------------------#include"c8051f020.h"#include<intrins.h>//-------------------------------------------------------------------//特殊功能寄存器聲明//-------------------------------------------------------------------sfr16DAC0=

0xd2;

//DAC0數(shù)據(jù)寄存器//-------------------------------------------------------------------//常量聲明//-------------------------------------------------------------------#defineSetSpeed30參考程序分析(2)//-------------------------------------------------------------------//全局變量定義//-------------------------------------------------------------------unsigned

intCount1s=1000;unsigned

int

SaveMotorCount,MotorCount=0;unsigned

intiDAC0=2048;intSD;unsigned

charCount1ms;//-------------------------------------------------------------------//外部函數(shù)聲明//-------------------------------------------------------------------extern

void

TestMotor(void);//-------------------------------------------------------------------//函數(shù)定義//-------------------------------------------------------------------//系統(tǒng)時鐘初始化void

SYSCLK_Init

(void){

inti;

//延遲計數(shù)

OSCXCN=

0x67;

//啟動外部晶體振蕩器,頻率11.0592MHz

for

(i=0;i<

256;i++)

;

//等待外部晶振啟動

while

(!(OSCXCN&

0x80))

;

//等待外部晶振穩(wěn)定

OSCICN=

0x88;

//選擇外部晶振作為系統(tǒng)時鐘

//使能丟失時鐘檢測器}參考程序分析(3)//端口初始化void

PORT_Init

(void){XBR0=

0x07;

//EnableSMBus,SPI0,andUART0XBR1=

0x04;

//P10<---int0XBR2=

0x40;

//使能交叉開關(guān)和弱上拉}//定時器初始化voidTimer0_Init(void){CKCON|=0x8;TMOD|=0x1;

//選擇16定時模式

Count1ms=10;TR0=

0;

//定制定時器0TH0=

(-SYSCLK/1000)

>>

8;

//設(shè)置定時器溢出周期1msTL0=

-SYSCLK/1000;TR0=

1;

//啟動Timer0IE|=

0x2;

}參考程序分析(4)//延時1ms函數(shù)voidDelay1ms(unsigned

charT){Count1ms=T;

while

(Count1ms);}//主函數(shù)voidmain(void)

{WDTCN=

0xde;WDTCN=

0xad;

//關(guān)看門狗

SYSCLK_Init

();

//初始化時鐘

Timer0_Init();

//初始化定時器

PORT_Init

();

//初始化IO口

REF0CN=

0x03;

//使能片內(nèi)參考電壓

DAC0CN|=

0x80;

//使能DAC0DAC0H=0;DAC0L=0;IT0=1;IE|=

0x01;

//使能INT0中斷

EA=1;

//開中斷

TestMotor();}

參考程序分析(5)//--------------------------------------------------------------------//中斷服務(wù)函數(shù)定義//--------------------------------------------------------------------//定時器0中斷服務(wù)函數(shù)voidTimer0_ISR(void)interrupt1

//1ms定時中斷服務(wù)程序

{

TH0=

(-SYSCLK/1000)

>>

8;

TL0=

-SYSCLK/1000;

if

(Count1ms)Count1ms--;

if

(Count1s)Count1s--;

else{Count1s=1000;

SaveMotorCount=MotorCount;

MotorCount=0;SD=SaveMotorCount/2-SetSpeed;

SaveMotorCount*=30;

if

(SD){

if

((SD>5)||(SD<-5))iDAC0-=SD*4;

elseiDAC0-=SD;DAC0=iDAC0;

}

}}//外部中斷0服務(wù)函數(shù)voidInt0_ISR(void)interrupt0

{

MotorCount++;}

參考程序分析(6)②數(shù)模轉(zhuǎn)換程序dac.c/*實驗準(zhǔn)備:用連接線將JH端子的CKMOT與P10(INT0)連接*///---------------------------------------------------------------------//包含頭文件//---------------------------------------------------------------------#include"c8051f020.h"#include<intrins.h>//--------------------------------------------------------------------//特殊功能寄存器聲明//--------------------------------------------------------------------sfr16DAC0=

0xd2;

//DAC0數(shù)據(jù)寄存器參考程序分析(7)//--------------------------------------------------------------------//外部變量聲明//--------------------------------------------------------------------extern

unsigned

int

SaveMotorCount;extern

unsigned

intiDAC0;//--------------------------------------------------------------------//外部函數(shù)聲明//--------------------------------------------------------------------extern

voidDelay1ms(unsigned

charT);extern

void

DispLED(char

*DispBuf,char

ShowDot);

//ShowDot

顯示小數(shù)點位void

TestMotor(void){

charbuf[6];DAC0=iDAC0;

for

(;;){Delay1ms(100);buf[0]='F';buf[1]='';buf[2]=(SaveMotorCount%10000)/1000;buf[3]=(SaveMotorCount%1000)/100;buf[4]=(SaveMotorCount%100)/10;buf[5]=(SaveMotorCount%10);DispLED(buf,0);

}}參考程序分析(8)③7279顯示程序7279disp.c//---------------------------------------------------------------------//包含頭文件//---------------------------------------------------------------------#include"c8051f020.h"#include<intrins.h>//---------------------------------------------------------------------//特殊功能位聲明//---------------------------------------------------------------------sbitHD7279_DAT=P1^7;sbitHD7279_CLK=P1^6;//--------------------------------------------------------------------//宏定義//--------------------------------------------------------------------#defineNOSELECT7279P5|=0x80//SPICS4(P57)=1#defineSELECT7279P5&=~(0x80)//SPICS4(P57)=0;#defineSet7279DATHD7279_DAT=1#defineClr7279DATHD7279_DAT=0#defineSet7279CLKHD7279_CLK=1#defineClr7279CLKHD7279_CLK=0

參考程序分析(9)//--------------------------------------------------------------------//全局變量定義//-----

溫馨提示

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

評論

0/150

提交評論