ImageVerifierCode 换一换
格式:DOCX , 页数:16 ,大小:50.09KB ,
资源ID:3504401      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/3504401.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(微机原理课程设计报告书两台PC机之间进行串口通信.docx)为本站会员(b****3)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

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

1、微机原理课程设计报告书两台PC机之间进行串口通信一、课程设计题目 两台PC机之间进行串口通信。二、课程设计目的与要求 通过本次实训,加强学生们对微机原理与接口技术这门课程的理解和掌握,同时了解并掌握8250串口芯片和中断管理芯片8259的初始化编程和使用。1.目的: 俩个PC机通过串行口互联,实现文件的无差错传输。2.基本要求:(1) PC机使用8250串口芯片。中断管理芯片使用8259 (2)要求用C语言或汇编语言完成程序的设计。(3)程序必须用中断方式来实现。(4)在U盘上自备TURBO C 2.0编译环境。因为机房的计算机(C和D盘要还原)安装有还原卡。(5)自购DB9P 公插头二个,2

2、,3脚交叉连线,5脚直接连接,焊接。电缆长度一米。(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线

3、路状态寄存器6ReadMSRMODEM状态寄存器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)波特率高八位波特率低八位5009h00h30001h80h60000hC0h2

4、40000h30h480000h18h960000h0Ch1920000h06h3840000h03h5760000h02h11520000h01h 以下几个表格为8250的寄存器的功能描述: 中断允许寄存器(IER):位注 释7未使用6未使用5进入低功耗模式(16750)4进入睡眠模式(16750)3允许MODEM状态中断2允许接收线路状态中断1允许发送保持器空中断0允许接收数据就绪中断 Bit0置1将允许接收到数据时产生中断,Bit1置1时允许发送保持寄存器空时产生中断,Bit2置1将在LSR变化时产生中断,相应的Bit3置位将在MSR变化时产生中断。中断识别寄存器(IIR):位注 释Bi

5、t6:7=00无FIFOBit6:7=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用来指示超时中断(1

6、6550/16750)。 Bit0用来指示是否有中断发生,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寄存

7、器。Bit0置1将允许发送/接收的FIFO工作,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位停止位Bit

8、2=12位停止位(数据位6-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则根据数据长度的不同使

9、用1.5-2位停止位。Bit0:1用来设定数据长度。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时标示发送保持及发送移

10、位寄存器均空,Bit5为1时标示仅发送保持寄存器空,此时,可以由软件发送下一数据。当线路状态为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机的串行通讯硬件环境,以下将分别给出使用查询及中断驱动的方法编写的

11、串行口驱动程序。这些程序仅使用RXD/TXD,无需硬件握手信号。 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 (读/写)*/#defi

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

13、(除数)为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内部寄存器基地址*/*/#define COM_3 0x3E8 /*COM3口 8250内部寄存器8250基地址*/#defin

14、e 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_NONE 0 /*无校验*/#define SER_PARITY_ODD 8 /*奇校验*/#define S

15、ER_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 far Serial_Isr();void interrupt far Serial_File();Open_

16、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;char ch=0;int done=0;main()char press; char i; char fn

17、ame80; 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,0,sizeof(s);/初始化s为零,指针指向swhile(1)printf(Serial Communicationn);printf(1.Send

18、Charn);printf(2.Accept Charn);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

19、name to be sent:n); scanf(%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

20、, 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); /*允许接收数据

21、就绪中断,关闭其它中断*/ 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_SER_PORT_1); setv

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

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

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

25、ULL) 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(j5)x=inp(0x3fd);if(x & 0x01)=1) ch=inp(0x3F8); /*开始接受数据*/ sj=c

26、h; printf(%d-%cn,j,ch); j+;j=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=in

27、p(0x3F8); /*开始接受数据*/ sj=ch;/将值给数组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. 程序流程图 四.实训体会经过一个星期的上机实践学习,使我对微机原理与接口技术这门课程有了更进一步的认识和了解,要想学好它要重在实践,要通过不断的对硬件操作才能更好地学习它,通过实践,我也发现我的好多不足之处,首先是自己在编程上比较差,对一些函数的认识和运用还不是很熟悉,其中曾遇到过很多问题,不过通过这次学习也有所改进;再有对8250的一些寄存器不太了解。通过实践,使我在这几个方面的认识有所提高。通过实践的学习,我认到学好计算机要重视实践操作,不仅仅是学习微机原理这门课程,还是其它的课程,以及其它的计算机方面的知识都要重在实践,所以后在学习过程中,我会更加注视实践操作,使自己便好地学好计算机。备注:由于设计的时间比较短暂,程序功能不是很完善,请老师批评指正!

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1