微机原理课程设计报告书-两台PC机之间进行串口通信.doc_第1页
微机原理课程设计报告书-两台PC机之间进行串口通信.doc_第2页
微机原理课程设计报告书-两台PC机之间进行串口通信.doc_第3页
微机原理课程设计报告书-两台PC机之间进行串口通信.doc_第4页
微机原理课程设计报告书-两台PC机之间进行串口通信.doc_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

一、课程设计题目 两台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脚直接连接,焊接。电缆长度一米。(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状态寄存器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)波特率高八位波特率低八位5009h00h30001h80h60000hc0h240000h30h480000h18h960000h0ch1920000h06h3840000h03h5760000h02h11520000h01h 以下几个表格为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允许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用来指示是否有中断发生,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工作,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位停止位(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用来设定数据长度。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时标示仅发送保持寄存器空,此时,可以由软件发送下一数据。当线路状态为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,无需硬件握手信号。 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控制寄存器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_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基地址*/#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_none 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 far 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;char 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,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(%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(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) 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); /*允许接收数据就绪中断,关闭其它中断*/ 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); 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();/*允许中断*/*-关闭串口-*/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); 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) & 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(j5)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); main();/*写入ocw2,向8259发普通eoi指令

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论