數(shù)據(jù)采集系統(tǒng)的設(shè)計(jì)_第1頁(yè)
數(shù)據(jù)采集系統(tǒng)的設(shè)計(jì)_第2頁(yè)
數(shù)據(jù)采集系統(tǒng)的設(shè)計(jì)_第3頁(yè)
數(shù)據(jù)采集系統(tǒng)的設(shè)計(jì)_第4頁(yè)
數(shù)據(jù)采集系統(tǒng)的設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩37頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

目錄TOC\o\h\z第一章計(jì)算機(jī)硬件系統(tǒng)概述 11.1計(jì)算機(jī)硬件系統(tǒng)的組成及結(jié)構(gòu) 11.2I/O系統(tǒng)概述 21.3計(jì)算機(jī)硬件系統(tǒng)的設(shè)計(jì)內(nèi)容 51.4計(jì)算機(jī)硬件系統(tǒng)的設(shè)計(jì)原則 5第二章數(shù)據(jù)采集技術(shù)概述 62.1數(shù)據(jù)采集系統(tǒng)的結(jié)構(gòu)原理 62.1.1數(shù)據(jù)采集系統(tǒng)的分類 62.1.2數(shù)據(jù)采集系統(tǒng)的基本功能 62.1.3數(shù)據(jù)采集系統(tǒng)的結(jié)構(gòu)形式 62.2數(shù)據(jù)采集系統(tǒng)設(shè)計(jì)的基本原則 72.2.1硬件設(shè)計(jì)的基本原則 72.2.2軟件設(shè)計(jì)的基本原則 7第三章數(shù)據(jù)采集系統(tǒng)的硬件設(shè)計(jì) 83.1系統(tǒng)結(jié)構(gòu)框圖 83.2系統(tǒng)工作原理 83.2.1CPU處理核心模塊 93.2.2ADC模數(shù)轉(zhuǎn)換 103.2.3液晶顯示流程 133.2.4完整的PCB版圖 15第四章數(shù)據(jù)采集系統(tǒng)的軟件設(shè)計(jì) 174.1匯編和keilc 174.2KeilC51vsANSIC(標(biāo)準(zhǔn)C) 174.2.1內(nèi)存區(qū)域(MemoryAreas): 184.2.2變量或數(shù)據(jù)類型 184.2.3存儲(chǔ)類型聲明和存儲(chǔ)模式 194.2.4KeilC51指針 214.2.5KeilC51函數(shù) 214.2.6中斷服務(wù) 224.3使用KeilC時(shí)應(yīng)做的和應(yīng)該避免的 234.3.1采用短變量 244.3.2使用無(wú)符號(hào)類型 244.3.3避免使用浮點(diǎn)指針 244.3.4使用位變量 244.3.5用局部變量代替全局變量 244.3.6為變量分配內(nèi)部存儲(chǔ)區(qū) 254.3.7使用特定指針 254.3.8使用調(diào)令 254.3.9使用宏替代函數(shù) 254.4C51的編程規(guī)范 254.5keilc軟件使用方法 274.6系統(tǒng)整體程序流程 364.7各模塊軟件程序流程 374.7.1ADC模數(shù)轉(zhuǎn)換流程 374.7.2液晶顯示模塊 384.7.3鍵盤處理模塊 394.7.4定時(shí)器中斷響應(yīng)處理程序 39第一章計(jì)算機(jī)硬件系統(tǒng)概述計(jì)算機(jī)硬件是在指令的控制下自動(dòng)對(duì)數(shù)字進(jìn)行操作,并將數(shù)字信息與其他形式信息進(jìn)行相互轉(zhuǎn)換的機(jī)器系統(tǒng),是一個(gè)高度復(fù)雜的由多種電子線路、精密機(jī)械裝置等構(gòu)成的能自動(dòng)并高速完成數(shù)據(jù)計(jì)算的裝置或者工具。本章將介紹計(jì)算機(jī)硬件系統(tǒng)的基本組成和設(shè)計(jì)過程。1.1計(jì)算機(jī)硬件系統(tǒng)的組成及結(jié)構(gòu)原始的馮·諾依曼計(jì)算機(jī)在結(jié)構(gòu)上是以運(yùn)算器為中心的,而發(fā)展到現(xiàn)在,已轉(zhuǎn)向以存儲(chǔ)器為中心,圖1-1為計(jì)算機(jī)最基本的組成框圖。輸入設(shè)備輔助存儲(chǔ)器輸出設(shè)備輸入設(shè)備輔助存儲(chǔ)器輸出設(shè)備主存儲(chǔ)器運(yùn)算器控制器外設(shè)主機(jī)CPU圖1-1計(jì)算機(jī)的組成框圖輸入設(shè)備的任務(wù)是把人們編好的程序和原始數(shù)據(jù)送到計(jì)算機(jī)中去,并且將它們轉(zhuǎn)換成計(jì)算機(jī)內(nèi)部所能識(shí)別和接受的信息方式。按輸入信息的形態(tài)分為字符輸入、圖形輸入。圖像輸入及語(yǔ)音輸入等。目前,常見的輸入設(shè)備有:鍵盤、鼠標(biāo)、掃描儀等。輔助存儲(chǔ)器(磁盤、磁帶)也可以看作輸入設(shè)備。另外,自動(dòng)控制和檢測(cè)系統(tǒng)中使用的模數(shù)(A/D)裝置也是一種輸入設(shè)備。(2)輸出設(shè)備輸出設(shè)備的任務(wù)是將計(jì)算機(jī)的處理結(jié)果以人或其他設(shè)備所能接受的形式送出計(jì)算機(jī)。目前最常用的輸入設(shè)備是打印機(jī)和顯示器。輔助存儲(chǔ)器也可以看作輸出設(shè)備。另外,數(shù)模(D/A)轉(zhuǎn)換裝置也是一種輸出設(shè)備。(3)存儲(chǔ)器存儲(chǔ)器是用來(lái)存放程序和數(shù)據(jù)的部件,它是一個(gè)記憶裝置,也是計(jì)算機(jī)能夠?qū)崿F(xiàn)“存儲(chǔ)程序控制”的基礎(chǔ)。在計(jì)算機(jī)系統(tǒng)中,規(guī)模較大的存儲(chǔ)器往往分成若干級(jí),稱為存儲(chǔ)系統(tǒng)。如圖1-2所示的是常見的三級(jí)存儲(chǔ)系統(tǒng)。主存儲(chǔ)器可由CPU直接訪問,存儲(chǔ)速度快但容量較小,一般用來(lái)存放當(dāng)前正在執(zhí)行的程序和數(shù)據(jù)。輔助存儲(chǔ)器設(shè)置在主機(jī)外部,它的存儲(chǔ)容量大,價(jià)格低,但存取速度較慢,一般用來(lái)存放暫時(shí)不參與運(yùn)行的程序和數(shù)據(jù),這些程序和數(shù)據(jù)在需要時(shí)可傳送到主存,因此它是主存的補(bǔ)充和后援。當(dāng)CPU速度很高時(shí),為了使訪問存儲(chǔ)器的速度能與CPU的速度相匹配,又在主存和CPU間增設(shè)了一級(jí)Cache(高速緩沖存儲(chǔ)器)。Cache的存取速度比主存更快,但容量更小,用來(lái)存放當(dāng)前最急需處理的程序和數(shù)據(jù),以便快度地向CPU提供指令和數(shù)據(jù)。(4)運(yùn)算器運(yùn)算器使對(duì)信息進(jìn)行處理和運(yùn)算的部件。經(jīng)常進(jìn)行的運(yùn)算使算術(shù)運(yùn)算和邏輯運(yùn)算,所以運(yùn)算器又稱算術(shù)邏輯運(yùn)算部件(ArighmeticandLogicalUnit,ALU)。運(yùn)算器的核心是加法器。運(yùn)算器中還有若干個(gè)通用寄存器或累加寄存器。用來(lái)暫存操作數(shù),并存放運(yùn)算結(jié)果。寄存器的存取速度比存儲(chǔ)器的存取速度快的多。(5)控制器控制器是整個(gè)計(jì)算機(jī)的指揮中心,它的主要功能是按照人們預(yù)選取確定的操作步驟,控制整個(gè)計(jì)算機(jī)的各部件有條不紊的自動(dòng)工作??刂破鞔嬷鞔嬷兄饤l地取出指令進(jìn)行分析,根據(jù)指令的不同來(lái)安排操作順序,向各部件發(fā)出相應(yīng)的操作信號(hào),控制他們執(zhí)行指令所規(guī)定的任務(wù)。將前述的各大基本部件,按某種方式連接起來(lái)就構(gòu)成了計(jì)算機(jī)的硬件系統(tǒng)。目前許多計(jì)算機(jī)的基本部件之間是用總線連接起來(lái)的。計(jì)算機(jī)的總線按其邏輯結(jié)構(gòu)來(lái)看,可以分為單總線和多總線結(jié)構(gòu)。1.2I/O系統(tǒng)概述在以計(jì)算機(jī)為控制核心的硬件系統(tǒng)中,CPU和存儲(chǔ)器一般封裝在主機(jī)中,計(jì)算機(jī)系統(tǒng)與其他硬件設(shè)備信息的傳輸是通過I/O系統(tǒng)來(lái)完成的,因此I/O系統(tǒng)的設(shè)計(jì)是硬件系統(tǒng)設(shè)計(jì)的焦點(diǎn),下面介紹一下I/O系統(tǒng)基本組成和功能。(1)I/O系統(tǒng)的組成主機(jī)外設(shè)外設(shè)識(shí)別數(shù)據(jù)或命令或狀態(tài)外設(shè)識(shí)別地址信息數(shù)據(jù)(串)數(shù)據(jù)(并)數(shù)據(jù)(并串)控制聯(lián)絡(luò)圖1-2接口與主機(jī)、外設(shè)間的連接示意圖I/O系統(tǒng)包括外部設(shè)備主機(jī)外設(shè)外設(shè)識(shí)別數(shù)據(jù)或命令或狀態(tài)外設(shè)識(shí)別地址信息數(shù)據(jù)(串)數(shù)據(jù)(并)數(shù)據(jù)(并串)控制聯(lián)絡(luò)圖1-2接口與主機(jī)、外設(shè)間的連接示意圖(2)I/O模塊的功能I/O模塊是連接主機(jī)(CPU、主存)和外部設(shè)備的橋梁,因此它必須有計(jì)算機(jī)的內(nèi)接接口和計(jì)算機(jī)的外接接口。其功能主要包括:·各種外設(shè)的操作方法不同,由CPU統(tǒng)一控制不切合實(shí)際?!ね庠O(shè)的數(shù)據(jù)傳輸速率比存儲(chǔ)器和CPU慢,使得高速總線不能直接與外設(shè)相連?!ね庠O(shè)所使用的數(shù)據(jù)格式各不一致。(3)I/O設(shè)備的編址為了CPU便于對(duì)I/O設(shè)備進(jìn)行尋址和選擇,必須給眾多的I/O設(shè)備進(jìn)行編址,也就是給每一臺(tái)設(shè)備規(guī)定一些地址碼,稱為設(shè)備號(hào)或設(shè)備代碼。I/O設(shè)備兩種尋址方法:·專設(shè)I/O指令:例指令I(lǐng)N完成輸入,指令OUT完成輸出操作。其地址碼指出I/O設(shè)備的設(shè)備代碼。這是I/O空間獨(dú)立于存儲(chǔ)器空間的情況,即設(shè)備碼的編碼和存儲(chǔ)器的存儲(chǔ)單元的編碼是平行存在的?!ご鎯?chǔ)器映象方式:利用訪存(取數(shù)/存數(shù))指令完成I/O功能。使用這種方法時(shí),從主存的地址空間中分出一部分地址碼作為I/O的設(shè)備代碼,當(dāng)訪問到這些地址時(shí),表示被訪的不是主存儲(chǔ)器,而是I/O設(shè)備寄存器。這時(shí)I/O空間和存儲(chǔ)器空間是合在一起的,即I/O設(shè)備和存儲(chǔ)單元是統(tǒng)一編址的。(4)I/O接口類型按照數(shù)據(jù)傳送的寬度可分為并行接口和串行接口。并行接口中,設(shè)備和接口是將一個(gè)字節(jié)(或字)的所有位同時(shí)傳送。傳送完?設(shè)置內(nèi)存緩沖區(qū)首址設(shè)置計(jì)數(shù)器啟動(dòng)外設(shè)傳送一個(gè)數(shù)據(jù)修改內(nèi)存地址傳送完?設(shè)置內(nèi)存緩沖區(qū)首址設(shè)置計(jì)數(shù)器啟動(dòng)外設(shè)傳送一個(gè)數(shù)據(jù)修改內(nèi)存地址修改計(jì)數(shù)值結(jié)束I/O傳送準(zhǔn)備好?未完是完否圖1-3程序直接控制輸入輸出方式流程按照數(shù)據(jù)傳送的控制方式可分成程序控制輸入輸出接口,程序中斷輸入輸出接口和直接存儲(chǔ)器存取(DMA)接口等。(5)I/O技術(shù)常用的輸入輸出方式有五種,包括:程序直接控制(編程I/O)、程序中斷控制(中斷驅(qū)動(dòng)I/O)、存儲(chǔ)器直接存?。―MA)、通道方式、外圍處理機(jī)方式。在實(shí)際硬件系統(tǒng)設(shè)計(jì)種,較常用的是程序直接控制方式和中斷方式,下面介紹一下,這兩種方式的特點(diǎn)和過程?!こ绦蛑苯涌刂?programeddirectcontrol)特點(diǎn):完全通過程序來(lái)控制主機(jī)和外圍設(shè)備之間的信息傳送。過程:首先啟動(dòng)設(shè)備,發(fā)出啟動(dòng)命令,接著CPU等待外圍設(shè)備完成接收或發(fā)送數(shù)據(jù)的準(zhǔn)備工作,在等待時(shí)間內(nèi),CPU不斷地用一條測(cè)試指令檢測(cè)外圍設(shè)備工作狀態(tài)標(biāo)志觸發(fā)器。一旦測(cè)試到標(biāo)志觸發(fā)器已置成“完成”狀態(tài),即可進(jìn)行數(shù)據(jù)傳送,其流程如圖1-3。缺點(diǎn):這種控制方式簡(jiǎn)單,但CPU和外圍設(shè)備只能串行工作,而CPU的速度比I/O設(shè)備的速度快得多,所以CPU的大量時(shí)間都處于等待,空閑狀態(tài),使系統(tǒng)效率大大降低。·程序中斷傳送(programinterrupttransfer)關(guān)中斷保護(hù)斷點(diǎn)、保護(hù)現(xiàn)場(chǎng)判斷中斷條件轉(zhuǎn)入中斷服務(wù)程序開中斷執(zhí)行中斷服務(wù)程序關(guān)中斷恢復(fù)現(xiàn)場(chǎng)、恢復(fù)斷點(diǎn)開中斷返回?cái)帱c(diǎn)圖1-4程序中斷傳送程序流程過程:?jiǎn)?dòng)外圍設(shè)備后主機(jī)繼續(xù)執(zhí)行程序。當(dāng)外圍設(shè)備完成數(shù)據(jù)傳送的準(zhǔn)備后,便向CPU發(fā)關(guān)中斷保護(hù)斷點(diǎn)、保護(hù)現(xiàn)場(chǎng)判斷中斷條件轉(zhuǎn)入中斷服務(wù)程序開中斷執(zhí)行中斷服務(wù)程序關(guān)中斷恢復(fù)現(xiàn)場(chǎng)、恢復(fù)斷點(diǎn)開中斷返回?cái)帱c(diǎn)圖1-4程序中斷傳送程序流程優(yōu)點(diǎn):在一定程度上實(shí)現(xiàn)了CPU和外圍設(shè)備的并行工作。多中斷:若在某一時(shí)刻有幾臺(tái)外圍設(shè)備發(fā)出中斷請(qǐng)求信號(hào),CPU可根據(jù)預(yù)先規(guī)定好的優(yōu)先順序,按輕重緩急去處理幾臺(tái)外設(shè)的數(shù)據(jù)傳送,從而實(shí)現(xiàn)了外圍設(shè)備的并行工作。1.3計(jì)算機(jī)硬件系統(tǒng)的設(shè)計(jì)內(nèi)容計(jì)算機(jī)硬件系統(tǒng)的設(shè)計(jì)不僅僅是將電路設(shè)計(jì)出來(lái)就完成任務(wù),要將硬件設(shè)計(jì)并調(diào)試到軟件可以方便運(yùn)行和調(diào)用的程度,所涉及的內(nèi)容要廣的多。目前一般認(rèn)為下列內(nèi)容都屬于硬件工程師要完成的任務(wù):電路設(shè)計(jì)、可編程器件的邏輯設(shè)計(jì)、專用集成電路設(shè)計(jì)、指令系統(tǒng)設(shè)計(jì)、計(jì)算機(jī)系統(tǒng)設(shè)計(jì)、微程序控制設(shè)計(jì)、匯編語(yǔ)言程序設(shè)計(jì)、設(shè)備驅(qū)動(dòng)程序設(shè)計(jì)和系統(tǒng)仿真和調(diào)試的測(cè)試。目前,嵌入式硬件的設(shè)計(jì)師還用懂得嵌入式實(shí)時(shí)操作系統(tǒng)??傊?,凡是實(shí)現(xiàn)“操作數(shù)字”的任務(wù),以及以上層軟件如何調(diào)用這些基本操作所涉及的軟硬件接口,都是硬件設(shè)計(jì)的內(nèi)容。計(jì)算機(jī)硬件設(shè)計(jì)的層次不同,采用的方法也有所區(qū)別,專業(yè)的計(jì)算機(jī)一股腦見人員可能會(huì)涉及到處理器設(shè)計(jì)、存儲(chǔ)器設(shè)計(jì)和傳輸通道設(shè)計(jì),而非計(jì)算機(jī)的工程技術(shù)人員往往是利用已有的器件來(lái)設(shè)計(jì)板卡或者某種數(shù)字化裝置。一般來(lái)說,現(xiàn)代的硬件設(shè)計(jì)人員應(yīng)該掌握電子設(shè)計(jì)自動(dòng)化(EDA)方法和相應(yīng)的軟件工具。EDA是利用計(jì)算機(jī)軟件設(shè)計(jì)和仿真工具來(lái)進(jìn)行硬件的芯片設(shè)計(jì)、電路原理設(shè)計(jì)、布板、運(yùn)行仿真、熱設(shè)計(jì)和電磁兼容性仿真等。它可以大大提高硬件設(shè)計(jì)的效率和正確性。作為硬件設(shè)計(jì)人員,還要學(xué)習(xí)硬件描述語(yǔ)言HDL,會(huì)采用各種開發(fā)工具軟件和測(cè)試工具軟件,并會(huì)用邏輯分析儀和示波器等調(diào)試硬件電路。1.4計(jì)算機(jī)硬件系統(tǒng)的設(shè)計(jì)原則計(jì)算機(jī)硬件系統(tǒng)的設(shè)計(jì)要遵循兩個(gè)原則:(1)加快經(jīng)常性事件經(jīng)常性事件就是發(fā)生最頻繁、占時(shí)間最多的事件,如果某個(gè)事件占了總運(yùn)行時(shí)間的90%,這部分加快了10倍,總時(shí)間就會(huì)顯著減小到原來(lái)的19%。但如果某個(gè)事件只占了總時(shí)間的10%,即使加快10000倍,總時(shí)間也會(huì)少于原來(lái)的90%。所以,加快經(jīng)常性事件效果最好。(2)性能平衡原則即CPU、內(nèi)存、I/O的性能要相互匹配才是一個(gè)性能平衡的系統(tǒng),不平衡就會(huì)出現(xiàn)瓶頸。一個(gè)經(jīng)驗(yàn)的定律是:每一個(gè)MIPS(每秒兆指令數(shù))的處理能力,需要1MB的內(nèi)存與1MB/s的I/O帶寬與之匹配。第二章數(shù)據(jù)采集技術(shù)概述數(shù)據(jù)采集技術(shù)是微型計(jì)算機(jī)應(yīng)用技術(shù)的重要分支。外部現(xiàn)實(shí)對(duì)象(廣義的外部設(shè)備)通過接口和計(jì)算機(jī)交換信息,在現(xiàn)實(shí)對(duì)象中.信息表現(xiàn)為不同的形式并有明確的物理意義,輸入到計(jì)算機(jī)內(nèi)部后部變成二進(jìn)制數(shù),統(tǒng)稱為數(shù)據(jù)。數(shù)據(jù)經(jīng)過計(jì)算機(jī)的加工處理再作用到現(xiàn)實(shí)對(duì)象,又變成具體的物理信號(hào)。上述整個(gè)過程部可以看成是數(shù)據(jù)采集技術(shù)涵蓋的內(nèi)容。2.1數(shù)據(jù)采集系統(tǒng)的結(jié)構(gòu)原理數(shù)據(jù)采集系統(tǒng)一般包括模擬信號(hào)的輸入輸出通道和數(shù)字信號(hào)的輸入輸出通道。數(shù)據(jù)采集系統(tǒng)的輸入又稱為數(shù)據(jù)的收集;數(shù)據(jù)采集系統(tǒng)的輸出又稱為數(shù)據(jù)的分配。2.1.1數(shù)據(jù)采集系統(tǒng)的分類數(shù)據(jù)采集系統(tǒng)的結(jié)構(gòu)形式多種多樣,用途和功能也各不相同,常見的分類方法有以下幾種:根據(jù)數(shù)據(jù)采集系統(tǒng)的功能分類:數(shù)據(jù)收集和數(shù)據(jù)分配;根據(jù)數(shù)據(jù)采集系統(tǒng)適應(yīng)環(huán)境分類:隔離型和非隔離型,集中式和分布式,高速、中速和低速型;根據(jù)數(shù)據(jù)采集系統(tǒng)的控制功能分類:智能化數(shù)據(jù)采集系統(tǒng),非智能化數(shù)據(jù)采集系統(tǒng);根據(jù)模擬信號(hào)的性質(zhì)分類:電壓信號(hào)和電流信號(hào),高電平信號(hào)和低電平信號(hào),單端輸入(SE)和差動(dòng)輸入(DE),單極性和雙極性;根據(jù)信號(hào)通道的結(jié)構(gòu)方式分類:?jiǎn)瓮ǖ婪绞?,多通道方式?.1.2數(shù)據(jù)采集系統(tǒng)的基本功能數(shù)據(jù)采集系統(tǒng)的任務(wù),具體地說,就是采集傳感器輸出的模擬信號(hào)并轉(zhuǎn)換成計(jì)算機(jī)能識(shí)別的數(shù)字信號(hào),然后送入計(jì)算機(jī),根據(jù)不同的需要由計(jì)算機(jī)進(jìn)行相應(yīng)的計(jì)算和處理,得出所需的數(shù)據(jù)。與此同時(shí),將計(jì)算得到的數(shù)根進(jìn)行顯顯示和打印,以便文現(xiàn)對(duì)某些物理量的監(jiān)視[2]。由數(shù)據(jù)采集系統(tǒng)的任務(wù)可以知道,數(shù)據(jù)采集系統(tǒng)具有以下幾方面的功能:數(shù)據(jù)采集、模擬信號(hào)處理、數(shù)字信號(hào)處理、開關(guān)信號(hào)處理、二次數(shù)據(jù)計(jì)算、屏幕顯示、數(shù)據(jù)存儲(chǔ)、打印輸出、人機(jī)聯(lián)系。2.1.3數(shù)據(jù)采集系統(tǒng)的結(jié)構(gòu)形式從硬件力向來(lái)看,白前數(shù)據(jù)采集系統(tǒng)的結(jié)構(gòu)形式主要有兩種:一種是微型計(jì)算機(jī)數(shù)據(jù)采集系統(tǒng);另一種是集散型數(shù)據(jù)采集系統(tǒng)。微型計(jì)算機(jī)數(shù)據(jù)采集系統(tǒng)是由傳感器、模擬多路開關(guān)、程控放大器、采樣/保持器、AD轉(zhuǎn)換器、計(jì)算機(jī)及外設(shè)等部分組成。集散型數(shù)據(jù)采集系統(tǒng)是計(jì)算機(jī)網(wǎng)絡(luò)技術(shù)的產(chǎn)物,它由若十個(gè)“數(shù)據(jù)采集站”和一臺(tái)上位機(jī)及通信線路組成。數(shù)據(jù)采集站一般是由單片機(jī)數(shù)據(jù)采集裝置組成。位于生產(chǎn)設(shè)備附近,可獨(dú)立完成數(shù)據(jù)采集和頸處理任務(wù),還可將數(shù)據(jù)以數(shù)字信號(hào)的形式傳送給上位機(jī)。2.2數(shù)據(jù)采集系統(tǒng)設(shè)計(jì)的基本原則對(duì)于不同的采集對(duì)象,系統(tǒng)設(shè)計(jì)的具體要求是不相同的。但是,由于數(shù)據(jù)采集系統(tǒng)是由硬件和軟件兩部分組成的,因此,系統(tǒng)設(shè)計(jì)的一些基本原則是大體相同的[2]。2.2.1硬件設(shè)計(jì)的基本原則(1)經(jīng)濟(jì)合理系統(tǒng)硬件設(shè)計(jì)中,一定要注意在滿足件能指標(biāo)的前提下,盡可能地降低價(jià)格,以便得到高的性能價(jià)格比,這是硬件設(shè)計(jì)中優(yōu)先考慮的一個(gè)主要因素,也是一個(gè)產(chǎn)品爭(zhēng)取市場(chǎng)的主要因素之一。(2)安全可靠選購(gòu)設(shè)備要考慮環(huán)境的溫度、濕度、壓力、振動(dòng)、粉塵等要求,以保認(rèn)在規(guī)定的下作環(huán)境下,系統(tǒng)性能穩(wěn)定、工作可靠。要有超量程和過載保護(hù),保證輸入、輸出通道正常工作。要注意對(duì)交流市電以及電火花等的隔離。要保證連接件的接觸可靠。(3)足夠的抗干擾能力有完善的抗干擾措施,是保證系統(tǒng)精度、工作正常和不產(chǎn)生錯(cuò)誤的必要條件。2.2.2軟件設(shè)計(jì)的基本原則(1)結(jié)構(gòu)合理程序應(yīng)該采用結(jié)構(gòu)模塊化設(shè)計(jì)。這不僅有利于程序的進(jìn)一步擴(kuò)充,而且也有利于程序的修改和維護(hù)。在程序編序時(shí),要盡量使得程序的層次分明,易于閱讀和理解,同時(shí)還可以簡(jiǎn)化程序,減少程序?qū)τ趦?nèi)存的使用量。當(dāng)程序中有經(jīng)常需要加以修改或變化的參數(shù)時(shí),應(yīng)該設(shè)計(jì)成獨(dú)立的參數(shù)傳遞群序,避免程序的頻繁修改。(2)操作性能好操作件能好是指使用方便。這點(diǎn)對(duì)數(shù)據(jù)采集系統(tǒng)來(lái)說是很重要的。在開發(fā)程序時(shí),應(yīng)該考慮如何降低對(duì)操作人員專業(yè)知識(shí)的要求。(3)系統(tǒng)應(yīng)設(shè)計(jì)一定的檢測(cè)程序,例如狀態(tài)檢測(cè)利診斷程序,以便系統(tǒng)發(fā)生故障時(shí)容易確定故障部位,對(duì)于重要的參數(shù)要定時(shí)存儲(chǔ),以防止因掉電而丟失數(shù)據(jù)。(4)提高程序的執(zhí)行速度。(5)給出必要的程序說明。第三章數(shù)據(jù)采集系統(tǒng)的硬件設(shè)計(jì)3.1系統(tǒng)結(jié)構(gòu)框圖物理模擬量數(shù)據(jù)采集模塊物理模擬量數(shù)據(jù)采集模塊鍵盤單片機(jī)液晶顯示圖3-1系統(tǒng)模塊關(guān)系圖3.2系統(tǒng)工作原理該系統(tǒng)工作的總原理圖如圖3-2。圖3-2系統(tǒng)總原理圖3.2.1CPU處理核心模塊AT89C52是一種高性能低功耗的采用CMOS工藝制造的8位微控制器,擁有8KB的可編程的閃存(Flashprogrammableanderasablereadonlymemory)。它提供下列標(biāo)準(zhǔn)特征:8K字節(jié)的閃速存儲(chǔ)器,56字節(jié)的RAM,32條I/O線,3個(gè)16位定時(shí)器/計(jì)數(shù)器,一個(gè)六中斷源兩個(gè)優(yōu)先級(jí)的中斷結(jié)構(gòu),一個(gè)雙工的串行口,片上震蕩器和時(shí)鐘電路。其管腳圖如圖3-3所示:圖3-38051芯片管腳圖圖3-38051芯片管腳圖·VCC:電源電壓·GND:地·P0口:P0口是一組8位漏極開路型雙向I/O口,作為輸出口用時(shí),每個(gè)引腳能驅(qū)動(dòng)8個(gè)TTL邏輯門電路。當(dāng)對(duì)0端口寫入1時(shí),可以作為高阻抗輸入端使用。當(dāng)P0口訪問外部程序存儲(chǔ)器或數(shù)據(jù)存儲(chǔ)器時(shí),它還可設(shè)定成地址數(shù)據(jù)總線復(fù)用的形式。在這種模式下,P0口具有內(nèi)部上拉電阻。在Flash編程時(shí),P0口接收指令字節(jié),同時(shí)輸出指令字節(jié)在程序校驗(yàn)時(shí)。程序校驗(yàn)時(shí)需要外接上拉電阻?!1口:P1口是一帶有內(nèi)部上拉電阻的8位雙向I/O口。P1口的輸出緩沖能接受或輸出4個(gè)TTL邏輯門電路。當(dāng)對(duì)P1口寫1時(shí),它們被內(nèi)部的上拉電阻拉升為高電平,此時(shí)可以作為輸入端使用。當(dāng)作為輸入端使用時(shí),P1口因?yàn)閮?nèi)部存在上拉電阻,所以當(dāng)外部被拉低時(shí)會(huì)輸出一個(gè)低電流(IIL)。·P2口:P2是一帶有內(nèi)部上拉電阻的8位雙向的I/O端口。P2口的輸出緩沖能驅(qū)動(dòng)4個(gè)TTL邏輯門電路。當(dāng)向P2口寫1時(shí),通過內(nèi)部上拉電阻把端口拉到高電平,此時(shí)可以用作輸入口。作為輸入口,因?yàn)閮?nèi)部存在上拉電阻,某個(gè)引腳被外部信號(hào)拉低時(shí)會(huì)輸出電流(IIL)。P2口在訪問外部程序存儲(chǔ)器或16位地址的外部數(shù)據(jù)存儲(chǔ)器(例如MOVX@DPTR)時(shí),P2口送出高8位地址數(shù)據(jù)。在這種情況下,P2口使用強(qiáng)大的內(nèi)部上拉電阻功能當(dāng)輸出1時(shí)。當(dāng)利用8位地址線訪問外部數(shù)據(jù)存儲(chǔ)器時(shí)(例MOVX@R1),P2口輸出特殊功能寄存器的內(nèi)容。當(dāng)Flash編程或校驗(yàn)時(shí),P2口同時(shí)接收高8位地址和一些控制信號(hào)?!3口:P3是一帶有內(nèi)部上拉電阻的8位雙向的I/O端口。P3口的輸出緩沖能驅(qū)動(dòng)4個(gè)TTL邏輯門電路。當(dāng)向P3口寫1時(shí),通過內(nèi)部上拉電阻把端口拉到高電平,此時(shí)可以用作輸入口。作為輸入口,因?yàn)閮?nèi)部存在上拉電阻,某個(gè)引腳被外部信號(hào)拉低時(shí)會(huì)輸出電流(IIL)。P3口同時(shí)具有AT89C51的多種特殊功能,具體如下表3-1所示。表3-1P3口的第二功能端口引腳第二功能RXD(串行輸入口)TXD(串行輸出口)(外部中斷0)(外部中斷1)T0(定時(shí)器0)T1(定時(shí)器1)(外部數(shù)據(jù)存儲(chǔ)器寫選通)(外部數(shù)據(jù)存儲(chǔ)器都選通)·RST:復(fù)位輸入。當(dāng)振蕩器工作時(shí),RST引腳出現(xiàn)兩個(gè)機(jī)器周期的高電平將使單片機(jī)復(fù)位?!LE/:當(dāng)訪問外部存儲(chǔ)器時(shí),地址鎖存允許是一輸出脈沖,用以鎖存地址的低8位字節(jié)。當(dāng)在Flash編程時(shí)還可以作為編程脈沖輸出()。一般情況下,ALE是以晶振頻率的1/6輸出,可以用作外部時(shí)鐘或定時(shí)目的。但也要注意,每當(dāng)訪問外部數(shù)據(jù)存儲(chǔ)器時(shí)將跳過一個(gè)ALE脈沖。·:程序存儲(chǔ)允許時(shí)外部程序存儲(chǔ)器的讀選通信號(hào)。當(dāng)AT89C52執(zhí)行外部程序存儲(chǔ)器的指令時(shí),每個(gè)機(jī)器周期兩次有效,除了當(dāng)訪問外部數(shù)據(jù)存儲(chǔ)器時(shí),將跳過兩個(gè)信號(hào)?!?VPP:外部訪問允許。為了使單片機(jī)能夠有效的傳送外部數(shù)據(jù)存儲(chǔ)器從0000H到FFFH單元的指令,必須同GND相連接。需要主要的是,如果加密位1被編程,復(fù)位時(shí)EA端會(huì)自動(dòng)內(nèi)部鎖存。當(dāng)執(zhí)行內(nèi)部編程指令時(shí),應(yīng)該接到VCC端?!TAL1:振蕩器反相放大器以及內(nèi)部時(shí)鐘電路的輸入端?!TAL2:振蕩器反相放大器的輸出端。本系統(tǒng)中,采用AT89C52作為CPU處理器,充分利用其硬件資源,結(jié)合74ls373鎖存器,7404、7402、74138等數(shù)字處理芯片,連接了各個(gè)硬件模塊。地址分配如下:ADC0809地址:0111100000000000B--01111111XXXXXXXXB3.2.2ADC模數(shù)轉(zhuǎn)換1.ADC0809主要特性ADC0809是采用CMOS工藝制造的雙列直插式單片8位A/D轉(zhuǎn)換器。分辨率8位,精度7位,帶8個(gè)模擬量輸入通道,有通道地址譯碼鎖存器,輸出帶三態(tài)數(shù)據(jù)鎖存器。啟動(dòng)信號(hào)為脈沖啟動(dòng)方式,最大可調(diào)節(jié)誤差為±1LSB,ADC0809內(nèi)部設(shè)有時(shí)鐘電路,故CLK時(shí)鐘需由外部輸入,fclk允許范圍為500kHz~1MHz,典型值為640kHz。每通道的轉(zhuǎn)換需66~73個(gè)時(shí)鐘脈沖,大約100~110μs。工作溫度范圍為-40℃~+85℃。功耗為15mW,輸入電壓范圍為0~5V,單一+5V電源供電。它可以接與Z80、8085、8080、8031等2.ADC0809內(nèi)部結(jié)構(gòu)和外部引腳ADC0809A/D轉(zhuǎn)換器,其內(nèi)部結(jié)構(gòu)如圖3-4所示。包括一個(gè)高阻抗斬波比較器;一個(gè)帶有256個(gè)電阻分壓器的樹狀開關(guān)網(wǎng)絡(luò);一個(gè)邏輯控制環(huán)節(jié)和8位逐次比較寄存器(SAR);一個(gè)8位三態(tài)輸出緩沖器。引腳功能介紹如下:圖3-4圖3-4ADC0809內(nèi)部結(jié)構(gòu)和外部引腳圖A、IN0~IN8:8路輸入通道的模擬量輸入端,輸入;B、2-1~2-8:8位數(shù)字量輸出端;2-1為最低位(LSB),2-8為最高位(MSB),輸出,三態(tài);C、ALE:地址鎖存控制信號(hào),輸入,上升沿有效。將地址選擇信號(hào)A、B、C鎖入地址寄存器;D、START:?jiǎn)?dòng)A/D轉(zhuǎn)換控制信號(hào),輸入,上升沿有效。當(dāng)輸入一個(gè)正脈沖,便立即啟動(dòng)A/D轉(zhuǎn)換,同時(shí)使EOC變?yōu)榈碗娖剑籈、EOC:A/D轉(zhuǎn)換結(jié)束信號(hào),輸出,高電平有效。EOC由低電平變?yōu)楦唠娖?,表明本次A/D轉(zhuǎn)換已經(jīng)結(jié)束;F、OE:輸出允許控制信號(hào),輸入,高電平有效。OE由低電平變?yōu)楦唠娖?,打開三態(tài)輸出鎖存器,將轉(zhuǎn)換的結(jié)果輸出到數(shù)據(jù)總線上;G、VREF(-)、VREF(+):片內(nèi)D/A轉(zhuǎn)換器的參考電壓輸入端。VREF(-)不能為負(fù)值,VREF(+)不能高于VCC,且1/2[VREF(-)+VREF(+)]與1/2VCC之差不得大于;H、CLOCK:時(shí)鐘輸入端。500kHz~1MHz,典型值為640kHz。I、A、B、C:8路模擬開關(guān)的3位地址選通輸入端,其對(duì)應(yīng)關(guān)系如表3-2所示。表3-28路模擬開關(guān)地址選通輸入端ADC0809時(shí)序圖如圖3-5所示。其中,tWS:最小起動(dòng)脈寬,典型值為100ns,最大值為200ns;tWE:最小ALE脈寬,典型值為100ns,最大值為200ns;tD:模擬開關(guān)延時(shí),典型值為1μs,最大值為μs;tC:轉(zhuǎn)換時(shí)間,當(dāng)fclk=640kHz時(shí),典型值為100μs,最大值為116μs;tEOC:轉(zhuǎn)換結(jié)束延時(shí),最大位8個(gè)時(shí)鐘周期加2μs。本系統(tǒng)采用中斷連接方式,當(dāng)傳感器獲取的信號(hào)經(jīng)過放大器放大和濾波后再AD轉(zhuǎn)換器進(jìn)行處理。通過對(duì)其模擬通道控制線ADDA、ADDB、ADDC的設(shè)值可以對(duì)通道進(jìn)行選擇。將ADDA、ADDB、ADDC分別接系統(tǒng)地址鎖存器提供的末三位地址,只要把三位位地址寫入0809中的地址鎖存器,就實(shí)現(xiàn)了通道的選擇。將ADC0809的ALE和START信號(hào)連在一起,然后將8051中的P2.7作為片選信號(hào),與8051中的/WR“或非”后接ALE信號(hào),與/RD“或非”后連ADC0809的OE信號(hào),同時(shí)將ADC的EOC轉(zhuǎn)換結(jié)束信號(hào)連接8051的中斷口。該模塊的原理圖如圖3-6。圖3-5ADC0809時(shí)序圖圖3-6AD轉(zhuǎn)換模塊原理圖此時(shí)啟動(dòng)A/D轉(zhuǎn)換只需一條MOVX指令。例如:MOVDPTR,#0000H;送入0809的口地址,選擇IN0通道MOVX@DPTR,A;啟動(dòng)轉(zhuǎn)換轉(zhuǎn)換完成后,將會(huì)給8051一個(gè)中斷,此時(shí)只要在中斷程序中保存數(shù)據(jù)即可。3.2.3液晶顯示流程本系統(tǒng)的顯示部分采用RT1602c字符顯示模塊,與采用數(shù)碼管相比,硬件連接和軟件調(diào)試上都由優(yōu)勢(shì)。只要把要顯示的內(nèi)容放進(jìn)液晶模塊的顯示存儲(chǔ)器里面就可以直觀的顯示出指定的內(nèi)容,操作方便。1602采用標(biāo)準(zhǔn)的14腳接口,其中:第1腳:VSS為地電源。第2腳:VDD接5V正電源。第3腳:V0為液晶顯示器對(duì)比度調(diào)整端。第4腳:RS為寄存器選擇,高電平時(shí)選擇數(shù)據(jù)寄存器、低電平時(shí)選擇指令寄存器。第5腳:RW為讀寫信號(hào)線,高電平時(shí)進(jìn)行讀操作,低電平時(shí)進(jìn)行寫操作。當(dāng)RS和RW共同為低電平時(shí)可以寫入指令或者顯示地址,當(dāng)RS為低電平RW為高電平時(shí)可以讀忙信號(hào),當(dāng)RS為高電平RW為低電平時(shí)可以寫入數(shù)據(jù)。第6腳:E端為使能端,當(dāng)E端由高電平跳變成低電平時(shí),液晶模塊執(zhí)行命令。第7~14腳:D0~D7為8位雙向數(shù)據(jù)線。第15~16腳:空腳1602液晶模塊內(nèi)部的字符發(fā)生存儲(chǔ)器(CGROM)已經(jīng)存儲(chǔ)了160個(gè)不同的點(diǎn)陣字符圖形,如表3-3所示,這些字符有:阿拉伯?dāng)?shù)字、英文字母的大小寫、常用的符號(hào)、和日文假名等,每一個(gè)字符都有一個(gè)固定的代碼,比如大寫的英文字母“A”的代碼是01000001B(41H),顯示時(shí)模塊把地址41H中的點(diǎn)陣字符圖形顯示出來(lái),我們就能看到字母“A”表3-31602字符碼表它的讀寫操作、屏幕和光標(biāo)的操作都是通過指令編程來(lái)實(shí)現(xiàn)的。(說明:1為高電平、0為低電平),指令表見表3-4。表3-31602字符碼表表3-41602字符模塊指令表指令1:清顯示,指令碼01H,光標(biāo)復(fù)位到地址00H位置指令2:光標(biāo)復(fù)位,光標(biāo)返回到地址00H指令3:光標(biāo)和顯示模式設(shè)置I/D:光標(biāo)移動(dòng)方向,高電平右移,低電平左移S:屏幕上所有文字是否左移或者右移。高電平表示有效,低電平則無(wú)效指令4:顯示開關(guān)控制。D:控制整體顯示的開與關(guān),高電平表示開顯示,低電平表示關(guān)顯示C:控制光標(biāo)的開與關(guān),高電平表示有光標(biāo),低電平表示無(wú)光標(biāo)B:控制光標(biāo)是否閃爍,高電平閃爍,低電平不閃爍指令5:光標(biāo)或顯示移位S/C:高電平時(shí)移動(dòng)顯示的文字,低電平時(shí)移動(dòng)光標(biāo)指令6:功能設(shè)置命令DL:高電平時(shí)為4位總線,低電平時(shí)為8位總線N:低電平時(shí)為單行顯示,高電平時(shí)雙行顯示F:低電平時(shí)顯示5x7的點(diǎn)陣字符,高電平時(shí)顯示5x10的點(diǎn)陣字符指令7:字符發(fā)生器RAM地址設(shè)置指令8:DDRAM地址設(shè)置指令9:讀忙信號(hào)和光標(biāo)地址BF:為忙標(biāo)志位,高電平表示忙,此時(shí)模塊不能接收命令或者數(shù)據(jù),如果為低電平表示不忙。指令10:寫數(shù)據(jù)指令11:讀數(shù)據(jù)圖3-7液晶顯示原理圖該模塊的硬件原理圖如圖3-7所示。1602C的數(shù)據(jù)口接單片機(jī)的P0口,使能端E接P2.5,液晶的RS端接P2.3,讀寫端RW接P2.4,這樣使用下面的子程序就可以實(shí)現(xiàn)寫入命令和數(shù)據(jù):RS=1;//置1為寫入數(shù)據(jù),置0為寫入命令RW=0;//讀寫端置0為寫命令,即將命令或數(shù)據(jù)寫入液晶的數(shù)據(jù)命令寄存器E=1; //P0=l_data;//把數(shù)據(jù)賦給P0數(shù)據(jù)口E=0;//在使能端下降沿時(shí)將數(shù)據(jù)寫入液晶的存儲(chǔ)器delay();//寫的過程要有數(shù)個(gè)延時(shí)3.2.4完整的PCB版圖本次畢業(yè)設(shè)計(jì)的完整的PCB制版圖如下圖所示,所制作的PCB是單面板,圖3-8所示的三根紅線在制作完成的PCB版圖中并不存在,需要使用飛線連接起來(lái),這一點(diǎn)大家尤其要注意,否則系統(tǒng)不能正常工作。圖3-9不帶跳線的PCB圖圖3-8圖3-9不帶跳線的PCB圖圖3-8帶有跳線的PCB圖

第四章數(shù)據(jù)采集系統(tǒng)的軟件設(shè)計(jì)4.1匯編和keilc匯編語(yǔ)言是一種用文字助記符來(lái)表示機(jī)器指令的符號(hào)語(yǔ)言,是最接近機(jī)器碼的一種語(yǔ)言。其主要優(yōu)點(diǎn)是占用資源少、程序執(zhí)行效率高。但是不同的CPU,其匯編語(yǔ)言可能有所差異,所以不易移植。對(duì)于目前普遍使用的RISC架構(gòu)的8bitMCU來(lái)說,其內(nèi)部ROM、RAM、STACK等資源都有限,如果使用C語(yǔ)言編寫,一條C語(yǔ)言指令編譯后,會(huì)變成很多條機(jī)器碼,很容易出現(xiàn)ROM空間不夠、堆棧溢出等問題。而且一些單片機(jī)廠家也不一定能提供C編譯器。而匯編語(yǔ)言,一條指令就對(duì)應(yīng)一個(gè)機(jī)器碼,每一步執(zhí)行什么動(dòng)作都很清楚,并且程序大小和堆棧調(diào)用情況都容易控制,調(diào)試起來(lái)也比較方便。所以在資源較少單片機(jī)開發(fā)中,建議采用匯編語(yǔ)言比較好。C語(yǔ)言是一種編譯型程序設(shè)計(jì)語(yǔ)言,它兼顧了多種高級(jí)語(yǔ)言的特點(diǎn),并具備匯編語(yǔ)言的功能。C語(yǔ)言有功能豐富的庫(kù)函數(shù)、運(yùn)算速度快、編譯效率高、有良好的可移植性,而且可以直接實(shí)現(xiàn)對(duì)系統(tǒng)硬件的控制。C語(yǔ)言是一種結(jié)構(gòu)化程序設(shè)計(jì)語(yǔ)言,它支持當(dāng)前程序設(shè)計(jì)中廣泛采用的由頂向下結(jié)構(gòu)化程序設(shè)計(jì)技術(shù)。此外,C語(yǔ)言程序具有完善的模塊程序結(jié)構(gòu),從而為軟件開發(fā)中采用模塊化程序設(shè)計(jì)方法提供了有力的保障。因此,使用C語(yǔ)言進(jìn)行程序設(shè)計(jì)已成為軟件開發(fā)的一個(gè)主流。用C語(yǔ)言來(lái)編寫目標(biāo)系統(tǒng)軟件,會(huì)大大縮短開發(fā)周期,且明顯地增加軟件的可讀性,便于改進(jìn)和擴(kuò)充,從而研制出規(guī)模更大、性能更完備的系統(tǒng),用C語(yǔ)言進(jìn)行單片機(jī)程序設(shè)計(jì)是單片機(jī)開發(fā)與應(yīng)用的必然趨勢(shì)。所以作為一個(gè)技術(shù)全面并涉足較大規(guī)模的軟件系統(tǒng)開發(fā)的單片機(jī)開發(fā)人員最好能夠掌握基本的C語(yǔ)言編程。使用C語(yǔ)言肯定要使用到C編譯器,以便把寫好的C程序編譯為機(jī)器碼,這樣單片機(jī)才能執(zhí)行編寫好的程序。KEILuVISION2是眾多單片機(jī)應(yīng)用開發(fā)軟件中優(yōu)秀的軟件之一,它支持眾多不同公司的MCS51架構(gòu)的芯片,它集編輯,編譯,仿真等于一體,同時(shí)還支持,PLM,匯編和C語(yǔ)言的程序設(shè)計(jì),它的界面和常用的微軟VC++的界面相似,界面友好,易學(xué)易用,在調(diào)試程序,軟件仿真方面也有很強(qiáng)大的功能。因此本系統(tǒng)采用KEILuVISION2進(jìn)行軟件的編寫和調(diào)試。4.2KeilC51vsANSIC(標(biāo)準(zhǔn)C)下面將介紹KeilC的主要特點(diǎn)和它與ANSIC的不同之處。Keil編譯器除了少數(shù)一些關(guān)鍵地方外基本類似于ANSIC。差異主要是Keil可以讓戶針對(duì)8051的結(jié)構(gòu)進(jìn)行程序設(shè)計(jì),其它差異主要是8051的一些局限引起的。深入理解并應(yīng)用C51對(duì)標(biāo)準(zhǔn)ANSIC的擴(kuò)展是學(xué)習(xí)C51的關(guān)鍵之一。因?yàn)榇蠖鄶?shù)擴(kuò)展功能都是直接針對(duì)8051系列CPU硬件的。大致有以下幾點(diǎn):(1)8051存儲(chǔ)類型及存儲(chǔ)區(qū)域,(2)變量類型聲明與位變量與位尋址,(3)特殊功能寄存器(SFR),(4)C51指針與函數(shù)屬性,具體說明如下。4.2.1內(nèi)存區(qū)域(MemoryAreas):1.PragramArea:由Code說明可有多達(dá)64kBytes的程序存儲(chǔ)器2.InternalDataMemory:內(nèi)部數(shù)據(jù)存儲(chǔ)器可用以下關(guān)鍵字說明:data:直接尋址區(qū),為內(nèi)部RAM的低128字節(jié)00H~7FHidata:間接尋址區(qū),包括整個(gè)內(nèi)部RAM區(qū)00H~FFHbdata:可位尋址區(qū),20H~2FH3.ExternalDataMemory外部RAM視使用情況可由以下關(guān)鍵字標(biāo)識(shí):xdata:可指定多達(dá)64KB的外部直接尋址區(qū),地址范圍0000H~0FFFFHpdata:能訪問1頁(yè)(25bBytes)的外部RAM,主要用于緊湊模式(CompactModel)。4.SpeciacFunctionRegisterMemory8051提供128Bytes的SFR尋址區(qū),這區(qū)域可位尋址、字節(jié)尋址或字尋址,用以控制定時(shí)器、計(jì)數(shù)器、串口、I/O及其它部件,可由以下幾種關(guān)鍵字說明:sfr:字節(jié)尋址比如sfrP0=0x80;為PO口地址為80H,“=”后H~FFH之間的常數(shù)。sfr16:字尋址,如sfr16T2=0xcc;指定Timer2口地址T2L=0xccT2H=0xCDsbit:位尋址,如sbitEA=0xAF;指定第0xAF位為EA,即中斷允許還可以有如下定義方法:sbit0V=PSW^2;(定義0V為PSW的第2位)sbit0V=0XDO^2;(同上)或bit0V-=0xD2(同上)。4.2.2變量或數(shù)據(jù)類型C51提供以下幾種擴(kuò)展數(shù)據(jù)類型:bit位變量值為0或1sbit從字節(jié)中定義的位變量0或1sfrsfr字節(jié)地址0~255sfr16sfr字地址0~65535其余數(shù)據(jù)類型如:char,enum,short,int,long,float等與ANSIC相同。1.bit位標(biāo)量bit位標(biāo)量是C51編譯器的一種擴(kuò)充數(shù)據(jù)類型,利用它可定義一個(gè)位標(biāo)量,但不能定義位指針,也不能定義位數(shù)組。它的值是一個(gè)二進(jìn)制位,不是0就是1,類似一些高級(jí)語(yǔ)言中的Boolean類型中的True和False。bit型變量可用變量類型,函數(shù)聲明、函數(shù)返回值等,存貯于內(nèi)部RAM20H~2FH。注意:(1)用#pragmadisable說明函數(shù)和用“usign”指定的函數(shù),不能返回bit值。(2)一個(gè)bit變量不能聲明為指針,如bit*ptr;是錯(cuò)誤的(3)不能有bit數(shù)組如:bitarr[5];錯(cuò)誤。可位尋址區(qū)說明20H-2FH,可作如下定義:intbdatai;charbdataarr[3],然后:sbitbito=in0;sbitbit15=I^15;sbitarr07=arr[0]^7;sbitarr15=arr[i]^7;2.sbit可錄址位sbit同位是C51中的一種擴(kuò)充數(shù)據(jù)類型,利用它可以訪問芯片內(nèi)部的RAM中的可尋址位或特殊功能寄存器中的可尋址位。如先前我們定義了sfrP1=0x90;//因P1端口的寄存器是可位尋址的,所以我們可以定義//同樣我們可以用P1.1的地址去寫,如sbitP1_1=0x91;這樣我們?cè)谝院蟮某绦蛘Z(yǔ)句中就可以用P1_1來(lái)對(duì)P1.1引腳進(jìn)行讀寫操作了。通常這些可以直接使用系統(tǒng)提供的預(yù)處理文件,里面已定義好各特殊功能寄存器的簡(jiǎn)單名字,直接引用可以省去一點(diǎn)時(shí)間。3.sfr特殊功能寄存器sfr也是一種擴(kuò)充數(shù)據(jù)類型,點(diǎn)用一個(gè)內(nèi)存單元,值域?yàn)?~255。利用它可以訪問51單片機(jī)內(nèi)部的所有特殊功能寄存器。如用sfrP1=0x90這一句定P1為P1端口在片內(nèi)的寄存器,在后面的語(yǔ)句中我們用以用P1=255(對(duì)P1端口的所有引腳置高電平)之類的語(yǔ)句來(lái)操作特殊功能寄存器。4.sfr1616位特殊功能寄存器sfr16占用兩個(gè)內(nèi)存單元,值域?yàn)?~65535。sfr16和sfr一樣用于操作特殊功能寄存器,所不同的是它用于操作占兩個(gè)字節(jié)的寄存器,好定時(shí)器T0和T1。4.2.3存儲(chǔ)類型聲明和存儲(chǔ)模式說明了一個(gè)變量的數(shù)據(jù)類型后,還可選擇說明該變量的存儲(chǔ)器類型。存儲(chǔ)器類型的說明就是指定該變量在C51硬件系統(tǒng)中所使用的存儲(chǔ)區(qū)域,并在編譯時(shí)準(zhǔn)確的定位。變量或參數(shù)的存儲(chǔ)類型可由存儲(chǔ)模式指定缺省類型,也可由關(guān)鍵字直接聲明指定。各類型分別用:code,data,idata,xdata,pdata說明:data--直接訪問內(nèi)部數(shù)據(jù)存儲(chǔ)器(128字節(jié)),訪問速度最快;bdata--可位尋址內(nèi)部數(shù)據(jù)存儲(chǔ)器(16字節(jié)),允許位與字節(jié)混合訪問;idata--間接訪問內(nèi)部數(shù)據(jù)存儲(chǔ)器(256字節(jié)),允許訪問全部?jī)?nèi)部地址;pdata--分頁(yè)訪問外部數(shù)據(jù)存儲(chǔ)器(256字節(jié)),用MOVX@Ri指令訪問;xdata--外部數(shù)據(jù)存儲(chǔ)器(64KB),用MOVX@DPTR指令訪問;code--程序存儲(chǔ)器(64KB),用MOVC@A+DPTR指令訪問。datauar1charcodearray[]=“hello!”;unsignedcharxdataarr[10][4][4];如果省略存儲(chǔ)器類型,系統(tǒng)則會(huì)按編譯模式SMALL,COMPACT或LARGE所規(guī)定的默認(rèn)存儲(chǔ)器類型去指定變量的存儲(chǔ)區(qū)域。無(wú)論什么存儲(chǔ)模式都可以聲明變量在任何的8051存儲(chǔ)區(qū)范圍,然而把最常用的命令如循環(huán)計(jì)數(shù)器和隊(duì)列索引放在內(nèi)部數(shù)據(jù)區(qū)可以顯著的提高系統(tǒng)性能。還有要指出的就是變量的存儲(chǔ)種類與存儲(chǔ)器類型是完全無(wú)關(guān)的。SMALL存儲(chǔ)模式把所有函數(shù)變量和局部數(shù)據(jù)段放在8051系統(tǒng)的內(nèi)部數(shù)據(jù)存儲(chǔ)區(qū)這使訪問數(shù)據(jù)非???,但SMALL存儲(chǔ)模式的地址空間受限。在寫小型的應(yīng)用程序時(shí),變量和數(shù)據(jù)放在data內(nèi)部數(shù)據(jù)存儲(chǔ)器中是很好的因?yàn)樵L問速度快,但在較大的應(yīng)用程序中data區(qū)最好只存放小的變量、數(shù)據(jù)或常用的變量(如循環(huán)計(jì)數(shù)、數(shù)據(jù)索引),而大的數(shù)據(jù)則放置在別的存儲(chǔ)區(qū)域。COMPACT存儲(chǔ)模式中所有的函數(shù)和程序變量和局部數(shù)據(jù)段定位在8051系統(tǒng)的外部數(shù)據(jù)存儲(chǔ)區(qū)。外部數(shù)據(jù)存儲(chǔ)區(qū)可有最多256字節(jié)(一頁(yè)),在本模式中外部數(shù)據(jù)存儲(chǔ)區(qū)的短地址用@R0/R1。LARGE存儲(chǔ)模式所有函數(shù)和過程的變量和局部數(shù)據(jù)段都定位在8051系統(tǒng)的外部數(shù)據(jù)區(qū)外部數(shù)據(jù)區(qū)最多可有64KB,這要求用DPTR數(shù)據(jù)指針訪問數(shù)據(jù)。之前提到簡(jiǎn)單提到sfr,sfr16,sbit定義變量的方法,下面我們?cè)賮?lái)仔細(xì)看看。sfr和sfr16可以直接對(duì)51單片機(jī)的特殊寄存器進(jìn)行定義,定義方法如下:sfr特殊功能寄存器名=特殊功能寄存器地址常數(shù);sfr16特殊功能寄存器名=特殊功能寄存器地址常數(shù);我們可以這樣定義AT89C51的P1口:sfrP1=0x90;//定義P1I/O口,其地址90Hsfr關(guān)鍵定后面是一個(gè)要定義的名字,可任意選取,但要符合標(biāo)識(shí)符的命名規(guī)則,名字最好有一定的含義如P1口可以用P1為名,這樣程序會(huì)變的好讀好多。等號(hào)后面必須是常數(shù),不允許有帶運(yùn)算符的表達(dá)式,而且該常數(shù)必須在特殊功能寄存器的地址范圍之內(nèi)(80H-FFH),具體可查看附錄中的相關(guān)表。sfr是定義8位的特殊功能寄存器而sfr16則是用來(lái)定義16位特殊功能寄存器,如8052的T2定時(shí)器,可以定義為:sfr16T2=0xCC;//這里定義8052定時(shí)器2,地址為T2L=CCH,T2H=CDH用sfr16定義16位特殊功能寄存器時(shí),等號(hào)后面是它的低位地址,高位地址一定要位于物理低位地址之上。注意的是不能用于定時(shí)器0和1的定義。sbit可定義可位尋址對(duì)象。如訪問特殊功能寄存器中的某位。其實(shí)這樣應(yīng)用是經(jīng)常要用的如要訪問P1口中的第2個(gè)引腳P1.1。我們可以照以下的方法去定義:(1)sbit位變量名=位地址sbitP1_1=Ox91;這樣是把位的絕對(duì)地址賦給位變量。同sfr一樣sbit的位地址必須位于80H-FFH之間。(2)Sbit位變量名=特殊功能寄存器名^位位置sftP1=0x90;sbitP1_1=P1^1;//先定義一個(gè)特殊功能寄存器名再指定位變量名所在的位置,當(dāng)可尋址位位于特殊功能寄存器中時(shí)可采用這種方法。(3)sbit位變量名=字節(jié)地址^位位置sbitP1_1=0x90^1;這種方法其實(shí)和2是一樣的,只是把特殊功能寄存器的位址直接用常數(shù)表示。在C51存儲(chǔ)器類型中提供有一個(gè)bdata的存儲(chǔ)器類型,這個(gè)是指可位尋址的數(shù)據(jù)存儲(chǔ)器,位于單片機(jī)的可位尋址區(qū)中,可以將要求可位錄址的數(shù)據(jù)定義為bdata,如:unsignedcharbdataib;//在可位錄址區(qū)定義ucsignedchar類型的變量ibintbdataab[2];//在可位尋址區(qū)定義數(shù)組ab[2],這些也稱為可尋址位對(duì)象sbitib7=ib^7//用關(guān)鍵字sbit定義位變量來(lái)獨(dú)立訪問可尋址位對(duì)象的其中一位sbitab12=ab[1]^12;操作符"^"后面的位位置的最大值取決于指定的基址類型,char0-7,int0-15,long0-31。4.2.4KeilC51指針C51支持一般指針(GenericPointer)和存儲(chǔ)器指針(Memory_SpecificPointer)。1.一般指針一般指針的聲明和使用均與標(biāo)準(zhǔn)C相同,不過同時(shí)還可以說明指針的存儲(chǔ)類型,例如:long*state;為一個(gè)指向long型整數(shù)的指針,而state本身則依存儲(chǔ)模式存放。char*xdataptr;ptr為一個(gè)指向char數(shù)據(jù)的指針,而ptr本身放于外部RAM區(qū),以上的long,char等指針指向的數(shù)據(jù)可存放于任何存儲(chǔ)器中。一般指針本身用3個(gè)字節(jié)存放,分別為存儲(chǔ)器類型,高位偏移,低位偏移量。2.存儲(chǔ)器指針基于存儲(chǔ)器的指針說明時(shí)即指定了存貯類型,例如:chardata*str;str指向data區(qū)中char型數(shù)據(jù)intxdata*pow;pow指向外部RAM的int型整數(shù)。這種指針存放時(shí),只需一個(gè)字節(jié)或2個(gè)字節(jié)就夠了,因?yàn)橹恍璐娣牌屏俊?.指針轉(zhuǎn)換即指針在上兩種類型之間轉(zhuǎn)化:·當(dāng)基于存儲(chǔ)器的指針作為一個(gè)實(shí)參傳遞給需要一般指針的函數(shù)時(shí),指針自動(dòng)轉(zhuǎn)化?!と绻徽f明外部函數(shù)原形,基于存儲(chǔ)器的指針自動(dòng)轉(zhuǎn)化為一般指針,導(dǎo)致錯(cuò)誤,因而請(qǐng)用“#include”說明所有函數(shù)原形?!た梢詮?qiáng)行改變指針類型。4.2.5KeilC51函數(shù)C51函數(shù)聲明對(duì)ANSIC作了擴(kuò)展,具體包括:1.中斷函數(shù)聲明中斷聲明方法如下:voidserial_ISR()interrupt4[using1]{/*ISR*/}為提高代碼的容錯(cuò)能力,在沒用到的中斷入口處生成iret語(yǔ)句,定義沒用到的中斷。/*definenotusedinterrupt,sogenerate"IRET"intheirentrance*/voidextern0_ISR()interrupt0{}/*notused*/voidtimer0_ISR()interrupt1{}/*notused*/voidextern1_ISR()interrupt2{}/*notused*/voidtimer1_ISR()interrupt3{}/*notused*/voidserial_ISR()interrupt4{}/*notused*/2.通用存儲(chǔ)工作區(qū)3.選通用存儲(chǔ)工作區(qū)由usingx聲明4.指定存儲(chǔ)模式由smallcompact及l(fā)arge說明,例如:voidfun1(void)small{}提示:small說明的函數(shù)內(nèi)部變量全部使用內(nèi)部RAM。關(guān)鍵的經(jīng)常性的耗時(shí)的地方可以這樣聲明,以提高運(yùn)行速度。5.#pragmadisable在函數(shù)前聲明,只對(duì)一個(gè)函數(shù)有效。該函數(shù)調(diào)用過程中將不可被中斷。6.遞歸或可重入函數(shù)指定在主程序和中斷中都可調(diào)用的函數(shù),容易產(chǎn)生問題。因?yàn)?1和PC不同,PC使用堆棧傳遞參數(shù),且靜態(tài)變量以外的內(nèi)部變量都在堆棧中;而51一般使用寄存器傳遞參數(shù),內(nèi)部變量一般在RAM中,函數(shù)重入時(shí)會(huì)破壞上次調(diào)用的數(shù)據(jù)??梢杂靡韵聝煞N方法解決函數(shù)重入:a、在相應(yīng)的函數(shù)前使用前述“#pragmadisable”聲明,即只允許主程序或中斷之一調(diào)用該函數(shù);b、將該函數(shù)說明為可重入的。如下:voidfunc(param...)reentrant;KeilC51編譯后將生成一個(gè)可重入變量堆棧,然后就可以模擬通過堆棧傳遞變量的方法。由于一般可重入函數(shù)由主程序和中斷調(diào)用,所以通常中斷使用與主程序不同的R寄存器組。另外,對(duì)可重入函數(shù),在相應(yīng)的函數(shù)前面加上開關(guān)“#pragmanoaregs”,以禁止編譯器使用絕對(duì)寄存器尋址,可生成不依賴于寄存器組的代碼。7.指定PL/M-51函數(shù)由alien指定。4.2.6中斷服務(wù)8051的中斷系統(tǒng)十分重要,C51使你能夠用C來(lái)聲明中斷和編寫中斷服務(wù)程序(當(dāng)然你也可以用匯編來(lái)寫)。中斷過程通過使用interrupt關(guān)鍵字和中斷號(hào)(0到31)來(lái)實(shí)現(xiàn),中斷號(hào)告述編譯器中斷程序的入口地址。中斷號(hào)對(duì)應(yīng)著IE寄存器中的使能位,換句話說,IE寄存器中的0位對(duì)應(yīng)著外部中斷0相應(yīng)的外部中斷0的中斷號(hào)是0。下表反映了這種關(guān)系。IE寄存器中的使能位和C中的中斷號(hào)中斷源0外部中斷01定時(shí)器0溢出2外部中斷13定時(shí)器1溢出4串行口中斷5定時(shí)器2溢出一個(gè)中斷過程并不一定帶上所有參數(shù),可以沒有返回值。有了這些限制,編譯器不須要擔(dān)心寄存器組參數(shù)的使用和對(duì)累加器,狀態(tài)寄存器,B寄存器,數(shù)據(jù)指針和默認(rèn)的寄存器的保護(hù),只要他們?cè)谥袛喑绦蛑斜挥玫?,編譯的時(shí)候會(huì)把他們?nèi)霔?,在中斷程序結(jié)束時(shí)將他們恢復(fù)。中斷程序的入口地址被編譯器放在中斷向量中。C51支持所有5個(gè)8051/8052標(biāo)準(zhǔn)中斷從0到4和在8051系列中多達(dá)27個(gè)中斷源。一個(gè)中斷服務(wù)程序的例子如下:1 #include<reg51.h>2 #include<stdio.h>34 #defineRELOADVALH0x3C5 #defineRELOADVALL0xB067 externunsignedinttick_count;89 voidtimer0(void)interrupt1{10 TR0=0;//停止定時(shí)器011 TH0=RELOADVALH;//50ms后溢出12 TL0=RELOADVALL;13 TR0=1;//啟動(dòng)T014 tick_count++;//時(shí)間計(jì)數(shù)器加115 printf("tick_count=%05u\n",tick_count);16 }當(dāng)指定中斷程序的工作寄存器組時(shí),保護(hù)工作寄存器的工作就可以被省略。使用關(guān)鍵字using,后跟一個(gè)0到3的數(shù)對(duì)應(yīng)著4組工作寄存器。當(dāng)指定工作寄存器組的時(shí)候,默認(rèn)的工作寄存器組就不會(huì)被推入堆棧,這將節(jié)省32個(gè)處理周期,因?yàn)槿霔:统鰲6夹枰?個(gè)處理周期。為中斷程序指定工作寄存器組的缺點(diǎn)是,所有被中斷調(diào)用的過程都必須使用同一個(gè)寄存器組,否則參數(shù)傳遞會(huì)發(fā)生錯(cuò)誤。下面的例子給出了定時(shí)器0的中斷服務(wù)程序,但我已經(jīng)告述編譯器使用寄存器組0:1 #include<reg51.h>2 #include<stdio.h>34 #defineRELOADVALH0x3C5 #defineRELOADVALL0xB067 externunsignedinttick_count;89 voidtimer0(void)interrupt1using0{10 TR0=0;//停止定時(shí)器011 TH0=RELOADVALH;//設(shè)置溢出時(shí)間為50ms12 TL0=RELOADVALL;13 TR0=1;//啟動(dòng)T014 tick_count++;//時(shí)間計(jì)數(shù)器加115 printf("tick_count=%05u\n",tick_count);16 }4.3使用KeilC時(shí)應(yīng)做的和應(yīng)該避免的Keil編譯器能從你的C程序源代碼中產(chǎn)生高度優(yōu)化的代碼,但你可以幫助編譯器產(chǎn)生更好的代碼,下面將討論這方面的一些問題。4.3.1采用短變量一個(gè)提高代碼效率的最基本的方式就是減小變量的長(zhǎng)度。使用C編程時(shí)我們都習(xí)慣于對(duì)循環(huán)控制變量使用int類型,這對(duì)8位的單片機(jī)來(lái)說是一種極大的浪費(fèi)。你應(yīng)該仔細(xì)考慮你所聲明的變量值可能的范圍,然后選擇合適的變量類型。很明顯經(jīng)常使用的變量應(yīng)該是unsignedchar只占用一個(gè)字節(jié)。4.3.2使用無(wú)符號(hào)類型為什么要使用無(wú)符號(hào)類型呢,原因是8051不支持符號(hào)運(yùn)算,程序中也不要使用含有帶符號(hào)變量的外部代碼。除了根據(jù)變量長(zhǎng)度來(lái)選擇變量類型以外,你還要考慮是否變量是否會(huì)用于負(fù)數(shù)的場(chǎng)合。如果你的程序中可以不需要負(fù)數(shù),那么把變量都定義成無(wú)符號(hào)類型的。4.3.3避免使用浮點(diǎn)指針在8位操作系統(tǒng)上使用32位浮點(diǎn)數(shù)是得不償失的,你可以這樣做,但會(huì)浪費(fèi)大量的時(shí)間。所以當(dāng)你要在系統(tǒng)中使用浮點(diǎn)數(shù)的時(shí)候,你要問問自己這是否一定需要。可以通過提高數(shù)值數(shù)量級(jí)和使用整型運(yùn)算來(lái)消除浮點(diǎn)指針。處理ints和longs比處理doubles和floats要方便得多,你的代碼執(zhí)行起來(lái)會(huì)更快,也不用連接處理浮點(diǎn)指針的模塊。如果你一定要采用浮點(diǎn)指針的話,你應(yīng)該采用西門子80517和達(dá)拉斯半導(dǎo)體公司的80320這些已經(jīng)對(duì)數(shù)處理進(jìn)行過優(yōu)化的單片機(jī)。如果你不得不在你的代碼中加入浮點(diǎn)指針,那么你的代碼長(zhǎng)度會(huì)增加,程序執(zhí)行速度也會(huì)比較慢。如果浮點(diǎn)指針運(yùn)算能被中斷的話,你必須確保要么中斷中不會(huì)使用浮點(diǎn)指針運(yùn)算,要么在中斷程序前使用fpsave指令把中斷指針推入堆棧,在中斷程序執(zhí)行后使用fprestore指令把指針恢復(fù)。還有一種方法是,當(dāng)你要使用像sin()這樣的浮點(diǎn)運(yùn)算程序時(shí),禁止使用中斷,在運(yùn)算程序執(zhí)行完之后再使能它。4.3.4使用位變量對(duì)于某些標(biāo)志位,應(yīng)使用位變量而不是unsignedchar。這將節(jié)省你的內(nèi)存,你不用多浪費(fèi)7位存儲(chǔ)區(qū)。而且位變量在RAM中,訪問他們只需要一個(gè)處理周期。4.3.5用局部變量代替全局變量把變量定義成局部變量比全局變量更有效率。編譯器為局部變量在內(nèi)部存儲(chǔ)區(qū)中分配存儲(chǔ)空間,而為全局變量在外部存儲(chǔ)區(qū)中分配存儲(chǔ)空間,這會(huì)降低你的訪問速度。另一個(gè)避免使用全局變量的原因是你必須在你系統(tǒng)的處理過程中調(diào)節(jié)使用全局變量。因?yàn)樵谥袛嘞到y(tǒng)和多任務(wù)系統(tǒng)中,不止一個(gè)過程會(huì)使用全局變量。4.3.6為變量分配內(nèi)部存儲(chǔ)區(qū)局部變量和全局變量可被定義在你想要的存儲(chǔ)區(qū)中。根據(jù)先前的討論,當(dāng)你把經(jīng)常使用的變量放在內(nèi)部RAM中時(shí),可使你的程序的速度得到提高,除此之外,你還縮短了你的代碼,因?yàn)橥獠看鎯?chǔ)區(qū)尋址的指令相對(duì)要麻煩一些??紤]到存儲(chǔ)速度,按下面的順序使用存儲(chǔ)器:DATA,IDATA,PDATA,XDATA,當(dāng)然你要記得留出足夠的堆??臻g。4.3.7使用特定指針當(dāng)你在程序中使用指針時(shí),你應(yīng)指定指針的類型,確定它們指向哪個(gè)區(qū)域,如XDATA或CODE區(qū)。這樣你的代碼會(huì)更加緊湊,因?yàn)榫幾g器不必去確定指針?biāo)赶虻拇鎯?chǔ)區(qū),因?yàn)槟阋呀?jīng)進(jìn)行了說明。4.3.8使用調(diào)令對(duì)于一些簡(jiǎn)單的操作如變量循環(huán)位移,編譯器提供了一些調(diào)令供用戶使用,許多調(diào)令直接對(duì)應(yīng)著匯編指令,而另外一些比較復(fù)雜并兼容ANSI。所有這些調(diào)令都是再入函數(shù),你可在任何地方安全的調(diào)用他們。和單字節(jié)循環(huán)位移指令RLA和RRA相對(duì)應(yīng)的調(diào)令是_crol_循環(huán)左移和_cror_(循環(huán)右移),如果你想對(duì)int或long類型的變量進(jìn)行循環(huán)位移,調(diào)令將更加復(fù)雜而且執(zhí)行的時(shí)間會(huì)更長(zhǎng)。對(duì)于int類型調(diào)令為_irol_,_iror_,對(duì)于long類型調(diào)令為_lrol_,_lror_。在C中也提供了像匯編中JBC指令那樣的調(diào)令_testbit_。如果參數(shù)位置位他將返回1,否則將返回0。這條調(diào)令在檢查標(biāo)志位時(shí)十分有用,而且使C的代碼更具有可讀性。調(diào)令將直接轉(zhuǎn)換成JBC指令。4.3.9使用宏替代函數(shù)對(duì)于小段代碼,像使能某些電路或從鎖存器中讀取數(shù)據(jù),你可通過使用宏來(lái)替代函數(shù),使得程序有更好的可讀性。你可把代碼定義在宏中,這樣看上去更像函數(shù)。編譯器在碰到宏時(shí),按照事先定義的代碼去替代宏。宏的名字應(yīng)能夠描述宏的操作。當(dāng)需要改變宏時(shí),你只要修該宏定義處。宏能夠使得訪問多層結(jié)構(gòu)和數(shù)組更加容易??梢杂煤陙?lái)替代程序中經(jīng)常使用的復(fù)雜語(yǔ)句以減少你打字的工作量,且有更好的可讀性和可維護(hù)性。4.4C51的編程規(guī)范1.注釋(1)采用中文;(2)開始的注釋:文件(模塊)注釋內(nèi)容:公司名稱、版權(quán)、作者名稱、修改時(shí)間、模塊功能、背景介紹等,復(fù)雜的算法需要加上流程說明;比如:/*********************************************************************//*公司名稱:*//*模塊名:LCD模塊LCD型號(hào):HD44780*//*創(chuàng)建人:zhaojunjie日期:2001-06-08*//*修改人:日期:2001-06-08*//*功能描述:*//*其他說明:*//*版本:/**********************************************************************/函數(shù)開頭的注釋內(nèi)容:函數(shù)名稱、功能、說明輸入、返回、函數(shù)描述、流程處理、全局變量、調(diào)用樣例等,復(fù)雜的函數(shù)需要加上變量用途說明;/***********************************************************************函數(shù)名:v_LcdInit*功能描述:LCD初始化*函數(shù)說明:初始化命令:0x3c,0x08,0x01,0x06,0x10,0x0c*調(diào)用函數(shù):v_Delaymsec(),v_LcdCmd()*全局變量:*輸入:無(wú)*返回:無(wú)*設(shè)計(jì)者:zhao日期:2005-6-30*修改者:zhao日期:2005-6-30*版本:***********************************************************************/(3)程序中的注釋內(nèi)容:修改時(shí)間和作者、方便理解的注釋等。注釋內(nèi)容應(yīng)簡(jiǎn)煉、清楚、明了,一目了然的語(yǔ)句不加注釋。2.命名:命名必須具有一定的實(shí)際意義。(1)常量的命名:全部用大寫。(2)變量的命名:變量名加前綴,前綴反映變量的數(shù)據(jù)類型,用小寫,反映變量意義的第一個(gè)字母大寫,其他小寫。其中變量數(shù)據(jù)類型:unsignedchar前綴ucsignedchar前綴scunsignedint前綴uisignedint前綴siunsignedlong前綴ulsignedlong前綴slbit前綴b指針前綴p例:ucReceivData接收數(shù)據(jù)(3)結(jié)構(gòu)體命名:(4)函數(shù)的命名:函數(shù)名首字大寫,若包含有兩個(gè)單詞的每個(gè)單詞首字母大寫。函數(shù)原型說明包括:引用外來(lái)函數(shù)及內(nèi)部函數(shù),外部引用必須在右側(cè)注明函數(shù)來(lái)源:模塊名及文件名,內(nèi)部函數(shù),只要注釋其定義文件名;3.編輯風(fēng)格(1)縮進(jìn):縮進(jìn)以Tab為單位,一個(gè)Tab為四個(gè)空格大小。預(yù)處理語(yǔ)句、全局?jǐn)?shù)據(jù)、函數(shù)原型、標(biāo)題、附加說明、函數(shù)說明、標(biāo)號(hào)等均頂格書寫。語(yǔ)句塊的“{”“}”配對(duì)對(duì)齊,并與其前一行對(duì)齊;(2)空格:數(shù)據(jù)和函數(shù)在其類型,修飾名稱之間適當(dāng)空格并據(jù)情況對(duì)齊。關(guān)鍵字原則上空一格,如:if(...)等,運(yùn)算符的空格規(guī)定如下:“->”、“[”、“]”、“++”、“--”、“~”、“!”、“+”、“-”(指正負(fù)號(hào)),“&”(取址或引用)、“*”(指使用指針時(shí))等幾個(gè)運(yùn)算符兩邊不空格(其中單目運(yùn)算符系指與操作數(shù)相連的一邊),其它運(yùn)算符(包括大多數(shù)二目運(yùn)算符和三目運(yùn)算符“?:”兩邊均空一格,“(”、“)”運(yùn)算符在其內(nèi)側(cè)空一格,在作函數(shù)定義時(shí)還可據(jù)情況多空或不空格來(lái)對(duì)齊,但在函數(shù)實(shí)現(xiàn)時(shí)可以不用。“,”運(yùn)算符只在其后空一格,需對(duì)齊時(shí)也可不空或多空格,對(duì)語(yǔ)句行后加的注釋應(yīng)用適當(dāng)空格與語(yǔ)句隔開并盡可能對(duì)齊。(3)對(duì)齊:原則上關(guān)系密切的行應(yīng)對(duì)齊,對(duì)齊包括類型、修飾、名稱、參數(shù)等各部分對(duì)齊。另每一行的長(zhǎng)度不應(yīng)超過屏幕太多,必要時(shí)適當(dāng)換行,換行時(shí)盡可能在“,”處或運(yùn)算符處,換行后最好以運(yùn)算符打頭,并且以下各行均以該語(yǔ)句首行縮進(jìn),但該語(yǔ)句仍以首行的縮進(jìn)為準(zhǔn),即如其下一行為“{”應(yīng)與首行對(duì)齊。(4)空行:程序文件結(jié)構(gòu)各部分之間空兩行,若不必要也可只空一行,各函數(shù)實(shí)現(xiàn)之間一般空兩行。(5)修改:版本封存以后的修改一定要將老語(yǔ)句用/**/封閉,不能自行刪除或修改,并要在文件及函數(shù)的修改記錄中加以記錄。(6)形參:在定義函數(shù)時(shí),在函數(shù)名后面括號(hào)中直接進(jìn)行形式參數(shù)說明,不再另行說明。4.5keilc軟件使用方法KeilC51軟件是眾多單片機(jī)應(yīng)用開發(fā)的優(yōu)秀軟件之一,它集編輯,編譯,仿真于一體,支持匯編,PLM語(yǔ)言和C語(yǔ)言的程序設(shè)計(jì),界面友好,易學(xué)易用。下面介紹KeilC51軟件的使用方法。進(jìn)入KeilC51后,屏幕如圖4-1所示。幾秒鐘后出現(xiàn)圖4-2所示的編輯界面。圖4-1啟動(dòng)KeilC51時(shí)的屏幕圖4-2進(jìn)入KeilC51后的編輯界面學(xué)習(xí)程序設(shè)計(jì)語(yǔ)言、學(xué)習(xí)某種程序軟件,最好的方法是直接操作實(shí)踐。下面通過簡(jiǎn)單的編程、調(diào)試,引導(dǎo)大家學(xué)習(xí)KeilC51軟件的基本使用方法和基本的調(diào)試技巧。(1)建立一個(gè)新工程單擊Project菜單,在彈出的下拉菜單中選中NewProject選項(xiàng)如圖4-3所示。圖4-3(2)然后選擇你要保存的路徑,輸入工程文件的名字,比如保存到C51目錄里,工程文件的名字為C51如圖4-4所示,然后點(diǎn)擊保存。圖4-4(3)這時(shí)會(huì)彈出一個(gè)對(duì)話框,要求你選擇單片機(jī)的型號(hào),你可以根據(jù)你使用的單片機(jī)來(lái)選擇,keilc51幾乎支持所有的51核的單片機(jī),我這里還是以大家用的比較多的Atmel的89C51來(lái)說明,如圖4-5所示,選擇89C51之后,右邊欄是對(duì)這個(gè)單片機(jī)的基本的說明,然后點(diǎn)擊確定。圖4-5(4)完成上一步驟后,屏幕如圖4-6所示。圖4-6到現(xiàn)在為止,我們還沒有編寫一句程序,下面開始編寫我們的第一個(gè)程序。(5)在圖4-7中,單擊“File”菜單,再在下拉菜單中單擊“New”選項(xiàng)。圖4-7新建文件后屏幕如圖4-8所示。圖4-8此時(shí)光標(biāo)在編輯窗口里閃爍,這時(shí)可以鍵入用戶的應(yīng)用程序了,但筆者建議首先

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論