984724294微机原理课程设计报告书两台PC机之间进行串口通信.doc

上传人:仙人指路1688 文档编号:2386404 上传时间:2023-02-17 格式:DOC 页数:11 大小:127KB
返回 下载 相关 举报
984724294微机原理课程设计报告书两台PC机之间进行串口通信.doc_第1页
第1页 / 共11页
984724294微机原理课程设计报告书两台PC机之间进行串口通信.doc_第2页
第2页 / 共11页
984724294微机原理课程设计报告书两台PC机之间进行串口通信.doc_第3页
第3页 / 共11页
984724294微机原理课程设计报告书两台PC机之间进行串口通信.doc_第4页
第4页 / 共11页
984724294微机原理课程设计报告书两台PC机之间进行串口通信.doc_第5页
第5页 / 共11页
点击查看更多>>
资源描述

《984724294微机原理课程设计报告书两台PC机之间进行串口通信.doc》由会员分享,可在线阅读,更多相关《984724294微机原理课程设计报告书两台PC机之间进行串口通信.doc(11页珍藏版)》请在三一办公上搜索。

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线路状态寄存器6ReadMSRMODEM状态寄存器

3、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)波特率高八位波特率低八位5009h00h30001h80h60000hC0h240000h30h480000h18h96000

4、0h0Ch1920000h06h3840000h03h5760000h02h11520000h01h 以下几个表格为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=01允许F

5、IFO,但不可用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将允许发送/接收的FIFO工作,

7、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位),1.5位停止

8、位(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/TXD,无

11、需硬件握手信号。 2. 程序源代码和部分注释#include #include #include #include #include #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 /*中断识别寄存器IIR (读)*/#define SER_LCR 3 /*通信线路控制寄存器LCR (读/写)*/#define SER_MCR 4 /*Model控制寄存

12、器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的基准时钟输入,所以除数=1843200/(B*16)*/#define SER_BAUD_1200 96 /*波特率为1200时,波特率因子(除数)为96*/#define SER_BAU

13、D_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内部寄存器基地址*/*/#define COM_3 0x3E8 /*COM3口 8250内部寄存器8250基地址*/#define COM_4 0x2E8 /*COM4口 82

14、50内部寄存器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_NONE 0 /*无校验*/#define SER_PARITY_ODD 8 /*奇校验*/#define SER_PARITY_EVEN 24 /*偶校验*

15、/#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 far Serial_Isr();void interrupt far Serial_File();Open_Serial(int port_base, in

16、t 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;char ch=0;int done=0;main()char press; char i; char fname80; char fn80; /*初始化C

17、OM1端口*/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,0,sizeof(s);/初始化s为零,指针指向swhile(1)printf(Serial Communicationn);printf(1.Send Charn);printf(2.Accept C

18、harn);printf(3.Send Filen);printf(4.Accept Filen);printf(5.Exitn);printf(please select number!n);i=getch();printf(%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); scan

19、f(%s,&fname); Serial_Write_File(fname); 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 baud, int configuration) ope

20、n_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); /*允许接收数据就绪中断,关闭其它中断*/ if(port_ba

21、se = 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_SER_PORT_1); setvect(INT_SER_PORT_1, Seri

22、al_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();/*允许中断*/*-关闭串口-*/Close_Serial(int port_base) outp(port_base + SER_MCR, 0)

23、; 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); printf(nClosing Com Port #2.n); /*-写串口-*/Serial_Write(char ch) while(

24、!(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) & 0x20)/*如串口不空闲,则循环等待*/disable();fp=fopen(fname,rb); if(fp=NULL) printf(Failure to open

25、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(j5)x=inp(0x3fd);if(x & 0x01)=1) ch=inp(0x3F8); /*开始接受数据*/ sj=ch; printf(%d-%cn,j,ch); j+;j

26、=j%50; j=1;enable();outp(PIC_ICR,0x20); main();/*写入OCW2,向8259发普通EOI指令*/void interrupt far Serial_File() FILE *p; char ch; int x=inp(0x3fd); int j=1; p=fopen(fn,w);/用写入的方式打开当前目录名为fn的文件 disable(); while(j1000)/从1循环到999x=inp(0x3fd);/再次读出变化后的线路状态寄存器的值给变量Xif(x & 0x01)=1) ch=inp(0x3F8); /*开始接受数据*/ sj=ch;/

27、将值给数组sj j在循环 fputc(ch,p);/*将ch中的字符输出到p指针中 ,也就是文件fn中*/ j+; j=j%50; j=1;enable();outp(PIC_ICR,0x20); fclose(fp); /*写入OCW2,向8259发普通EOI指令*/ 3. 程序流程图 程序开始初始化串口主菜单传送字符传送文件接收文件退出接收字符输入一个要 发送的字符符接收完毕返 回主菜单 输入一个要 发送的文件名符输入一个要 保存的文件名符关闭串口发送完毕返 回主菜单 文件不存在 返回主菜单那回主菜单 发送完毕返 回主菜单 接收完毕返 回主菜单 程序结束 四.实训体会经过一个星期的上机实践

28、学习,使我对微机原理与接口技术这门课程有了更进一步的认识和了解,要想学好它要重在实践,要通过不断的对硬件操作才能更好地学习它,通过实践,我也发现我的好多不足之处,首先是自己在编程上比较差,对一些函数的认识和运用还不是很熟悉,其中曾遇到过很多问题,不过通过这次学习也有所改进;再有对8250的一些寄存器不太了解。通过实践,使我在这几个方面的认识有所提高。通过实践的学习,我认到学好计算机要重视实践操作,不仅仅是学习微机原理这门课程,还是其它的课程,以及其它的计算机方面的知识都要重在实践,所以后在学习过程中,我会更加注视实践操作,使自己便好地学好计算机。备注:由于设计的时间比较短暂,程序功能不是很完善,请老师批评指正!

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号