第一篇:2018東南大學(xué)自動化學(xué)院微機實驗6、7實驗報告
《微機實驗及課程設(shè)計》實驗報告
學(xué)號
08
東南大學(xué)
《微機系統(tǒng)與接口(含實驗)》
實驗報告
實驗六
8255 并行輸入輸出
實驗七
串行通信
姓
名:
學(xué)
號:
08
專
業(yè):
實 驗 室:
金智樓516
實驗時間: 2018年05月08日
報告時間: 2018年06月03日
評定成績:
審閱教師:
《微機實驗及課程設(shè)計》實驗報告
學(xué)號
08
一.實驗?zāi)康呐c內(nèi)容
1.實驗?zāi)康模?/p>
(1)掌握 8255 方式 0 的工作原理及使用方法,利用直接輸入輸出進(jìn)行控制顯示;(2)掌握 8 段數(shù)碼管的動態(tài)刷新顯示控制;
(3)分析掌握 8255 工作方式1時的使用及編程,進(jìn)一步掌握中斷處理程序的編寫。(4)了解串行通信的基本原理,認(rèn)識串行收發(fā)過程;(5)掌握串行接口芯片 8251 的工作原理和編程方法。
2.實驗內(nèi)容:
(1)實驗六 8255 并行輸入輸出
基本實驗內(nèi)容和要求 1)8255方式0:簡單輸入輸出
實驗電路如圖3.7-1,8255C口輸入接邏輯電平開關(guān)K0~K7,編程A口輸出接LED顯示電路L0~L7;用指令從C口輸入數(shù)據(jù),再從A口輸出。注意實驗箱中的8255既引出了A、B、C口引腳排線,也提供了PA0-PA7,PB0-PB7,PC0-PC7的信號連接孔,成組開關(guān)、數(shù)碼管,8段LED顯示器也如此,可根據(jù)需要設(shè)計選用。
推薦接線:
8255/JP8(PC7---PC0)8255/JP6(PA7---PA0)8255/CS
接邏輯開關(guān)/JP1(K7---K0)接LED顯示/JP2(L7---L0)接I/O譯碼/Y1(288H---28FH)2)編程將 A 口 L0-L7 控制成流水燈,流水間隔時間由軟件產(chǎn)生;流水方向由 K0 鍵在線控制,隨時 可切換;流水間隔時間也可由 K4~K7 鍵編碼控制,如 0000 對應(yīng)停止,0001 對應(yīng) 1 秒,1111 對應(yīng) 15 秒, 大鍵盤輸入 ESC 鍵退出。8段數(shù)碼管。
3)8段數(shù)碼管靜態(tài)顯示:按圖 3.7-3 連接好電路,將 8255 的 A 口 PA0~PA6(JP6)分別與七段
《微機實驗及課程設(shè)計》實驗報告
學(xué)號
08
數(shù)碼 管的段碼驅(qū)動輸入端 a~DP 相連(JP3),位碼驅(qū)動輸入端 S1 接+5V(選中),S0 接地(關(guān)閉)。編程從鍵盤 輸入一位十進(jìn)制數(shù)字(0~9),在七段數(shù)碼管上顯示出來。
4)8段數(shù)碼管動態(tài)顯示:按圖 3.7-4 連接好電路,七段數(shù)碼管段碼連接不變,位碼驅(qū)動輸入端 S1、S0 接 8255 C 口的 PC1、PC0。編程在兩個數(shù)碼管上顯示“56”。(注意字符變換之間應(yīng)使段位全滅,避免顯 示“影子”)
(2)實驗七 串行通信 基本實驗內(nèi)容和要求
1)按圖 3.8-1 連接好電路,其中 8254 計數(shù)器用于產(chǎn)生 8251 的發(fā)送和接收時鐘,TXD 和 RXD 直接相連(注意: 實驗系統(tǒng)未采用 MC1488/1489 或 ICL232 等長線收發(fā)器,故有關(guān) RS232/422 等電平標(biāo)準(zhǔn)及轉(zhuǎn) 換內(nèi)容可自行參考相關(guān)資料);
2)編寫測試程序,初始化 8251,實現(xiàn)連續(xù)發(fā)送固定字符,用示波器觀察發(fā)送波形,試用多種不同字符格式和字符。
《微機實驗及課程設(shè)計》實驗報告
學(xué)號
08
3)編程實現(xiàn)從鍵盤輸入一個字符, 將其 ASCII 碼加 1 后發(fā)送出去,再接收回來在屏幕上顯示,實現(xiàn)自發(fā)自收。
《微機實驗及課程設(shè)計》實驗報告
學(xué)號
08
二.基本實驗原理
(1)實驗六 8255并行輸入輸出
1)實驗箱上的七段數(shù)碼管為共陰型,段碼采用同相驅(qū)動,輸入端加高電平,選中的數(shù)碼管亮,位碼加反相驅(qū)動器,位碼輸入端高電平選中。
2)七段數(shù)碼管的字型代碼表如表 3.7-1:
3)參考流程圖(圖3.7-5,3.7-6)
《微機實驗及課程設(shè)計》實驗報告
學(xué)號
08
(2)實驗七 串行通信
編程提示
1)圖 3.8-1 電路 8251 的控制口地址為 2B9H,數(shù)據(jù)口地址為 2B8H。
2)8253 計數(shù)器的計數(shù)初值= 時鐘頻率 /(波特率× 波特率因子),這里的時鐘頻率接脈沖源1MHz,波特率若選 1200,波特率因子若選16,則計數(shù)器初值為52。
4)收發(fā)采用查詢方式,參考流程圖(見圖 3.8-2)6
《微機實驗及課程設(shè)計》實驗報告
學(xué)號
08
《微機實驗及課程設(shè)計》實驗報告
學(xué)號
08
三.方案實現(xiàn)與測試
1.實驗六 8255并行輸入輸出
(1)8255方式0:簡單輸入輸出
實驗電路如圖3.7-1,8255C口輸入接邏輯電平開關(guān)K0~K7,編程A口輸出接LED顯示電路L0~L7;用指令從C口輸入數(shù)據(jù),再從A口輸出。
推薦接線:
8255/JP8(PC7---PC0)8255/JP6(PA7---PA0)8255/CS
接邏輯開關(guān)/JP1(K7---K0)接LED顯示/JP2(L7---L0)接I/O譯碼/Y1(288H---28FH)1)按照上圖所示電路搭接電路,接線圖如下:
2)在純DOS或者桌面上的TPC集成開發(fā)環(huán)境中編譯運行如下代碼:
8255 簡單輸入輸出(程序名:8255_io.asm)
8255 控制寄存器端口地址 28BH A 口的地址 288H
《微機實驗及課程設(shè)計》實驗報告
學(xué)號
08
C 口的地址 28AH ioport equ 3100h-0280h;tpc 卡中設(shè)備的 I/O 地址 io8255a equ ioport+288h io8255c equ ioport+28ah
;8255A 口地址;8255C 口地址
io8255k equ ioport+28bh;8255 控制寄存器端口地址 stacks segment stack db 100 dup(?)stacks ends code segment assume cs:code,ss:stacks main proc far start: mov ax,stacks
mov ss,ax mov dx,io8255k;設(shè) 8255 為 C 口輸入,A 口輸出 mov al,8bh out dx,al inout: mov dx,io8255c;從 C 口輸入一數(shù)據(jù)
in al,dx mov dx,io8255a;從 A 口輸出剛才自 C 口所輸入的數(shù)據(jù) out dx,al mov dl,0ffh;判斷是否有按鍵 mov ah,06h int 21h jz inout;若無,則繼續(xù)自 C 口輸入,A 口輸出
mov ah,4ch;否則返回 DOS 操作系統(tǒng) int 21h main endp code ends end start 3)實驗結(jié)果記錄如下圖所示:
《微機實驗及課程設(shè)計》實驗報告
學(xué)號
08
(2)8段數(shù)碼管靜態(tài)顯示實驗
1)按圖下圖連接好電路,將 8255 的 A 口 PA0~PA6(JP6)分別與七段數(shù)碼 管的段碼驅(qū)動輸入端 a~DP 相連(JP3),位碼驅(qū)動輸入端 S1 接+5V(選中),S0 接地(關(guān)閉)。
2)在純DOS或者桌面上的TPC集成開發(fā)環(huán)境中編譯運行如下代碼:
8255_led_s.asm源程序: data segment ioport io8255a io8255b equ 3100h-0280h equ 288h equ 28bh led db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh mesg1 db 0dh,0ah,'Input a num(0--9h):',0dh,0ah,'$' data ends stacks segment stack
《微機實驗及課程設(shè)計》實驗報告
學(xué)號
08
db 100 dup(?)stacks ends code segment assume cs:code,ds:data,ss:stacks start: mov ax,stacks
mov ss,ax mov ax,data mov ds,ax mov dx,io8255b;使8255的A口為輸出方式 mov ax,80h out dx,al sss: mov dx,offset mesg1;顯示提示信息
mov ah,09h int 21h mov ah,01;從鍵盤接收字符 int 21h cmp al,'0';是否小于0 jl exit;若是則退出 cmp al,'9';是否大于9 jg exit;若是則退出
sub al,30h;將所得字符的ASCII碼減30H mov bx,offset led;bx為數(shù)碼表的起始地址 xlat;求出相應(yīng)的段碼 mov dx,io8255a;從8255的A口輸出 out dx,al jmp sss;轉(zhuǎn)SSS exit: mov ah,4ch;返回DOS int 21h code ends end start
3)實驗現(xiàn)象記錄如下:
《微機實驗及課程設(shè)計》實驗報告
學(xué)號
08
(3)8段數(shù)碼管動態(tài)顯示實驗
1)按圖下圖所示電路搭接好電路,七段數(shù)碼管段碼連接不變,位碼驅(qū)動輸入端 S1、S0 接 8255 C 口的 PC1、PC0。編程在兩個數(shù)碼管上顯示“56”。(注意字符變換之間應(yīng)使段位全滅,避免顯示“影子”)
2)在純DOS或者桌面上的TPC集成開發(fā)環(huán)境中編譯運行如下代碼:
8255 動態(tài)顯示‘56’參考程序(程序名:8255_led_d.asm)data segment ioport equ 3100h-0280h io8255a equ ioport+288h io8255c equ ioport+28ah io8255k equ ioport+28bh
;tpc 卡中設(shè)備的 I/O 地址;8255A 口地址;8255C 口地址
;8255 控制寄存器端口地址
《微機實驗及課程設(shè)計》實驗報告
學(xué)號
08
led db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh;段碼 buffer1 db 5,6 bz dw ? data ends stacks segment stack db 100 dup(?)
;存放要顯示的個位和十位
;位碼
stacks ends code segment assume cs:code,ss:stacks,ds:data start: mov ax,stacks
mov ss,ax mov ax,data mov ds,ax mov dx,io8255k;將 8255 設(shè)為 A 口輸出 mov al,80h out dx,al mov di,offset buffer1;設(shè) di 為顯示緩沖區(qū)
loop2: mov bh,02 lll:
mov al,0
;送全滅段碼
mov dx,io8255a;自 8255A 口輸出 out dx,al mov byte ptr bz,bh push di dec di add di, bz mov bl,[di];bl 為要顯示的數(shù) pop di mov bh,0 mov si,offset led;置 LED 數(shù)碼表偏移地址為 SI add si,bx;求出對應(yīng)的 LED 數(shù)碼 mov al,byte ptr [si] mov dx,io8255a;自 8255A 口輸出 out dx,al mov al,byte ptr bz;使相應(yīng)的數(shù)碼管亮 mov dx,io8255c 13
《微機實驗及課程設(shè)計》實驗報告
學(xué)號
08
out dx,al mov cx,3000 delay: loop delay;延時
mov bh,byte ptr bz shr bh,1 jnz lll mov dx,0ffh mov ah,06 int 21h je loop2;有鍵按下則退出
mov dx,io8255c mov al,0 out dx,al mov ah,4ch;返回 DOS 操作系統(tǒng) int 21h;關(guān)掉數(shù)碼管顯示
code ends end start
3)實驗結(jié)果記錄如下:
《微機實驗及課程設(shè)計》實驗報告
學(xué)號
08
2.實驗七 串行通信
基本實驗內(nèi)容和要求
1)按圖 3.8-1 連接好電路,其中 8254 計數(shù)器用于產(chǎn)生 8251 的發(fā)送和接收時鐘,TXD 和 RXD 直接相連
2)在純DOS或者桌面上的TPC集成開發(fā)環(huán)境中編譯運行如下代碼:
參考程序:程序名:8251.asm data segment ioport equ 3100h-0280h io8253a equ ioport+280h io8253b equ ioport+283h io8251a equ ioport+2b8h io8251b equ ioport+2b9h mes2 dd mes1 data ends stacks segment stack db 100 dup(?)stacks ends code segment assume cs:code,ds:data,ss:stacks main proc far start: mov ax,stacks
;tpc 卡中設(shè)備的 io 地址;計數(shù)器 0 地址;8253 控制寄存器地址;8251 數(shù)據(jù)口地址;8251 控制口地址
mes1 db 'you can play a key on the keybord!',0dh,0ah,24h mov ss,ax
《微機實驗及課程設(shè)計》實驗報告
學(xué)號
08
mov ax,data mov ds,ax mov dx,io8253b;設(shè)置 8253 計數(shù)器 0 工作方式 mov al,16h out dx,al mov dx,io8253a mov al,52;給 8253 計數(shù)器 0 送初值 out dx,al mov dx,io8251b;初始化 8251 xor al,al mov cx,03;向 8251 控制端口送 3 個 0 loop delay mov al,40h;向 8251 控制端口送 40H,使其復(fù)位 call out1 mov al,4eh;設(shè)置為 1 個停止位,8 個數(shù)據(jù)位 call out1;波特率因子為 16 mov al,27h;向 8251 送控制字允許其發(fā)送和接收 call out1 lds dx,mes2;顯示提示信息 mov ah,09 int 21h in al,dx test al,01;發(fā)送是否準(zhǔn)備好 jz waiti mov ah,01;是,從鍵盤上讀一字符 int 21h cmp al,27;若為 ESC,結(jié)束 jz exit mov dx,io8251a inc al out dx,al;發(fā)送 mov cx,0F00h
;延時
next: mov dx,io8251b in al,dx test al,02;檢查接收是否準(zhǔn)備好 jz next in al,dx;沒有,等待;準(zhǔn)備好,接收 delay: call out1 waiti: mov dx,io8251b s51: loop s51 mov dx,io8251a
《微機實驗及課程設(shè)計》實驗報告
學(xué)號
08
inc al mov dl,al;如果需要處理,如加 1 mov ah,02;將接收到的字符顯示在屏幕上 int 21h jmp waiti int 21h
;向外發(fā)送一字節(jié)的子程序 exit: mov ah,4ch;退出 main endp out1 proc near
out dx,al push cx mov cx,0F00h;延時
pop cx ret gg: loop gg out1 endp code ends end start
3)實驗現(xiàn)象:輸入1,回顯3,因為發(fā)時加1,接受時又加1。
修改代碼,持續(xù)輸入55,用示波器觀察發(fā)送發(fā)送過程和波特率,刪掉源碼中接受和發(fā)送部分,在原發(fā)送部分加如下代碼:
out2: mov al,55h mov dx,io8251a out dx,al mov cx,0f00h 實驗現(xiàn)象:
每16次RCLK脈沖對應(yīng)一個數(shù)據(jù)位。
《微機實驗及課程設(shè)計》實驗報告
學(xué)號
08
四.提高與創(chuàng)新研究
略
五.分析與總結(jié)
通過這兩次實驗,我大致了解并掌握了 8255三種方式的工作原理及使用方法以及利用它直接輸入輸出進(jìn)行控制顯示的方法,掌握了8段數(shù)碼管的動態(tài)刷新顯示控制方法;進(jìn)一步掌握了中斷處理程序的編寫,了解串行通信的基本原理,深入認(rèn)識了串行收發(fā)過程,掌握了串行接口芯片 8251 的工作原理和編程方法,特別是對8255的A組控制,B組控制以及8255控制字有了更加深入的理解
第二篇:【微機實驗】2018東南大學(xué)微型計算機原理及應(yīng)用實驗二
實驗二 基本算術(shù)和邏輯運算
學(xué)院:信息科學(xué)與工程學(xué)院
姓名:周信元
學(xué)號:04016523 實驗日期:2018.4.4
一、實驗?zāi)康?/p>
1.熟悉算術(shù)和邏輯運算指令的功能。
2.進(jìn)一步了解標(biāo)志寄存器各標(biāo)志位的意義和指令執(zhí)行對它的影響。
二、實驗任務(wù)
1.采用單步執(zhí)行方式執(zhí)行下列各程序段,檢查各標(biāo)志位的情況。
程序段1 MOV AX, 10101H MOV SI, 2000H ADD AL, 30H ADD AX, SI
;AX=1010H
;SI=2000H
;AX=1040H
;AX=3040H;BX=03FFH MOV BX, 03FFH ADD AX, BX
;AX=343FH;DS:[0020]=1000H;DS:[0020]=443FH MOV[0020],1000H ADD 0020, AX 程序段2: MOV AX, OA0AOIH ADO AX, OFFFFH
;AX=A0A0H;AX=A09FH MOV CX, OFFOOH ADD AX, CX SUB AX, AX INC AX
;CX=FF00H;AX=9F9FH
;AX=0000H
;AX=0001H
;CX=FFFFH OR CX, OOFFH AND CX, OFOFH M0V[0010],CX 程序段3: MOV BL, 25H MO[0010],04H MOV AL, [0010] MUL BL 程序段4: MOV BL, 04H
;CX=0F0FH;DS:[0010]=OFOFH
;BX=0025H;DS:[0010]=04H
;AX=0004H
;AX=0094H
;BX=0004H MOV WORD PTR L0010], 0080H;DS:[0010]=0080H MOV AX, [0010] DIV BL 程序段5: MOV AX, 00 DEC AX
;AX=0000H;AX=FFFFH
;AX=3FFEH
;AX=0080H;AX=0020H ADC AX, 3FFFH ADD AX, AX
;AX=7FFCH NOT AX SUB AX, 3
;AX=8003H;AX=8000H
;AX=FBFDH OR AX, OFEFDH AND AX, OAFCFH SHL AX, 1 RCL AX, 1 步驟
;AX=ABCDH;AX=579AH;AX=AF35H(1)進(jìn)入 Turbo Debugger,在CPU窗口下輸入程序段 2)將IP指針指向程序段開始處(3)按下F7鍵(單步)運行程序。
(4)分析各條指令執(zhí)行后的結(jié)果與各標(biāo)志位在指令執(zhí)行后對它的影響
2.將寄存器BⅨ作地址指針,自BX所指的內(nèi)存單元(0010HD)開始連續(xù)存放著三個無符號數(shù)(10H、04H、30H),。試編寫程序分別求它們的和與積,并將結(jié)果存放在這三個數(shù)之后的單元中。
求和程序段
MOV[0010],10H MOV[0011],04H MOV[0012],30H SUB AX, AX MOV BX, 0010H MOV AL, BXI ADD AL, [BX+1] ADD Al, [BX+2] MOV [BX+3], AL 結(jié)果[DS:0013]=44H 求積程序段
MOV[0010],10H MOV[0011],04H MOV[0012],30H SUB AX, AX MOV A1,[0010] MOV BL, [0011 MUL BL MOV BL, [0012] MUL BL MOV [0013], AX 結(jié)果[DS:0013=0C00H 3.寫出完成下述功能的程序段(1)傳送15H到AL寄存器。(2)將L的內(nèi)容乘以2(3)傳送15H到L寄存器 4)AL的內(nèi)容乘以BL的內(nèi)容。最后結(jié)果(AX)=?
MOV AL, 15H SHL AL, 1 MOV BL, 15H MUL BL 結(jié)果(AX)=0372H 4.寫出完成下述功能的程序段
(1)從地址DS:0000H單元中,傳送一個數(shù)據(jù)58H到AL寄存器。(2)把AL寄存器的內(nèi)容右移兩位
(3)再把L寄存器的內(nèi)容與字節(jié)單元DS:0001H中的數(shù)據(jù)12H相乘。(4)將乘積存入字單元DS:0002H中
M0V[0000],58H MOV[0001],12H MOV AL, [0000] SHR AL, 02 MOV BL, [0001] MUL BL MOV [0002], AX 結(jié)果[0002]=018CH 5.假設(shè)下面的程序段用來清除數(shù)據(jù)段中相應(yīng)字存儲單元的內(nèi)容(即零送到這些存儲 單元中去),其偏移地址從0010H到0020H(1)將第4條比較指令語句填寫完整(劃線處)MOV SI, 0010H NEXT: MOV WORD PTR[SI].00 ADD SI, 0022H CMP SI, INE NEXT(2)假設(shè)要清除偏移地址從0020H到001字存儲單元中的內(nèi)容(即由高地址到 低地址清零),試編寫程序段。
MOV SI, 0020H NEXT MOV WORD PTR[S1], 00 SUB SI, 2 CMP SI, 000EH JNE NEXT
三,實驗設(shè)備
IBM-TC/XT微機一臺
四、實驗預(yù)習(xí)要求
1.復(fù)習(xí)8086指令系統(tǒng)的算術(shù)和邏輯運算指令 2,按照題目要求在實驗前編寫好程序
五、實驗報告要求
1.整理出運行正確的各題源程序段和結(jié)果, 2.,簡要說明ADD指今和AND指令對標(biāo)志位的影響。
1.見報告中加粗文字部分
2.普通加法指令A(yù)DD,指令格式:ADD Reg/mem,Reg/mem/imm受影響標(biāo)志位:AF/CF/OF/PF/SF/ZF 邏輯與操作指令A(yù)ND,指令的格式: AND Reg/Mem, Reg/Mem/imm受影響的標(biāo)志位:CF(0)、OF(0)、PF、SF和ZF(AF無定義)
第三篇:微機實驗報告數(shù)模轉(zhuǎn)換器和模數(shù)轉(zhuǎn)換器實驗
實
驗
報
告
課程名稱
微機接口與匯編語言
實驗項目
實驗五
數(shù)/模轉(zhuǎn)換器和模/數(shù)轉(zhuǎn)換器實驗
實驗儀器 TPC-USB通用微機接口實驗系統(tǒng)
系 別 計算機學(xué)院
專 業(yè)
班級/學(xué)號
學(xué)生姓名 實驗日期 2013.12.19 成 績 指導(dǎo)教師
胡信裕
實驗五 數(shù)/模轉(zhuǎn)換器和模/數(shù)轉(zhuǎn)換器實驗
一、實驗?zāi)康?/p>
1.了解數(shù)/模轉(zhuǎn)換器的基本原理,掌握DAC0832芯片的使用方法。2.了解模/數(shù)轉(zhuǎn)換器的基本原理,掌握ADC0809的使用方法。二.實驗設(shè)備
1.PC微機系統(tǒng)一套
2.TPC-USB通用微機接口實驗系統(tǒng) 一套 三.實驗要求
1.實驗前要作好充分準(zhǔn)備,包括程序框圖、源程序清單、調(diào)試步驟、測試方法、對運行結(jié)果的分析等。
2.熟悉與實驗有關(guān)的系統(tǒng)軟件(如編輯程序、匯編程序、連接程序和調(diào)試程序等)使用方法。在程序調(diào)試過程中,有意識地了解并掌握TPC-USB通用微機接口實驗系統(tǒng)的軟硬件環(huán)境及使用,掌握程序的調(diào)試及運行的方法技巧。3.實驗前仔細(xì)閱讀理解教材相關(guān)章節(jié)的相關(guān)內(nèi)容,實驗時必須攜帶教材及實驗講義。四.實驗內(nèi)容及步驟
(一)數(shù)/模轉(zhuǎn)換器實驗
1.實驗電路原理如圖:DAC0832采用單緩沖方式,具有單雙極性輸入端(圖中的Ua、Ub),編程產(chǎn)生以下鋸齒波(從Ua和Ub輸出,用示波器觀察)
參考電路圖
2.8位D/A轉(zhuǎn)換器DAC0832的口地址為290H,輸入數(shù)據(jù)與輸出電壓的關(guān)系為:
(UREF表示參考電壓,N表示數(shù)數(shù)據(jù)),這里的參考電壓為PC機的+5V電源。
3.產(chǎn)生鋸齒波只須將輸出到DAC0832的數(shù)據(jù)由0循環(huán)遞增。4.參考流程圖:
參考流程圖
(二)模/數(shù)轉(zhuǎn)換器
1.實驗電路原理圖如圖。
將
(一)的DAC的輸出Ua,送入ADC0809通道1(IN1)。
連接參考電路圖
2.編程采集IN1輸入的電壓,在屏幕上顯示出轉(zhuǎn)換后的數(shù)據(jù)(用16進(jìn)制數(shù))。3.ADC0809的IN0口地址為298H,IN1口地址為299H。4.IN0單極性輸入電壓與轉(zhuǎn)換后數(shù)字的關(guān)系為:
其中Ui為輸入電壓,UREF為參考電壓,這里的參考電壓為PC機的+5V電源。
4.一次A/D轉(zhuǎn)換的程序可以為
MOV DX,口地址 OUT DX,AL
;啟動轉(zhuǎn)換
;延時
IN AL,DX
;讀取轉(zhuǎn)換結(jié)果放在AL中
五、實驗程序設(shè)計和調(diào)試運行
1、程序設(shè)計
實驗一:(生成的是鋸齒波)io0832a
equ 290h(a)主程序
參考流程圖
(b)顯示子程序 code segment assume cs:code start: mov cl,0 mov dx,io0832a lll:
mov al,cl out dx,al inc cl
;cl加1 inc cl inc cl inc cl inc cl inc cl inc cl push dx mov ah,06h
;判斷是否有鍵按下
mov dl,0ffh int 21h pop dx jz lll
;若無則轉(zhuǎn)LLL mov ah,4ch
;返回
int 21h code ends end start
實驗二 :(生成正弦波)DATA SEGMENT IO0832A EQU 290H SIN DB 80H,96H,0AEH,0C5H,0D8H,0E9H,0F5H,0FDH DB 0FFH,0FDH,0F5H,0E9H,0D8H,0C5H,0AEH,96H DB 80H,66H,4EH,38H,25H,15H,09H,04H DB 00H,04H,09H,15H,25H,38H,4EH,66H
;正弦波數(shù)據(jù) DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA
MOV DS,AX
;置正弦波數(shù)據(jù)的偏移地址為SI,LL:MOV SI,OFFSET SIN
;一組輸出32個數(shù)據(jù)
MOV BH,32
;將數(shù)據(jù)輸出到D/A轉(zhuǎn)換器
LLL:MOV AL,[SI]
MOV DX,IO0832A
OUT DX,AL
MOV AH,06H
MOV DL,0FFH
INT 21H
JNE EXIT
MOV CX,1 DELAY:LOOP DELAY INC SI DEC BH JNZ LLL JMP LL EXIT:MOV AH,4CH INT 21H CODE ENDS END START
2.實驗過程(步驟)和實驗結(jié)果說明
(1)按圖連接實驗電路;
(2)在TPC-IDE操作環(huán)境下,用文本編輯器編輯實驗源程序(EXP5.asm);(3)在IDE操作環(huán)境下,對源程序(EXP5.asm)進(jìn)行編譯和連接,生成生成鏈接文件(EXP5.obj)和可執(zhí)行文件(EXP5.exe);
(4)運行IDE操作環(huán)境下的調(diào)試命令,調(diào)試可執(zhí)行文件(EXP5.exe);
(5)運行IDE操作環(huán)境下的執(zhí)行命令,運行可執(zhí)行文件(EXP5.exe),結(jié)果顯示為:
運行成功后,可以從示波器中看到相應(yīng)的波形,通過調(diào)節(jié)示波器,波形會更加明顯。
實驗結(jié)果 鋸齒波:
正弦波:
六、實驗總結(jié)
通過此次實驗,我了解了數(shù)/模和模/數(shù)轉(zhuǎn)換器的基本原理,以及掌握了DAC0832和ADC0809芯片的使用方法。在實驗過程中,對于填寫代碼空白這一項,感覺很鍛煉對于程序的閱讀和理解能力。當(dāng)然也遇到了一些障礙,通過請教老師和同學(xué),最后都順利解決,此次實驗收獲很大。
第四篇:電子科技大學(xué)微機實驗報告 實驗4
實驗四基于ARM的嵌入式Linux開發(fā)環(huán)境建立 【實驗?zāi)康摹?1.掌握嵌入式Linux 開發(fā)環(huán)境的基本流程。2.熟悉Linux 操作系統(tǒng) 3.熟悉嵌入式開發(fā)平臺
【實驗內(nèi)容】
在PC機虛擬機下的Linux系統(tǒng)中建立基于ARM 的嵌入式Linux 開發(fā)環(huán)境。
1.學(xué)會網(wǎng)口的配置 2.Minicom端口的使用
【預(yù)備知識】
1.了解ARM9處理器結(jié)構(gòu) 2.了解Linux 系統(tǒng)結(jié)構(gòu)
3.了解ARM開發(fā)板使用常識
【實驗設(shè)備和工具】
硬件:PC機Pentium100以上,ARM嵌入式開發(fā)平臺
軟件:PC機Linux 操作系統(tǒng)+MINICOM+AMRLINUX開發(fā)環(huán)境
【實驗原理】
1.交叉編譯器在一種計算機環(huán)境中運行的編譯程序,能編譯出在另外一種環(huán)境下運行的代碼,我們就稱這種編譯器支持交叉編譯,這個編譯過程就叫交叉編譯。簡單地說,就是在一個平臺上生成另一個平臺上的可執(zhí)行代碼。這里需要注意的是所謂平臺,實際上包含兩個概念:體系結(jié)構(gòu)
(Architecture)、操作系統(tǒng)(OperatingSystem)。同一個體系結(jié)構(gòu)可以運行不同的操作系統(tǒng);同樣,同一個操作系統(tǒng)也可以在不同的體系結(jié)構(gòu)上運行。舉例來說,我們常說的x86 Linux平臺實際上是Intelx86體系結(jié)構(gòu)和Linuxforx86操作系統(tǒng)的統(tǒng)稱;而x86WinNT平臺 實際上是Intelx86體系結(jié)構(gòu)和Windows NTforx86操作系統(tǒng)的簡稱。交叉編譯這個概念的出現(xiàn)和流行是和嵌入式系統(tǒng)的廣泛發(fā)展同步的。我們常用的計算機軟
件,都需要通過編譯的方式,把使用高級計算機語言編寫的代碼(比如C代碼)編譯(compile)成計算機可以識別和執(zhí)行的二進(jìn)制代碼。比如,我們在Windows平臺上,可使用Visual C++ 開發(fā)環(huán)境,編寫程序并編譯成可執(zhí)行程序。這種方式下,我們使用PC平臺上的Windows工具開發(fā)針對Windows本身的可執(zhí)行程序,這種編譯過程稱為nativecompilation,中文可理解
為本機編譯。然而,在進(jìn)行嵌入式系統(tǒng)的開發(fā)時,運行程序的目標(biāo)平臺通常具有有限的存儲空間和運算能力,比如常見的ARM平臺,其一般的靜態(tài)存儲空間大概是16到32MB,而CPU 的主頻大概在100MHz到500MHz之間。這種情況下,在ARM平臺上進(jìn)行本機編譯就不太可能了,這是因為一般的編譯工具鏈(compilationtoolchain)需要很大的存儲空間,并需要很強 的CPU運算能力。為了解決這個問題,交叉編譯工具就應(yīng)運而生了。通過交叉編譯工具,我們就可以在CPU能力很強、存儲空間足夠的主機平臺上(比如PC上)編譯出針對其他平臺的可執(zhí)行程序。
要進(jìn)行交叉編譯,我們需要在主機平臺上安裝對應(yīng)的交叉編譯工具鏈(crosscompilation tool-chain),然后用這個交叉編譯工具鏈編譯我們的源代碼,最終生成可在目標(biāo)平臺上運行的代碼。常見的交叉編譯例子如下:
1、在WindowsPC上,利用RVDS(ARM開發(fā)環(huán)境),使用armcc編譯器,則可編譯出針對ARMCPU的可執(zhí)行代碼。
2、在LinuxPC上,利用arm-linux-gcc編譯器,可編譯出針對LinuxARM平臺的可執(zhí)行代碼。
3、在Windows PC上,利用cygwin環(huán)境,運行arm-elf-gcc編譯器,可編譯出針對ARMCPU的可執(zhí)行代碼。
2.NFS服務(wù)
NFS是Net FileSystem的簡寫,即網(wǎng)絡(luò)文件系統(tǒng).網(wǎng)絡(luò)文件系統(tǒng)是FreeBSD支持的文件系統(tǒng)中的一種,也被稱為NFS.NFS允許一個系統(tǒng)在網(wǎng)絡(luò)上與它人共享目錄和文件。通過使用NFS,用戶和程序可以像訪問本地文件一樣訪問遠(yuǎn)端系
統(tǒng)上的文件。
NFS至少有兩個主要部分:一臺服務(wù)器和一臺(或者更多)客戶機??蛻魴C遠(yuǎn)程訪問存放在服務(wù)器上的數(shù)據(jù)。為了正常工作,一些進(jìn)程需要被配置并運行。
在本實驗中就是將PC機作為服務(wù)器,而將ARM開發(fā)板作為客戶機,這樣ARM開發(fā)板就可以遠(yuǎn)程
訪問存放在在PC機上的數(shù)據(jù),這樣可以縮短研發(fā)周期,更方便的調(diào)試程序。
【實驗步驟】
1.雙擊桌面上VMWARE,打開Linux 虛擬機 2.點擊啟動虛擬機,啟動虛擬機 3.以root身份登陸虛擬機,密碼123456
4.其他步驟詳見實驗指導(dǎo)書
【實驗結(jié)果和程序】
基于ARM 的嵌入式Linux開發(fā)環(huán)境建立完畢。
【思考題】
1.如何驗證交叉編譯器已安裝成功? 答:在終端輸入命令:cd/arm/rootfs/home/driver(文件夾里已有test_led.c文件)arm-linux-gcc–o test_ledtest_led.c
若有可執(zhí)行文件test_led生成則表示交叉編譯器已安裝成功
2.如果我們需要變更根文件系統(tǒng)的目錄,該如何設(shè)置使得ARM開發(fā)板可以成功掛載?答:修改/etc/exports 文件的內(nèi)容,將/arm/rootfs*(rw,sync,no_root_squash)改為/XX/XXX
*(rw,sync,no_root_squash)(/XX/XXX為變更后點的文件目錄)
3.怎么在u-boot命令行下修改ARM 開發(fā)板的IP?
答:輸入setenvip=x.x.x.x:192.168.0.1:192.168.0.1:255.255.255.0:uestc:eth0:off
Saveenv
x,x,x,x為ARM開發(fā)板的新IP。
【實驗結(jié)論】
本實驗實現(xiàn)了基于ARM 的嵌入式Linux 開發(fā)環(huán)境建立
第五篇:電子科技大學(xué)微機實驗報告 實驗5
實驗五 基于ARM的模塊方式驅(qū)動程序?qū)嶒?【實驗?zāi)康摹?1.掌握Linux 系統(tǒng)下設(shè)備驅(qū)動程序的作用與編寫技巧 2.掌握Linux 驅(qū)動程序模塊加載和卸載的方法 3.了解Linux 內(nèi)核中的makefile和kconfig文件
【實驗內(nèi)容】
1.基于s3c2440 開發(fā)板編寫led 驅(qū)動程序。2.將編寫好的led驅(qū)動加入linux內(nèi)核中,修改makefile和kconfig文件,配置和編譯內(nèi)核。3.編寫關(guān)于led 的測試程序,交叉編譯后運行,控制led 燈的亮滅。
【預(yù)備知識】
1.了解ARM9處理器結(jié)構(gòu)和Linux 系統(tǒng)結(jié)構(gòu)
2.熟練掌握C語言。
【實驗設(shè)備和工具】
? 硬件:ARM嵌入式開發(fā)平臺,PC機Pentium100 以上。
? 軟件:PC機Linux操作系統(tǒng)+MINICOM+AMRLINUX 開發(fā)環(huán)境
【實驗原理】
?
linux設(shè)備驅(qū)動程序 ? 驅(qū)動的模塊式加載和卸載
? 編譯模塊
? 裝載和卸載模塊
? led 驅(qū)動的原理
在本開發(fā)板上有八個led指示燈,從下往上分別為LED0-LED7。這八個led燈都是接的芯片上的gpio口(通用功能輸入輸出口)。在本實驗的開發(fā)板硬件設(shè)計中,當(dāng)led 燈對應(yīng)的gpio的電平為低時,led燈被點亮;當(dāng)led燈對應(yīng)的gpio的電平為高時,led燈滅。本驅(qū)動的作用就是通過設(shè)置對應(yīng)gpio口的電平來控制led 的亮滅。
因為ARM 芯片內(nèi)的GPIO口都是復(fù)用的,即它可以被配置為多種不同的功能,本實
驗是使用它的普通的I/O口的輸出功能,故需要對每個GPIO口進(jìn)行配置。在內(nèi)核中已經(jīng)定義了對GPIO口進(jìn)行配置的函數(shù),我們只需要調(diào)用這些函數(shù)就可以完成對GPIO口的配置。
【實驗步驟】實驗程
序運行效果:
程序會提示:“pleaseenterthe led status”
輸入與希望顯示的led狀態(tài)對應(yīng)的ledstatus值(輸入十進(jìn)制值即可),觀察led 的顯示情況。例如:
? 輸入數(shù)字“3”,對應(yīng)的二進(jìn)制數(shù)字為00000011
故點亮LED2~LED7
? 輸入數(shù)字“4”,對應(yīng)的二進(jìn)制數(shù)字為00000100
故點亮LED0,LED1,LED3~LED7
【實驗結(jié)果和程序】
C語言程序:
#include
static intLedMajor=231;
staticintLedMinor=0;
static charledstatus=0xff;staticstructclass*s3c2440_class;staticstructcdev *s3c2440_led_cdev;
/*
******************************************************************************* ************************
** Function name:Update_led()**Descriptions **Input :NONE **Output :NONE :update the led status
******************************************************************************* ************************
*/ staticvoid Update_led(void)
{
if(ledstatus&0x01)
s3c2410_gpio_setpin(S3C2410_GPC7,1);//LED0滅
else
s3c2410_gpio_setpin(S3C2410_GPC7,0);//LED0亮
if(ledstatus&0x02)
s3c2410_gpio_setpin(S3C2410_GPC5,1);//LED1滅
else
s3c2410_gpio_setpin(S3C2410_GPC5,0);//LED1亮
if(ledstatus&0x04)
s3c2410_gpio_setpin(S3C2410_GPH9,1);//LED2滅
else
s3c2410_gpio_setpin(S3C2410_GPH9,0);//LED2亮
if(ledstatus&0x08)
s3c2410_gpio_setpin(S3C2410_GPB4,1);//LED3滅
else
s3c2410_gpio_setpin(S3C2410_GPB4,0);//LED3亮
if(ledstatus&0x10)
s3c2410_gpio_setpin(S3C2410_GPG5,1);//LED4滅
else
s3c2410_gpio_setpin(S3C2410_GPG5,0);//LED4亮
if(ledstatus&0x20)
s3c2410_gpio_setpin(S3C2410_GPG6,1);//LED5滅
else
s3c2410_gpio_setpin(S3C2410_GPG6,0);//LED5亮
if(ledstatus&0x40)
s3c2410_gpio_setpin(S3C2410_GPG7,1);//LED6滅elses3c2410_gpio_setpin(S3C2410_GPG7,0);//LED6亮
if(ledstatus&0x80)
s3c2410_gpio_setpin(S3C2410_GPG8,1);//LED7滅
else
s3c2410_gpio_setpin(S3C2410_GPG8,0);//LED7亮
}
staticssize_ts3c2440_Led_write(structfile*file,constchar*buffer,size_tcount,loff_t*ppos){
copy_from_user(&ledstatus,buffer,sizeof(ledstatus));
Update_led();
printk(“write: led=0x%x,count=%dn”,ledstatus,count);returnsizeof(ledstatus);} staticints3c2440_Led_open(structinode*inode,struct file *filp)
{
printk(“l(fā)ed device openn”);
return 0;
} staticints3c2440_Led_release(structinode*inode,struct file*filp)
{
printk(“l(fā)ed device releasen”);
return 0;} staticstructfile_operationss3c2440_fops={.owner=THIS_MODULE,.open=s3c2440_Led_open,.write=s3c2440_Led_write,.release=s3c2440_Led_release, };
staticintinits3c2440_Led_init(void)
{
dev_ts3c2440_leds_devno;
/*configure the gpiofor leds*/
s3c2410_gpio_cfgpin(S3C2410_GPG5,S3C2410_GPIO_OUTPUT);
s3c2410_gpio_cfgpin(S3C2410_GPG6,S3C2410_GPIO_OUTPUT);
s3c2410_gpio_cfgpin(S3C2410_GPG7,S3C2410_GPIO_OUTPUT);
s3c2410_gpio_cfgpin(S3C2410_GPG8,S3C2410_GPIO_OUTPUT);
s3c2410_gpio_cfgpin(S3C2410_GPC7,S3C2410_GPIO_OUTPUT);
s3c2410_gpio_cfgpin(S3C2410_GPC5,S3C2410_GPIO_OUTPUT);
s3c2410_gpio_cfgpin(S3C2410_GPH9,S3C2410_GPIO_OUTPUT);
s3c2410_gpio_cfgpin(S3C2410_GPB4,S3C2410_GPIO_OUTPUT);
Update_led();/*registerthe devnumber*/ s3c2440_leds_devno=MKDEV(LedMajor,LedMinor);ret=register_chrdev_region(s3c2440_leds_devno, 1,DEVICE_NAME);
/*registerthe chardevice*/
s3c2440_led_cdev=cdev_alloc();if
(s3c2440_led_cdev!= NULL)
{ cdev_init(s3c2440_led_cdev, &s3c2440_fops);s3c2440_led_cdev->owner=THIS_MODULE;if(cdev_add(s3c2440_led_cdev, s3c2440_leds_devno, 1))
printk(KERN_NOTICE “Something wrong when addings3c2440_led_cdev!n”);
else
printk(“Success addings3c2440_led_cdev!n”);} /*create the device node in /dev*/ s3c2440_class =class_create(THIS_MODULE, “l(fā)ed_class”);class_device_create(s3c2440_class, NULL, s3c2440_leds_devno, NULL, DEVICE_NAME);
printk(DEVICE_NAME “ initializedn”);
return 0;
}
staticvoid exits3c2440_Led_exit(void)
cdev_del(s3c2440_led_cdev);class_device_destroy(s3c2440_class, MKDEV(LedMajor,LedMinor));class_destroy(s3c2440_class);printk(DEVICE_NAME “ removedn”);
}
module_init(s3c2440_Led_init);
module_exit(s3c2440_Led_exit);
【思考題】
1.設(shè)備驅(qū)動程序的功能是什么?答:設(shè)備驅(qū)動的功能就是將系統(tǒng)提供的調(diào)用映射到作用于實際硬件的和設(shè)備相關(guān)的操作上。
2.模塊化的最大優(yōu)點是什么?答:可以在系統(tǒng)正在運行著的時候給內(nèi)核增加模塊
提供的功能(也可以移除功能)。
3.如果在驅(qū)動模塊中刪除module_exit(s3c2440_Led_exit);后會有什么影響?
答:這個模塊將不能被移除。
4.驅(qū)動代碼中調(diào)用的宏MKDEV 的作用是什么?答:獲取設(shè)備在設(shè)備表中的位置。輸入主設(shè)備號,從設(shè)備號,返回位置號。
【實驗結(jié)論】
本實驗實現(xiàn)了linux環(huán)境下的led燈驅(qū)動的添加。