




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、四川大學(xué)網(wǎng)絡(luò)教育學(xué)院計算機(jī)綜合實踐校外學(xué)習(xí)中心: 天津市勞動經(jīng)濟(jì)學(xué)校 學(xué) 生 姓 名: 邊浩東 專 業(yè): 電氣工程及其自動化 層 次: 專升本(業(yè)余) 年 級: 2012春 學(xué) 號: DH1121S1003 實 踐 時 間: 2014年2月16日 一、熟悉、使用DEBUG調(diào)試工具摘要 借助DEBUG調(diào)試工具來發(fā)現(xiàn)匯編語言程序的錯誤所在并加以改正。通過實驗,掌握DEBUG的常用基本命令,學(xué)會如何在windows的命令模式下啟動DEBUG,進(jìn)而學(xué)會如何使用DEBUG查看CPU和內(nèi)存,以及進(jìn)行程序的跟蹤調(diào)試等。1 實驗?zāi)康?.1學(xué)習(xí)如何在Windows的命令模式下啟動DEBUG。1.2掌握DEBUG
2、的常用基本命令。1.3學(xué)習(xí)如何使用DEBUG查看CPU和內(nèi)存以及進(jìn)行跟蹤調(diào)試。2 實驗設(shè)備及軟件環(huán)境裝有DOS系統(tǒng)及MASM6.X的微機(jī)一臺。3 預(yù)備知識3.1 什么是DEBUG? Debug是DOS、Windows都提供的實模式(8086方式)程序的調(diào)試工具。使用它,可以查看CPU各種寄存器的內(nèi)容、內(nèi)存的情況和在機(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)容U 范圍 反匯編,
3、將內(nèi)存中的機(jī)器指令翻譯成匯編指令T 地址指令數(shù) 執(zhí)行一條機(jī)器指令A(yù) 地址 以匯編指令的格式在內(nèi)存中寫入一條機(jī)器指令Q 退出Debug,回到DOS狀態(tài)4 啟動DEBUG4.1打開Windows命令窗口選擇“開始”“運(yùn)行”輸入“cmd”命令4.2啟動DEBUG在命令窗口中啟動DEBUG,將顯示連接符“”,這時可輸入各種DEBUG命令。4.3關(guān)于使用命令的幾點說明:l 在提示符“”下才能輸入命令,在按“回車”鍵后,該命令才開始執(zhí)行;l 命令是單個字母,命令和參數(shù)的大小寫可混合輸入;l 可用F1、F2、F3、Ins、Del、等編輯鍵來編輯本行命令;l 當(dāng)命令出現(xiàn)語法錯誤時,將在出錯位置顯示“Error
4、”;l 在DEBUG中使用的數(shù)都是以十六進(jìn)制來表示的。5 實驗內(nèi)容5.1 R命令作用:查看、改變CPU寄存器的內(nèi)容(1)顯示所有寄存器之中的內(nèi)容:輸入R我們重點關(guān)注AX、BX、CX、DX、CS及IP寄存器的內(nèi)容,其他寄存器SP、BP、SI、DI、ES、SS及標(biāo)志寄存器先不予理會。此外,并列出了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部分內(nèi)容,查看執(zhí)行結(jié)
5、果。說明:l 左邊是每行的起始地址,用“XXXX:YYYY”表示,其中XXXX表示內(nèi)存單元的段地址,YYYY表示內(nèi)存單元的偏移量;l 中間以十六進(jìn)制的形式顯示從指定地址開始的128個內(nèi)存單元的內(nèi)容,每行顯示16個字節(jié)的內(nèi)容;l 右邊顯示每個內(nèi)存單元中的數(shù)據(jù)對應(yīng)的可顯示的ASCII碼字符,若沒有對應(yīng)可顯示的ASCII碼字符,DEBUG用“.”來代替。(2)執(zhí)行帶參數(shù)的D命令若執(zhí)行帶參數(shù)的命令D,DEBUG將顯示指定地址范圍的內(nèi)容。帶參數(shù)的方式有三種。l 方式一:D 起始位置n DEBUG從起始位置開始顯示128個字節(jié)的內(nèi)容。n 輸入命令:D 1AF5:100l 方式二:D 起始位置 結(jié)束位置n
6、DEBUG從起始位置開始一直顯示到結(jié)束位置。n 輸入命令:D DS:100 11Fl 方式三:D 起始位置 L長度n DEBUG命令從起始位置開始顯示指定長度內(nèi)容。n 輸入命令:D DS:100 L10使用帶參數(shù)的D命令后,接著使用D命令,可列出后續(xù)的128個內(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:01000:f單
7、元的內(nèi)容:D 1000:0 f 用E命令修改從1000:0開始的10個單元中的內(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開始寫入:數(shù)值1,字符
8、串“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命令以提問的方式來逐個地修改從某一地址開始的內(nèi)存單元中的內(nèi)容。以從1000:10單元開始為例。 步驟: 用D命令查看1000:10處的內(nèi)容:D 1000:10 用E命令輸入:E 1000:10,按Enter鍵 DEBUG將顯示起始地址1000:0010以及第一個單元(即1000:0010單元)的原始內(nèi)容:00.,然后光標(biāo)停在“.”
9、的后面,提示輸入想要寫入的數(shù)據(jù),此時有兩種選擇:其一輸入數(shù)據(jù),完后按空格鍵,即用輸入的數(shù)據(jù)改寫當(dāng)前的內(nèi)存單元;其二不輸入數(shù)據(jù),直接按空格鍵,則表示不對當(dāng)前內(nèi)存單元進(jìn)行改寫 當(dāng)前單元處理完成后(不論是改寫或者沒有改寫,只要按了空格鍵,就表示處理完成),DEBUG將顯示下一個內(nèi)存單元的原始內(nèi)容,并提示進(jìn)行修改,可以用同樣的方法進(jìn)行處理 所有希望改寫的內(nèi)存單元改寫完畢后,按ENTER鍵,E命令結(jié)束 用D命令查看1000:10單元中內(nèi)容的變化:D 1000:10 6實驗任務(wù)C:>debug -F 100 17F 00 -A 100 0B3E:0100 MOV DL,01 0B3E:0102 MO
10、V 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) 1,080,6
11、19,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)匯編語言程序的錯誤所在并加以改正。 7體會這次實驗,因為要自己去設(shè)計整個過程,所以就去了解學(xué)習(xí)自己原來并沒有真正弄懂的東西。比如一些程序的代碼的意思,匯編語言的邏輯。使我對前面所做的實驗有了原理性的了解,回頭看一些實驗,也知其然其所以然了。同時對
12、課本上講的一些內(nèi)容,不再像以前那樣覺得抽象,通過這次設(shè)計,有了具體的理解。二、設(shè)計匯編語言程序1實驗?zāi)康倪M(jìn)行程序設(shè)計實驗,掌握匯編語言程序。實驗包括對字符串統(tǒng)計程序進(jìn)行設(shè)計;設(shè)計雙字乘法程序設(shè)計;設(shè)計字符串統(tǒng)計程序設(shè)計雙字乘法程序設(shè)計。掌握宏匯編中的標(biāo)號的使用學(xué)會使用msam編寫簡單的程序2預(yù)備知識匯編語言程序設(shè)計是一門實踐性很強(qiáng)的課程。編寫程序、上機(jī)調(diào)試、運(yùn)行程序是進(jìn)一步學(xué)習(xí)和掌握匯編語言程序設(shè)計的必要手段。在編譯匯編程序后,需要進(jìn)行調(diào)試,DEBUG.EXE是DOS提供的用于調(diào)試可執(zhí)行程序的工具軟件,是匯編語程序設(shè)計中常用的調(diào)試工具。在DEBUG環(huán)境下,不但可以調(diào)試經(jīng)匯編、連接生成的可執(zhí)行程
13、序,也可以編寫簡單的程序。調(diào)試匯編語言程序,能使用戶接觸到計算機(jī)內(nèi)部,允許用戶直接觀察和修改CPU的寄存器;能觀察、修改內(nèi)存單元;允許直接輸入機(jī)器指令并單步執(zhí)行;能反匯編程序??梢哉f,debug是觀察和了解計算機(jī)內(nèi)部運(yùn)行情況的有利助手。3匯編語言源程序上機(jī)操作過程3.1源程序上機(jī)過程流程圖 開始建立源文件 Y有人工檢查嗎? 修改源程序 NASM文件存盤調(diào)MASM程序匯編源文件 Y有語法錯誤? N調(diào)LINK程序,連接目標(biāo)文件?連接有錯?EXE文件存盤 用DELBUG查錯執(zhí)行EXE文件 Y結(jié)果有錯? N結(jié)束3.2 實驗步驟1)編寫一段代碼(m.asm)功能是:顯示字符串data segment m
14、ov 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提示符下鍵入:對名為m.asmd的文件進(jìn)行編譯,連接生產(chǎn).obj和.exe文件:-cd.-cd.-cdmasm-msam-m-link t-debug m.exe得到可執(zhí)
15、行文件后就可以直接調(diào)用可執(zhí)行文件名,從盤上調(diào)到內(nèi)存中運(yùn)行。程序及運(yùn)行結(jié)果(或?qū)嶒灁?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,dl int 21
16、h 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 lp1 lp7:
17、mov di,bx+si lp2:mov s,dl or di,30h mov dl,0 4) 在DOS提示符下鍵入:對名為m.asmd的文件進(jìn)行編譯,連接生產(chǎn).obj和.exe文件:-cd.-cd. -msam -link t -cdmasm m -debug m.exe程序及運(yùn)行結(jié)果(或?qū)嶒灁?shù)據(jù)記錄及分析)4體會編寫好一個程序后,要想在計算機(jī)中調(diào)試、運(yùn)行,必須要有一個程序來支持程序的編輯、修改等操作。這種支援程序叫編輯程序。編輯程序有很多種,但按功能劃分,主要有兩大類。一類是行編輯程序,如EDIT編輯程序;另一類是全屏幕編輯程序如Quick Edit(QE)。行編輯程序功能較弱,不如全屏幕
18、編輯程序方便、靈活。在編輯匯編語言的源程序時,可以使用已熟悉的。三、8253定時器/計數(shù)器接口與數(shù)字電子琴摘要 選擇利用實驗儀揚(yáng)聲器/PC機(jī)內(nèi)8253驅(qū)動內(nèi)揚(yáng)聲器改變定時器2的計數(shù)值來改變聲音頻率,通過編程來獲得聲調(diào)(頻率)和節(jié)奏(延時長短),利用鍵盤1、2、3、4、5、6、7、8設(shè)計一個電子琴,通過按數(shù)字鍵響相應(yīng)的樂符1、2、3、4、5、6、7、i,使能演奏簡單的樂曲。使計算機(jī)演奏出樂曲來。1實驗?zāi)康臋z驗和提高我在原理與接口綜合應(yīng)用方面分析問題與解決問題的能力,同時也給我提供更多、更好的訓(xùn)練機(jī)會。根據(jù)設(shè)計要求,盡可能完成設(shè)計要求的功能,選擇最合適的器件,構(gòu)成最有效的硬件電路來完成。2實驗要求
19、選擇利用實驗儀揚(yáng)聲器/PC機(jī)內(nèi)8253驅(qū)動內(nèi)揚(yáng)聲器與鍵盤1、2、3、4、5、6、7、8設(shè)計一個電子琴,通過按數(shù)字鍵響相應(yīng)的樂符1、2、3、4、5、6、7、i,使能演奏簡單的樂曲。3程序流程和程序?qū)崿F(xiàn)3.1流程圖 開始鍵盤讀入一個字符是ESC鍵嗎? N N 返回DOS是數(shù)字18鍵嗎? Y讀出音階值保存賦相應(yīng)頻率延時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 dw 400num
20、 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 ;不在'1
21、39;-'8'之間轉(zhuǎn)sss sub al,31h mov num,al ;num求出相應(yīng)的時間常數(shù)的序號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)制計數(shù) out 43h,al mov dx,12h mov ax,12928; DX AX=896*533h=18*65536+12928=1.19M div
22、 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 ;延時子程序delay2: nop dec ax jnz delay2 loop delay3 dec bx jnz wait1 mov al,ah out 61h,al retgen endp cseg endsend start3.3試驗儀電子琴流程圖3.4實驗電路:3.5程序data segmentioportequ 0d400h
23、-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,106,94,8
24、9,79,70,63,59;發(fā)不同音時8253的計數(shù)器初值msg db 'Press 1,2,3,4,5,6,7,8,ESC:',0dh,0ah,'$'num db ?;num為8253計數(shù)器初值的序號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)EXITcmp al,31
25、hjl ssscmp al,38hjg sss ;若不在'1'-'8'之間轉(zhuǎn)ssssub al,31hmov num,al ;求出相應(yīng)的時間常數(shù)的序號mov cx,60 ;取60次32個正弦波數(shù)據(jù)ddd:mov si,0lll:mov al,data1si ;取正弦波數(shù)據(jù)mov dx,io0832aout dx,al ;放音call delay ;調(diào)延時子程序inc sicmp si,32 ;是否取完32個數(shù)據(jù)jl lll ;若沒有,則繼續(xù)loop ddd ;總循環(huán)次數(shù)60是否完,沒有,則繼續(xù)jmp sssexit:mov ah,4chint 21hdelay
26、proc near ;延時子程序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ù)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 endpcode endsend
27、 start4測試方案和測試結(jié)果 測試方案 測試結(jié)果啟動程序,出現(xiàn)按鍵提示,按下18鍵機(jī)內(nèi)/實驗儀發(fā)出相應(yīng)的音階改變開關(guān)狀態(tài)(可隨時任意改變),按18鍵對應(yīng)發(fā)出相應(yīng)的音階“彈琴”發(fā)出優(yōu)美旋律按下ESC鍵退出程序5體會 通過這次微機(jī)實驗課程設(shè)計,使我對微機(jī)軟硬件結(jié)合有了進(jìn)一步的了解。原來并不太清楚是什么意思,一直都很模糊,聽課本也是很迷茫;而之前的那些單元實驗,也沒有都做好。之前做的實驗,由于大部分是驗證性的,所以就很被動地去做,甚至并沒有想為什么要那樣連電路,內(nèi)部的代碼更沒有認(rèn)真看。這次課程設(shè)計,要自己去設(shè)計整個過程,了解學(xué)習(xí)自己原來并沒有真正弄懂的東西。比如一些程序的代碼的意思,匯編語言的邏
28、輯,比如一些芯片的用途。使我對前面所做的實驗有了原理性的了解,回頭看一些實驗,也知其然其所以然了。同時對課本上講的一些內(nèi)容,不再像以前那樣覺得抽象,通過這次設(shè)計,有了具體的理解。 同時,我也知道了設(shè)計一個項目,應(yīng)該如何下手。應(yīng)該先對項目要求有個全面的了解,知道要做什么,然后根據(jù)要求所要涉及到的知識我們要主動去攝取,結(jié)合自己已學(xué)過的,再對整體框架有個感知,心里有數(shù)后,進(jìn)行設(shè)計。設(shè)計時用流程圖,這很重要,這樣整個思路就很清晰,而且是按照軟硬件語言的邏輯順序進(jìn)行,就很方便。設(shè)計過程可以分模塊,不要一開始就想把所有的功能都實現(xiàn)了,應(yīng)該一個模塊一個模塊地實現(xiàn),再總的連起來,實現(xiàn)最后的總模塊。在每個模塊設(shè)
29、計時,盡量想到比較簡單的設(shè)計,簡化編程和電路,也可少出錯。對微機(jī)是這樣,對其他的像數(shù)字系統(tǒng)設(shè)計,也是一樣的。 因此,我也覺得微機(jī)實驗的這種形式的課程設(shè)計是很好也很有必要的,對我們對微機(jī)實驗的理解有很大幫助。四、實時時鐘實驗1實驗?zāi)康?.1了解RTC實時時鐘特性、功能、結(jié)構(gòu)1.2了解RTC實時時鐘寄存器描述1.3了解RTC中斷2實驗過程2.1利用RTC的增量功能進(jìn)行1s的定時,當(dāng)定時時間到,取反LED控制#include "config.h"#define LED1CON 0x00000400 /*P0.10口為LED1控制器*/*定義Fpclk值,用于設(shè)置串口波特率*/#d
30、efine FPCLK 3686250L2.2初始化實時時鐘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; /啟動RTC2.3使用RTC的秒增量中斷功能控制LED閃動int main(void) PINSEL0=0x00000000; /引腳連接設(shè)置 PINSEL1=0x00000000; IODIR=LED1CON
31、; RTCIni(); /初始化RTC while(1) IOSET=LED1CON; /熄滅LED1 while(0=(ILR&0x01); /等待RTC增量中斷標(biāo)志 ILR=0x01; /清除中斷標(biāo)志 IOCLR=LED1CON; /點亮LED1 while(0=(ILR&0x01); ILR=0x01; return(0);2.4運(yùn)行rtc進(jìn)行計時,并將所計時間值不斷地通過串口向上位機(jī)發(fā)送#include "config.h"#define LED1CON 0x00000400 /*P0.10口為LED1控制端*/* 定義Fpclk值,用于設(shè)置串口波特
32、率*/#define FPCLK 2764800L/*定義串口模式設(shè)置數(shù)據(jù)結(jié)構(gòu)*/typedef struct UartMode uint8 datab; /字長度,5/6/7/8 uint8 stopb; /停止位,1/2 uint8 parity; /奇偶校驗位,0為無校驗,1為奇數(shù)校驗,2為偶數(shù)校驗 UARTMODE;uint8 send_buf16; /UART0數(shù)據(jù)接收緩沖區(qū) 2.5初始化串口0,設(shè)置其工作模式及波特率入口參數(shù): baud 波特率 set 模式設(shè)置(UARTMODE數(shù)據(jù)結(jié)構(gòu))出口參數(shù): 返回值為1時表示初始化成功,為0時表示參數(shù)出錯uint8 UART0_Ini(ui
33、nt32 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; U0DLL=bak&
34、;0xff; /*設(shè)置串口模式*/ bak=set.datab-5; /設(shè)置字長度 if(2=set.stopb)bak|=0x04; /判斷是否為2位停止位 if(0!=set.parity)set.parity=set.parity-1; bak|=0x08; bak|=set.parity<<4; /設(shè)置奇偶校驗 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將緩沖區(qū)的數(shù)據(jù)發(fā)送回主
35、機(jī)入口參數(shù): buf 數(shù)據(jù)緩沖區(qū) no 發(fā)送數(shù)據(jù)的個數(shù)出口參數(shù): 無void ISendBuf(uint8 const *buf,uint8 no) uint8 i; for(i=0;i<no;i+)SendByte(bufi); 2.8讀取rtc的時間值,并將讀出的時分秒值由串口發(fā)送到上位機(jī)顯示void SendTimeRtc(void) uint8 const MESSAGE="RTC Time is:" uint32 times; uint8 bak; times=CTIME0; /讀取完整時鐘寄存器0 bak=(times>>16)&0x1
36、F; /取得時的值 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' send_bu
37、f8='n' ISendBuf(MESSAGE,14); /發(fā)送數(shù)據(jù) ISendBuf(send_buf,9); 2.9初始化實時時鐘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; /啟動RTC 2.10讀取實時時鐘的值,并從串口發(fā)送出去int main(
38、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; /無奇偶校驗位 UART0_Ini(9600,uart0_set); /初始化串口模式 U0FCR=0x01; /使能FIFO RTCIni(); /初始化RTC while(1) IOSET=LED1CON; /熄滅
39、LED while(0=(ILR&0x01); /等待RTC增量中斷標(biāo)志位 ILR=0x01; /清除中斷標(biāo)志位 SendTimeRtc(); /讀取時鐘值,并向UART0發(fā)送 IOCLR=LED1CON; /點亮LED while(0=(ILR&0x01); ILR=0x01; SendTimeRtc(); return(0);3實驗電路圖4體會學(xué)習(xí)rtc的時間并不長,而且又是第一次接觸,因此有很多東西還是不太了解,雖然說時間不長,但是還是很有收獲的,這次畢竟使自己有機(jī)會去學(xué)習(xí)一些貼近硬件的知識,如果將來有機(jī)會再學(xué)習(xí),我還是很樂意的。畢竟一個真正學(xué)習(xí)計算機(jī)的人不能只知道軟件的
40、知識。五、8255并行接口鍵盤實驗1實驗?zāi)康?.1掌握8255A的功能及方式0、1的實現(xiàn)1.2熟悉8255A與CPU的接口,以及傳輸數(shù)據(jù)的工作原理及編程方法。2準(zhǔn)備知識2.1 8255的工作方式一片8255內(nèi)部有3個端口,A口可以工作在方式0、方式1或方式2,B口可以工作在方式0、方式1,C口可以工作在方式0。方式0是基本型輸入/輸出。這種方式和外設(shè)交換數(shù)據(jù)時,8255端口與外設(shè)之間不使用聯(lián)絡(luò)線。方式1為選通型輸入/輸出。用這種方式和外界交換數(shù)據(jù)時,端口和外設(shè)之間要有聯(lián)絡(luò)信號。方式2是雙向數(shù)據(jù)傳送,僅A口有這項功能。當(dāng)A口工作在方式2時,B口仍可以工作在方式0或方式1,但此時B口方式1只能用查
41、詢方式與CPU交換信息。2.2 工作方式選擇字8255工作方式選擇字共8位,存放在8255控制寄存器中。最高位D7為標(biāo)志位,D7=1表示控制寄存器中存放的是工作方式選擇字,D7=0表示控制寄存器中存放的是C口置位/復(fù)位控制字。2.3 C口置/復(fù)位控制字8255的C口可進(jìn)行位操作,即:可對8255C口的每一位進(jìn)行置位或清零操作,該操作是通過設(shè)置C口置/復(fù)位字實現(xiàn)的(圖8-10)。C口置/復(fù)位字共8位,各位含義如下:2.4 命令字與初始化編程8255有兩個命令字,即方式選擇控制字和C口置0/置1控制字,初始化編程的步驟是: 向8255控制寄存器寫入“方式選擇控制字”,從而預(yù)置端口的工作方式。 當(dāng)端
42、口預(yù)置為方式1或方式2時,再向控制寄存器寫入“C口置0/置1控制字”。這一操作的主要目的是使相應(yīng)端口的中斷允許觸發(fā)器置0,從而禁止中斷,或者使相應(yīng)端口的中斷允許觸發(fā)器置1,從而允許端口提出中斷請求。 注意:“C口置0/置1控制字”雖然是對C口進(jìn)行操作,但是該控制字是命令字,所以要寫入控制寄存器,而不是寫入C口控制寄存器。 向8255數(shù)據(jù)寄存器寫入“數(shù)據(jù)”或從8255數(shù)據(jù)寄存器讀出“數(shù)據(jù)”。3實驗過程鍵盤驅(qū)動的主要作用就是實時監(jiān)測外部按鍵中斷,一旦發(fā)現(xiàn)外部有鍵按下就向內(nèi)核發(fā)送鍵盤消息實現(xiàn)鍵盤輸入功能。鍵盤驅(qū)動創(chuàng)建了中斷服務(wù)線程和4個鍵盤中斷事件,每行按鍵對應(yīng)一個鍵盤中斷事件。有鍵被按下時,中斷服
43、務(wù)例程得到對應(yīng)的中斷標(biāo)識符并報告給系統(tǒng)任務(wù)調(diào)度進(jìn)程,同時產(chǎn)生鍵盤中斷事件,鍵盤中斷服務(wù)線程響應(yīng)鍵盤中斷事件,開始掃描矩陣鍵盤。根據(jù)產(chǎn)生的中斷事件類型不同,可以首先確定被按下鍵的行位置。由于鍵盤被按下后,該鍵對應(yīng)的行和列被連通,因此根據(jù)判斷各列對應(yīng)的I/O口的電平,可以得到被按下鍵的列位置;得到按鍵的準(zhǔn)確位置后,通過向操作系統(tǒng)發(fā)送鍵盤消息KEYBD_EVENT,實現(xiàn)一次鍵盤輸入。循環(huán)掃描鍵盤,直到按鍵被彈起則發(fā)送KEYEVENTF_KEYUP事件。響應(yīng)鍵盤中斷輸入的整個流程如圖。3.1 在OAL層加入中斷源矩陣鍵盤采用4路I/O口中斷,每路中斷對應(yīng)1個中斷源。矩陣鍵盤驅(qū)動首先要在OAL層加入這些中
溫馨提示
- 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 大數(shù)據(jù)背景下C銀行個人住房貸款業(yè)務(wù)客戶管理優(yōu)化研究
- 基于高速光電二極管陣列的GaN驅(qū)動集成電路設(shè)計
- Ni基CO2高效電還原催化劑的結(jié)構(gòu)調(diào)控與性能研究
- 新型量子算法設(shè)計
- 課題開題報告:五育融合視域下地方“桂花文化”融入高職美育課程的設(shè)計與實施研究
- 農(nóng)村家庭文化資本與初中英語學(xué)習(xí)效果關(guān)系的研究
- 課題開題報告:網(wǎng)絡(luò)教研實踐研究
- 課題開題報告:體育美育促進(jìn)心理健康實踐研究
- 2025年壓力監(jiān)測裝置項目經(jīng)濟(jì)效益評估報告
- 小學(xué)六年級暑假復(fù)習(xí)安排
- 醫(yī)院各科室工作制度
- GA/T 1582-2019法庭科學(xué)視覺功能障礙鑒定技術(shù)規(guī)范
- 農(nóng)業(yè)技術(shù)培訓(xùn)-番茄栽培
- 氫化物發(fā)生器課件
- 衛(wèi)生事業(yè)管理名詞解釋
- 景觀細(xì)節(jié)品質(zhì)提升做法匯編課件
- 急診護(hù)患溝通技巧-急診科課件
- 人力資源服務(wù)許可證、勞務(wù)派遣經(jīng)營許可證年檢報告書
- 內(nèi)科學(xué)教學(xué)課件:腦梗死
- 消防主機(jī)EST3操作手冊
- 第九章+城市廣場設(shè)計ppt
評論
0/150
提交評論