




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、任務(wù)16制作三角波發(fā)生器2011年2月11日整理完畢任務(wù)16 制作波形發(fā)生器【任務(wù)要求】單片機(jī)的f osc=11.0592mhz,用p1.0、p1.1、p1.2三根i/o 口線分別充當(dāng) spi總線的數(shù) 據(jù)線、時(shí)鐘線和片選線,外接帶有 spi總線接口的串行 d/a轉(zhuǎn)換芯片max515用單片機(jī)控 制max515r生周期為1s、幅度為5v的等腰三角波?!鞠嚓P(guān)知識】任務(wù)16所涉及的新知識主要有 d/a轉(zhuǎn)換器的基礎(chǔ)知識、帶有spi總線接口的d/a轉(zhuǎn)換芯片max51弼應(yīng)用特性等。1. d/a轉(zhuǎn)換器的基礎(chǔ)知識d/a轉(zhuǎn)換器的功能是將數(shù)字量轉(zhuǎn)換成與數(shù)字量成比例的模擬量,常用dac表示。按照待轉(zhuǎn)換數(shù)字的位數(shù)可分為
2、 8位、10位、12位等幾種類型;按照輸出模擬量的類型可分為電流 輸出型和電壓輸出型;按照dacf微處理器的接口形式可分為串行dac并行dac并行dac占用的數(shù)據(jù)線多,輸出速度快,但價(jià)格高;串行dac占用的數(shù)據(jù)線少,方便隔離,性價(jià)比高, 速度相對慢一些。就目前的使用情況來看,工程上偏向于選用串行 dac在選擇dac芯片時(shí),常涉及到以下3個技術(shù)參數(shù):分辨率:輸入數(shù)字量變化1時(shí),對應(yīng)的輸出模擬量的變化量。分辨率反映了輸出模擬 量的最小變化值。設(shè) dac勺數(shù)字量的位數(shù)為 n,則dac的分辨率=滿量程電壓/(2 n-1)。對于 同等的滿量程電壓,dac勺位數(shù)越多,則分辨率越高。因此,分辨率也常用dac
3、的數(shù)字量的位數(shù)來表示。轉(zhuǎn)換時(shí)間:從數(shù)字量輸入至dacff始到da就成轉(zhuǎn)換并輸出對應(yīng)的模擬量所需要的時(shí) 間。轉(zhuǎn)換時(shí)間反映了 dac的轉(zhuǎn)換速度。滿刻度誤差:數(shù)字量輸入為滿刻度(全1時(shí)),實(shí)際輸出的模擬量與理論值的偏差。2.帶有spi接口的d/a轉(zhuǎn)換器 max51弼使用特性max51強(qiáng)maxin公司生產(chǎn)的10位串行電壓輸出型 d/a轉(zhuǎn)換器,轉(zhuǎn)換建立時(shí)間為 25科s, 采用+5v單電源供電,供電流為 140pa,具有簡化的spi總線接口,轉(zhuǎn)換結(jié)果采用緩沖電壓 輸出,可變輸出電壓為 05v,最大線性誤差為 1/2lsb。 max51弼引腳功能及其與單片機(jī)的接口電路max51箱dip8和sop8兩種封裝形
4、式,其引腳分布如圖7-34所示。各引腳的功能如表7-11所示,max515w單片機(jī)的接口電路如圖7-35所示。12 3 4dinsclkcs doutvddvoutrefinagndmp10p11p12stc89c51dinsclk voutcsmax515圖7-34max51田i腳分布圖7-35max515t單片機(jī)的接口電路引腳符號功能1din串行數(shù)據(jù)輸入腳2sclk時(shí)鐘輸入腳3cs片選引腳。低電平時(shí),對 max515訪問有效,上升沿更新內(nèi)部 dac4dout串行級聯(lián)數(shù)據(jù)輸出腳。5agnd模擬信號地6refin參考電壓輸入腳7voutda轉(zhuǎn)換電壓輸出8vdd+5v電源輸入7-11max515
5、勺引腳功能第219頁共21頁應(yīng)用特性max515勺內(nèi)部結(jié)構(gòu)如圖 7-36所示、工作日序如圖 7-37所示。圖7-36 max515內(nèi)部結(jié)構(gòu)圖7-37 max515的工作時(shí)序圖7-37中各參數(shù)的含義如表 7-12所示。表7-12 max51印寸序參數(shù)參數(shù)含義參數(shù)值單位最小典型取大t css片選建立時(shí)間20nst csh0sclk下降沿到片選下降沿保持時(shí)間15nst csh1sclk下降沿到片選上升沿保持時(shí)間0nst chsclk高電平寬度35nst clsclkw寬度35nst dsdin建立時(shí)間45nst dhdin保持時(shí)間0nst dodout級聯(lián)車出)傳輸延時(shí)間50nst csw片選高電平
6、寬度20nst cs1片選上升沿到 sclk升沿建立的時(shí)間間隔50ns從圖7-36、7-37中可以看出,max51弼應(yīng)用特性如下:在cs、sclk勺作用下,din引腳輸入的數(shù)據(jù)被移入 max515內(nèi)部的16位移位寄存器, 每次輸入的數(shù)據(jù)為16位。這16位數(shù)據(jù)的格式如下:d15 d12d11 d2 d1 d0x x x xc9 c00 0其中,d15d12: 4位無效位,可為任意值。d1dq固定為00。d11d2: 10位的dac專換代碼。設(shè)10位轉(zhuǎn)換代碼的對應(yīng)值為 daval ,則將daval左移2位,即得到待寫入 max515的 16位數(shù)據(jù),其實(shí)現(xiàn)代碼如下:daval=daval2;max5
7、15勺轉(zhuǎn)換輸出電壓 vout為:2 daval x10232.5v。2 davalvout = vref _20 =vref式中,vref為refin引腳輸入的參考電壓,此值一般不高于daval為10位的da8專換代碼值,其值為 01023。cs=1時(shí),din引腳上的數(shù)據(jù)不能移入 max515只有cs =0時(shí),數(shù)據(jù)才能移入 max515 cs出現(xiàn)上升沿時(shí),10位的轉(zhuǎn)換代碼傳輸至 10位的da*存器,并更新 dac在cs =0的條件下,在sclk的上升沿,max515各din引腳上的數(shù)據(jù)移入到內(nèi)部移位 寄存器中。所以,向max51%數(shù)時(shí),應(yīng)先將數(shù)位寫入 din引腳上,然后產(chǎn)生時(shí)鐘的上升沿。移位的
8、次序?yàn)楦呶辉谙鹊臀辉诤?。cs下沿之前,scl3為低電平,cs上沿之前sclk也為低電平。max515勺最高時(shí)鐘頻率由1/(t ch+tcl)決定,大約是14mhz;數(shù)據(jù)更新率受到片選周期 的限制,其周期為 16(t ch+t cl)+ t csvy相當(dāng)于1.14因。由于10位d/a轉(zhuǎn)換器的建立時(shí)間為 25的,實(shí)際使用時(shí),max51弼輸出更新率不高于 40khz。max51弼訪問編程對max51魏程訪問主要是用軟件模擬max51弼工作時(shí)序,在編寫程序時(shí)要注意以下問題:每次寫數(shù)為16位;高位先發(fā)送(數(shù)據(jù)移位的方向?yàn)樽笠?;先將數(shù)位寫入 din弓|腳,然后產(chǎn)sclk的上升沿;sclk高低電平持續(xù)時(shí)間
9、、片選與sclk上升沿或下降沿之間的間隔必須符合表7-12中的規(guī)定。按照max51弼工作時(shí)序圖,max51弼訪問程序的流程圖如圖 7-38所示。開始、結(jié)束=圖7-38max51助問程序流程圖【說明】圖7-38所示的流程圖是在單片機(jī)的指令周期大于50ns的條件下設(shè)計(jì)的,如果單片機(jī)的指令周期小于 50ns,則需要在上述流程圖的各框之間適當(dāng)?shù)夭迦肴舾蓚€“_nop_(); ”語句進(jìn)行延時(shí),以滿足表 7-12中各時(shí)序參數(shù)的時(shí)間要求。采用圖7-35所示的接口電路時(shí),max51略引腳口線的定義如下:sbitdin=pi0;sbitsclk=p1a1;sbit cs=pi2;max515勺訪問程序如下:voi
10、d max515(uintm)/1 max515訪問函數(shù)。m為da轉(zhuǎn)換代碼值uchari;/2定義局部變量。i為循環(huán)次數(shù)計(jì)數(shù)器m=m2;/3 m 左移2位形成寫入 max515的16位移位數(shù)據(jù)(低2位為00)cs=1;/4片選置高電平sclk=0;/5 時(shí)鐘清0cs=0;/6產(chǎn)生片選下降沿for(i=0;i16;i+)/7循環(huán)16次。循環(huán)體為語句8語句11din=(bit)(m&0x8000);/8 m的最高位傳送至數(shù)據(jù)線din上sclk=1;/9產(chǎn)生時(shí)鐘上升沿sclk=0;/10產(chǎn)生時(shí)鐘下降沿,形成一個完整的時(shí)鐘信號m=mbottom)八調(diào)用d/a轉(zhuǎn)換函數(shù)max515() xdaval值進(jìn)行
11、轉(zhuǎn)換輸出d/a轉(zhuǎn)換值減1 : daval-1延時(shí)t2時(shí)間圖7-41三角波發(fā)生器的流程圖按圖7-41所示的流程圖編寫的程序可以產(chǎn)生三角波,程序比較簡單,也很好理解,但 程序并不實(shí)用。其主要的缺陷是,程序不能放在定時(shí)中斷服務(wù)程序中,不能用定時(shí)中斷實(shí)現(xiàn)程序的延時(shí)。對圖7-41所示流程圖進(jìn)行改進(jìn)方法是,引入一個標(biāo)志位updown,用updown標(biāo)識程序的狀態(tài)。其中,updown=0表示是產(chǎn)生三角波的上升線階段,updown=1表示是產(chǎn)生三角波的下降線階段。在初始化程序中將updown的值設(shè)置為0,表示程序先產(chǎn)生三角波的上升線。在循環(huán)體中對updown進(jìn)行判斷,updown=0 (產(chǎn)生上升線階段)時(shí),對
12、d/a轉(zhuǎn)換值daval作 線性遞增的轉(zhuǎn)換車出,并延時(shí) t1時(shí)間,當(dāng)daval達(dá)到由i值top時(shí),將標(biāo)志位updown置1, 表示下次進(jìn)行循環(huán)體時(shí),進(jìn)入產(chǎn)生三角波的下降線階段。updown=1(產(chǎn)生下降線階段)時(shí),對d/a轉(zhuǎn)換值daval作線性遞減的轉(zhuǎn)換輸出,并延時(shí) t2時(shí)間,當(dāng)daval達(dá)到谷值bottom, 將標(biāo)志位updown清0,表示下次進(jìn)行循環(huán)體時(shí),進(jìn)入產(chǎn)生三角波的上升線階段。改進(jìn)后的 流程圖如圖7-42所示。開始圖7-42三角波發(fā)生器的改進(jìn)后流程圖對于等腰三角波發(fā)生器,t1時(shí)間與t2時(shí)間相等。將圖7-42所示流程圖中的延時(shí) t1時(shí) 間與延時(shí)t2時(shí)間2個框去掉,把循環(huán)體中的其他部分放在
13、定時(shí)時(shí)長為t1的定時(shí)中斷服務(wù)函數(shù)中就可以用2次中斷服務(wù)之間的時(shí)間間隔來實(shí)現(xiàn)延時(shí)。如果t1時(shí)間與t2時(shí)間不相等,可以按以下方法對圖7-42所示的流程圖作進(jìn)一步的改造:設(shè)t1、t2的最大公約數(shù)為 t0,將程序設(shè)計(jì)成時(shí)間間隔為t0時(shí)間的循環(huán)程序,引入一個軟件計(jì)數(shù)器timcnt ,用timcnt對t0時(shí)間的循環(huán)次數(shù)進(jìn)行計(jì)數(shù)。在產(chǎn)生上升線階段,當(dāng) timcnt計(jì)時(shí)不滿t1時(shí)間時(shí),只作t0時(shí)間的延時(shí)處理。當(dāng)timcnt計(jì)時(shí)滿t1時(shí)間時(shí),將timcnt 的計(jì)數(shù)值清0,然后作daval遞增的轉(zhuǎn)換輸出,延時(shí)t0時(shí)間后再次進(jìn)入循環(huán)體。在產(chǎn)生下降線階段,當(dāng)timcnt計(jì)時(shí)不滿t2時(shí)間時(shí),只作 t0時(shí)間的延時(shí)處理。當(dāng)
14、 timcnt計(jì)時(shí)滿t2 時(shí)間時(shí),將timcnt的計(jì)數(shù)值清0,然后作daval遞減的轉(zhuǎn)換輸出,延時(shí) t0時(shí)間后再次進(jìn)入 循環(huán)體。其流程圖如圖 7-43所示。-開始-初始化:d/a轉(zhuǎn)換值賦初值:daval=bottom循環(huán)次數(shù)計(jì)數(shù)值賦初值0: timcnt=0狀態(tài)標(biāo)志位賦初值:updown=0(上升階段)循環(huán)次數(shù)計(jì)數(shù)值加1 : timcnt+1y是上升階段?(updonw=0)上計(jì)滿t1時(shí)間?n一n循環(huán)計(jì)數(shù)值清0: timcnt=0循環(huán)計(jì)數(shù)值清0: timcnt=0調(diào)用d/a轉(zhuǎn)換函數(shù)max515() xdaval值進(jìn)行d/a轉(zhuǎn)換輸出調(diào)用d/a轉(zhuǎn)換函數(shù)max515()xdaval值進(jìn)行d/a轉(zhuǎn)換輸
15、出d/a轉(zhuǎn)換值加1: daval+1d/a轉(zhuǎn)換彳直減1 : daval-1n ,1到達(dá)峰值?一 (davaltop-1)nii到達(dá)谷值?一 (davalbottom+1)設(shè)置下降階段標(biāo)志:updown=1設(shè)置上升階段標(biāo)志:updown=0延時(shí)t0時(shí)間圖7-43循環(huán)周期為t0時(shí)間的三角發(fā)生器流程圖圖7-43與圖7-41相比,兩者功能一樣,但按圖 7-43所示的流程圖編寫的程序可以用 定時(shí)中斷實(shí)現(xiàn)軟件延時(shí),一方面可以減輕cpu的負(fù)擔(dān),另一方面可以方便使用 cpu睡眠技術(shù) 提高程序的抗干擾性。將圖7-43所示流程圖對應(yīng)的程序放在定時(shí)時(shí)長為t0的定時(shí)中斷服務(wù)函數(shù)中的方法是,將延時(shí)t0時(shí)間框去掉,把循環(huán)
16、體中的其他部分放在定時(shí)中斷服務(wù)程序中。任務(wù)16所要產(chǎn)生的三角波為等腰三角波,我們采用圖7-42所示的流程圖,并將圖中的延時(shí)t1時(shí)間框和延時(shí) t2時(shí)間框合并成一個框。 其中top=0 bottom=1023當(dāng)t1=t0=488因 時(shí),三角波的周期 t=2046x 488的=1s。程序代碼任務(wù)16的程序代碼如下:/任務(wù)16制作等腰三角波發(fā)生器#include/1 包含特殊功能寄存器定義頭文件reg51.h#defineucharunsigned char /2 宏定義: uchar 代表 unsigned char#defineuint unsigned int/3 宏定義:uint 代表 uns
17、igned int#definetop 1023/4 宏定義:top代表1023(峰值)#definebottom 0/5 宏定義:bottoms表 0(谷值)sbitdin=pi0;/6 定義max515的引腳線:din接p1.0sbitsclk=p1a1;/7 sclk 接 p1.1sbitcs=pi2;/8 cs 接 p1.2voiddelay();/9 delay函數(shù)說明void/-max515(uint);/10 max515函數(shù)說明voidmain(void)/11 main 函數(shù)bit updown=0;/12定義位變量updowrk 0:三角波的上升階段uint daval=b
18、ottom;/13定義變量daval(da轉(zhuǎn)換代碼),初值為波谷值while(1)/14 死循環(huán),循環(huán)體為語句 15語句24 max515(daval);if(updown) daval-;if(davaltop-1) delay();/15 調(diào)用max515函數(shù)進(jìn)行d/a轉(zhuǎn)換輸出/16判斷波形所處階段,若為下降階段,則處理語句/17待轉(zhuǎn)換值減1updown=0; /18 若達(dá)到谷值,則 updown位清0/19下降期處理結(jié)束/20 若為上升階段,則處理語句 21語句22/21 待轉(zhuǎn)換值加1updown=1; /22 若達(dá)到峰值,則 updown位置1/23上升期處理結(jié)束/24 延時(shí) 488
19、s/25死循環(huán)的循環(huán)體結(jié)束/26 main 函數(shù)結(jié)束17語句19/max515 函數(shù)void max515(uintm)/27uchari;m=m2;cs=1;sclk=0;cs=0;for(i=0;i16;i+)/28定義局部變量。i為循環(huán)次數(shù)計(jì)數(shù)器/29 m 左移2位形成寫入 max515的16位移位數(shù)據(jù)/30片選置高電平/31 時(shí)鐘清0/32產(chǎn)生片選下降沿/33循環(huán)16次。循環(huán)體為語句 34語句37din=(bit)(m&0x8000);sclk=1;sclk=0;m=m0;i-);/42/43/功能:向max515輸入待轉(zhuǎn)換的數(shù)字量 m,并進(jìn)行dac專換更新(低2位為00)44【應(yīng)用總
20、結(jié)與拓展】c51與匯編語言混合編程單片機(jī)的應(yīng)用程序一般采用c51編寫,當(dāng)程序中有對時(shí)間要求比較苛刻的程序時(shí),例如要求精確延時(shí)的程序、時(shí)序苛刻的硬件控制程序等,可采用c51與匯編語言混合編程,用匯編語言編寫對時(shí)間要求苛刻的程序,程序中的其他部分則用c51編寫。c51與匯編語言混合編程時(shí),匯編代碼可以直接嵌入在c51程序中,也可以放在單獨(dú)的匯編程序模塊文件中(后綴為asm或者src勺文件)。下面要介紹的編合編程是指匯編程序單獨(dú)放在匯編程序模塊文 件中的混合編程(以下簡稱為混合編程),有關(guān)在c51程序中嵌入?yún)R編程序代碼的混合編程, 我們已在任務(wù)4中作了詳細(xì)介紹,在此不再贅述。c51中,程序的調(diào)用分為
21、無參數(shù)傳遞的調(diào)用、有參數(shù)傳遞的調(diào)用和有返回值的調(diào)用3種。c51與匯編語言混合編程的最簡便方法是,先編制被調(diào)匯編程序的啞函數(shù),利用kei c51生成啞函數(shù)對應(yīng)的匯編程序框架結(jié)構(gòu),再在匯編程序框架結(jié)構(gòu)中添加匯編程序代碼,最后將 c51程序與被調(diào)的匯編程序添加到工程中進(jìn)行編譯連接,生成所需要的目標(biāo)程序。采用這種 方法進(jìn)行混合編程時(shí), 可以避免匯編程序中復(fù)雜的段定義問題,用戶只需掌握c51程序與匯編程序之間的參數(shù)傳遞方法和程序值返回的方法。下面用實(shí)例介紹混合編程的具體方法。 1.無參數(shù)傳遞的混合編程假定c51程序保存在c51.c文件中,c51程序中需要調(diào)用保存在 a51.asm文件中的匯編 程序del
22、ay ,調(diào)用時(shí)無參數(shù)傳遞。采用混合編程的方法如下: 創(chuàng)建被調(diào)程序的啞函數(shù)所謂啞函數(shù)是指只有函數(shù)參數(shù)定義、函數(shù)返回值定義、無函數(shù)體說明的函數(shù)。創(chuàng)建啞函數(shù)的目的是為了生成被調(diào)匯編程序的框架結(jié)構(gòu)。本例中的啞函數(shù)如下:void delay(void) 創(chuàng)建被調(diào)程序的啞函數(shù)的方法如下:第1步:按照項(xiàng)目一中所介紹的方法,在keil uvision2中新建工程名為 mix的工程文件。第2步:新建2個不同名的c51程序文件c51.c和a51.c,并將這2個文件添加至 mix 工程中。其中,c51.c為c51主調(diào)程序文件,a51.c為被調(diào)啞函數(shù)程序文件。第3步:在c51.c文件中錄入所編制的 c51程序代碼,在
23、a51.c文件中錄入啞函數(shù), 如 圖7-44所示。圖7-44 c51程序與啞函數(shù)【說明】由于被調(diào)程序delay與主調(diào)的c51程序不在同一個文件中, 編寫c51程序時(shí),必須在主 調(diào)文件的函數(shù)說明處用關(guān)鍵字 “extern ”對被調(diào)函數(shù)delay()進(jìn)行說明。其含義是,delay() 是其他模塊文件中定義的外部函數(shù)。產(chǎn)生啞函數(shù)對應(yīng)的匯程序代碼操作步驟如下:第1步:用鼠標(biāo)右鍵點(diǎn)擊項(xiàng)目窗口中的被調(diào)函數(shù)的文件名a51.c ,這時(shí)窗口中會彈出如圖7-45所示的文件選項(xiàng)快捷菜單。圖7-45文件選項(xiàng)快捷菜單第2步:在快捷菜單中用鼠標(biāo)左鍵點(diǎn)擊“ options for file a51.c ”菜單項(xiàng),這時(shí) 窗口
24、中會彈出如圖 7-46所示的文件選項(xiàng)對話框。圖7-46文件選項(xiàng)對話框第3步:在圖7-46所示的文件選項(xiàng)對話框中,用鼠標(biāo)左鍵點(diǎn)擊generate assembler srcfile ”(產(chǎn)生匯編sced)和“assemble src file ”(匯編src文件)前面的復(fù)選鈕,使其 由灰色狀態(tài)變成白底黑勾的選中狀態(tài),然后點(diǎn)擊“確定”按鈕。第4步:在keil uvision2的主窗口中點(diǎn)擊編譯圖標(biāo)按鈕或者編譯菜單命令,對 mix工程中的源程序進(jìn)行編譯。這時(shí), keil c51會產(chǎn)生一個與a51.c同名,但后綴名為 src的 a51.src文件。a51.src文件的內(nèi)容是a51.c中的啞函數(shù)對應(yīng)的匯
25、編程序, 用keil uvision2 打開a51.src,我們可以看到其內(nèi)容只是匯編程序delay的框架結(jié)構(gòu),如圖7-47所示。圖7-47 delay程序的框架結(jié)構(gòu)在圖7-47中,我們可以看到,分號“;”后面的字符是綠色的,這一部分是匯編程序的 注釋,可以連分號一并刪去, 這樣我們可以很直觀地觀察到啞函數(shù)delay()的匯編程序結(jié)構(gòu)。編寫匯編程序代碼操作步驟如下:第1步:關(guān)閉a51.src文件,將其后綴名改為 asm,改名后的文件名為 a51.asm,它與啞函數(shù)的主文件名同名,但文件類型為asm,表示是匯編程序文件?!菊f明】keil c51支持對src文件的編譯,但a51.src文件是kei
26、l c51直接產(chǎn)生的匯編源程序。 在操作的過程中,如果沒有把圖7-46中的generate assembler srcfile 多選鈕改成灰色不可用狀態(tài),重新編譯時(shí)會將原來的a51.src文件覆蓋掉,所以筆者建議讀者最好是將其改為asm文件。第2步:添加匯編程序代碼。在 keil uvision2中打開被調(diào)程序文件a51.asm ,刪除其注釋部分。我們可以看到 keil c51生成的被調(diào)匯編程序的結(jié)構(gòu)如下:為模塊命名,模塊名為 a51定義代碼段,段名為?pr?delay?a51指定標(biāo)識符(程序名)可在其他模塊中使用為段?pr?delay?a51選擇一個可重新定位的段程序開始,delay為程序名
27、,冒號不可省在這里添加匯編程序代碼程序返回指令模塊結(jié)束name a51;1?pr?delay?a51segment code2publicdelay;3rseg?pr?delay?a51 ;4delay:;5;6ret;7end;8程序中,第5行是匯編程序的程序名,它與啞函數(shù)的名字相同,其后有冒號,為匯編程序的開始處。第7行是程序的返回指令,第6行是空白行,是程序delay的指令行,供我們在這里添加程序代碼。假定delay程序是500ms的延時(shí)程序,單片機(jī)的 fosc=12mh則500ms延時(shí)程序代碼如delay:;1程序開始,delay為程序名movr3,#4;2 r3賦初值4dl1:mov
28、r2,#250;3 r2賦初值250,dl1為標(biāo)號dl2:movr1,#250;4 r1賦初值250,dl2為標(biāo)號djnzr1,$;5 r1減1后若不為0,則再執(zhí)行本指令djnzr2,dl2;6 r2減1后若不為0,則轉(zhuǎn)至dl2處循環(huán)djnzr3,dl1;7 r3減1后若不為0,則轉(zhuǎn)至dl1處循環(huán)ret;8程序返回將上述匯編程序的第2行第7行(去頭去尾后的代碼)添加至keil c51生成的匯編框架結(jié)構(gòu)的第6行中,保存文件,到此為止,混合編程的匯編程序已經(jīng)編制完畢。添加了匯編 代碼的delay程序如圖7-48所示。圖7-48添加了匯編代碼的 delay程序編譯混合程序操作步驟如下:第1步:從mi
29、x工程中移除啞函數(shù)文件 a51.c。用鼠標(biāo)右鍵點(diǎn)擊項(xiàng)目窗口中的啞函數(shù)的 文件名a51.c ,在彈出的快捷菜單中用鼠標(biāo)左鍵點(diǎn)擊“ remove file a51.c ”菜單項(xiàng), 如圖7-49所示。圖7-49移除文件快捷菜單第2步:將匯編程序文件 a51.asm添加至mix工程中。至此,mix工程由一個 c51程序 文件c51.c和一個被調(diào)的匯編程序文件a51.asm組成。第3步:設(shè)置輸出文件。用鼠標(biāo)右鍵點(diǎn)擊工程管理窗口中的“ target 1,在彈出的快 捷菜單中點(diǎn)擊“option for target target 1。這時(shí)系統(tǒng)會出現(xiàn)option for targettarget 1 ”對話框
30、。在option for target target 1 ”對話框中點(diǎn)擊 output 標(biāo) 簽。在output頁面中勾選“ create hexfile ”多選鈕,如圖 7-50所示。(詳見項(xiàng)目1的任 務(wù)實(shí)施中“第3步配置工程”)圖7-50設(shè)置輸出文件第4步:編譯、連接。在 keil uvision2 的主窗口中點(diǎn)擊重新編譯圖標(biāo)按鈕“ 筒或 者點(diǎn)擊菜單欄上的project 一 reuild all target files 菜單命令,對 mix工程中的 源程序進(jìn)行編譯、連接。這時(shí), keil uvision2 會生成目標(biāo)文件 mix.hex。2 .有參數(shù)傳遞的混合編程有參數(shù)傳遞的混合編程的過程
31、與無參數(shù)傳遞的混合編程的過程完全相同,在此不再贅述。但是,由于c51程序調(diào)用匯編程序時(shí)存在參數(shù)傳遞,編寫匯編程序時(shí)必須找到參數(shù)存放的位置和存放的格式,并且正確地接收這些參數(shù),才能編寫出正確的匯編程序。c51程序是用當(dāng)前工作寄存器 r7r1或者單片機(jī)的存儲器傳遞參數(shù)的,其中存儲器是匯編程序中定義 的位段或者字節(jié)段。函數(shù)名變換規(guī)則c51函數(shù)編譯時(shí),keil c51會根據(jù)函數(shù)的類型按表7-13所示的規(guī)則將函數(shù)名轉(zhuǎn)換成匯編程序名:表7-13函數(shù)名轉(zhuǎn)換規(guī)則函數(shù)類型c51函數(shù)匯編程序轉(zhuǎn)換規(guī)則無參數(shù)傳遞func(void)func:名字/、艾后參數(shù)第1個參數(shù)為bit型func(bit,char )func:
32、名字/、艾傳遞第1個參數(shù)為非bit型func(char,bit)_func:名字前加下劃線keil c51生成的位段函數(shù)的參數(shù)中含有位參數(shù)時(shí),keil c51 會在所生成的匯編程序中自動地定義位段,并且按照位參數(shù)在參數(shù)表中出現(xiàn)的順序在位段中依次為各位參數(shù)分配存儲空間。keil c51 生成的位段的格式如下:?bi?程序名?模塊名 segment bit overlayable 位段的段名為“ ?bi?程序名?模塊名public ?程序名?bitrseg ?bi?程序名?模塊名?程序名?bit:位名 1: dbit 1位名 2: dbit 1;2指明符號地址“ ?程序名? bit ”可在其他模塊
33、中訪問 ;3重定位位段“ ?bi?程序名?模塊名”;4位參數(shù)表的首地址,供模塊外的程序訪問位參數(shù)之用;5第1個位參數(shù)的定義,“位名1”是訪問的符號地址位名 n: dbit 1;7第n個位參數(shù)的定義,“位名n”是訪問的符號地址;6第2個位參數(shù)的定義,“位名2”是訪問的符號地址程序中,第1行第3行主要是位段的說明,供keil c51使用,用戶不必關(guān)心,只要不修改就可以了。第4行中的“ ?程序名?bit是符號地址,代表的是位參數(shù)表的首地址,c51程序調(diào)用匯編程序時(shí),通過該地址給各位參數(shù)賦值,第4行決不可修改。第5行第7行依次是啞函數(shù)中各位參數(shù)的存儲空間的定義說明。第5行(第1個dbit定義)對應(yīng)第1
34、個位參數(shù),第6行(第2個dbit定義)對應(yīng)第2個位參數(shù),依次類推。其中,冒號(:)前面的符號是位參數(shù)的符號位地址,供匯編程序中訪問位參數(shù)之用。dbit是匯編偽指令,其含義是保留若干位,即分配若位的存儲空間。dbit 1 ”的含義是在位段中為位參數(shù)分配1位的存儲空間。keil c51生成的字節(jié)段函數(shù)的參數(shù)中含有非字節(jié)段,并且按照非 bitbit型的參數(shù)時(shí),keil c51會在所生成的匯編程序中自動地定義 型參數(shù)的類型及其在參數(shù)表中出現(xiàn)的順序在字節(jié)段中依次為各非bit型參數(shù)分配存儲空間。keil c51生成的字節(jié)段的格式如下:?dt?s序名?模塊名 segment data overlayable
35、字節(jié)段的段名為“ ?dt準(zhǔn)序名?模塊名public ?程序名?byterseg ?dt?g序名?模塊名?程序名?byte:名字1:ds n1名字2:ds n2名字n:ds k;2指明符號地址“ ?程序名?byte可在其他模塊中訪問;3重定位字節(jié)段“ ?dt?g序名?模塊名”;4符號地址“ ?程序名?byte ,供c51程序訪問;5第1個非bit型參數(shù)的存儲空間;6第2個非bit型參數(shù)的存儲空間;7第n個非bit型參數(shù)的存儲空間程序中,第1行第3行主要是字節(jié)段的說明,供keil c51使用,用戶不必關(guān)心,只要不修改就可以了。第4行中的“?程序名?byte是符號地址,代表的是非bit型參數(shù)表的首地
36、址,c51程序調(diào)用匯編程序時(shí),若需要通過存儲器傳遞非bit型參數(shù),則通過引用該符號地址給對應(yīng)的非bit型參數(shù)賦值。所以,第 4行決不能修改。第5行第7行依次是啞函數(shù)中各非 bit型參數(shù)的存儲空間的定義說明。第 5行(第1 個ds定義)對應(yīng)第1個非bit型參數(shù),第6行(第2個ds定義)對應(yīng)第2個非bit型參數(shù), 依次類推。其中,冒號(:)前面的符號是非bit型參數(shù)的首字節(jié)的符號地址,供匯編程序中訪問非 bit型參數(shù)之用。ds是匯編偽指令,其含義是保留若干個字節(jié),即在字節(jié)段中為非 bit型參數(shù)分配若干個字節(jié)的存儲空間, ds后面的常數(shù)是所分配的字節(jié)數(shù)。若用 label表示非bit 型參數(shù)的首字節(jié)的
37、符號地址,各類參數(shù)分配的存儲空間以及各字節(jié)的作用如表7-14所示。表7-14各類參數(shù)分配的存儲空間及其含義參數(shù)類型字節(jié)數(shù)各字節(jié)的作用char1int2局字節(jié)在label中,低字節(jié)在label+1 中l(wèi)ong4最圖字節(jié)在label中,最低字節(jié)在 label+3中float432位ieee格式,指數(shù)和符號位在label+3 中基于 存儲 器的 指針data *1地址在label中idata *pdata *xdata *2地址的圖字節(jié)在 label中,地址的低字節(jié)在label+1 中code *一般指針3存儲類型在label中,地址的圖字下在label+1中,地址的低字節(jié)在label+2 中例如,
38、啞函數(shù)void func(long x,int y,char z)”編譯后,各參數(shù)的存儲空間 的定義如下:rseg ?dt?_func?a51?_func?byte:x?040: ds 4y?041: ds 2z?042: ds 1x?040是第1個參數(shù)x的首字節(jié)地址,x分配有4個字節(jié)的存儲空間,x?040單元用于 存放x的最高字節(jié)數(shù),x?040+3單元用于存放 x的最低字節(jié)數(shù)。若 x=0x12345678 ,則x?040 單元中存放的是 0x12, x?040+1單元中存放的是 0x34, x?040+2單元中存放的是0x56,x?040+3單元中存放的是 0x78。將參數(shù)x的值傳送到 r4
39、r5r6r7(r件存放高字節(jié)數(shù))中的程 序代碼如下:mov r4,x?040mov r5,x?040+1mov r6,x?040+2mov r7,x?040+3y?041是第2個參數(shù)y的首字節(jié)地址,y分配有2個字節(jié)的存儲空間,y?041單元用于 存放參數(shù)y的高字節(jié)數(shù),y?041+1單元用于存放y的低字節(jié)數(shù)。若y=0x1234 ,則y?041單元 中存放的是0x12 , y?041+1單元中存放的是 0x34。將參數(shù)y的值傳送到 r6r7(r6存入高字 節(jié)數(shù))中的程序代碼如下:mov r6,y?041mov r7,y?041+1z?042是第3個參數(shù)z的首字節(jié)地址,z分配有1個字節(jié)。參數(shù)傳遞的規(guī)
40、則keil c51中,c51程序調(diào)用匯編程序時(shí),按以下規(guī)則進(jìn)行參數(shù)傳遞:依據(jù)參數(shù)在參數(shù)表中出現(xiàn)的順序,優(yōu)先選用當(dāng)前工作寄存器組中的r7r1進(jìn)行參數(shù)傳遞,并且各個參數(shù)傳遞所使用的寄存器為固定的寄存器。參數(shù)傳遞所使用的寄存器如表 7-15所示。表7-15參數(shù)傳遞所使用的寄存器參數(shù)類型第1個參數(shù)第2個參數(shù)第3個參數(shù)說明bit位存儲器位存儲器位存儲器charr7r5r3intr6r7r4r5r2r3r6 r4 r2為高字節(jié)longr4r5r6r7r4r5r6r7r4r5r6r7r4為最高字節(jié),r7為最低字節(jié)floatr4r5r6r7r4r5r6r7r4r5r6r732位ieee格式,指數(shù)和符號位在 r
41、7基于 存儲 器的 指針data *r7r5r3idata *pdata *xdata *r6r7r4r5r2r3r6 r4 r2為所指向地址的高字節(jié)內(nèi)容code *一般指針r1r2r3r1r2r3r1r2r3r3存放存儲類型,r1存放地址的高字 節(jié)內(nèi)容,r1存放地址的低字節(jié)內(nèi)容。例如,函數(shù)func(char x,char y,int z) 中,x用r7傳遞,y用r5傳遞,z用r2r3傳 遞,其中r2傳遞z的高字節(jié)內(nèi)容,r3傳遞z的低字節(jié)內(nèi)容。函數(shù)func(int x,char y,char data * z)中,x用r6r7傳遞,其中 r6傳遞x的高字節(jié)內(nèi)容,r7傳遞x的低字節(jié)內(nèi)容。y用r5
42、傳遞,z用r3傳遞。位參數(shù)以及位參數(shù)以后的參數(shù)均使用存儲器傳遞。其中,位參數(shù)采用位段中的對應(yīng)位進(jìn)行傳遞,其他參數(shù)采用字節(jié)段中的對應(yīng)的存儲單元進(jìn)行傳遞。例如,函數(shù)func(int x,bit y,char z)編譯后,位段和字節(jié)段中各參數(shù)的存儲空間的定義如下:rseg ?dt?_func?a51?_func?byte:x?040: ds 2z?042: ds 1rseg ?bi?_func?a51?_func?bit:y?041: dbit 1x用r6r7傳遞,其中,r6傳遞x的高字節(jié),r7傳遞x的低字節(jié)。y用y?041位傳遞,z 用z?042字節(jié)傳遞。x?040和x?040+1兩個字節(jié)并沒有用
43、作參數(shù)傳遞。c51程序中,調(diào)用函數(shù)的語句“ func(5,1,2);”所對應(yīng)的匯編程序如下:setb?_func?bit;y用位存儲器傳遞,位參數(shù) y置1mov?_func?byte+02h,#02h;z用存儲器傳遞,參數(shù)z賦數(shù)2movr7,#05h;x用r6r7傳遞,x的低字節(jié)賦數(shù)5movr6,#00h;x的高字節(jié)賦數(shù)0lcall_func;調(diào)用子程序_func啞函數(shù) func(int x,bit y,char z)的匯編代碼如下:rseg?pr?_func?a51_func:movx?040,r6;將x參數(shù)的值保存至存儲單元中(函數(shù)調(diào)用時(shí),x參數(shù)用r6r7傳遞,mov x?040+01h,
44、r7;其他參數(shù)用存儲器傳遞,x?040、x?040+1為存放x參數(shù)的地址);source line # 3ret某個參數(shù)對應(yīng)的寄存器被前面的參數(shù)傳遞占用時(shí),該參數(shù)以及該參數(shù)以后的所有參數(shù)均用存儲器傳遞。存儲器的選擇與規(guī)則2中的存儲器選擇相同。例如,函數(shù) func(char *fp,long y,char z) 中,fp 用 r1r2r3f遞,y 用 r4r5r6r7f 遞,x的傳遞占用了 z傳遞所用的寄存器 r3,所以,z使用存儲器傳遞。函數(shù)func(float x,long y,char z)中,x用r4r5r6r7f遞,它占用了參數(shù) y傳遞所用 的寄存器,所以,y、z都用存儲器傳遞。3 .有返回值的混合編程有返回值的混合編程的過程與無參數(shù)傳遞的混合編程的過程相同,編寫匯編程序時(shí)要根據(jù)c51程序讀取返回值的格式,在匯編程序返回之前,在匯
溫馨提示
- 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 產(chǎn)業(yè)園區(qū)入駐合同協(xié)議
- 關(guān)于推進(jìn)跨部門合作項(xiàng)目的工作計(jì)劃
- 關(guān)于采購流程的往來文書說明
- 商務(wù)會議溝通要點(diǎn)及會議紀(jì)要模板
- 健康管理平臺的構(gòu)建及運(yùn)營規(guī)劃
- 機(jī)器人智能化生產(chǎn)線建設(shè)委托代理合同
- 交通物流調(diào)度管理系統(tǒng)建設(shè)方案
- 房屋預(yù)約買賣合同
- 木材原木購銷合同
- 2025年版《認(rèn)識大熊貓》課件發(fā)布
- 《GMP實(shí)務(wù)教程》 完整全套教學(xué)課件 項(xiàng)目1-14 GMP基礎(chǔ)知識-藥品生產(chǎn)行政檢查
- 房屋租賃交接家私清單
- 《Hadoop大數(shù)據(jù)平臺基礎(chǔ)》復(fù)習(xí)考試題庫(帶答案)
- 大單元下的教學(xué)評一體化
- 注射用A型肉毒毒素管理制度
- 黑龍江省鶴崗市東方紅鄉(xiāng)地?zé)豳Y源普查探礦權(quán)出讓收益評估報(bào)告
- PMBOK知識重點(diǎn)電子筆記
- 精選湖北恩施州2023中考英語試題英語(解析版)
- 小學(xué)體育-小小特種兵教學(xué)設(shè)計(jì)學(xué)情分析教材分析課后反思
- 中國故事英文版年英文二篇
- GB/T 37827-2019城鎮(zhèn)供熱用焊接球閥
評論
0/150
提交評論