为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

串行通信实验

2017-10-19 11页 doc 43KB 15阅读

用户头像

is_768820

暂无简介

举报
串行通信实验串行通信实验 实验4 串行通信接口实验 一、 实验目的和内容 1( 掌握16C550串行接口芯片的工作原理及编程方法 2( 完成16C550与PC通讯编程实验 二、实验电路及说明 时钟频率1.8432MHz。75189和75188完成16C550一则的TTL电平与RS,232C电平之间转换。写一个以110bit/s速率通讯的程序。 本程序的运行环境不在Windows95下。因为Win95下的驱动程序会拦截中断~故只能在纯DOS下编译~一般为DOS6.22下使用MASM6(0或以下版本。16c550地址80H 三...
串行通信实验
串行通信实验 实验4 串行通信接口实验 一、 实验目的和内容 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相连 四、程序框图 程序方框图 开始 设置PC机的16C550工作状态~110 bit/s~ 1位停止位~奇校验~8位数据 初始化实验主板上的16C550 输入将发送的数据datas sdata N 0= #include #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",iobase0); //表明此空间为IO空间参与PCI总线地址译码 err=getPCIbase1(); iobase1=iobase1&0xfffc; printf("IOBase1=%xH\n",iobase1); err=getPCImembase1(); err=getPCImembase0(); membase0=membase0+membase1<<16; //左移16位~将高位地址变换成双字中的高位字 printf("MEMBase0=%lxH\n",membase0); err=getPCIIRQ(); printf("PCI IRQ = %d\n",err); //////////////////////////////////////////////////////////////////////////// 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",&datas); 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",&judgesr); 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",datar); //显示接收到的数据 printf("\n"); flag3=1; judge=0; printf("Are you want to exit???(y-exit/n-continue):\n"); //判断是否继续 do { scanf("%c",&judge); 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这两个芯片的作用是什么, 用示波器观测MC1488 的2、3脚电平范围~相互关系如何,
/
本文档为【串行通信实验】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索