一、 实验目的和内容
1. 掌握16C550串行接口芯片的工作原理及编程方法 2. 完成16C550与PC通讯编程实验
二、实验电路及说明
时钟频率1.8432MHz。75189和75188完成16C550一则的TTL电平与RS-232C电平之间转换。写一个以110bit/s速率通讯的程序。
本程序的运行环境不在Windows95下。因为Win95下的驱动程序会拦截中断,故只能在纯DOS下编译,一般为DOS6.22下使用MASM6.0或以下版本。16c550地址80H 三、实验步骤
本实验在板上由N与E部分组成,有短路块与跳线两种方式。短路块为缺省方式。下面介绍跳线方式
1、把J79与J19的IRQ相连 2、把J40的短路块去掉 3、通过跳线使J42与J2的Y1相连
四、程序框图 程序方框图
N 结束? Y 结束!
显示接收的数据 PC机发送 实验板接收 实验板发送 PC机接收 0= #include “PCICard.h” int ic_16550_0=0x10,ic_16550_1=0x11,ic_16550_2=0x12, ic_16550_3=0x13,ic_16550_5=0x15; int pc_16550_0=0x3f8,pc_16550_1=0x3f9,pc_16550_2=0x3fa, pc_16550_3=0x3fb,pc_16550_5=0x3fd; void main(void ) { int err,data1,datas,datar,flag1,flag2,flag3,flag4; /////////////////////////////////// char judge,judgesr; void pcsend(); int pcrecieve(); void bdsend(); int bdrecieve(); /////////////////////////////////// err=findPCIcard(); /////////////////////////////////// if (err!=0) printf(\"Can't find the PCI card!!!\"); /////////////////////////////////// err=getPCIbase0(); iobase0=iobase0&0xfffc; //从PCI配置空间读入的与地址空间有关的数据其bit 0位为1, printf(\"IOBase0=%xH\\n\ //表明此空间为IO空间参与PCI总线地址译码 err=getPCIbase1(); iobase1=iobase1&0xfffc; printf(\"IOBase1=%xH\\n\ err=getPCImembase1(); err=getPCImembase0(); membase0=membase0+membase1<<16; //左移16位,将高位地址变换成双字中的高位字 printf(\"MEMBase0=%lxH\\n\ err=getPCIIRQ(); printf(\"PCI IRQ = %d\\n\ //////////////////////////////////////////////////////////////////////////// ic_16550_0=iobase1+ic_16550_0; //获取实验板上16c550的地址 ic_16550_1=iobase1+ic_16550_1; ic_16550_2=iobase1+ic_16550_2; ic_16550_3=iobase1+ic_16550_3; ic_16550_5=iobase1+ic_16550_5; //Set the 16c550 of PC// outport( (1) ); //初始化16c550,写LCR,使DLAB=1, 奇校验,1位停止位, 8位数据 outport( (2) ); //设置波特率为110bit/s,除数=1843200/(B*16) outport( (3) ); outport( (4) ); //写LCR,相同格式;使DLAB=0,允许对发送/接收数据 寄存器和中断允许寄存器进行寻址 outport( (5) );//写中断允许寄存器,禁止所有中断 //Set the 16c550 of big board// outport( (6) ); //初始化16c550,使DLAB=1 outport( (7) ); //设置波特率为110bit/s outport( (8) ); outport( (9) ); //写LCR,相同格式;使DLAB=0,允许对发送/接收数据 outport( (10) );// 禁止中断 flag1=1; do //主循环 { flag2=1; do //判断字符是否在允许范围内的循环 { printf(\"Input the data for sending out(0-255):\\n\"); scanf(\"%d\ if ((datas>=0)&&(datas<=255)) { printf(\"The data is valid!!!\\n\"); flag2=0; } else printf(\"The data is invalid!!!\\n\"); }while (flag2==1); //**************************************** //The choose of the PC send or recieve. //**************************************** printf(\"The PC send or recieve(s-send,r-recieve):\\n\"); flag4=1; do //判断PC机是接收或是发送数据 { scanf(\"%c\ if (judgesr=='s') flag4=0; else if (judgesr=='r') flag4=0; }while (flag4==1); if (judgesr=='s') //PC机发送处理程序 { pcsend(datas); datar=bdrecieve(); } else if (judgesr=='r') //PC机接收处理程序 { bdsend(datas); datar=pcrecieve(); } //**************************************** printf(\"The data recieved is:%d\ //显示接收到的数据 printf(\"\\n\"); flag3=1; judge=0; printf(\"Are you want to exit???(y-exit/n-continue):\\n\"); //判断是否继续 do { scanf(\"%c\ if (judge=='y') { flag1=0; flag3=0; } else if (judge=='n') { flag1=1; flag3=0; } else flag1=1; }while (flag3==1); }while (flag1==1); return; //////////////////////////////////////////////////////////////////////////// } void pcsend(int data) //PC机发送子程序 { int sendreg,flags; flags=1; outport( (11) ); //写发送缓冲器 do { sendreg=inport( (11A) ); //读入传输线状态寄存器 sendreg=sendreg (11B) ; //检测发送缓冲器是否空 if (sendreg== 11C ) //不为空则继续等待 flags=1; else flags=0; //为空则返回主程序 }while(flags==1); return; } void bdsend(int data) { int sendreg,flags; flags=1; outport( (12) ); do{ sendreg=inport( (12A) ); sendreg=sendreg (12B) ; if (sendreg== (12C) ) flags=1; else flags=0; }while(flags==1); return; } int bdrecieve( void ) { int data,flagr; outport( (13) ); //写LCR,相同格式;使DLAB=0,允许对发送/接收 数据寄存器和中断允许寄存器进行寻址 outport( (13A) ); //禁止中断 data=inport( (14) ); //空读一次 flagr=1; do { data=inport( (15) ); //读传输线状态寄存器 data=data (15A) ; //检测接收数据寄存器中是否有数据 if (data== (15B) ) flagr=1; //接收数据寄存器为空,继续等待 else flagr=0; //接收寄存器中有数据,准备读取数据 data=inport( (16) ); //读传输线状态寄存器 data=data (16A) ; //检测通讯是否有错误 if (data!=0) printf(\"Board recieve error!!!\\n\"); //若有错误则显示 }while (flagr==1); data=inport( (17) ); //读入数据 return (data); } int pcrecieve() { int data,flagr; outport( (18) ); outport( (18A) ); data=inport( (19) ); flagr=1; do{ data=inport( (20) ); data=data (20A) ; if (data== (20B) ) flagr=1; else flagr=0; data=inport( (21) ); data=data (21A) ; if (data!=0) printf(\"PC recieve error!!!\\n\"); }while (flagr==1); data=inport( (22) ); return (data); } 思考题: 1、 MC1488、MC1489这两个芯片的作用是什么?的2、3脚电平范围,相互关系如何? 用示波器观测MC1488 因篇幅问题不能全部显示,请点此查看更多更全内容