版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
《微機原理》學習實例程序〔非原創(chuàng),為收集的,都通過了實物測試〕2011-7,RTX數(shù)字錄音機一、實驗目的1、了解數(shù)字錄音技術的基本原理。2、進一步掌握A/D轉(zhuǎn)換器與D/A轉(zhuǎn)換器的使用方法。二、實驗內(nèi)容1、按圖41連接電路,將聲傳感器接J2,把代表語音的電信號送給ADC0809通道2(IN2);D/A轉(zhuǎn)換器的輸出端通過K8跳線接喇叭。2、編程,以每秒鐘5000次的速率采集IN2輸入的語音數(shù)據(jù)并存入內(nèi)存,共采集60000個數(shù)據(jù)(錄12秒),然后再以同樣的速率將數(shù)據(jù)送DAC0832使喇叭發(fā)聲(放音)。三、實驗提示1、將8253設置成方式0,計數(shù)200個,(定時0.2ms),利用PA0查詢OUT0電平,若高電平表示定時時間到。2、ADC0809通道2(IN2)的口地址為298Hdatasegmentioport equ01400h-0280hluport equioport+29ah;錄音口地址fangport equioport+290h;放音口地址io8253a equioport+283hio8253b equioport+280hio8255c equioport+28bhio8255d equioport+288hdata_qudb60000dup(?);錄音數(shù)據(jù)存放數(shù)據(jù)區(qū)news_1db'Pressanykeytorecord:',24h;錄音提示news_2db0dh,0ah,'Playing:',24h;放音提示dataendscodesegment assumecs:code,ds:data,es:databegin: movax,data;初始化 movds,ax moves,ax movdx,offsetnews_1;顯示錄音提示 movah,9 int21htest_1: movah,1;等待鍵盤輸入 int16h jztest_1;若不是則循環(huán)等待 calllu;調(diào)用錄音子程序 movdx,offsetnews_2;顯示放音提示 movah,9 int21hfy: callfang;調(diào)用放音子程序 movax,0c07h int21h cmpal,20h jzfy movah,4ch;返回DOS int21hluprocnear;錄音子程序 movdi,offsetdata_qu;置數(shù)據(jù)區(qū)首地址為DI movcx,60000;錄60000個數(shù)據(jù) cldxunhuan: movdx,luport;啟動A/D outdx,al calldelay;延時 inal,dx;從A/D讀數(shù)據(jù)到AL stosb;存入數(shù)據(jù)區(qū),使DI加1 loopxunhuan;循環(huán) ret;子程序返回luendpfangprocnear;放音子程序 movcx,60000;放60000個數(shù)據(jù) movsi,offsetdata_qu;置數(shù)據(jù)區(qū)首地址為SI cldfang_yin: movdx,fangport lodsb;從數(shù)據(jù)區(qū)取出數(shù)據(jù) subal,30h outdx,al;放音 calldelay;延時 loopfang_yin;循環(huán) ret;子程序返回fangendpdelayproc near;延時子程序 push dx mov al,10h;設8253通道0工作方式0 mov dx,io8253a out dx,al mov al,200;寫入計數(shù)器初值200 mov dx,io8253b out dx,al mov dx,io8255c;設8255的A口為輸入 mov al,9bh out dx,al mov dx,io8255d;從8255的A口輸入delay1: in al,dx and al,1;判斷PA0是否為1 jz delay1;若PA0不為1,轉(zhuǎn)de_lay pop dx ret;子程序返回delayendp codeends endbegin數(shù)模轉(zhuǎn)換器正弦波一、實驗目的了解數(shù)/模轉(zhuǎn)換器的基本原理,掌握DAC0832芯片的使用方法。二、實驗內(nèi)容1、實驗電路原理如圖36,DAC0832采用單緩沖方式,具有單雙極性輸入端(圖中的Ua、Ub),利用debug輸出命令(Out290數(shù)據(jù))輸出數(shù)據(jù)給DAC0832,用萬用表測量單極性輸出端Ua及雙極性輸出端Ub的電壓,驗證數(shù)字與電壓之間的線性關系。2、編程產(chǎn)生以下波形(從Ub輸出,用示波器觀察)正弦波三、編程提示1、8位D/A轉(zhuǎn)換器DAC0832的口地址為290H,輸入數(shù)據(jù)與輸出電壓的關系為:(UREF表示參考電壓,N表示數(shù)數(shù)據(jù)),這里的參考電壓為PC機的+5V電源。2、產(chǎn)生正弦波可根據(jù)正弦函數(shù)建一個下弦數(shù)字量表,取值范圍為一個周期,表中數(shù)據(jù)個數(shù)在16個以上datasegmentioport equ0d400h-0280hio0832a equioport+290hsin db80h,96h,0aeh,0c5h,0d8h,0e9h,0f5h,0fdh db0ffh,0fdh,0f5h,0e9h,0d8h,0c5h,0aeh,96h db80h,66h,4eh,38h,25h,15h,09h,04h db00h,04h,09h,15h,25h,38h,4eh,66h;正弦波數(shù)據(jù)dataendscodesegmentassumecs:code,ds:datastart:movax,data movds,axll: movsi,offsetsin;置正弦波數(shù)據(jù)的偏移地址為SI movbh,32;一組輸出32個數(shù)據(jù)lll: moval,[si];將數(shù)據(jù)輸出到D/A轉(zhuǎn)換器 movdx,io0832a outdx,al movah,06h movdl,0ffh int21h jneexit movcx,1delay:loopdelay;延時 incsi;取下一個數(shù)據(jù) decbh jnzlll;若未取完32個數(shù)據(jù)則轉(zhuǎn)lll jmpllexit: movah,4ch;退出 int21hcodeendsendstart鋸齒波一、實驗目的了解數(shù)/模轉(zhuǎn)換器的基本原理,掌握DAC0832芯片的使用方法。二、實驗內(nèi)容1、實驗電路原理如圖36,DAC0832采用單緩沖方式,具有單雙極性輸入端(圖中的Ua、Ub),利用debug輸出命令(Out290數(shù)據(jù))輸出數(shù)據(jù)給DAC0832,用萬用表測量單極性輸出端Ua及雙極性輸出端Ub的電壓,驗證數(shù)字與電壓之間的線性關系。2、編程產(chǎn)生以下波形(從Ub輸出,用示波器觀察)鋸齒波三、編程提示1、8位D/A轉(zhuǎn)換器DAC0832的口地址為290H,輸入數(shù)據(jù)與輸出電壓的關系為: (UREF表示參考電壓,N表示數(shù)數(shù)據(jù)),這里的參考電壓為PC機的+5V電源。2、產(chǎn)生鋸齒波只須將輸出到DAC0832的數(shù)據(jù)由0循環(huán)遞增。ioport equ0d400h-0280hio0832acodesegmentassumecs:codestart:movcl,0movdx,io0832alll:moval,cl outdx,al inccl;cl加1 inccl inccl inccl inccl inccl inccl pushdx movah,06h;判斷是否有鍵按下 movdl,0ffh int21h popdx jzlll;若無則轉(zhuǎn)LLL movah,4ch;返回DOS int21hcodeendsendstart電壓轉(zhuǎn)16進制數(shù)據(jù)一、實驗目的了解模/數(shù)轉(zhuǎn)換的基本原理,掌握ADC0809的使用方法。二、實驗內(nèi)容1、實驗電路原理圖如圖38。通過實驗臺左下角電位器RW1輸出0~5V直流電壓送入ADC0809通道0(IN0),利用debug的輸出命令啟動A/D轉(zhuǎn)換器,輸入命令讀取轉(zhuǎn)換結果,驗證輸入電壓與轉(zhuǎn)換后數(shù)字的關系。啟動IN0開始轉(zhuǎn)換: Out02980讀取轉(zhuǎn)換結果: In02982、編程采集IN0輸入的電壓,在屏幕上顯示出轉(zhuǎn)換后的數(shù)據(jù)(用16進制數(shù))。三、實驗提示1、ADC0809的IN0口地址為298H,IN1口地址為299H。2、IN0單極性輸入電壓與轉(zhuǎn)換后數(shù)字的關系為: N=Ui/(Uref/256) 其中Ui為輸入電壓,UREF為參考電壓,這里的參考電壓為PC機的+5V電源。3、一次A/D轉(zhuǎn)換的程序可以為MOVDX,口地址OUTDX,AL;啟動轉(zhuǎn)換;延時INAL,DX;讀取轉(zhuǎn)換結果放在AL中ioport equ0d400h-0280hio0809a equioport+298hcodesegment assumecs:codestart:movdx,io0809a;啟動A/D轉(zhuǎn)換器 outdx,al movcx,0ffh;延時delay:loopdelay inal,dx;從A/D轉(zhuǎn)換器輸入數(shù)據(jù) movbl,al;將AL保存到BL movcl,4 shral,cl;將AL右移四位 calldisp;調(diào)顯示子程序顯示其高四位 moval,bl andal,0fh calldisp;調(diào)顯示子程序顯示其低四位 movah,02 movdl,20h;加回車符 int21h movdl,20h int21h pushdx movah,06h;判斷是否有鍵按下 movdl,0ffh int21h popdx jestart;若沒有轉(zhuǎn)START movah,4ch;退出 int21hdispprocnear;顯示子程序 movdl,al cmpdl,9;比較DL是否>9 jleddd;若不大于則為'0'-'9',加30h為其ASCII碼 adddl,7;否則為'A'-'F',再加7ddd:adddl,30h;顯示 movah,02 int21h retdispendpcodeendsendstart波形顯示一、實驗目的了解模/數(shù)轉(zhuǎn)換的基本原理,掌握ADC0809的使用方法。二、實驗內(nèi)容將JP3的1、2短接,使IN2處于雙極性工作方式,并給IN1輸入一個低頻交流信號(幅度為±5V),編程采集這個信號數(shù)據(jù)并在屏幕上顯示波形。三、實驗提示1、ADC0809的IN0口地址為298H,IN1口地址為299H。2、IN0單極性輸入電壓與轉(zhuǎn)換后數(shù)字的關系為: N=Ui/(Uref/256) 其中Ui為輸入電壓,UREF為參考電壓,這里的參考電壓為PC機的+5V電源。3、一次A/D轉(zhuǎn)換的程序可以為MOVDX,口地址OUTDX,AL;啟動轉(zhuǎn)換;延時INAL,DX;讀取轉(zhuǎn)換結果放在AL中ioport equ0d400h-0280hio0809b equioport+299hcodesegment assumecs:codestart: movax,0012h;設屏幕顯示方式為VGA640X480模示 int10h andcx,0;cx為橫坐標draw: movdx,io0809b;啟動A/D轉(zhuǎn)換器通道1 outdx,al movbx,500;延時delay: decbx jnzdelay inal,dx;讀入數(shù)據(jù) movah,0 movdx,368;dx為縱坐標 subdx,ax moval,0ah;設置顏色 movah,0ch;畫點 int10h cmpcx,639;一行是否滿 jzstart;是則轉(zhuǎn)start inccx;繼續(xù)畫點 pushdx movah,06h;是否有鍵按下 movdl,0ffh int21h popdx jedraw;無,則繼續(xù)畫點 movax,0003;有恢復屏幕為字符方式 int10h movah,4ch;返回DOS int21hcodeendsendstart實驗05_七段數(shù)碼管七段數(shù)碼管靜態(tài)顯示一、實驗目的掌握數(shù)碼管顯示數(shù)字的原理二、實驗內(nèi)容靜態(tài)顯示:按圖22連接好電路,將8255的A口PA0~PA6分別與七段數(shù)碼管的段碼驅(qū)動輸入端a~g相連,位碼驅(qū)動輸入端S1接+5V(選中),S0、dp接地(關閉)。編程從鍵盤輸入一位十進制數(shù)字(0~9),在七段數(shù)碼管上顯示出來。三、編程提示實驗臺上的七段數(shù)碼管為共陰型,段碼采用同相驅(qū)動,輸入端加高電平,選中的數(shù)碼管亮,位碼加反相驅(qū)動器,位碼輸入端高電平選中。datasegmentioport equ0d400h-0280hio8255a equioport+288hio8255b equioport+28bhleddb3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fhmesg1db0dh,0ah,'Inputanum(0--9h):',0dh,0ah,'$'dataendscodesegment assumecs:code,ds:datastart:movax,data movds,ax movdx,io8255b;使8255的A口為輸出方式 movax,80h outdx,alsss:movdx,offsetmesg1;顯示提示信息 movah,09h int21h movah,01;從鍵盤接收字符 int21h cmpal,'0';是否小于0 jlexit;若是則退出 cmpal,'9';是否大于9 jgexit;若是則退出 subal,30h;將所得字符的ASCII碼減30H movbx,offsetled;bx為數(shù)碼表的起始地址 xlat;求出相應的段碼 movdx,io8255a;從8255的A口輸出 outdx,al jmpsss;轉(zhuǎn)SSSexit:movah,4ch;返回DOS int21hcodeends七段數(shù)碼管動態(tài)顯示(選作)一、實驗目的掌握數(shù)碼管顯示數(shù)字的原理二、實驗內(nèi)容動態(tài)顯示(選作):使用圖23的電路,編程在兩個數(shù)碼管上循環(huán)顯示“00-99”。三、編程提示實驗臺上的七段數(shù)碼管為共陰型,段碼采用同相驅(qū)動,輸入端加高電平,選中的數(shù)碼管亮,位碼加反相驅(qū)動器,位碼輸入端高電平選中datasegmentioport equ0d400h-0280hio8255a equioport+28ahio8255b equioport+28bhio8255c equioport+288hleddb3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh;段碼buffer1db0,0;存放要顯示的十位和個位bzdw?;位碼dataendscodesegment assumecs:code,ds:datastart:movax,data movds,ax movdx,io8255b;將8255設為A口輸出 moval,80h outdx,almovdi,offsetbuffer1;設di為顯示緩沖區(qū)loop1: movcx,0300h;循環(huán)次數(shù)loop2: movbh,02lll: movbyteptrbz,bh pushdi decdi adddi,bz movbl,[di];bl為要顯示的數(shù) popdi movbh,0 movsi,offsetled;置led數(shù)碼表偏移地址為SI addsi,bx;求出對應的led數(shù)碼 moval,byteptr[si] movdx,io8255c;自8255A的口輸出 outdx,al moval,byteptrbz;使相應的數(shù)碼管亮 movdx,io8255a outdx,al pushcx movcx,3000 ;如果顯示過快,可更改cx值為最大0ffffhdelay: loopdelay;延時 popcx movbh,byteptrbz shrbh,1 jnzlll looploop2;循環(huán)延時 movax,wordptr[di] cmpah,09 jnzsetcmpal,09 jnzset movax,0000mov[di],al mov[di+1],ah jmploop1set: movah,01 int16h jneexit;有鍵按下則轉(zhuǎn)exit movax,wordptr[di] incal aaa mov[di],al;al為十位 mov[di+1],ah;ah中為個位 jmploop1exit: movdx,io8255a moval,0;關掉數(shù)碼管顯示 outdx,al movah,4ch;返回DOS int21hcodeends endstart七段數(shù)碼管動態(tài)顯示一、實驗目的掌握數(shù)碼管顯示數(shù)字的原理二、實驗內(nèi)容動態(tài)顯示:按圖23連接好電路,七段數(shù)碼管段碼連接不變,位碼驅(qū)動輸入端S1,S0接8255C口的PC1,PC0。編程在兩個數(shù)碼管上顯示“56”三、編程提示實驗臺上的七段數(shù)碼管為共陰型,段碼采用同相驅(qū)動,輸入端加高電平,選中的數(shù)碼管亮,位碼加反相驅(qū)動器,位碼輸入端高電平選中。datasegmentioport equ0d400h-0280hio8255a equioport+28ahio8255b equioport+28bhio8255c equioport+288hleddb3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh;段碼buffer1db5,6;存放要顯示的個位和十位bzdw?;位碼dataendscodesegment assumecs:code,ds:datastart: movax,data movds,ax movdx,io8255b;將8255設為A口輸出 moval,80h outdx,al movdi,offsetbuffer1;設di為顯示緩沖區(qū)loop2: movbh,02lll:movbyteptrbz,bh pushdi decdi adddi,bz movbl,[di];bl為要顯示的數(shù) popdimoval,0movdx,io8255aoutdx,al movbh,0 movsi,offsetled;置led數(shù)碼表偏移地址為SI addsi,bx;求出對應的led數(shù)碼 moval,byteptr[si] movdx,io8255c;自8255A的口輸出 outdx,al moval,byteptrbz;使相應的數(shù)碼管亮 movdx,io8255a outdx,al movcx,3000delay: loopdelay;延時 movbh,byteptrbz shrbh,1 jnzlll movdx,0ffh movah,06 int21h jeloop2;有鍵按下則退出 movdx,io8255a moval,0;關掉數(shù)碼管顯示 outdx,al movah,4ch;返回 int21hcodeends endstart實驗01_IO地址譯碼一、實驗目的掌握I/O地址譯碼電路的工作原理。二、實驗原理和內(nèi)容實驗電路如圖11所示,其中74LS74為D觸發(fā)器,可直接使用實驗臺上數(shù)字電路實驗區(qū)的D觸發(fā)器,74LS138為地址譯碼器。譯碼輸出端Y0~Y7在實驗臺上“I/O地址“輸出端引出,每個輸出端包含8個地址,Y0:280H~287H,Y1:288H~28FH,……當CPU執(zhí)行I/O指令且地址在280H~2BFH范圍內(nèi),譯碼器選中,必有一根譯碼線輸出負脈沖。例如:執(zhí)行下面兩條指令MOVDX,2A0HOUTDX,AL(或INAL,DX)Y4輸出一個負脈沖,執(zhí)行下面兩條指令MOVDX,2A8HOUTDX,AL(或INAL,DX)Y5輸出一個負脈沖。注意:命令中的端口地址D820、D82A是根據(jù)PCI卡的基址再加上偏移量計算出來的,不同的微機器PCI卡的基址可能不同,需要事先查找出來,查找方法見本書末尾文章中的介紹。計算公式如下:計算出的地址=查找出的PCI卡的基址+偏移量;(其中:偏移量=2A0H-280H或2A8H–A80H)利用這個負脈沖控制L7閃爍發(fā)光(亮、滅、亮、滅、……),時間間隔通過軟件延時實現(xiàn)。三、編程提示1、實驗電路中D觸發(fā)器CLK端輸入脈沖時,上升沿使Q端輸出高電平L7發(fā)光,CD端加低電平L7滅。2、由于TPC卡使用PCI總線,所以分配的IO地址每臺微機可能都不同,編程時需要了解當前的微機使用那段IO地址并進行設置,獲取方法請參看匯編程序使用方法的介紹。(也可使用自動獲取資源分配的程序取得中斷號)ioport equ0d400h-0280houtport1 equioport+2a0houtport2 equioport+2a8hcodesegment assumecs:codestart: movdx,outport1 outdx,al calldelay;調(diào)延時子程序 movdx,outport2 outdx,al calldelay;調(diào)延時子程序 movah,1 int16h jestart movah,4ch int21hdelayprocnear;延時子程序 movbx,2000lll:movcx,0ll:loopll decbx jnelll retdelayendpcodeendsendstart實驗02_簡單并行接口簡單并行接口74LS273一、實驗目的掌握簡單并行接口的工作原理及使用方法。二、實驗內(nèi)容1、按下面圖12簡單并行輸出接口電路圖連接線路(74LS273插通用插座,74LS32用實驗臺上的“或門”)。74LS273為八D觸發(fā)器,8個D輸入端分別接數(shù)據(jù)總線D0~D7,8個Q輸出端接LED顯示電路L0~L7。2、編程從鍵盤輸入一個字符或數(shù)字,將其ASCⅡ碼通過這個輸出接口輸出,根據(jù)8個發(fā)光二極管發(fā)光情況驗證正確性。三、編程提示上述并行輸出接口的地址為2A8H,并行輸入接口的地址為2A0H,通過上述并行接口電路輸出數(shù)據(jù)需要3條指令:MOVAL,數(shù)據(jù)MOVDX,2A8HOUTDX通過上述并行接口輸入數(shù)據(jù)需要2條指令:MOVDX,2ADHINAL,DXioport equ0d400h-0280hls273 equioport+2a8hcodesegmentassumecs:codestart: movah,2;回車符 movdl,0dh int21h movah,1;等待鍵盤輸入 int21h cmpal,27;判斷是否為ESC鍵 jeexit;若是則退出 movdx,ls273;若不是,從2A8H輸出其ASCII碼 outdx,al jmpstart;轉(zhuǎn)startexit:movah,4ch;返回DOS int21hcodeendsendstart簡單并行接口74LS244一、實驗目的掌握簡單并行接口的工作原理及使用方法。二、實驗內(nèi)容1、按下面圖13簡單并行輸入接口電路圖連接電路(74LS244插通用插座,74LS32用實驗臺上的“或門”)。74LS244為八緩沖器,8個數(shù)據(jù)輸入端分別接邏輯電平開關輸出K0~K7,8個數(shù)據(jù)輸出端分別接數(shù)據(jù)總線D0~D7。2、用邏輯電平開關預置某個字母的ASCⅡ碼,編程輸入這個ASCⅡ碼,并將其對應字母在屏幕上顯示出來。三、編程提示1、上述并行輸出接口的地址為2A8H,并行輸入接口的地址為2A0H,通過上述并行接口電路輸出數(shù)據(jù)需要3條指令:MOVAL,數(shù)據(jù)MOVDX,2A8HOUTDX通過上述并行接口輸入數(shù)據(jù)需要2條指令:MOVDX,2ADHINAL,DXioport equ0d400h-0280hls244 equioport+2a0hcodesegment assumecs:codestart:movdx,ls244;從2A0輸入一數(shù)據(jù) inal,dx movdl,al;將所讀數(shù)據(jù)保存在DL中 movah,02 int21h movdl,0dh;顯示回車符 int21h movdl,0ah;顯示換行符 int21h movah,06;是否有鍵按下 movdl,0ffh int21h jnzexit jestart;若無,則轉(zhuǎn)startexit:movah,4ch;返回DOS int21hcodeendsendstart實驗04_可編程并行接口(8255方式0,1)可編程并行接口(8255方式0)ASM一、實驗目的掌握8255方式0的工作原理及使用方法。二、實驗內(nèi)容1.實驗電路如圖20,8255C口接邏輯電平開關K0~K7,A口接LED顯示電路L0~L7。2.編程從8255C口輸入數(shù)據(jù),再從A口輸出.三、編程提示1、8255控制寄存器端口地址 28BHA口的地址 288HC口的地址 28AH2、參考流程圖(見圖21):ioport equ0d400h-0280hio8255a equioport+288hio8255b equioport+28bhio8255c equioport+28ahcodesegment assumecs:codestart:movdx,io8255b;設8255為C口輸入,A口輸出 moval,8bh outdx,alinout:movdx,io8255c;從C口輸入一數(shù)據(jù) inal,dx movdx,io8255a;從A口輸出剛才自C口 outdx,al;所輸入的數(shù)據(jù) movdl,0ffh;判斷是否有按鍵 movah,06h int21h jzinout;若無,則繼續(xù)自C口輸入,A口輸出 movah,4ch;否則返回DOS int21hcodeends endstart并行接口(8255方式一實驗2)C一、實驗目的1.掌握8255工作方式1時的使用及編程。2.進一步掌握中斷處理程序的編寫。二、實驗內(nèi)容1.按圖33(B)8255方式1輸入電路,連好線路。2.編程:每按一次單脈沖按鈕產(chǎn)生一個正脈沖使8255產(chǎn)生一次中斷請求,讓CPU進行一次中斷服務:讀取邏輯電平開關預置的ASCII碼,在屏幕上顯示其對應的字符,中斷8次結束。/*******************************//*可編程并行接口(二)*//*8255方式1輸入實驗(A口)*//*******************************/#include<stdio.h>#include<conio.h>#include"ApiEx.h"#pragmacomment(lib,"ApiEx.lib")intCount=8; /*響應中斷次數(shù)為8*/voidIntS();voidmain(){ printf("--------------------EXP21_10_8255-1_2---------------------\n"); printf("1.8255(PA0-PA7)===TPC(K0-K7)\n"); printf("2.I/O(288-28F)===8255(CS)\n"); printf("3.8255(PC3)===TPC(IRQ)\n"); printf("4.8255(PC4)===(K8(DMC))\n"); printf("Pressanykeytobegin!\n\n"); getch(); if(!Startup()) /*打開設備*/ { printf("ERROR:OpenDeviceError!\n"); return; } printf("PressDMC!Pressanykeytoexit!\n"); PortWriteByte(0x28b,0xb8); /*設8255工作方式1輸入*/ PortWriteByte(0x28b,0x09); /*將PC4置位*/ RegisterLocalISR(IntS); /*注冊中斷程序*/ EnableIntr(); /*開中斷*/ while(!kbhit())Sleep(10); DisableIntr(); /*關中斷*/ Cleanup(); /*關閉設備*/}voidIntS(){ BYTE data; PortReadByte(0x288,&data); /*以16進制打印自A口輸入的數(shù)據(jù)*/ printf("ThisisaIntrupt!In=%x\n",data); Count--; if(Count==0) exit(0);}可編程并行接口(8255方式一實驗1)C一、實驗目的1.掌握8255工作方式1時的使用及編程。2.進一步掌握中斷處理程序的編寫。二、實驗內(nèi)容1.按圖33(A)8255方式1的輸出電路連好線路。2.編程:每按一次單脈沖按鈕產(chǎn)生一個正脈沖使8255產(chǎn)生一次中斷請求,讓CPU進行一次中斷服務:依次輸出01H、02H,04H,08H,10H,20H,40H,80H使L0~L7依次發(fā)光,中斷8次結束。/*******************************//*可編程并行接口(二)*//*8255方式1輸出實驗(A口)*//*******************************/#include<stdio.h>#include<conio.h>#include"ApiEx.h"#pragmacomment(lib,"ApiEx.lib")intCount=0x01; /*響應中斷次數(shù)為8*/voidIntS();voidmain(){ printf("--------------------EXP21_10_8255-1_1---------------------\n"); printf("1.8255(PA0-PA7)===TPC(L0-L7)\n"); printf("2.I/O(288-28F)===8255(CS)\n"); printf("3.8255(PC3)===TPC(IRQ)\n"); printf("4.8255(PC6)===(K8(DMC))\n"); printf("Pressanykeytobegin!\n\n"); getch(); if(!Startup()) /*打開設備*/ { printf("ERROR:OpenDeviceError!\n"); return; } printf("PressDMC!Pressanykeytoexit!\n"); RegisterLocalISR(IntS); /*注冊中斷程序*/ EnableIntr(); /*開中斷*/ PortWriteByte(0x28b,0xa8); /*設8255工作方式1輸出*/ PortWriteByte(0x28b,0x0d); /*將PC6置位*/ while(!kbhit())Sleep(10); DisableIntr(); /*關中斷*/ Cleanup(); /*關閉設備*/}voidIntS(){ PortWriteByte(0x288,Count); /*從PA口輸出i,初值為0x80*/ printf("ThisisaIntrupt!Out=%x\n",Count); Count<<=1; /*Count左移一位*/ if(Count==0x100) exit(0);}8251串行通信實驗一、實驗目的1、了解串行通訊的基本原理。2、掌握串行接口芯片8251的工作原理和編程方法。二、實驗內(nèi)容1、 按圖43連接好電路,(8251插通用插座)其中8253計數(shù)器用于產(chǎn)生8251的發(fā)送和接收時鐘.TXD和RXD連在一起。2、 編程:從鍵盤輸入一個字符,將其ASCII碼加1后發(fā)送出去,再接收回來在屏幕上顯示。實現(xiàn)自發(fā)自收。三、實驗提示1、 圖示電路8251的控制口地址為2B9H,數(shù)據(jù)口地址為2B8H。2、 8253計數(shù)器的計數(shù)初值=時鐘頻率/(波特率×波特率因子),這里的時鐘頻率接1MHz,波特率若選1200,波特率因子若選16,則計數(shù)器初值為52。3、 收發(fā)采用查詢方式。datasegmentioport equ0d400h-0280hio8253a equioport+280hio8253b equioport+283hio8251a equioport+2b8hio8251b equioport+2b9hmes1db'youcanplayakeyonthekeybord!',0dh,0ah,24hmes2ddmes1dataendscodesegmentassumecs:code,ds:datastart:movax,data movds,ax movdx,io8253b;設置8253計數(shù)器0工作方式 moval,16h outdx,al movdx,io8253a moval,52;給8253計數(shù)器0送初值 outdx,al movdx,io8251b;初始化8251 xoral,al movcx,03;向8251控制端口送3個0delay:callout1 loopdelay moval,40h;向8251控制端口送40H,使其復位 callout1 moval,4eh;設置為1個停止位,8個數(shù)據(jù)位,波特率因子為16 callout1 moval,27h;向8251送控制字允許其發(fā)送和接收 callout1 ldsdx,mes2;顯示提示信息 movah,09 int21hwaiti:movdx,io8251b inal,dx testal,01;發(fā)送是否準備好 jzwaiti movah,01;是,從鍵盤上讀一字符 int21h cmpal,27;若為ESC,結束 jzexit movdx,io8251a incal outdx,al;發(fā)送 movcx,0F00hs51:loops51;延時next:movdx,io8251b inal,dx testal,02;檢查接收是否準備好 jznext;沒有,等待 movdx,io8251a inal,dx;準備好,接收 movdl,al movah,02;將接收到的字符顯示在屏幕上 int21h jmpwaitiexit:movah,4ch;退出 int21hout1procnear;向外發(fā)送一字節(jié)的子程序 outdx,al pushcx movcx,0F00hgg:loopgg;延時 popcx retout1endpcodeendsendstart8250串行通訊實驗一、實驗目的1、進一步了解串行通信的基本原理2、掌握串行接口芯片8250的工作原理和編程方法二、實驗內(nèi)容1、按圖-52連接線路,圖中8250芯片插在通用插座上。2、編程:從鍵盤輸入一個字符,將其ASCLL碼加1后發(fā)送出去,再接收回來在屏幕上加1后的字符顯示出來,實現(xiàn)自發(fā)自收三、實驗提示1、8250介紹:INC8250是一個可編程序異步通訊單元芯片,在微機系統(tǒng)中起串行數(shù)據(jù)的輸入輸出接口作用。此外,它還包含有可編程序波特率發(fā)生器,它可用1~65535的因子對輸入時鐘進行分頻,以產(chǎn)生波特率十六倍的輸入輸出時鐘。2、8250時鐘接2MHZ,若選波特率為9600,波特率因子為16,則因子寄存器中分頻數(shù)為13。所以因子寄存器低字節(jié)送13,高字節(jié)為00H。3、圖中CS接02B8H~02BFH:下表為各寄存器選擇地址一覽表。表中DLAB為線控制寄存器的最高位,也叫因子寄存器存取位。當DLAB為0時選接收數(shù)據(jù)緩沖器,發(fā)送數(shù)據(jù)寄存器和中斷允許寄存器。當DLAB為1時選因子寄存器的低字節(jié)和高字節(jié)。4、收發(fā)采用查詢方式DATASEGMENTioport equ0d400h-0280hPORT equioport+2b8hPORT1 equioport+2b9hPORT3 equioport+2bbhPORT5 equioport+2bdhMES DB'Youcanplayakeyonthekeybort!',0AH,0DH DB'ESCquittodos!',0AH,0DH,'$'DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART: MOV AX,DATA MOV DS,AX MOV AL,80H MOV DX,PORT3 OUT DX MOV AL,13;setlightdivisor MOV DX,PORT OUT DX MOV AL,00;setlowdivisor9600boud MOV DX,PORT1 OUT DX MOV AL,00011011B;8bits1stop MOV DX,PORT3 OUT DX MOV AL,00H MOV DX,PORT1 OUT DX,AL MOV DX,OFFSETMES MOV AH,09H INT 21HWAITI: MOV DX,PORT5 IN AL,DX;GETLINESTATUS AND AL,20H TEST AL,20H JZ WAITI MOV AH,01 INT 21H CMP AL,27 JZ EXIT MOV DX,PORT INC AL OUT DX MOV CX,40HS50: LOOP S50NEXT: MOV DX,PORT5 IN AL,DX AND AL,01 TEST AL,01 JZ NEXT MOV DX,PORT IN AL,DX MOV DL,AL MOV AH,02 INT 21H JMP WAITIEXIT: MOV AH,4CH INT 21HCODEENDSENDSTART實驗03_可編程定時器計數(shù)器8253可編程定時器計數(shù)器8253(一)一、實驗目的掌握8253的基本工作原理和編程方法。二、實驗內(nèi)容按圖16虛線連接電路,將計數(shù)器0設置為方式0,計數(shù)器初值為N(N≤0FH),用手動逐個輸入單脈沖,編程使計數(shù)值在屏幕上顯示,并同時用邏輯筆觀察OUT0電平變化(當輸入N+1個脈沖后OUT0變高電平)。三、編程提示 8253控制寄存器地址 283H 計數(shù)器0地址 280H 計數(shù)器1地址 281H CLK0連接時鐘 1MHZioport equ0d400h-0280hio8253a equioport+283hio8253b equioport+280hcodesegment assumecs:codestart:moval,14h;設置8253通道0為工作方式2,二進制計數(shù) movdx,io8253a outdx,al movdx,io8253b;送計數(shù)初值為0FH moval,0fh outdx,allll:inal,dx;讀計數(shù)初值 calldisp;調(diào)顯示子程序 pushdx movah,06h movdl,0ffh int21h popdx jzlll movah,4ch;退出 int21hdispprocnear;顯示子程序 pushdxandal,0fh;首先取低四位 movdl,al cmpdl,9;判斷是否<=9 jlenum;若是則為'0'-'9',ASCII碼加30H adddl,7;否則為'A'-'F',ASCII碼加37Hnum:adddl,30h movah,02h;顯示 int21h movdl,0dh;加回車符 int21h movdl,0ah;加換行符 int21h popdx ret;子程序返回dispendpcodeendsendstart可編程定時器計數(shù)器8253(二)一、實驗目的掌握8253的基本工作原理和編程方法。二、實驗內(nèi)容按圖17連接電路,將計數(shù)器0、計數(shù)器1分別設置為方式3,計數(shù)初值設為1000,用邏輯筆觀察OUT1輸出電平的變化(頻率1HZ)三、編程提示1、 8253控制寄存器地址 283H 計數(shù)器0地址 280H 計數(shù)器1地址 281H CLK0連接時鐘 1MHZioport equ0d400h-0280hio8253a equioport+280hio8253b equioport+281hio8253c equioport+283hcodesegment assumecs:codestart:movdx,io8253c;向8253寫控制字 moval,36h;使0通道為工作方式3 outdx,al movax,1000;寫入循環(huán)計數(shù)初值1000 movdx,io8253a outdx,al;先寫入低字節(jié) moval,ah outdx,al;后寫入高字節(jié) movdx,io8253c moval,76h;設8253通道1工作方式2 outdx,al movax,1000;寫入循環(huán)計數(shù)初值1000 movdx,io8253b outdx,al;先寫低字節(jié)moval,ah outdx,al;后寫高字節(jié) movah,4ch;程序退出 int21hcodeends endstart實驗21_鍵盤顯示控制實驗鍵盤顯示2(中斷編程)C一、 實驗目的1、掌握8279鍵盤顯示電路的基本功能及編程方法。2、掌握一般鍵盤和顯示電路的工作原理。3、進一步掌握定時器的使用和中斷處理程序的編程方法。二、 實驗內(nèi)容1、I/O編程本實驗的實驗電路如圖。它做在一塊擴展電路板上,用一根20芯扁平電纜線將實驗板擴展插頭與實驗臺上的擴展插頭J7相連,為擴展電路連接電源及外部總線。擴展電路板上的數(shù)碼管、鍵盤陣列既能由8279控制,也可以由外部電路控制,其實現(xiàn)靠的是若干組短路子組成的控制選擇開關K1,K2,K3,K4,KB0,KB1,KB2。當K1,K3,K4連接在8279一端時,數(shù)碼管由8279控制,連接在LS273一端時由外部總線通過LS273直接控制。當K2,KB1,KB2,KB3連接在8279一端時,鍵盤陣列由8279控制,連接在8255一端時由外接芯片8255控制。因為本實驗為8279控制實驗,所以除了連接J1和J7外,還需要將選擇開關K1,K2,K3,K4,KB0,KB1,KB2連接在8279一端,以使數(shù)碼管、鍵盤陣列由8279芯片控制。3、編程2:中斷編程利用實驗臺上提供的定時器8253和擴展板上提供的8279以及鍵盤和數(shù)碼顯示電路,設計一個電子鐘。由8253中斷定時,小鍵盤控制電子鐘的啟停及初始值的預置。電子鐘顯示格式如下:XX.XX.XX.由左向右分別為時、分、秒。要求具有如下功能:①、C鍵:清除,顯示全零。②、G鍵:啟動,電子鐘計時。③、D鍵:停止,電子鐘停止計時。④、P鍵:設置時、分、秒值。輸入時依次為時、分、秒,同時應有判斷輸入錯誤的能力,若輸入有錯,則顯示:E-----。此時敲P鍵可重新輸入預置值。⑤、E鍵:程序退出。四、 編程2接線方法1. 用一根20芯扁平電纜將實驗擴展板與實驗臺上擴展插頭J7相連。2. 實驗臺上8253CLK0接1MHZ,GATE0和GATE1接+5V,OUT0接CLK1,OUT1接IRQ,CS接280H~287H。/***************************//*8279鍵盤顯示控制器2*//***************************/#include<stdio.h>#include<conio.h>#include"ApiEx.h"#pragmacomment(lib,"ApiEx.lib")#define ioport 0x2b0 //8279數(shù)據(jù)口#define ioport1 0x2b1 //8279控制口#define time 0x280 //8253定時器0口地址#define time1 0x281 //8253定時器1口地址#define timec 0x283 //8253控制口地址intbuf=0; //計數(shù)單元intsign=1; //計數(shù)標志intsec1=0,sec2=0; //秒高/低位intmin1=0,min2=0; //分高/低位inthour1=0,hour2=0;//時高/低位interr1=0; //出錯標志inthms; //預置時,分,秒標志intled[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C, 0x39,0x5E,0x79,0x71,0x67,0x37,0x73,0x31,0x3E,0x36,0x66,0x80,0x40}; //0,1,2,3,4,5,6,7,8,9,A,b,C,d,E,F,g,m,P,r,w,x,y,.,-intkeyin=0;voidkey(); //鍵盤顯示子程序voiddisp(); //顯示子程序voidhigh(); //預置時、分、秒高位子程序voidlow(); //預置時、分、秒低位子程序voidint_proc(); //中斷處理子程序voiderror();voidmain(){ printf("--------------------EXP29_21_SYB---------------------\n"); printf("1.8253(CLK0)===TPC(1MHz)\n"); printf("2.8253(GATE0,GATE1)===TPC(+5V)\n"); printf("3.8253(OUT0)===8253(CLK1)\n"); printf("4.8253(OUT1)===TPC(IRQ)\n"); printf("5.I/O(280-287)===8253(CS)\n"); printf("6.SYB===J7\n"); printf("Pressanykeytobegin!\n\n"); getch(); printf("Presssmallkeybord:\n"); printf("C--CLEARTOZERO;\n"); printf("G--GOAHEAD\n"); printf("D--STOPTHEDISPLY;\n"); printf("P--POSITIONTHEBEGINNINGTIME\n"); printf("E--EXIT\n"); if(!Startup()) /*打開設備*/ { printf("ERROR:OpenDeviceError!\n"); return; } PortWriteByte(timec,0x36); //8253初始化 PortWriteByte(time,1000%256); PortWriteByte(time,1000/256); PortWriteByte(timec,0x74); PortWriteByte(time1,100%256); //定時器1每0.1S中斷1次 PortWriteByte(time1,100/256); //定時器1每0.1S中斷1次 PortWriteByte(ioport1,0xd3); //8279清零 PortWriteByte(ioport1,0x2a); //置8279時鐘命令 PortWriteByte(ioport1,0x40); //讀FIFO存儲器命令 PortWriteByte(ioport1,0x00); //置鍵盤顯示模式 PortWriteByte(ioport1,0x80); //寫顯示緩沖區(qū)命令 RegisterLocalISR(int_proc); /*注冊中斷程序*/ EnableIntr(); /*開中斷*/ do{ key(); //調(diào)鍵盤顯示子程序 if((hour2==0x0a)|(keyin==0x0c)) //是否'C'命令 { sign=0; hour2=0; hour1=0; min2=0; min1=0; sec2=0; sec1=0; } if(keyin==0x10) //是否'G'命令 { sign=0x01; }elseif(keyin==0x0d) //是否'D'命令 { sign=0x00; }elseif(keyin==0x12) //是否'P'命令 { sign=0x00; //'00'為預置時標志 hms=0x00; high(); if(err1!=0x01) { low(); if(err1!=0x01) { hms=0x11; //'11'為預置分標志 high(); if(err1!=0x01) { low(); if(err1!=0x01) { hms=0x22; //'22'為預置秒標志 high(); if(err1!=0x01) { low(); } } } } } } }while(!(keyin==0x0e)); //'E'命令,退出程序 DisableIntr(); /*關中斷*/ Cleanup(); /*關閉設備*/}voidint_proc(){ if(sign!=0) //是否允許計數(shù) { buf++; //計數(shù)單元加1 if(buf==10) { buf=0; sec1++; if(sec1==10) { sec1=0; sec2++; if(sec2==6) { sec2=0; min1++; if(min1==10) { min1=0; min2++; if(min2==6) { min2=0; hour1++; if((hour1==4)&(hour2==2)) { hour2=0; hour1=0; } if(hour1==10) { hour1=0; hour2++; } } } } } } }}voidkey(){ BYTE data; PortWriteByte(ioport1,0xd1); //清顯示 Sleep(100); do{ disp(); //調(diào)顯示子程序 PortReadByte(ioport1,&data); }while(!(data&0x07)); PortReadByte(ioport,&data); //讀狀態(tài) keyin=data&0x07; data=data&0x38; data>>=3; if(data==0) //是否第一行鍵按下 keyin=keyin+0x08; //第一行,加8 elseif(data!=1) //是否第二行鍵按下 keyin=keyin+0x10; //第三行,加10H}voiddisp(){ PortWriteByte(ioport1,0x90); Sleep(100); PortWriteByte(ioport,led[sec1]); PortWriteByte(ioport,led[sec2]); PortWriteByte(ioport,led[min1]); PortWriteByte(ioport,led[min2]); PortWriteByte(ioport,led[hour1]); PortWriteByte(ioport,led[hour2]);}voidhigh(){ key(); err1=00; if(hms==0x00) //HMS是預置時、分、秒標志,00預置時 { if(keyin<=0x02) { hour2=keyin; }else { error(); } }elseif(hms==0x11) //11預置分 { if(keyin<=0x05) { min2=keyin; }else { error(); } }elseif(keyin<=0x05) //22預置秒 { sec2=keyin; }else { error(); }}voiderror(){ err1=0x01; hour2=0x0e; hour1=0x18; min2=0x18; min1=0x18; sec2=0x18; sec1=0x18;}voidlow(){ key(); err1=00; if(hms==0x00) //預置時、分、秒低位 { if(((keyin<=0x09)&(hour2==0))|((keyin<=0x09)&(hour2==1))|((keyin<=0x03)&(hour2==2))) { hour1=keyin; }else { error(); } }elseif(hms==0x11) //11預置分 { if(keyin<=0x09) { min1=keyin; }else { error(); } }elseif(keyin<=0x09) //22預置秒 { sec1=keyin; }else { error(); }}鍵盤顯示1一、 實驗目的1、掌握8279鍵盤顯示電路的基本功能及編程方法。2、掌握一般鍵盤和顯示電路的工作原理。3、進一步掌握定時器的使用和中斷處理程序的編程方法。二、 實驗內(nèi)容1、本實驗的實驗電路如圖56。它做在一塊擴展電路板上,用一根20芯扁平電纜與實驗臺上擴展插頭J7相連。2、編程1:使得在小鍵盤上每按一個健,6位數(shù)碼管上顯示出相應字符,它們的對應關系如下三、接線方法用一根20芯扁平電纜將實驗擴展板與實驗臺上擴展插頭J7相連/***************************//*8279鍵盤顯示控制器1*//********
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 金融科技下知識產(chǎn)權融資的實踐與探索
- 個人住房抵押貸款合同
- 中外雙方進出口合同范本
- 二手房全款交易合同范本
- 個人租賃倉儲空間的合同范本
- 中外合作研發(fā)合同范本(人工智能)
- 專業(yè)技術人才培養(yǎng)合作合同
- 產(chǎn)業(yè)投資合作協(xié)議合同模板
- 主要農(nóng)作物新品種推廣合同示范文本
- 個人與合作方倉儲運輸合同例文
- 2024年山東省高中學業(yè)水平合格考生物試卷試題(含答案詳解)
- 2025年中考英語復習熱點話題作文范文
- 小學數(shù)學教學工作交流數(shù)學教學中的體會總結經(jīng)驗交流會課件
- 2024年美國智能馬桶和馬桶蓋市場現(xiàn)狀及上下游分析報告
- 中國成人暴發(fā)性心肌炎診斷和治療指南(2023版)解讀
- 復產(chǎn)復工六個一
- 招商引資項目落地工作方案
- 湘教版高中數(shù)學必修二知識點清單
- 商業(yè)綜合體投資計劃書
- 2024妊娠期糖尿病指南課件
- 《鋼鐵是怎樣煉成的》練習題(含答案)
評論
0/150
提交評論