




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、一、課程設計題目 兩臺pc機之間進行串口通信。二、課程設計目的與要求 通過本次實訓,加強學生們對微機原理與接口技術這門課程的理解和掌握,同時了解并掌握8250串口芯片和中斷管理芯片8259的初始化編程和使用。1.目的: 倆個pc機通過串行口互聯,實現文件的無差錯傳輸。2.基本要求:(1) pc機使用8250串口芯片。中斷管理芯片使用8259 (2)要求用c語言或匯編語言完成程序的設計。(3)程序必須用中斷方式來實現。(4)在u盤上自備turbo c 2.0編譯環境。因為機房的計算機(c和d盤要還原)安裝有還原卡。(5)自購db9p 公插頭二個,2,3腳交叉連線,5腳直接連接,焊接。
2、電纜長度一米。(6)不準帶電拔插串行口插頭。 三、實現方法 1. 8250的初始化依據 8250(16550)的寄存器如下表所示:基地址讀/寫寄存器縮寫注 釋0write-發送保持寄存器(dlab=0)0read-接收數據寄存器(dlab=0)0read/write-波特率低八位(dlab=1)1read/writeier中斷允許寄存器1read/write-波特率高八位(dlab=1)2readiir中斷標識寄存器2writefcrfifo控制寄存器3read/writelcr線路控制寄存器4read/writemcrmodem控制寄存器5readlsr線路狀態寄存器6readmsrmode
3、m狀態寄存器7read/write-scratch register pc機支持1-4個串行口,即com1-com4,其基地址在bios數據區0000:0400-0000:0406中描述,對應地址分別為3f8/2f8/3e8/2e8,com1及com3使用pc機中斷4,com2及com4使用中斷3。 在上表中,8250共有12個寄存器,使用了8個地址,其中部分寄存器共用一個地址,由dlab=0/1來區分,在dlab=1用于設定通訊所需的波特率。常用的波特率參數見下表:速率(bps)波特率高八位波特率低八位5009h00h30001h80h60000hc0h240000h30h480000h18
4、h960000h0ch1920000h06h3840000h03h5760000h02h11520000h01h 以下幾個表格為8250的寄存器的功能描述: 中斷允許寄存器(ier):位注 釋7未使用6未使用5進入低功耗模式(16750)4進入睡眠模式(16750)3允許modem狀態中斷2允許接收線路狀態中斷1允許發送保持器空中斷0允許接收數據就緒中斷 bit0置1將允許接收到數據時產生中斷,bit1置1時允許發送保持寄存器空時產生中斷,bit2置1將在lsr變化時產生中斷,相應的bit3置位將在msr變化時產生中斷。中斷識別寄存器(iir):位注 釋bit6:7=00無fifobit6:7
5、=01允許fifo,但不可用bit6:7=11允許fifobit5允許64字節fifo(16750)bit4未使用bit316550超時中斷bit2:1=00modem狀態中斷(cts/ri/dtr/dcd)bit2:1=01發送保持寄存器空中斷bit2:1=10接收數據就緒中斷bit2:1=11接收線路狀態中斷bit0=0有中斷產生bit0=1無中斷產生iir為只讀寄存器,bit6:7用來指示fifo的狀態,均為0時則無fifo,此時為8250或16450芯片,為01時有fifo但不可以使用,為11時fifo有效并可以正常工作。bit3用來指示超時中斷(16550/16750)。 bit0用
6、來指示是否有中斷發生,bit1:2標識具體的中斷類型,這些中斷具有不同的優先級別,其中lsr中斷級別最高,其次是數據就緒中斷,然后是發送寄存器空中斷,而msr中斷級別最低。fifo控制寄存器(fcr):位注 釋bit7:6=001byte產生中斷bit7:6=014byte產生中斷bit7:6=108byte產生中斷bit7:6=1114byte產生中斷bit5允許64字節fifobit4未使用bit3dma模式選擇bit2清除發送fifobit1清除接收fifobit0允許fifo fcr可寫但不可以讀,該寄存器用來控制16550或16750的fifo寄存器。bit0置1將允許發送/接收的f
7、ifo工作,bit1和bit2置1分別用來清除接收及發送fifo。清除接收及發送fifo并不影響移位寄存器。bit1:2可自行復位,因此無需使用軟件對其清零。bit6:7用來設定產生中斷的級別,發送/接收中斷將在發送/接收到對應字節數時產生。線路控制寄存器(lcr):位注 釋bit7=1允許訪問波特率因子寄存器bit7=0允許訪問接收/發送及中斷允許寄存器bit6設置間斷,0-禁止,1-設置bit5:3=xx0無校驗bit5:3=001奇校驗bit5:3=011偶校驗bit5:3=101奇偶保持為1bit5:3=111奇偶保持為0bit2=01位停止位bit2=12位停止位(數據位6-8位),
8、1.5位停止位(5位數據位)bit1:0=005位數據位bit1:0=016位數據位bit1:0=107位數據位bit1:0=118位數據位 lcr用來設定通訊所需的一些基本參數。bit7為1指定波特率因子寄存器有效,為0則指定發送/接收及ier有效。bit6置1會將發送端置為0,這將會使接收端產生一個“間斷”。bit3-5用來設定是否使用奇偶校驗以及奇偶校驗的類型,bit3=1時使用校驗,bit4為0則為奇校驗,1為偶校驗,而bit5則強制校驗為1或0,并由bit4決定具體為0或1。bit2用來設定停止位的長度,0表示1位停止位,為1則根據數據長度的不同使用1.5-2位停止位。bit0:1用
9、來設定數據長度。modem控制寄存器(mcr):位注 釋bit7未使用bit6未使用bit5自動流量控制(僅16750)bit4環路測試bit3輔助輸出2bit2輔助輸出1bit1設置rtsbit0設置dsr mcr寄存器可讀可寫,bit4=1進入環路測試模式。bit3-0用來控制對應的管腳。線路狀態寄存器(lsr):位注 釋bit7fifo中接收數據錯誤bit6發送移位寄存器空bit5發送保持寄存器空bit4間斷bit3幀格式錯bit2奇偶錯bit1超越錯bit0接收數據就緒 lsr為只讀寄存器,當發生錯誤時bit7為1,bit6為1時標示發送保持及發送移位寄存器均空,bit5為1時標示僅發
10、送保持寄存器空,此時,可以由軟件發送下一數據。當線路狀態為0時bit4置位為1,幀格式錯時bit3置位為1,奇偶錯和超越錯分別將bit2及bit1置位為1。bit0置位為1表示接收數據就緒。modem狀態寄存器(msr):位注 釋bit7載波檢測bit6響鈴指示bit5dsr準備就緒bit4cts有效bit3dcd已改變bit2ri已改變bit1dsr已改變bit0cts已改變 msr寄存器的高4位分別對應modem的狀態線,低4位表示modem的狀態線是否發生了變化。 以上我們詳細介紹了pc機的串行通訊硬件環境,以下將分別給出使用查詢及中斷驅動的方法編寫的串行口驅動程序。這些程序僅使用rxd
11、/txd,無需硬件握手信號。 2. 程序源代碼和部分注釋#include <dos.h>#include <bios.h>#include <stdio.h>#include <math.h>#include <conio.h>#define ser_rbr 0 /*接收緩沖寄存器rbr(讀) dlab=0*/#define ser_thr 0 /*發送保持寄存器thr(寫) dlab=0*/#define ser_ier 1 /*中斷允許寄存器ier(讀/寫) dlab=0*/#define ser_iir 2 /*中斷識別寄存器i
12、ir (讀)*/#define ser_lcr 3 /*通信線路控制寄存器lcr (讀/寫)*/#define ser_mcr 4 /*model控制寄存器mcr (讀/寫)*/#define ser_lsr 5 /*通信線路狀態寄存器lsr (讀)*/#define ser_msr 6 /*modem狀態寄存器msr (讀)*/#define ser_dll 0 /*除數鎖存器(波特率低8位)dll(讀/寫) dlab=1*/#define ser_dlh 1 /*除數鎖存器(波特率高8位)dlh(讀/寫) dlab=1*/*8250使用1.8432mhz的基準時鐘輸入,所以除數=18432
13、00/(b*16)*/#define ser_baud_1200 96 /*波特率為1200時,波特率因子(除數)為96*/#define ser_baud_2400 48 /*波特率為2400時,波特率因子(除數)為48*/#define ser_baud_9600 12 /*波特率為9600時,波特率因子(除數)為12*/#define ser_baud_19200 6 /*波特率為19200時,波特率因子(除數)為6*/#define com_1 0x3f8 /*com1口 8250內部寄存器基地址*/#define com_2 0x2f8 /*com2口 8250內部寄存器基地址*/*
14、/#define com_3 0x3e8 /*com3口 8250內部寄存器8250基地址*/#define com_4 0x2e8 /*com4口 8250內部寄存器8250基地址*/#define ser_stop_1 0 /* 1位停止位*/#define ser_stop_2 4 /* 2位停止位*/#define ser_bits_5 0 /* 5位數據位*/#define ser_bits_6 1 /* 6位數據位*/#define ser_bits_7 2 /* 7位數據位*/#define ser_bits_8 3 /* 8位數據位*/#define ser_parity_no
15、ne 0 /*無校驗*/#define ser_parity_odd 8 /*奇校驗*/#define ser_parity_even 24 /*偶校驗*/#define ser_div_latch_on 128 /*dlab=1*/#define pic_imr 0x21 /*中斷屏蔽寄存器*/#define pic_icr 0x20 /*中斷控制寄存器*/ #define int_ser_port_0 0x0c /*com1與com3中斷向量編號*/#define int_ser_port_1 0x0b /*com2與com4中斷向量編號*/*函數聲明*/void interrupt fa
16、r serial_isr();void interrupt far serial_file();open_serial(int port_base, int baud, int configuration);close_serial(int port_base);/*全局變量定義,可在各函數間傳遞參數*/void interrupt far (*old_isr)(); /* old_isr保存原來的串口中斷向量*/int old_int_mask; /*保存原來的中斷屏蔽寄存器的值*/int open_port; /*當前打開的串口編號*/unsigned char s80;int j=0;c
17、har ch=0;int done=0;main()char press; char i; char fname80; char fn80; /*初始化com1端口*/open_serial(com_1,ser_baud_1200,ser_parity_even|ser_bits_8|ser_stop_1); printf("com:1;bps:1200;parity:even;bits:8;stop bit:1"); printf("press any key to begin sendingn"); enable();/*開中斷*/memset(s,
18、0,sizeof(s);/初始化s為零,指針指向swhile(1)printf("serial communicationn");printf("1.send charn");printf("2.accept charn");printf("3.send filen");printf("4.accept filen");printf("5.exitn");printf("please select number!n");i=getch();printf(&
19、quot;%cn",i);switch(i)case '1': printf("please enter a char:n"); press=getch(); serial_write(press); break;case '2': serial_isr(); break;case '3': printf("please enter the file name to be sent:n"); scanf("%s",&fname); serial_write_file(f
20、name); break;case '4': printf("please enter the file name to preserve:n"); scanf("%s",&fn); serial_file(fn); break; case '5': exit(0); close_serial(com_1);/*關閉串口com1*/ break;default: printf("error!"); break;/*-初始化串口-*/open_serial(int port_base, int b
21、aud, int configuration) open_port = port_base; disable();/*關閉中斷*/ outp(port_base + ser_lcr, ser_div_latch_on);/*dlab=1*/ outp(port_base + ser_dll, baud); /*通過設置波特率因子來確定波特率*/ outp(port_base + ser_dlh, 0);outp(port_base + ser_lcr, configuration); /*通信方式設定,同時dlab=0*/ outp(port_base + ser_ier, 1); /*允許接
22、收數據就緒中斷,關閉其它中斷*/ if(port_base = com_1|port_base=com_3) /*保存串口1、3原來的中斷向量,以便在退出程序時恢復*/ old_isr =getvect(int_ser_port_0); /*為串口設置新的中斷向量,在發生中斷時就會調用執行用戶所指定的中斷服務程序*/ setvect(int_ser_port_0, serial_isr); printf("nopening com port #1/3.n"); else /*功能與上面的代碼類似,只是處理的對象是串口2、4*/ old_isr =getvect(int_se
23、r_port_1); setvect(int_ser_port_1, serial_isr); printf("nopening com port #2/4.n"); old_int_mask = inp(pic_imr);/*讀入中斷屏蔽寄存器的值*/ /*對應位為0則允許該中斷,允許3(串口1中斷)、4(串口2中斷)而不影響其它中斷的屏蔽狀態*/ outp(pic_imr, (port_base=com_1) ? (old_int_mask & 0xef) : (old_int_mask & 0xf7 ); enable();/*允許中斷*/*-關閉串口
24、-*/close_serial(int port_base) outp(port_base + ser_mcr, 0); outp(port_base + ser_ier, 0);/*禁止所有串口中斷*/ outp(pic_imr, old_int_mask );/*恢復原來的中斷屏蔽狀態*/ if(port_base = com_1) setvect(int_ser_port_0, old_isr);/*恢復原來的串口中斷向量*/ printf("nclosing com port #1.n"); else setvect(int_ser_port_1, old_isr)
25、; printf("nclosing com port #2.n"); /*-寫串口-*/serial_write(char ch) while(!(inp(open_port + ser_lsr) & 0x20)/*如串口不空閑,則循環等待*/ disable();/*當上面條件不等,說明串口空閑,退出循環*/ outp(open_port + ser_thr, ch); /*開始發送數據*/ enable();/*開中斷*/*-寫文件-*/serial_write_file()file *fp;while(!(inp(open_port + ser_lsr) &
26、amp; 0x20)/*如串口不空閑,則循環等待*/disable();fp=fopen(fname,"rb"); if(fp=null) printf("failure to open the file!n"); return; while(ch=fgetc(fp)!=eof() outp(open_port + ser_thr, ch); fclose(fp); enable();/*-串口中斷服務程序-*/void interrupt far serial_isr()char ch;int x=inp(0x3fd);/讀出線路狀態寄存器的值給變量xint j=1;disable(); while(j<5)x=inp(0x3fd);if(x & 0x01)=1) ch=inp(0x3f8); /*開始接受數據*/ sj=ch; printf("%d-%cn",j,ch); j+;j=j%50; j=1;enable();outp(pic_icr,0x20); mai
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 產品特性分析培訓
- 中小學生心理健康教育整體方案
- 代駕安全責任協議書
- 鏟車銷售、維修與保養服務合同
- 燒烤連鎖品牌加盟管理合同
- 房地產開發企業財務代理記賬及土地增值稅合同
- 礦山安全標志牌設計制作及銷售合同
- 車輛保養與道路救援服務合作協議
- 離婚時遺產繼承與財產分割協議書
- 茶葉拍賣會組織與委托合同
- GB/T 5497-1985糧食、油料檢驗水分測定法
- GB/T 24218.1-2009紡織品非織造布試驗方法第1部分:單位面積質量的測定
- GB/T 19089-2003橡膠或塑料涂覆織物耐磨性的測定馬丁代爾法
- GB/T 18443.1-2010真空絕熱深冷設備性能試驗方法第1部分:基本要求
- 二三級醫院放射科要求
- 危大工程巡視檢查記錄表(深基坑)
- 鋼網架結構安裝、拼裝施工方案
- Q∕SY 05262-2019 機械清管器技術條件
- 2022年社會學概論考試重點廣東海洋
- 二級建造師法規課件
- 早產兒出院后喂養(課堂PPT)
評論
0/150
提交評論