讓你明白什么是IT 精英的成才之路(中文版教程)
標(biāo)簽:
上傳時(shí)間: 2013-05-20
上傳用戶(hù):tuilp1a
什么是PWM控制 Pulse Width Modulation -- 脈寬調(diào)制 /脈沖寬度調(diào)制
標(biāo)簽: PWM
上傳時(shí)間: 2013-04-24
上傳用戶(hù):時(shí)代將軍
射頻識(shí)別 (RFID) 是一種自動(dòng)識(shí)別技術(shù),用於識(shí)別包含某個(gè)編碼標(biāo)簽的任何物體
上傳時(shí)間: 2013-10-29
上傳用戶(hù):star_in_rain
電壓源電流源名字上僅差一個(gè)字…HE HE.有一些朋友對(duì)此不太明白.所以特此說(shuō)明下…并以軟件仿真…詳細(xì)介紹工作原理…以及注意事項(xiàng)….下面就是電壓源和電流的符號(hào)…左邊是電流源,右邊是電壓源. 電壓源…電壓源其實(shí)就是我們普通經(jīng)常用的一種電源.比如說(shuō)電池呀電瓶或自己做的穩(wěn)壓電路.一般屬于電壓源… 電壓源的特性是: 輸出端,可以開(kāi)路,但不能短路…總而言之電壓源的輸出電壓是恒定的…比如5V 電壓源輸出的電壓就是5V.隨不同的負(fù)載會(huì)改變電流…比如在5V 的電壓源上加一個(gè)1 歐的負(fù)載… 流過(guò)的電流就是5/1=5A 電流… 如果接的電阻為2 歐.流過(guò)電流就等于5/2=2.5A….這個(gè)簡(jiǎn)單的計(jì)算相信誰(shuí)都會(huì)…電流源電流源和電壓源區(qū)別比較大…電流源輸出端不能開(kāi)路,但可以短路…為什么不能開(kāi)路呢…HE HE…是因?yàn)殚_(kāi)路了…電流源輸出的電壓就為無(wú)限高了…(實(shí)際上電壓也是有一定值的)總而言之電流源的輸出電流是恒定的.不管你負(fù)載的大小…就是你短路了.他的電流還是保持不變.改變的是電壓…比如一個(gè)1A的恒流源…你接上一個(gè)1歐的負(fù)載…他輸出的電壓是.1x1=1V 電壓…當(dāng)你接上一個(gè)10 歐電阻的時(shí)候…他就是1x10=10V電壓輸出…
上傳時(shí)間: 2013-10-08
上傳用戶(hù):kaixinxin196
超低漏失線(xiàn)性穩(wěn)壓器的技術(shù)關(guān)鍵,是基準(zhǔn)源模塊的設(shè)計(jì),在對(duì)雙極型LDO穩(wěn)壓器進(jìn)行分析的基礎(chǔ)上,提出了對(duì)其關(guān)鍵模塊基準(zhǔn)電壓源進(jìn)行高精度的設(shè)計(jì)的方案。
標(biāo)簽: LDO 穩(wěn)壓器 電壓基準(zhǔn)源 分
上傳時(shí)間: 2013-12-07
上傳用戶(hù):guojin_0704
拿到這本教程您首先就會(huì)想,什么是IAP教學(xué)法?是不是一種什么全新的教學(xué)方法?當(dāng)然不是,我可沒(méi)那么大的本事,其實(shí)這只是我杜撰的一個(gè)新名詞,意思就是IN APPLICATIONS PROGRAN(在應(yīng)用中編程),當(dāng)然這只是針對(duì)單片機(jī)教學(xué),說(shuō)法是否正確,還得您說(shuō)了算。
上傳時(shí)間: 2013-11-04
上傳用戶(hù):com1com2
ATMEL公司的AVR單片機(jī),是增強(qiáng)型RISC內(nèi)載Flash的單片機(jī),芯片上的Flash存儲(chǔ)器附在用戶(hù)的產(chǎn)品中,可隨時(shí)編程,再編程,使用戶(hù)的產(chǎn)品設(shè)計(jì)容易,更新?lián)Q代方便。AVR單片機(jī)采用增強(qiáng)的RISC結(jié)構(gòu),使其具有高速處理能力,在一個(gè)時(shí)鐘周期內(nèi)可執(zhí)行復(fù)雜的指令,每MHz可實(shí)現(xiàn)1MIPS的處理能力。AVR單片機(jī)工作電壓為2.7-6.0V,可以實(shí)現(xiàn)耗電最優(yōu)化。AVR的單片機(jī)廣泛應(yīng)用于計(jì)算機(jī)外部設(shè)備,工業(yè)實(shí)時(shí)控制,儀器儀表,通訊設(shè)備,家用電器,宇航設(shè)備等各個(gè)領(lǐng)域。
上傳時(shí)間: 2013-10-20
上傳用戶(hù):ynwbosss
單片機(jī)大蝦是怎么樣煉成的 強(qiáng)烈要求學(xué)習(xí)單片機(jī)的同志們看完!前言:近來(lái)在論壇總是見(jiàn)到一些菜鳥(niǎo)們?cè)诖蠼校骸拔蚁雽W(xué)單片機(jī)”,“我要學(xué)單片機(jī)”,“如何入門(mén)???”,“你們?cè)趺催@么厲害,是怎樣學(xué)的??”等等等等一系列的問(wèn)題,實(shí)在是看多了也感到煩了,今天,就由我電子白菜厚著面皮,頂著無(wú)數(shù)老蝦的磚頭,在這里寫(xiě)上一篇單片機(jī)學(xué)習(xí)心得,讓菜鳥(niǎo)們勇敢地跨出第一步。首先解釋什么是蝦米先,以我個(gè)人意見(jiàn)吧。1、來(lái)單片機(jī)論壇的時(shí)候能夠看懂大多數(shù)家伙在說(shuō)什么,(當(dāng)然不是看懂他們?cè)诠嗨奶永玻┎⑶夷苓m當(dāng)?shù)靥岢鰡?wèn)題(非弱智的問(wèn)題)和討論,解答別人的問(wèn)題。2、當(dāng)希望自己用單片機(jī)開(kāi)發(fā)一個(gè)東東,或公司要求開(kāi)發(fā)一個(gè)方案的時(shí)候,能夠很快地在心中建立一個(gè)基本模型,知道應(yīng)該需要些什么知識(shí),而自己又掌握多少,并根據(jù)一定的靈感開(kāi)始搜索資料。就是以上這2 點(diǎn)了,如果你滿(mǎn)足了,基本下面的東西你就當(dāng)作是故事來(lái)讀就可以了。然后是心態(tài)問(wèn)題,不久前看到有人這么問(wèn):“我想學(xué)單片機(jī)啊,因?yàn)槁?tīng)說(shuō)很有錢(qián)途,請(qǐng)問(wèn)學(xué)那種單片機(jī)最有錢(qián)途?”這個(gè)問(wèn)題,我看到了就覺(jué)得反感,可以這么說(shuō),在這個(gè)壇子混的單片機(jī)大蝦只有兩種:第一、是一直從事單片機(jī)類(lèi)工作的;第二、是愛(ài)好者,愛(ài)好者包括從事單片機(jī)工作的和非單片機(jī)工作的。的確,單片機(jī)是有一定的錢(qián)途,但對(duì)于那些本來(lái)不是從事單片機(jī)工作的,而又沒(méi)有興趣的,單從錢(qián)的角度出發(fā)的家伙,想學(xué)好單片機(jī)??恐怕是做白日夢(mèng)。
標(biāo)簽: 單片機(jī)
上傳時(shí)間: 2013-11-04
上傳用戶(hù):firstbyte
at91rm9200啟動(dòng)過(guò)程教程 系統(tǒng)上電,檢測(cè)BMS,選擇系統(tǒng)的啟動(dòng)方式,如果BMS為高電平,則系統(tǒng)從片內(nèi)ROM啟動(dòng)。AT91RM9200的ROM上電后被映射到了0x0和0x100000處,在這兩個(gè)地址處都可以訪(fǎng)問(wèn)到ROM。由于9200的ROM中固化了一個(gè)BOOTLOAER程序。所以PC從0X0處開(kāi)始執(zhí)行這個(gè)BOOTLOAER(準(zhǔn)確的說(shuō)應(yīng)該是一級(jí)BOOTLOADER)。這個(gè)BOOTLOER依次完成以下步驟: 1、PLL SETUP,設(shè)置PLLB產(chǎn)生48M時(shí)鐘頻率提供給USB DEVICE。同時(shí)DEBUG USART也被初始化為48M的時(shí)鐘頻率; 2、相應(yīng)模式下的堆棧設(shè)置; 3、檢測(cè)主時(shí)鐘源(Main oscillator); 4、中斷控制器(AIC)的設(shè)置; 5、C 變量的初始化; 6、跳到主函數(shù)。 完成以上步驟后,我們可以認(rèn)為BOOT過(guò)程結(jié)束,接下來(lái)的就是LOADER的過(guò)程,或者也可以認(rèn)為是裝載二級(jí)BOOTLOER。AT91RM9200按照DATAFLASH、EEPROM、連接在外部總線(xiàn)上的8位并行FLASH的順序依次來(lái)找合法的BOOT程序。所謂合法的指的是在這些存儲(chǔ)設(shè)備的開(kāi)始地址處連續(xù)的存放的32個(gè)字節(jié),也就是8條指令必須是跳轉(zhuǎn)指令或者裝載PC的指令,其實(shí)這樣規(guī)定就是把這8條指令當(dāng)作是異常向量表來(lái)處理。必須注意的是第6條指令要包含將要裝載的映像的大小。關(guān)于如何計(jì)算和寫(xiě)這條指令可以參考用戶(hù)手冊(cè)。一旦合法的映像找到之后,則BOOT程序會(huì)把找到的映像搬到SRAM中去,所以映像的大小是非常有限的,不能超過(guò)16K-3K的大小。當(dāng)BOOT程序完成了把合法的映像搬到SRAM的任務(wù)以后,接下來(lái)就進(jìn)行存儲(chǔ)器的REMAP,經(jīng)過(guò)REMAP之后,SRAM從映設(shè)前的0X200000地址處被映設(shè)到了0X0地址并且程序從0X0處開(kāi)始執(zhí)行。而ROM這時(shí)只能在0X100000這個(gè)地址處看到了。至此9200就算完成了一種形式的啟動(dòng)過(guò)程。如果BOOT程序在以上所列的幾種存儲(chǔ)設(shè)備中找到合法的映像,則自動(dòng)初始化DEBUG USART口和USB DEVICE口以準(zhǔn)備從外部載入映像。對(duì)DEBUG口的初始化包括設(shè)置參數(shù)115200 8 N 1以及運(yùn)行XMODEM協(xié)議。對(duì)USB DEVICE進(jìn)行初始化以及運(yùn)行DFU協(xié)議?,F(xiàn)在用戶(hù)可以從外部(假定為PC平臺(tái))載入你的映像了。在PC平臺(tái)下,以WIN2000為例,你可以用超級(jí)終端來(lái)完成這個(gè)功能,但是還是要注意你的映像的大小不能超過(guò)13K。一旦正確從外部裝載了映像,接下來(lái)的過(guò)程就是和前面一樣重映設(shè)然后執(zhí)行映像了。我們上面講了BMS為高電平,AT91RM9200選擇從片內(nèi)的ROM啟動(dòng)的一個(gè)過(guò)程。如果BMS為低電平,則AT91RM9200會(huì)從片外的FLASH啟動(dòng),這時(shí)片外的FLASH的起始地址就是0X0了,接下來(lái)的過(guò)程和片內(nèi)啟動(dòng)的過(guò)程是一樣的,只不過(guò)這時(shí)就需要自己寫(xiě)啟動(dòng)代碼了,至于怎么寫(xiě),大致的內(nèi)容和ROM的BOOT差不多,不同的硬件設(shè)計(jì)可能有不一樣的地方,但基本的都是一樣的。由于片外FLASH可以設(shè)計(jì)的大,所以這里編寫(xiě)的BOOTLOADER可以一步到位,也就是說(shuō)不用像片內(nèi)啟動(dòng)可能需要BOOT好幾級(jí)了,目前AT91RM9200上使用較多的bootloer是u-boot,這是一個(gè)開(kāi)放源代碼的軟件,用戶(hù)可以自由下載并根據(jù)自己的應(yīng)用配置。總的說(shuō)來(lái),筆者以為AT91RM9200的啟動(dòng)過(guò)程比較簡(jiǎn)單,ATMEL的服務(wù)也不錯(cuò),不但提供了片內(nèi)啟動(dòng)的功能,還提供了UBOOT可供下載。筆者寫(xiě)了一個(gè)BOOTLODER從片外的FLASHA啟動(dòng),效果還可以。 uboot結(jié)構(gòu)與使用uboot是一個(gè)龐大的公開(kāi)源碼的軟件。他支持一些系列的arm體系,包含常見(jiàn)的外設(shè)的驅(qū)動(dòng),是一個(gè)功能強(qiáng)大的板極支持包。其代碼可以 http://sourceforge.net/projects/u-boot下載 在9200上,為了啟動(dòng)uboot,還有兩個(gè)boot軟件包,分別是loader和boot。分別完成從sram和flash中的一級(jí)boot。其源碼可以從atmel的官方網(wǎng)站下載。 我們知道,當(dāng)9200系統(tǒng)上電后,如果bms為高電平,則系統(tǒng)從片內(nèi)rom啟動(dòng),這時(shí)rom中固化的boot程序初始化了debug口并向其發(fā)送'c',這時(shí)我們打開(kāi)超級(jí)終端會(huì)看到ccccc...。這說(shuō)明系統(tǒng)已經(jīng)啟動(dòng),同時(shí)xmodem協(xié)議已經(jīng)啟動(dòng),用戶(hù)可以通過(guò)超級(jí)終端下載用戶(hù)的bootloader。作為第一步,我們下載loader.bin.loader.bin將被下載到片內(nèi)的sram中。這個(gè)loder完成的功能主要是初始化時(shí)鐘,sdram和xmodem協(xié)議,為下載和啟動(dòng)uboot做準(zhǔn)備。當(dāng)下載了loader.bin后,超級(jí)終端會(huì)繼續(xù)打印:ccccc....。這時(shí)我們就可以下在uboot了。uboot將被下載到sdram中的一個(gè)地址后并把pc指針調(diào)到此處開(kāi)始執(zhí)行uboot。接著我們就可以在終端上看到uboot的shell啟動(dòng)了,提示符uboot>,用戶(hù)可以u(píng)boot>help 看到命令列表和大概的功能。uboot的命令包含了對(duì)內(nèi)存、flash、網(wǎng)絡(luò)、系統(tǒng)啟動(dòng)等一些命令。 如果系統(tǒng)上電時(shí)bms為低電平,則系統(tǒng)從片外的flash啟動(dòng)。為了從片外的flash啟動(dòng)uboot,我們必須把boot.bin放到0x0地址出,使得從flash啟動(dòng)后首先執(zhí)行boot.bin,而要少些boot.bin,就要先完成上面我們講的那些步驟,首先開(kāi)始從片內(nèi)rom啟動(dòng)uboot。然后再利用uboot的功能完成把boot.bin和uboot.gz燒寫(xiě)到flash中的目的,假如我們已經(jīng)啟動(dòng)了uboot,可以這樣操作: uboot>protect off all uboot>erase all uboot>loadb 20000000 uboot>cp.b 20000000 10000000 5fff uboot>loadb 21000000 uboot>cp.b 210000000 10010000 ffff 然后系統(tǒng)復(fù)位,就可以看到系統(tǒng)先啟動(dòng)boot,然后解壓縮uboot.gz,然后啟動(dòng)uboot。注意,這里uboot必須壓縮成.gz文件,否則會(huì)出錯(cuò)。 怎么編譯這三個(gè)源碼包呢,首先要建立一個(gè)arm的交叉編譯環(huán)境,關(guān)于如何建立,此處不予說(shuō)明。建立好了以后,分別解壓源碼包,然后修改Makefile中的編譯器項(xiàng)目,正確填寫(xiě)你的編譯器的所在路徑。 對(duì)loader和boot,直接make。對(duì)uboot,第一步:make_at91rm9200dk,第二步:make。這樣就會(huì)在當(dāng)前目錄下分別生成*.bin文件,對(duì)于uboot.bin,我們還要壓縮成.gz文件。 也許有的人對(duì)loader和boot搞不清楚為什么要兩個(gè),有什么區(qū)別嗎?首先有區(qū)別,boot主要完成從flash中啟動(dòng)uboot的功能,他要對(duì)uboot的壓縮文件進(jìn)行解壓,除此之外,他和loader并無(wú)大的區(qū)別,你可以把boot理解為在loader的基礎(chǔ)上加入了解壓縮.gz的功能而已。所以這兩個(gè)并無(wú)多大的本質(zhì)不同,只是他們的使命不同而已。 特別說(shuō)名的是這三個(gè)軟件包都是開(kāi)放源碼的,所以用戶(hù)可以根據(jù)自己的系統(tǒng)的情況修改和配置以及裁減,打造屬于自己系統(tǒng)的bootloder。
上傳時(shí)間: 2013-10-27
上傳用戶(hù):wsf950131
單片機(jī)入門(mén)基礎(chǔ)知識(shí)大全免費(fèi)下載 單片機(jī)第八課(尋址方式與指令系統(tǒng)) 通過(guò)前面的學(xué)習(xí),我們已經(jīng)了解了單片機(jī)內(nèi)部的結(jié)構(gòu),并且也已經(jīng)知道,要控制單片機(jī),讓它為我們干學(xué),要用指令,我們已學(xué)了幾條指令,但很零散,從現(xiàn)在開(kāi)始,我們將要系統(tǒng)地學(xué)習(xí)8051的指令部份。 一、概述 1、指令的格式 我們已知,要讓計(jì)算機(jī)做事,就得給計(jì)算機(jī)以指令,并且我們已知,計(jì)算機(jī)很“笨”,只能懂得數(shù)字,如前面我們寫(xiě)進(jìn)機(jī)器的75H,90H,00H等等,所以指令的第一種格式就是機(jī)器碼格式,也說(shuō)是數(shù)字的形式。但這種形式實(shí)在是為難我們?nèi)肆耍y記了,于是有另一種格式,助記符格式,如MOV P1,#0FFH,這樣就好記了。 這兩種格式之間的關(guān)系呢,我們不難理解,本質(zhì)上它們完全等價(jià),只是形式不一樣而已。 2、匯編 我們寫(xiě)指令使用匯編格式,而計(jì)算機(jī)只懂機(jī)器碼格式,所以要將我們寫(xiě)的匯編格式的指令轉(zhuǎn)換為機(jī)器碼格式,這種轉(zhuǎn)換有兩種方法:手工匯編和機(jī)器匯編。手工匯編實(shí)際上就是查表,因?yàn)檫@兩種格式純粹是格式不同,所以是一一對(duì)應(yīng)的,查一張表格就行了。不過(guò)手工查表總是嫌麻煩,所以就有了計(jì)算機(jī)軟件,用計(jì)算機(jī)軟件來(lái)替代手工查表,這就是機(jī)器匯編。 二、尋址 讓我們先來(lái)復(fù)習(xí)一下我們學(xué)過(guò)的一些指令:MOV P1,#0FFH,MOV R7,#0FFH這些指令都是將一些數(shù)據(jù)送到相應(yīng)的位置中去,為什么要送數(shù)據(jù)呢?第一個(gè)因?yàn)樗腿氲臄?shù)可以讓燈全滅掉,第二個(gè)是為了要實(shí)現(xiàn)延時(shí),從這里我們可以看出來(lái),在用單片機(jī)的編程語(yǔ)言編程時(shí),經(jīng)常要用到數(shù)據(jù)的傳遞,事實(shí)上數(shù)據(jù)傳遞是單片機(jī)編程時(shí)的一項(xiàng)重要工作,一共有28條指令(單片機(jī)共111條指令)。下面我們就從數(shù)據(jù)傳遞類(lèi)指令開(kāi)始吧。 分析一下MOV P1,#0FFH這條指令,我們不難得出結(jié)論,第一個(gè)詞MOV是命令動(dòng)詞,也就是決定做什么事情的,MOV是MOVE少寫(xiě)了一個(gè)E,所以就是“傳遞”,這就是指令,規(guī)定做什么事情,后面還有一些參數(shù),分析一下,數(shù)據(jù)傳遞必須要有一個(gè)“源”也就是你要送什么數(shù),必須要有一個(gè)“目的”,也就是你這個(gè)數(shù)要送到什么地方去,顯然在上面那條指令中,要送的數(shù)(源)就是0FFH,而要送達(dá)的地方(目的地)就是P1這個(gè)寄存器。在數(shù)據(jù)傳遞類(lèi)指令中,均將目的地寫(xiě)在指令的后面,而將源寫(xiě)在最后。 這條指令中,送給P1是這個(gè)數(shù)本身,換言之,做完這條指令后,我們可以明確地知道,P1中的值是0FFH,但是并不是任何時(shí)候都可以直接給出數(shù)本身的。例如,在我們前面給出的延時(shí)程序例是這樣寫(xiě)的: MAIN: SETB P1.0 ;(1) LCALL DELAY ;(2) CLR P1.0 ;(3) LCALL DELAY ;(4) AJMP MAIN ??;(5) ;以下子程序 DELAY: MOV R7,#250 ;(6) D1: MOV R6,#250 ?。唬ǎ罚?D2: DJNZ R6,D2 ??;(8) DJNZ R7,D1 ?。唬ǎ梗? RET ??;(10) END ?。唬ǎ保保? 表1 MAIN: SETB P1.0 ??;(1) MOV 30H,#255 LCALL DELAY ; CLR P1.0 ;(3) MOV 30H,#200 LCALL DELAY ??;(4) AJMP MAIN ;(5) ;以下子程序 DELAY: MOV R7,30H ?。唬ǎ叮?D1: MOV R6,#250 ??;(7) D2: DJNZ R6,D2 ?。唬ǎ福? DJNZ R7,D1 ??;(9) RET ;(10) END ??;(11) 表2 這樣一來(lái),我每次調(diào)用延時(shí)程序延時(shí)的時(shí)間都是相同的(大致都是0.13S),如果我提出這樣的要求:燈亮后延時(shí)時(shí)間為0.13S燈滅,燈滅后延時(shí)0.1秒燈亮,如此循環(huán),這樣的程序還能滿(mǎn)足要求嗎?不能,怎么辦?我們可以把延時(shí)程序改成這樣(見(jiàn)表2):調(diào)用則見(jiàn)表2中的主程,也就是先把一個(gè)數(shù)送入30H,在子程序中R7中的值并不固定,而是根據(jù)30H單元中傳過(guò)來(lái)的數(shù)確定。這樣就可以滿(mǎn)足要求。 從這里我們可以得出結(jié)論,在數(shù)據(jù)傳遞中要找到被傳遞的數(shù),很多時(shí)候,這個(gè)數(shù)并不能直接給出,需要變化,這就引出了一個(gè)概念:如何尋找操作數(shù),我們把尋找操作數(shù)所在單元的地址稱(chēng)之為尋址。在這里我們直接使用數(shù)所在單元的地址找到了操作數(shù),所以稱(chēng)這種方法為直接尋址。除了這種方法之外,還有一種,如果我們把數(shù)放在工作寄存器中,從工作寄存器中尋找數(shù)據(jù),則稱(chēng)之為寄存器尋址。例:MOV A,R0就是將R0工作寄存器中的數(shù)據(jù)送到累加器A中去。提一個(gè)問(wèn)題:我們知道,工作寄存器就是內(nèi)存單元的一部份,如果我們選擇工作寄存器組0,則R0就是RAM的00H單元,那么這樣一來(lái),MOV A,00H,和MOV A,R0不就沒(méi)什么區(qū)別了嗎?為什么要加以區(qū)分呢?的確,這兩條指令執(zhí)行的結(jié)果是完全相同的,都是將00H單元中的內(nèi)容送到A中去,但是執(zhí)行的過(guò)程不同,執(zhí)行第一條指令需要2個(gè)周期,而第二條則只需要1個(gè)周期,第一條指令變成最終的目標(biāo)碼要兩個(gè)字節(jié)(E5H 00H),而第二條則只要一個(gè)字節(jié)(E8h)就可以了。 這么斤斤計(jì)較!不就差了一個(gè)周期嗎,如果是12M的晶振的話(huà),也就1個(gè)微秒時(shí)間了,一個(gè)字節(jié)又能有多少? 不對(duì),如果這條指令只執(zhí)行一次,也許無(wú)所謂,但一條指令如果執(zhí)行上1000次,就是1毫秒,如果要執(zhí)行1000000萬(wàn)次,就是1S的誤差,這就很可觀了,單片機(jī)做的是實(shí)時(shí)控制的事,所以必須如此“斤斤計(jì)較”。字節(jié)數(shù)同樣如此。 再來(lái)提一個(gè)問(wèn)題,現(xiàn)在我們已知,尋找操作數(shù)可以通過(guò)直接給的方式(立即尋址)和直接給出數(shù)所在單元地址的方式(直接尋址),這就夠了嗎? 看這個(gè)問(wèn)題,要求從30H單元開(kāi)始,取20個(gè)數(shù),分別送入A累加器。 就我們目前掌握的辦法而言,要從30H單元取數(shù),就用MOV A,30H,那么下一個(gè)數(shù)呢?是31H單元的,怎么取呢?還是只能用MOV A,31H,那么20個(gè)數(shù),不是得20條指令才能寫(xiě)完嗎?這里只有20個(gè)數(shù),如果要送200個(gè)或2000個(gè)數(shù),那豈不要寫(xiě)上200條或2000條命令?這未免太笨了吧。為什么會(huì)出現(xiàn)這樣的狀況?是因?yàn)槲覀冎粫?huì)把地址寫(xiě)在指令中,所以就沒(méi)辦法了,如果我們不是把地址直接寫(xiě)在指令中,而是把地址放在另外一個(gè)寄存器單元中,根據(jù)這個(gè)寄存器單元中的數(shù)值決定該到哪個(gè)單元中取數(shù)據(jù),比如,當(dāng)前這個(gè)寄存器中的值是30H,那么就到30H單元中去取,如果是31H就到31H單元中去取,就可以解決這個(gè)問(wèn)題了。怎么個(gè)解決法呢?既然是看的寄存器中的值,那么我們就可以通過(guò)一定的方法讓這里面的值發(fā)生變化,比如取完一個(gè)數(shù)后,將這個(gè)寄存器單元中的值加1,還是執(zhí)行同一條指令,可是取數(shù)的對(duì)象卻不一樣了,不是嗎。通過(guò)例子來(lái)說(shuō)明吧。 MOV R7,#20 MOV R0,#30H LOOP:MOV A,@R0 INC R0 DJNZ R7,LOOP 這個(gè)例子中大部份指令我們是能看懂的,第一句,是將立即數(shù)20送到R7中,執(zhí)行完后R7中的值應(yīng)當(dāng)是20。第二句是將立即數(shù)30H送入R0工作寄存器中,所以執(zhí)行完后,R0單元中的值是30H,第三句,這是看一下R0單元中是什么值,把這個(gè)值作為地址,取這個(gè)地址單元的內(nèi)容送入A中,此時(shí),執(zhí)行這條指令的結(jié)果就相當(dāng)于MOV A,30H。第四句,沒(méi)學(xué)過(guò),就是把R0中的值加1,因此執(zhí)行完后,R0中的值就是31H,第五句,學(xué)過(guò),將R7中的值減1,看是否等于0,不等于0,則轉(zhuǎn)到標(biāo)號(hào)LOOP處繼續(xù)執(zhí)行,因此,執(zhí)行完這句后,將轉(zhuǎn)去執(zhí)行MOV A,@R0這句話(huà),此時(shí)相當(dāng)于執(zhí)行了MOV A,31H(因?yàn)榇藭r(shí)的R0中的值已是31H了),如此,直到R7中的值逐次相減等于0,也就是循環(huán)20次為止,就實(shí)現(xiàn)了我們的要求:從30H單元開(kāi)始將20個(gè)數(shù)據(jù)送入A中。 這也是一種尋找數(shù)據(jù)的方法,由于數(shù)據(jù)是間接地被找到的,所以就稱(chēng)之為間址尋址。注意,在間址尋址中,只能用R0或R1存放等尋找的數(shù)據(jù)。 二、指令 數(shù)據(jù)傳遞類(lèi)指令 1) 以累加器為目的操作數(shù)的指令 MOV A,Rn MOV A,direct MOV A,@Ri MOV A,#data 第一條指令中,Rn代表的是R0-R7。第二條指令中,direct就是指的直接地址,而第三條指令中,就是我們剛才講過(guò)的。第四條指令是將立即數(shù)data送到A中。 下面我們通過(guò)一些例子加以說(shuō)明: MOV A,R1 ;將工作寄存器R1中的值送入A,R1中的值保持不變。 MOV A,30H ;將內(nèi)存30H單元中的值送入A,30H單元中的值保持不變。 MOV A,@R1 ;先看R1中是什么值,把這個(gè)值作為地址,并將這個(gè)地址單元中的值送入A中。如執(zhí)行命令前R1中的值為20H,則是將20H單元中的值送入A中。 MOV A,#34H ;將立即數(shù)34H送入A中,執(zhí)行完本條指令后,A中的值是34H。 2)以寄存器Rn為目的操作的指令 MOV Rn,A MOV Rn,direct MOV Rn,#data 這組指令功能是把源地址單元中的內(nèi)容送入工作寄存器,源操作數(shù)不變。
標(biāo)簽: 單片機(jī) 免費(fèi)下載 基礎(chǔ)知識(shí)
上傳時(shí)間: 2013-10-13
上傳用戶(hù):3294322651
蟲(chóng)蟲(chóng)下載站版權(quán)所有 京ICP備2021023401號(hào)-1