電氣工程及其自動(dòng)化計(jì)算機(jī)綜合實(shí)踐邱曉帆_第1頁
電氣工程及其自動(dòng)化計(jì)算機(jī)綜合實(shí)踐邱曉帆_第2頁
電氣工程及其自動(dòng)化計(jì)算機(jī)綜合實(shí)踐邱曉帆_第3頁
電氣工程及其自動(dòng)化計(jì)算機(jī)綜合實(shí)踐邱曉帆_第4頁
電氣工程及其自動(dòng)化計(jì)算機(jī)綜合實(shí)踐邱曉帆_第5頁
已閱讀5頁,還剩26頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、四川大學(xué)網(wǎng)絡(luò)教育學(xué)院實(shí)踐課程報(bào)告實(shí)踐課程 計(jì)算機(jī)綜合實(shí)踐9002 校外學(xué)習(xí)中心 重慶黔江奧鵬學(xué)習(xí)中心20VIP 專 業(yè) 電氣工程及其自動(dòng)化 層 次 專升本 年 級(jí) 1003 學(xué)生姓名 邱曉帆 學(xué) 號(hào) aDH1001g1003 2011 年 8 月 10 日實(shí)驗(yàn)內(nèi)容:一、熟悉、使用DEBUG調(diào)試工具摘要 借助DEBUG調(diào)試工具來發(fā)現(xiàn)匯編語言程序的錯(cuò)誤所在并加以改正。通過實(shí)驗(yàn),掌握DEBUG的常用基本命令,學(xué)會(huì)如何在windows的命令模式下啟動(dòng)DEBUG,進(jìn)而學(xué)會(huì)如何使用DEBUG查看CPU和內(nèi)存,以及進(jìn)行程序的跟蹤調(diào)試等。1 實(shí)驗(yàn)?zāi)康?.1學(xué)習(xí)如何在Windows的命令模式下啟動(dòng)DEBUG。1

2、.2掌握DEBUG的常用基本命令。1.3學(xué)習(xí)如何使用DEBUG查看CPU和內(nèi)存以及進(jìn)行跟蹤調(diào)試。2 實(shí)驗(yàn)設(shè)備及軟件環(huán)境裝有DOS系統(tǒng)及MASM6.X的微機(jī)一臺(tái)。3 預(yù)備知識(shí)3.1 什么是DEBUG? Debug是DOS、Windows都提供的實(shí)模式(8086方式)程序的調(diào)試工具。使用它,可以查看CPU各種寄存器的內(nèi)容、內(nèi)存的情況和在機(jī)器碼級(jí)跟蹤程序的運(yùn)行。3.2 常用的Debug命令及其含義表1.1 Debug命令及其含義命令格式 功能說明R 寄存器名 查看、改變CPU寄存器的內(nèi)容D 范圍 查看指定范圍內(nèi)的內(nèi)存中的內(nèi)容E 起始地址 字節(jié)值表 用值表中的值替換從“起始地址”開始的內(nèi)存單元中的內(nèi)容

3、U 范圍 反匯編,將內(nèi)存中的機(jī)器指令翻譯成匯編指令T 地址指令數(shù) 執(zhí)行一條機(jī)器指令A(yù) 地址 以匯編指令的格式在內(nèi)存中寫入一條機(jī)器指令Q 退出Debug,回到DOS狀態(tài)4 啟動(dòng)DEBUG4.1打開Windows命令窗口選擇“開始”“運(yùn)行”輸入“cmd”命令4.2啟動(dòng)DEBUG在命令窗口中啟動(dòng)DEBUG,將顯示連接符“”,這時(shí)可輸入各種DEBUG命令。4.3關(guān)于使用命令的幾點(diǎn)說明:l 在提示符“”下才能輸入命令,在按“回車”鍵后,該命令才開始執(zhí)行;l 命令是單個(gè)字母,命令和參數(shù)的大小寫可混合輸入;l 可用F1、F2、F3、Ins、Del、等編輯鍵來編輯本行命令;l 當(dāng)命令出現(xiàn)語法錯(cuò)誤時(shí),將在出錯(cuò)位

4、置顯示“Error”;l 在DEBUG中使用的數(shù)都是以十六進(jìn)制來表示的。5 實(shí)驗(yàn)內(nèi)容5.1 R命令作用:查看、改變CPU寄存器的內(nèi)容(1)顯示所有寄存器之中的內(nèi)容:輸入R我們重點(diǎn)關(guān)注AX、BX、CX、DX、CS及IP寄存器的內(nèi)容,其他寄存器SP、BP、SI、DI、ES、SS及標(biāo)志寄存器先不予理會(huì)。此外,并列出了CS:IP所指向的內(nèi)存單元處所存放的機(jī)器碼,并將它翻譯為匯編指令。(2)改變寄存器中的內(nèi)容:輸入R AX在提示符“:”后輸入1111,即可將AX的值設(shè)置為1111。在輸入R命令,查看修改后的寄存器值。5.2 D命令作用:查看指定范圍內(nèi)的內(nèi)存中的內(nèi)容(1)直接輸入D命令DEBUG將輸出3部

5、分內(nèi)容,查看執(zhí)行結(jié)果。說明:l 左邊是每行的起始地址,用“XXXX:YYYY”表示,其中XXXX表示內(nèi)存單元的段地址,YYYY表示內(nèi)存單元的偏移量;l 中間以十六進(jìn)制的形式顯示從指定地址開始的128個(gè)內(nèi)存單元的內(nèi)容,每行顯示16個(gè)字節(jié)的內(nèi)容;l 右邊顯示每個(gè)內(nèi)存單元中的數(shù)據(jù)對(duì)應(yīng)的可顯示的ASCII碼字符,若沒有對(duì)應(yīng)可顯示的ASCII碼字符,DEBUG用“.”來代替。(2)執(zhí)行帶參數(shù)的D命令若執(zhí)行帶參數(shù)的命令D,DEBUG將顯示指定地址范圍的內(nèi)容。帶參數(shù)的方式有三種。l 方式一:D 起始位置n DEBUG從起始位置開始顯示128個(gè)字節(jié)的內(nèi)容。n 輸入命令:D 1AF5:100l 方式二:D 起始

6、位置 結(jié)束位置n DEBUG從起始位置開始一直顯示到結(jié)束位置。n 輸入命令:D DS:100 11Fl 方式三:D 起始位置 L長(zhǎng)度n DEBUG命令從起始位置開始顯示指定長(zhǎng)度內(nèi)容。n 輸入命令:D DS:100 L10使用帶參數(shù)的D命令后,接著使用D命令,可列出后續(xù)的128個(gè)內(nèi)存單元的內(nèi)容。5.3 E命令格式:E 起始地址 字節(jié)值表 或 E 起始地址作用:用值表中的值替換從“起始地址”開始的內(nèi)存單元中的內(nèi)容例1:將內(nèi)存1000:01000:9單元中的內(nèi)容分別寫為0、1、2、3、4、5、6、7、8、9,可用“E 起始地址 數(shù)據(jù) 數(shù)據(jù) 數(shù)據(jù) 數(shù)據(jù) 數(shù)據(jù)”的格式來進(jìn)行。步驟: 用D命令查看1000

7、:01000:f單元的內(nèi)容:D 1000:0 f 用E命令修改從1000:0開始的10個(gè)單元中的內(nèi)容:E 1000:0 0 1 2 3 4 5 6 7 8 9 用D命令查看1000:01000:f單元中內(nèi)容的變化:D 1000:0 f例2:用E命令向內(nèi)存中寫入字符。從內(nèi)存1000:0開始寫入:數(shù)值1,字符“a”,數(shù)值2,字符“b”,數(shù)值3,字符“c”。步驟: 用D命令查看1000:0處的內(nèi)容:D 1000:0 用E命令輸入:E 1000:0 1 a 2 b 3 c 用D命令查看1000:01000:f單元中內(nèi)容的變化:D 1000:0 f例3:用E命令向內(nèi)存中寫入字符串。從內(nèi)存1000:0開始

8、寫入:數(shù)值1,字符串“a+b”,數(shù)值2,字符串“c+”,數(shù)值3,字符“IBM”。步驟: 用D命令查看1000:0處的內(nèi)容:D 1000:0 用E命令輸入:E 1000:0 1 a+b 2 c+ 3 IBM 用D命令查看1000:01000:f單元中內(nèi)容的變化:D 1000:0例4 用E命令以提問的方式來逐個(gè)地修改從某一地址開始的內(nèi)存單元中的內(nèi)容。以從1000:10單元開始為例。 步驟: 用D命令查看1000:10處的內(nèi)容:D 1000:10 用E命令輸入:E 1000:10,按Enter鍵 DEBUG將顯示起始地址1000:0010以及第一個(gè)單元(即1000:0010單元)的原始內(nèi)容:00.,

9、然后光標(biāo)停在“.”的后面,提示輸入想要寫入的數(shù)據(jù),此時(shí)有兩種選擇:其一輸入數(shù)據(jù),完后按空格鍵,即用輸入的數(shù)據(jù)改寫當(dāng)前的內(nèi)存單元;其二不輸入數(shù)據(jù),直接按空格鍵,則表示不對(duì)當(dāng)前內(nèi)存單元進(jìn)行改寫 當(dāng)前單元處理完成后(不論是改寫或者沒有改寫,只要按了空格鍵,就表示處理完成),DEBUG將顯示下一個(gè)內(nèi)存單元的原始內(nèi)容,并提示進(jìn)行修改,可以用同樣的方法進(jìn)行處理 所有希望改寫的內(nèi)存單元改寫完畢后,按ENTER鍵,E命令結(jié)束 用D命令查看1000:10單元中內(nèi)容的變化:D 1000:10 6實(shí)驗(yàn)任務(wù)C:>debug -F 100 17F 00 -A 100 0B3E:0100 MOV DL,01 0B3

10、E:0102 MOV AH,02 0B3E:0104 INT 21 0B3E:0106 INT 20 0B3E:0108 -N C:1ST.COM -R BXBX 0000 : -R CX CX 0000 :8 -W 100 Writing 00008 bytes -Q C:>在dos下執(zhí)行程序 C:>dir 1st*.* Volume in drive C is NTFSCCCC Volume Serial Number is FC03-2958 Directory of C: 2010-8-18 18:51 8 1ST.COM 1 File(s) 8 bytes 0 Dir(s

11、) 1,080,619,008 bytes free C:>1st C:>方法一:C:>DEBUG 1ST.COM -G=100 Program terminated normally方法二: C:>DEBUG -N C:1ST.COM -L 100 -G=100 Program terminated normally借助DEBUG調(diào)試工具來發(fā)現(xiàn)匯編語言程序的錯(cuò)誤所在并加以改正。 7體會(huì)這次實(shí)驗(yàn),因?yàn)橐约喝ピO(shè)計(jì)整個(gè)過程,所以就去了解學(xué)習(xí)自己原來并沒有真正弄懂的東西。比如一些程序的代碼的意思,匯編語言的邏輯。使我對(duì)前面所做的實(shí)驗(yàn)有了原理性的了解,回頭看一些實(shí)驗(yàn),也知其然

12、其所以然了。同時(shí)對(duì)課本上講的一些內(nèi)容,不再像以前那樣覺得抽象,通過這次設(shè)計(jì),有了具體的理解。二、設(shè)計(jì)匯編語言程序1實(shí)驗(yàn)?zāi)康倪M(jìn)行程序設(shè)計(jì)實(shí)驗(yàn),掌握匯編語言程序。實(shí)驗(yàn)包括對(duì)字符串統(tǒng)計(jì)程序進(jìn)行設(shè)計(jì);設(shè)計(jì)雙字乘法程序設(shè)計(jì);設(shè)計(jì)字符串統(tǒng)計(jì)程序設(shè)計(jì)雙字乘法程序設(shè)計(jì)。掌握宏匯編中的標(biāo)號(hào)的使用學(xué)會(huì)使用msam編寫簡(jiǎn)單的程序2預(yù)備知識(shí)匯編語言程序設(shè)計(jì)是一門實(shí)踐性很強(qiáng)的課程。編寫程序、上機(jī)調(diào)試、運(yùn)行程序是進(jìn)一步學(xué)習(xí)和掌握匯編語言程序設(shè)計(jì)的必要手段。在編譯匯編程序后,需要進(jìn)行調(diào)試,DEBUG.EXE是DOS提供的用于調(diào)試可執(zhí)行程序的工具軟件,是匯編語程序設(shè)計(jì)中常用的調(diào)試工具。在DEBUG環(huán)境下,不但可以調(diào)試經(jīng)匯編、

13、連接生成的可執(zhí)行程序,也可以編寫簡(jiǎn)單的程序。調(diào)試匯編語言程序,能使用戶接觸到計(jì)算機(jī)內(nèi)部,允許用戶直接觀察和修改CPU的寄存器;能觀察、修改內(nèi)存單元;允許直接輸入機(jī)器指令并單步執(zhí)行;能反匯編程序??梢哉f,debug是觀察和了解計(jì)算機(jī)內(nèi)部運(yùn)行情況的有利助手。3匯編語言源程序上機(jī)操作過程3.1源程序上機(jī)過程流程圖 開始建立源文件 Y有人工檢查嗎? 修改源程序 NASM文件存盤調(diào)MASM程序匯編源文件 Y有語法錯(cuò)誤? N調(diào)LINK程序,連接目標(biāo)文件?連接有錯(cuò)?EXE文件存盤 用DELBUG查錯(cuò)執(zhí)行EXE文件 Y結(jié)果有錯(cuò)? N結(jié)束3.2 實(shí)驗(yàn)步驟1)編寫一段代碼(m.asm)功能是:顯示字符串data

14、segment mov ax,num num dw 8072h or ax,ax data ends jns donecode segment neg ax assume cs:code,ds:data mov num,a xstart proc far done: r t epush ds start endpxor ax,ax code end spush ax end start mov ax,data mov ds,ax 2) 在DOS提示符下鍵入:對(duì)名為m.asmd的文件進(jìn)行編譯,連接生產(chǎn).obj和.exe文件:-cd.-cd.-cdmasm-msam-m-link t-debug

15、m.exe得到可執(zhí)行文件后就可以直接調(diào)用可執(zhí)行文件名,從盤上調(diào)到內(nèi)存中運(yùn)行。程序及運(yùn)行結(jié)果(或?qū)嶒?yàn)數(shù)據(jù)記錄及分析)3)編寫一段代碼(m.asm)功能是:顯示字符串data segment lp3:cmp ax,64h mov dl,bx+sis db 4 dup(?) mov ds,ax add dl,30hx db ? jb lp4 int 21hdata ends inc dl inc sicode segment sub ax,64h loop lp7assume cs:code,ds:data jmp lp3 mov ah,1start:mov ax,data lp4:mov s+1,

16、dl int 21h mov ds,ax mov dl,0 mov ah,4ch mov bx,1 lp5: cmp ax,0ah int 21h mov ax,0 jb lp6 code ends mov cx,100 inc dl end start lop:add ax,bx sub ax,0ah inc bx jmp lp5 loop lop lp6:mov s+2,dl mov dl,0 mov s+3,al lp1:cmp ax,3e8h mov bx,offset s jb lp2 mov si,0 inc dl mov ah,2 sub ax,3e8h mov cl,4 jmp

17、 lp1 lp7:mov di,bx+si lp2:mov s,dl or di,30h mov dl,0 4) 在DOS提示符下鍵入:對(duì)名為m.asmd的文件進(jìn)行編譯,連接生產(chǎn).obj和.exe文件:-cd.-cd. -msam -link t -cdmasm m -debug m.exe程序及運(yùn)行結(jié)果(或?qū)嶒?yàn)數(shù)據(jù)記錄及分析)4體會(huì)編寫好一個(gè)程序后,要想在計(jì)算機(jī)中調(diào)試、運(yùn)行,必須要有一個(gè)程序來支持程序的編輯、修改等操作。這種支援程序叫編輯程序。編輯程序有很多種,但按功能劃分,主要有兩大類。一類是行編輯程序,如EDIT編輯程序;另一類是全屏幕編輯程序如Quick Edit(QE)。行編輯程序功

18、能較弱,不如全屏幕編輯程序方便、靈活。在編輯匯編語言的源程序時(shí),可以使用已熟悉的。三、8253定時(shí)器/計(jì)數(shù)器接口與數(shù)字電子琴摘要 選擇利用實(shí)驗(yàn)儀揚(yáng)聲器/PC機(jī)內(nèi)8253驅(qū)動(dòng)內(nèi)揚(yáng)聲器改變定時(shí)器2的計(jì)數(shù)值來改變聲音頻率,通過編程來獲得聲調(diào)(頻率)和節(jié)奏(延時(shí)長(zhǎng)短),利用鍵盤1、2、3、4、5、6、7、8設(shè)計(jì)一個(gè)電子琴,通過按數(shù)字鍵響相應(yīng)的樂符1、2、3、4、5、6、7、i,使能演奏簡(jiǎn)單的樂曲。使計(jì)算機(jī)演奏出樂曲來。1實(shí)驗(yàn)?zāi)康臋z驗(yàn)和提高我在原理與接口綜合應(yīng)用方面分析問題與解決問題的能力,同時(shí)也給我提供更多、更好的訓(xùn)練機(jī)會(huì)。根據(jù)設(shè)計(jì)要求,盡可能完成設(shè)計(jì)要求的功能,選擇最合適的器件,構(gòu)成最有效的硬件電路

19、來完成。2實(shí)驗(yàn)要求選擇利用實(shí)驗(yàn)儀揚(yáng)聲器/PC機(jī)內(nèi)8253驅(qū)動(dòng)內(nèi)揚(yáng)聲器與鍵盤1、2、3、4、5、6、7、8設(shè)計(jì)一個(gè)電子琴,通過按數(shù)字鍵響相應(yīng)的樂符1、2、3、4、5、6、7、i,使能演奏簡(jiǎn)單的樂曲。3程序流程和程序?qū)崿F(xiàn)3.1流程圖 開始鍵盤讀入一個(gè)字符是ESC鍵嗎? N N 返回DOS是數(shù)字18鍵嗎? Y讀出音階值保存賦相應(yīng)頻率延時(shí)3.2程序seg segment freq dw 262,294,330,349,392,440,494,523 ;揚(yáng)聲器發(fā)聲各頻率值msg db 'Press 1,2,3,4,5,6,7,8,ESC:',0dh,0ah,'$'tim

20、dw 400num db ?dseg endssseg segment stack dw 256 dup(?)sseg endscseg segment assume cs:cseg,ds:dsegstart: mov ax,dseg mov ds,ax mov dx,offset msg mov ah,9 int 21h ;顯示提示信息sss: mov ah,7int 21h ;等待從鍵盤接收字符,不回顯al=asc碼 cmp al,1bh je exit;若為ESC鍵,則轉(zhuǎn)EXIT退出 cmp al,31h jl sss ;小于31h cmp al,38h ;大于38h jg sss ;不

21、在'1'-'8'之間轉(zhuǎn)sss sub al,31h mov num,al ;num求出相應(yīng)的時(shí)間常數(shù)的序號(hào)jinei: mov al,num add al,al mov ah,00h mov si,axagain: mov di,freqsi mov bx,tim call gen jmp sssexit: mov ah,4ch int 21hgen proc near mov al,0b6h ;設(shè)置8253通道2方式3二進(jìn)制計(jì)數(shù) out 43h,al mov dx,12h mov ax,12928; DX AX=896*533h=18*65536+12928=

22、1.19M div di out 42h,al ;8253通道2口設(shè)置初值 mov al,ah out 42h,al in al,61h ;讀8255PB口 mov ah,al or al,3out 61h,alwait1: mov cx,0hdelay3: mov ax,10 ;延時(shí)子程序delay2: nop dec ax jnz delay2 loop delay3 dec bx jnz wait1 mov al,ah out 61h,al retgen endp cseg endsend start3.3試驗(yàn)儀電子琴流程圖3.4實(shí)驗(yàn)電路:3.5程序data segmentioporte

23、qu 0d400h-0280hio8253aequ ioport+280hio8253bequ ioport+283hio8255aequ ioport+288hio8255bequ ioport+28bhio0832aequ ioport+290hdata1 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ù)time db 120

24、,106,94,89,79,70,63,59;發(fā)不同音時(shí)8253的計(jì)數(shù)器初值msg db 'Press 1,2,3,4,5,6,7,8,ESC:',0dh,0ah,'$'num db ?;num為8253計(jì)數(shù)器初值的序號(hào)data endscode segment assume cs:code,ds:datastart:mov ax,datamov ds,axmov dx,offset msgmov ah,9int 21h ;顯示提示信息sss:mov ah,7int 21h ;從鍵盤接收字符,不回顯cmp al,1bhje exit ;若為ESC鍵,則轉(zhuǎn)EXIT

25、cmp al,31hjl ssscmp al,38hjg sss ;若不在'1'-'8'之間轉(zhuǎn)ssssub al,31hmov num,al ;求出相應(yīng)的時(shí)間常數(shù)的序號(hào)mov cx,60 ;取60次32個(gè)正弦波數(shù)據(jù)ddd:mov si,0lll:mov al,data1si ;取正弦波數(shù)據(jù)mov dx,io0832aout dx,al ;放音call delay ;調(diào)延時(shí)子程序inc sicmp si,32 ;是否取完32個(gè)數(shù)據(jù)jl lll ;若沒有,則繼續(xù)loop ddd ;總循環(huán)次數(shù)60是否完,沒有,則繼續(xù)jmp sssexit:mov ah,4chint

26、21hdelay proc near ;延時(shí)子程序ccc:mov bx,offset timemov dx,io8253b ;置8253通道0為方式0工作mov al,10hout dx,almov dx,io8255b ;設(shè)8255A口輸入mov al,9bhout dx,almov al,num ;取相應(yīng)的時(shí)間常數(shù)xlatmov dx,io8253aout dx,al ;向8253通道0輸出kkk:mov dx,io8255ain al,dx ;從8255A口讀一字節(jié)test al,01 ;判PA0口是否為1jz kkk ;若不為1,則轉(zhuǎn)KKKret ;子程序返回delay endpcod

27、e endsend start4測(cè)試方案和測(cè)試結(jié)果 測(cè)試方案 測(cè)試結(jié)果啟動(dòng)程序,出現(xiàn)按鍵提示,按下18鍵機(jī)內(nèi)/實(shí)驗(yàn)儀發(fā)出相應(yīng)的音階改變開關(guān)狀態(tài)(可隨時(shí)任意改變),按18鍵對(duì)應(yīng)發(fā)出相應(yīng)的音階“彈琴”發(fā)出優(yōu)美旋律按下ESC鍵退出程序5體會(huì) 通過這次微機(jī)實(shí)驗(yàn)課程設(shè)計(jì),使我對(duì)微機(jī)軟硬件結(jié)合有了進(jìn)一步的了解。原來并不太清楚是什么意思,一直都很模糊,聽課本也是很迷茫;而之前的那些單元實(shí)驗(yàn),也沒有都做好。之前做的實(shí)驗(yàn),由于大部分是驗(yàn)證性的,所以就很被動(dòng)地去做,甚至并沒有想為什么要那樣連電路,內(nèi)部的代碼更沒有認(rèn)真看。這次課程設(shè)計(jì),要自己去設(shè)計(jì)整個(gè)過程,了解學(xué)習(xí)自己原來并沒有真正弄懂的東西。比如一些程序的代碼的

28、意思,匯編語言的邏輯,比如一些芯片的用途。使我對(duì)前面所做的實(shí)驗(yàn)有了原理性的了解,回頭看一些實(shí)驗(yàn),也知其然其所以然了。同時(shí)對(duì)課本上講的一些內(nèi)容,不再像以前那樣覺得抽象,通過這次設(shè)計(jì),有了具體的理解。 同時(shí),我也知道了設(shè)計(jì)一個(gè)項(xiàng)目,應(yīng)該如何下手。應(yīng)該先對(duì)項(xiàng)目要求有個(gè)全面的了解,知道要做什么,然后根據(jù)要求所要涉及到的知識(shí)我們要主動(dòng)去攝取,結(jié)合自己已學(xué)過的,再對(duì)整體框架有個(gè)感知,心里有數(shù)后,進(jìn)行設(shè)計(jì)。設(shè)計(jì)時(shí)用流程圖,這很重要,這樣整個(gè)思路就很清晰,而且是按照軟硬件語言的邏輯順序進(jìn)行,就很方便。設(shè)計(jì)過程可以分模塊,不要一開始就想把所有的功能都實(shí)現(xiàn)了,應(yīng)該一個(gè)模塊一個(gè)模塊地實(shí)現(xiàn),再總的連起來,實(shí)現(xiàn)最后的總

29、模塊。在每個(gè)模塊設(shè)計(jì)時(shí),盡量想到比較簡(jiǎn)單的設(shè)計(jì),簡(jiǎn)化編程和電路,也可少出錯(cuò)。對(duì)微機(jī)是這樣,對(duì)其他的像數(shù)字系統(tǒng)設(shè)計(jì),也是一樣的。 因此,我也覺得微機(jī)實(shí)驗(yàn)的這種形式的課程設(shè)計(jì)是很好也很有必要的,對(duì)我們對(duì)微機(jī)實(shí)驗(yàn)的理解有很大幫助。四、實(shí)時(shí)時(shí)鐘實(shí)驗(yàn)1實(shí)驗(yàn)?zāi)康?.1了解RTC實(shí)時(shí)時(shí)鐘特性、功能、結(jié)構(gòu)1.2了解RTC實(shí)時(shí)時(shí)鐘寄存器描述1.3了解RTC中斷2實(shí)驗(yàn)過程2.1利用RTC的增量功能進(jìn)行1s的定時(shí),當(dāng)定時(shí)時(shí)間到,取反LED控制#include "config.h"#define LED1CON 0x00000400 /*P0.10口為L(zhǎng)ED1控制器*/*定義Fpclk值,用于設(shè)置

30、串口波特率*/#define FPCLK 3686250L2.2初始化實(shí)時(shí)時(shí)鐘void RTCIni(void) PREINT=FPCLK/32768-1; /設(shè)置預(yù)分頻器 PREFRAC=FPCLK-(FPCLK/32768)*32768; YEAR=2005; /初始化年 MONTH=6; /初始化月 DOM=10; /初始化日 CIIR=0x01; /設(shè)置秒值的增量產(chǎn)生一次中斷 CCR=0x01; /啟動(dòng)RTC2.3使用RTC的秒增量中斷功能控制LED閃動(dòng)int main(void) PINSEL0=0x00000000; /引腳連接設(shè)置 PINSEL1=0x00000000; IODI

31、R=LED1CON; RTCIni(); /初始化RTC while(1) IOSET=LED1CON; /熄滅LED1 while(0=(ILR&0x01); /等待RTC增量中斷標(biāo)志 ILR=0x01; /清除中斷標(biāo)志 IOCLR=LED1CON; /點(diǎn)亮LED1 while(0=(ILR&0x01); ILR=0x01; return(0);2.4運(yùn)行rtc進(jìn)行計(jì)時(shí),并將所計(jì)時(shí)間值不斷地通過串口向上位機(jī)發(fā)送#include "config.h"#define LED1CON 0x00000400 /*P0.10口為L(zhǎng)ED1控制端*/* 定義Fpclk值

32、,用于設(shè)置串口波特率*/#define FPCLK 2764800L/*定義串口模式設(shè)置數(shù)據(jù)結(jié)構(gòu)*/typedef struct UartMode uint8 datab; /字長(zhǎng)度,5/6/7/8 uint8 stopb; /停止位,1/2 uint8 parity; /奇偶校驗(yàn)位,0為無校驗(yàn),1為奇數(shù)校驗(yàn),2為偶數(shù)校驗(yàn) UARTMODE;uint8 send_buf16; /UART0數(shù)據(jù)接收緩沖區(qū) 2.5初始化串口0,設(shè)置其工作模式及波特率入口參數(shù): baud 波特率 set 模式設(shè)置(UARTMODE數(shù)據(jù)結(jié)構(gòu))出口參數(shù): 返回值為1時(shí)表示初始化成功,為0時(shí)表示參數(shù)出錯(cuò)uint8 UAR

33、T0_Ini(uint32 baud, UARTMODE set) uint32 bak; /*參數(shù)過濾*/ if (0=baud)|(baud>115200)return(0); if (set.datab<5)|(set.datab>8)return(0); if (0=set.stopb)|(set.stopb>2)return(0); if (set.parity>4)return(0); /*設(shè)置串口波特率*/ U0LCR=0x80; /DLAB位置1 bak=(FPCLK>>4)/baud; U0DLM=bak>>8; U0DL

34、L=bak&0xff; /*設(shè)置串口模式*/ bak=set.datab-5; /設(shè)置字長(zhǎng)度 if(2=set.stopb)bak|=0x04; /判斷是否為2位停止位 if(0!=set.parity)set.parity=set.parity-1; bak|=0x08; bak|=set.parity<<4; /設(shè)置奇偶校驗(yàn) U0LCR=bak; return(1);2.6向串口發(fā)送字節(jié)數(shù)據(jù),并等待發(fā)送完畢void SendByte(uint8 data) U0THR=data; /發(fā)送數(shù)據(jù) while(U0LSR&0x20)=0); /等待數(shù)據(jù)發(fā)送 2.7將緩

35、沖區(qū)的數(shù)據(jù)發(fā)送回主機(jī)入口參數(shù): buf 數(shù)據(jù)緩沖區(qū) no 發(fā)送數(shù)據(jù)的個(gè)數(shù)出口參數(shù): 無void ISendBuf(uint8 const *buf,uint8 no) uint8 i; for(i=0;i<no;i+)SendByte(bufi); 2.8讀取rtc的時(shí)間值,并將讀出的時(shí)分秒值由串口發(fā)送到上位機(jī)顯示void SendTimeRtc(void) uint8 const MESSAGE="RTC Time is:" uint32 times; uint8 bak; times=CTIME0; /讀取完整時(shí)鐘寄存器0 bak=(times>>16

36、)&0x1F; /取得時(shí)的值 send_buf0=bak/10+'0' send_buf1=bak%10+'0' send_buf2=':' bak=(times>>8)&0x3F; /取得分的值 send_buf3=bak/10+'0' send_buf4=bak%10+'0' send_buf5=':' bak=times&0x3F; /取得秒的值 send_buf6=bak/10+'0' send_buf7=bak%10+'0'

37、; send_buf8='n' ISendBuf(MESSAGE,14); /發(fā)送數(shù)據(jù) ISendBuf(send_buf,9); 2.9初始化實(shí)時(shí)時(shí)鐘void RTCIni(void) PREINT=FPCLK/32768-1; /設(shè)置預(yù)分頻器 PREFRAC=FPCLK-(FPCLK/32768)*32768; YEAR=2005; /初始化年 MONTH=6; /初始化月 DOM=10; /初始化日 HOUR=8; MIN=30; SEC=0; CIIR=0x01; /設(shè)置秒值的增量產(chǎn)生一次中斷 CCR=0x01; /啟動(dòng)RTC 2.10讀取實(shí)時(shí)時(shí)鐘的值,并從串口發(fā)送出去

38、int main(void) UARTMODE uart0_set; PINSEL0=0x00000005; /設(shè)置I/O連接到UART0 PINSEL1=0x00000000; IODIR=LED1CON; /設(shè)置LED1控制口為輸出,其它I/O為輸入 uart0_set.datab=8; /8位數(shù)據(jù)位 uart0_set.stopb=1; /1位停止位 uart0_set.parity=0; /無奇偶校驗(yàn)位 UART0_Ini(9600,uart0_set); /初始化串口模式 U0FCR=0x01; /使能FIFO RTCIni(); /初始化RTC while(1) IOSET=LED

39、1CON; /熄滅LED while(0=(ILR&0x01); /等待RTC增量中斷標(biāo)志位 ILR=0x01; /清除中斷標(biāo)志位 SendTimeRtc(); /讀取時(shí)鐘值,并向UART0發(fā)送 IOCLR=LED1CON; /點(diǎn)亮LED while(0=(ILR&0x01); ILR=0x01; SendTimeRtc(); return(0);3實(shí)驗(yàn)電路圖4體會(huì)學(xué)習(xí)rtc的時(shí)間并不長(zhǎng),而且又是第一次接觸,因此有很多東西還是不太了解,雖然說時(shí)間不長(zhǎng),但是還是很有收獲的,這次畢竟使自己有機(jī)會(huì)去學(xué)習(xí)一些貼近硬件的知識(shí),如果將來有機(jī)會(huì)再學(xué)習(xí),我還是很樂意的。畢竟一個(gè)真正學(xué)習(xí)計(jì)算機(jī)的

40、人不能只知道軟件的知識(shí)。五、8255并行接口鍵盤實(shí)驗(yàn)1實(shí)驗(yàn)?zāi)康?.1掌握8255A的功能及方式0、1的實(shí)現(xiàn)1.2熟悉8255A與CPU的接口,以及傳輸數(shù)據(jù)的工作原理及編程方法。2準(zhǔn)備知識(shí)2.1 8255的工作方式一片8255內(nèi)部有3個(gè)端口,A口可以工作在方式0、方式1或方式2,B口可以工作在方式0、方式1,C口可以工作在方式0。方式0是基本型輸入/輸出。這種方式和外設(shè)交換數(shù)據(jù)時(shí),8255端口與外設(shè)之間不使用聯(lián)絡(luò)線。方式1為選通型輸入/輸出。用這種方式和外界交換數(shù)據(jù)時(shí),端口和外設(shè)之間要有聯(lián)絡(luò)信號(hào)。方式2是雙向數(shù)據(jù)傳送,僅A口有這項(xiàng)功能。當(dāng)A口工作在方式2時(shí),B口仍可以工作在方式0或方式1,但此時(shí)

41、B口方式1只能用查詢方式與CPU交換信息。2.2 工作方式選擇字8255工作方式選擇字共8位,存放在8255控制寄存器中。最高位D7為標(biāo)志位,D7=1表示控制寄存器中存放的是工作方式選擇字,D7=0表示控制寄存器中存放的是C口置位/復(fù)位控制字。2.3 C口置/復(fù)位控制字8255的C口可進(jìn)行位操作,即:可對(duì)8255C口的每一位進(jìn)行置位或清零操作,該操作是通過設(shè)置C口置/復(fù)位字實(shí)現(xiàn)的(圖8-10)。C口置/復(fù)位字共8位,各位含義如下:2.4 命令字與初始化編程8255有兩個(gè)命令字,即方式選擇控制字和C口置0/置1控制字,初始化編程的步驟是: 向8255控制寄存器寫入“方式選擇控制字”,從而預(yù)置端口

42、的工作方式。 當(dāng)端口預(yù)置為方式1或方式2時(shí),再向控制寄存器寫入“C口置0/置1控制字”。這一操作的主要目的是使相應(yīng)端口的中斷允許觸發(fā)器置0,從而禁止中斷,或者使相應(yīng)端口的中斷允許觸發(fā)器置1,從而允許端口提出中斷請(qǐng)求。 注意:“C口置0/置1控制字”雖然是對(duì)C口進(jìn)行操作,但是該控制字是命令字,所以要寫入控制寄存器,而不是寫入C口控制寄存器。 向8255數(shù)據(jù)寄存器寫入“數(shù)據(jù)”或從8255數(shù)據(jù)寄存器讀出“數(shù)據(jù)”。3實(shí)驗(yàn)過程鍵盤驅(qū)動(dòng)的主要作用就是實(shí)時(shí)監(jiān)測(cè)外部按鍵中斷,一旦發(fā)現(xiàn)外部有鍵按下就向內(nèi)核發(fā)送鍵盤消息實(shí)現(xiàn)鍵盤輸入功能。鍵盤驅(qū)動(dòng)創(chuàng)建了中斷服務(wù)線程和4個(gè)鍵盤中斷事件,每行按鍵對(duì)應(yīng)一個(gè)鍵盤中斷事件。有

43、鍵被按下時(shí),中斷服務(wù)例程得到對(duì)應(yīng)的中斷標(biāo)識(shí)符并報(bào)告給系統(tǒng)任務(wù)調(diào)度進(jìn)程,同時(shí)產(chǎn)生鍵盤中斷事件,鍵盤中斷服務(wù)線程響應(yīng)鍵盤中斷事件,開始掃描矩陣鍵盤。根據(jù)產(chǎn)生的中斷事件類型不同,可以首先確定被按下鍵的行位置。由于鍵盤被按下后,該鍵對(duì)應(yīng)的行和列被連通,因此根據(jù)判斷各列對(duì)應(yīng)的I/O口的電平,可以得到被按下鍵的列位置;得到按鍵的準(zhǔn)確位置后,通過向操作系統(tǒng)發(fā)送鍵盤消息KEYBD_EVENT,實(shí)現(xiàn)一次鍵盤輸入。循環(huán)掃描鍵盤,直到按鍵被彈起則發(fā)送KEYEVENTF_KEYUP事件。響應(yīng)鍵盤中斷輸入的整個(gè)流程如圖。3.1 在OAL層加入中斷源矩陣鍵盤采用4路I/O口中斷,每路中斷對(duì)應(yīng)1個(gè)中斷源。矩陣鍵盤驅(qū)動(dòng)首先要在OAL層加入這些

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(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)論