串行通信实验串行通信实验
实验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,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。