您好,欢迎来到易榕旅网。
搜索
您的当前位置:首页串行通信实验

串行通信实验

来源:易榕旅网
实验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相连

四、程序框图 程序方框图

N 结束? Y 结束!

显示接收的数据 PC机发送 实验板接收 实验板发送 PC机接收 0=#include #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\ //表明此空间为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

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- yrrd.cn 版权所有

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务