C语言设计实现RS232标准接口串行通信的应用半双工串行通信的发送方.docx
《C语言设计实现RS232标准接口串行通信的应用半双工串行通信的发送方.docx》由会员分享,可在线阅读,更多相关《C语言设计实现RS232标准接口串行通信的应用半双工串行通信的发送方.docx(21页珍藏版)》请在冰豆网上搜索。
![C语言设计实现RS232标准接口串行通信的应用半双工串行通信的发送方.docx](https://file1.bdocx.com/fileroot1/2023-1/5/4564a0fb-055e-4603-8ee7-a7ce9513b268/4564a0fb-055e-4603-8ee7-a7ce9513b2681.gif)
C语言设计实现RS232标准接口串行通信的应用半双工串行通信的发送方
学号:
课程设计
题目
采用C语言设计实现RS-232标准接口串行通信的应用
(半双工串行通信的发送方)
学院
计算机科学与技术
专业
计算机科学与技术
班级
计算机班
姓名
指导教师
201
年
月
日
接口课程设计任务书
学生姓名专业班级计算机0班
指导老师工作单位计算机科学与技术学院
题目:
采用C语言设计实现RS-232标准接口串行通信的应用
(半双工串行通信的发送方)
一、内容:
通过MIFID微机实验台上的RS-232标准接口与另一台上的RS-232标准接口采用半双工方式进行串行通信。
接口硬件电路图见附录所示。
二、要求:
1、使用定时/计数器8253给可编程串行通信接口8251A提供发送和接收时钟。
发送和接收时钟为TXC,波特率为Baud,波特率因子为Facror,则:
TXC=Baud×Facror。
时钟信号为1.193181MHz(十六进制数为1234DEH),波特率因子为16。
根据自己所选用的波特率计算出定时/计数器8253的计数初值,进而使定时/计数器8253能够提供给串行通信接口8251A与所选用的波特率相匹配的发送和接收时钟。
2、可编程串行通信接口8251A采用查询方式发送数据,数据由键盘输入。
该题的设计者为半双工串行通信的发送方。
3、发送数据以后,数据在CRT上显示和移动到一定的位置。
同时用记录或结构的形式保存发送的数据。
4、在发送数据中,如果键盘输入ESC键,则退出半双工串行通信。
5、设计程序运行时的界面友好。
三、进度安排:
序号
内容
所用时间
1
接口电路设计
2天
2
编写程序
1天
3
调试程序
1天
4
撰写课程设计报告
1天
合计
5天
指导教师签名:
年月日
系主任(责任教师)签名:
年月日
采用C语言设计实现RS-232标准接口
串行通信的应用
(半双工串行通信的发送方)
1.课程设计目的与要求
1.1目的描述
学习完《微型计算机接口与应用》这门专业课后,对计算机接口的组成和功能有了一定的了解,对其的使用方法有了一定的掌握;基于此,在通过MIFID微机实验台上的RS-232标准接口与另一台上的RS-232标准接口采用半双工方式进行串行通信。
1.2要求描述
此次采用C语言实现RS-232标准接口串行通信的应用(半双工串行通信的发送方主要功能有:
[1].使用定时/计数器8253给可编程串行通信接口8251A提供发送和接收时钟。
发送和接收时钟为TXC,波特率为Baud,波特率因子为Facror,则:
TXC=Baud×Facror。
时钟信号为1.193181MHz(十六进制数为1234DEH),波特率因子为16。
根据自己所选用的波特率计算出定时/计数器8253的计数初值,进而使定时/计数器8253能够提供给串行通信接口8251A与所选用的波特率相匹配的发送和接收时钟。
[2].可编程串行通信接口8251A采用查询方式发送数据,数据由键盘输入。
该题的设计者为半双工串行通信的发送方。
[3].发送数据以后,数据在CRT上显示和移动到一定的位置。
同时用记录或结构的形式保存发送的数据。
[4].在发送数据中,如果键盘输入ESC键,则退出半双工串行通信。
[5].设计程序运行时的界面友好。
2.设计分析
2.1背景知识
2.1.1串行通信
从以下几个方面来介绍串行通信:
1.串行通信
把组成信息的各个码位在同一根传输线上,从低位到高位,逐位地、顺序地进行传送。
2.串行通信的特点
Ø串行通信节省传送线,串行传送的速度慢;
Ø信息格式有固定的要求,分异步和同步信息格式;
Ø串行传送中对信号的逻辑定义与TTL不兼容,因此,需要进行逻辑关系和逻辑电平转换;
Ø串行传送信息的速率需要控制,要求双方约定通信传输的波特率;
Ø利用软件或硬件方法进行串并行转换。
3.串行通信的数据传送方式
图—2.1.1-1串行通信的数据传送方式
4.串行通信的数据传送速率
1)数据信号传输速率(DCE与DTC之间)
比特率:
每秒钟传输的二进制数据的位(bit)数,单位为bps;
2)电信号传输速率(DCE与DCE之间)
波特率:
每秒传输的波特数(电信号变化的速度),反映单位时间内真正传输的数据量;
最常用的标准波特率是110,300,600,1200,24004800,9600和19200b/s。
5.串行通信的收发
串行通信中,发送器需要用一定频率的时钟信号来决定发送的每一位数据所占用的时间长度,接收器也需要用一定频率的时钟信号来检测每一位输入的数据
发送时钟:
发送器使用的时钟信号;
接收时钟:
接收器使用的时钟信号。
发送:
发送器在发送时钟(下降沿)作用下将移位寄存器的数据按位串行移位输出;
接收:
接收器在接收时钟(上升沿)作用下对接收数据位采样,并按位串行移入移位寄存器。
6.串行通信通信方式
异步通信方式
图—2.1.1-2串行通信的异步通信方式帧格式
同步通信方式
图—2.1.1-3串行通信的同步通信方式帧格式(面向字符的同步协议)
图—2.1.1-4串行通信的同步通信方式帧格式(面向比特的同步协议)
2.1.2串行接口标准EIARS-232C
EIARS-232C是由美国电子工业协会EIA(ElectronicIndustryAssociation)在1969年颁布的一种串行物理接口标准。
RS-232-C标准最初是远程通信连接数据终端设备DTE(DataTerminalEquipment)与数据通信设备DCE(DataCommunicationEquipment)而制定的。
1.RS-232C的电气特性
在TxD和RxD数据上:
逻辑1(MARK)=-3~-15V
逻辑0(SPACE)=+3~+15V
在RTS、CTS、DSR、DTR和DCD等控制线上:
信号有效(接通,ON状态)=+3~+15V
信号无效(断开,OFF状态)=-3~-15V
EIA-RS-232C与TTL转换:
发送器:
MC1488、SN75150芯片接收器:
MC1489、SN75154芯片MAX232芯片可完成TTL-EIA双向电平转换。
2.RS-232C的机械特性
图—2.1.2-1EIA-RS-232C的机械特性
3.RS-232C信号功能
DSR数据装置准备好(Datasetready)MODEM处于可以使用的状态。
DTR数据终端准备好(Datasetready)表明数据终端可以使用。
这对RTS/CTS请求应答联络信号是用于半双工MODEM系统中作发送方式和接收方式之间的切换。
RTS请求发送(Requesttosend-表示DTE请求DCE发送数据,它用来控制MODEM是否要进入发送状态。
CTS允许发送(Cleartosend)表示DCE准备好接收DTE发来的数据,是对请求发送信号RTS的响应信号。
RLSD接收线信号检出(ReceivedLinesignaldetection-)表示DCE已接通通信链路。
此线也叫数据载波检出(DataCarrierdetection-DCD)线。
RI振铃指示(Ringing)--当MODEM收到交换台送来的振铃呼叫信号时,通知终端,已被呼叫。
TxD发送数据(Transmitteddata-)通过TxD线终端将串行数据发送到MODEM
RxD接收数据(Receiveddata-)通过RxD线终端接收从MODEM发来的串行数据
有两根地线SG、PG--信号地和保护地信号线,无方向。
2.2接口芯片介绍
2.2.1可编程串行接口芯片8251A
8251A是可编程的串行通信接口,它可以管理信号变化范围很大的串行数据通信,适合作异步起止式数据格式和同步面向字符数据格式的接口,其功能很强。
1.8251A的主要特性
1)可用于同步和异步传送、接收。
2)同步5–8bit/字符,内同步或外同步,可自动插入同步字符(只能面向字符)。
3)异步:
5一8bit/字符,时钟速率为通信波特率的1,16,64倍。
可产生1,1.5或2位的停止位。
4)可自动产生、检测和处理中止字符。
5)波特率:
0-19.2kbps(异步)0-64kbps(同步)。
6)完全双工、双缓冲发送/接收器。
7)错误检测:
具有奇偶错、溢出和帧错误等检测能力。
8)全部输入/输出与TTL兼容,十5V供电,28只引脚。
2.8251A内部结构及引脚图
图—2.2.1-18251A内部结构及引脚图
3.8251A的控制字
8251A有一个方式命令字和一个工作命令字,它们的结构及含义如下图所示:
方式命令字:
图—2.2.1-28251A的方式命令字
D1D0确定工作于同步方式还是异步方式。
00为同步方式,方式控制字后必须装入同步字符,并由同一个方式控制字规定装入单同步字符还是双同步字符;D1D0≠00为异步方式,有3种组合来选择输入的时钟频率与波特率之间的系数。
D3D2确定每个字符的数据位(不包括奇偶校验位)。
D5D4确定是否校验和奇偶校验的性质。
×0=无校验01=奇校验11=偶校验
D7D6因同步方式或异步方式而异。
异步方式(D1D0≠00)时:
用来确定停止位个数。
同步方式时D6用来确定是内(SYNDET为输出)还是外同步(SYNDET为输入),D7用来确定同步字符个数。
外同步方式时,同步字符只用于发送。
工作命令字:
图—2.2.1-38251A的工作命令字
D0:
设置为1允许8251A开始发送操作。
只有命令字的D0=1,TxDRY才可能有效(为1)。
D1:
设置为1强制引脚DTR有效,表示数据终端准备好,通知调制解调器:
8251A已准备好
D2:
设置为1允许接收数据,D2=0禁止接收数据。
D3:
设置为1迫使TxD端发送低电平,以此作断点字符。
D4:
为1则对状态字的所有操作出错标志(FE,OE,PE)复位。
D5:
设置为1强制RTS引脚有效,向调制解调器提出发送请求。
D6:
为1强制8251A内部复位,使之回到准备接收方式字的状态。
D7:
用于同步方式。
为使8251A进入同步搜索操作,将输入的信息和同步字符比较,一致则使SYNDET/BRKDET引脚有效,开始对数据的接收操作。
2.2.2可编程定时/计数器8253A
8253A是可编程/定时计数器芯片,主要实现对输入的时钟频率,按照技术初值,输出一定频率的波形,实现分频和计数功能。
1.8253A的主要特性
1)8253A具有三个独立的16位计数器(0号-2号通道);
2)每个通道有6种工作方式,其中常用方式2、3实现分频;
3)可以进行二进制或十进制计数,计数方式为减1计数。
2.8253A内部结构及引脚图
图—2.2.2-18253A内部结构及引脚图
3.8253A的控制字
8253A有三个数据口,分别向0号、1号、2号技术其送初值,一个命令口,用于写初始化方式命令控制字。
图—2.2.2-28253A控制字
D7D6用于选择计数器:
000号计数器;011号计数器;102号计数器。
D5D4控制读写格式:
00锁存命令;01仅读/写一个低位字节;10仅读/写一个低位字节;11读/写两个字节,先是低字节,后是高字节。
D3D2D1工作方式选择:
0000方式;0011方式;0102方式;0113方式;1004方式;1015方式。
D0制定计数器的码制:
0二进制;1十进制。
2.2.3可编程并行接口8255A
1.8255A的主要特性
1)有三个输入输出端口:
端口A,端口B,端口C
2)每个端口可编程设定为输入端口或输出端口,并可设定为不同的工作方式。
3)端口C可作为一个独立的端口使用,但常常是配合A口和B口工作,为这两个端口的输入输出操作提供联络信号。
2.8255A内部结构及引脚图
图—2.2.3-18251A内部结构及引脚图
3.8255A的控制字
1
D6
D5
D4
D3
D2
D1
D0
1特征位:
1方式控制命令;0C口按位置位/复位命令字;
D6D5A组的工作方式:
000方式;011方式;102方式;11不用;
D4A口输入输出控制:
0输出;1输入;
D3C口PC4-7输入输出控制:
0输出;1输入;
D2B组的工作方式:
00方式;11方式;
D1B口输入输出控制:
0输出;1输入;
D4C口PC0-3输入输出控制:
0输出;1输入;
2.3硬件平台设计
2.3.1MFID实验平台
此次课程设计的硬件平台有:
PC一台,MFID实验平台;基于MFID实验平台的,串行通信接口电路原理如下图所示,所有使用串行接口的外设都共用MFID平台板上的这一硬件资源进行通信主要连线如下:
图—2.3.1-1MFID平台硬件资源进行通信主要连线
2.3.2硬件连接和跳线设置
1)将8255的PC6连到8253的GATE2口,当使用8255的C口按位置位/复位命令字将PC6置1时,就可以了启动8253的2号计数器工作。
2)将8253的OUT2口连接到8251的接收/发送时钟,给8251提供接收发送时钟。
跳线设置如下表:
跳线名称
跳接
说明
JP1
2,3
零MODEMN
JP2
2,3
选择RS232协议
JP3
空/RxD,TxD
双机通信/自收发
JP4
跳接/空
OUT2供收发时钟/自供时钟
JP11
1,2
PC6接GATE2
3.详细设计
3.1初始化程序
3.1.18251A初始化
8251A初始化过程分为三步:
1)写工作命令字,硬件(RESET)或软件(命令字D6=1)复位;即工作命令字为:
40H
2)写方式命令字,若为异步方式,即写异步方式字;若为同步方式:
单同步送同步字符;双同步先送同步字符1,后送同步字符2
3)写工作命令字,本课程设计命令字为:
27H;即发送请求允许,即是RTS有效,接收/发送允许,数据终端准备好。
3.1.28253A初始化
8253A初始化过程分为两步:
1)写方式命令控制字,本课程设计选择2号计数器,读取两个字节,3方式,二进制计数;即工作命令字为:
B6H;
2)写计数初值本程序技术初值为:
i=clk/bps;i=i/factor;clk为输入时钟频率,factor为波特率因子;初值分两次送入计数器2。
3.1.38255A初始化
8255A初始化过程:
写方式命令控制字,本课程设计使C口的PC6输出1;即工作命令字为:
0DH。
3.2模块说明
3.2.1主要函数模块及功能
主要函数模块及功能如下:
voidset_bps(intbps)
功能:
主要完成定时计数器8253A的初始化和向计数器2送计数初值。
voidint51()
功能:
完成初始化可编程串行接口芯片的初始化。
voidmain()
功能:
程序的入口,提供人机交互函数,控制初始化工作的开始,控制程序的开始与结束,从而控制数据收发速率,提示用户选择波特率,将用户输入的传送数据发送到端口,并保存在寄存器中。
3.2.2模块框图
主函数模块
数据传送、回显模块
控制8253A模块
初始化8251A模块
选择波特率模块
图–3.2.2-1系统模块框图
3.2.3程序流程图
本次程序流程图如下
图--3.2.3-1程序流程图
4.开发平台及源程序
4.1开发平台
开发环境:
WindowsXP平台
开发平台:
MIFID微机实验台RS-232标准接口
4.2源程序的主要部分
波特率定义源程序:
#definefactor16//波特率因子16
unsignedlongintclk=1193182;//8251输入时钟频率(十六进制表示)
inttc_table[8]={//定时波特率数组
110,//0=110bps
150,//1=150b/s
300,//2=300b/s
600,//3=600b/s
1200,//4=1200b/s
2400,//5=2400b/s
4800,//6=4800b/s
9600//1=9600b/s
};
8251A、8253A、8355A芯片端口定义源程序:
#definedata510x308//8251A数据口
#definectrl510x309//8251A命令/状态口
#definectrl550x303//8255命令口
#definetimer20x306//8253的2号计数器端口
#definetimctl0x307//8253命令口
初始化8251A源程序:
voidint51()
{
outportb(ctrl51,0x00);
delay(100);
outportb(ctrl51,0x40);//8251复位
delay(100);
outportb(ctrl51,0x4a);//8251A方式命令
delay(100);
outportb(ctrl51,0x27);//8251A工作命令
}
初始化8253A和写如初值源程序:
voidset_bps(intbps)
{
inti,sendhigh,sendlow;
i=clk/bps;
i=i/factor;//计算计数初值
sendhigh=(i>>8)&0x00ff;
sendlow=i&0x00ff;
outportb(timctl,0xb6);
outportb(timer2,sendlow);//装计数初值低字节
outportb(timer2,sendhigh);//装计数初值高字节
}
主函数源程序:
voidmain()
{
intgetvalue=0;
inttemp=-1;
intsletter,rletter,status;
for(;;)
{clrscr();
printf("\n0---110\n1---150\n2---300\n3---600\n4---1200\n5---2400\n6---4800\n7---9600\n");
printf("\npleasetakeoneofBaud-rates\n");
getvalue=getch();
if((getvalue<'0')||(getvalue>'7'))
{printf("\nInputerror!
tryagainplease!
\n");//errormessage
getch();
continue;}
else{break;}
}
temp=getvalue-'0';
set_bps(tc_table[temp]);
int51();
printf("\nreadytoreceive");
printf("\nendwith'Esc'\n");
outportb(0x303,0x80);//置PC6=1,打开8253-5的GATE2,开始输出方波
outportb(0x303,0x0d);
for(;;)//判断是否Esc键
{
if(kbhit()){//若无键按下,则转接收
if((sletter=getche())==0x1b)//是ESC?
是,则退出,并返回DOS
{outport(ctrl55,0x0c);//关闭8253
return;}
else{status=inportb(ctrl51);//获取8251TXRDY状态
if((status&0x01)!
=0)//已准备好,则将键入的字符发送出去
{outportb(data51,sletter);}
}
}
else{
status=inportb(ctrl51);//已准备好,即有数据传送过来,则接收1个字符
if((status&0x02)!
=0)
{rletter=inportb(data51);
printf("\n%c",rletter);}
}
}
}
5.程序测试
5.1测试用例
选择波特率为:
1200,则8253A计数初值为:
1193182/(1200*16)=63;
在键盘上输入:
15684sdsljiodfmvksoj;sdfjk)#*R、ESC。
5.2程运行结果及分析
选择波特率为1200后,输入用例中的数据,可以观察到输入的数据送到8251A端口后回显在屏幕上,如图:
[分析]上述程序运行结果显示程序正确,能够实现通过串行接口芯片8251A发送数据,并回显在屏幕上的功能。
6.自我评价与总结
6.1自我评价
《微型计算机接口技术与应用》这门课程是计算机专业一门基础性学科,重要性可见一斑,学好这门课程对以后人生的发展具有深远的影响。
而课程设计便是对学习效果的检验。
数课程设计不仅可以锻炼我们独立思考问题、解决问题的能力,而且可以培养我们的整体性思维的能力;通过课程设计,使我加深了对微机接口芯片的在认识;巩固了8251A、8253A、8255A等芯片的内部结构和工作原理、工作控制与方式。
本次课程设计,刚开始看到课程设计题目时,感觉有些难度,通过各个接口芯片知识的再次复习,结合接口实验的相关内容,最终确定了设计的思路。
能够实现通过串行接口芯片8251A发送数据,并回显在屏幕上的功能,达到了本次课程设计的目的。
6.2经验与收获
这次课程设计,我明白了各个微机接口芯片的初始化程序的书写,但是以前的实验均为汇编实现,这次要求用C语言实现,因此对C语言控制微机接口芯片等相关知识有了了解和掌握,其次解题的思路尤为重要。
此次课程设计与以往的课程设计的最大不同在于硬件平台与软件的结合,不仅要编写出符合要求,良好的程序,还要设计出精简使用,达到预期目的的物理实验电路;在设计电路和程序之前,如果没有比较清晰的思路,根本不可能设计出良好的电路、编出好的程序。
就算马马虎虎的设计和编出来,物理电路之间的相互影响,程序的逻辑性、健壮性、完善性、合理性也不会很强,对实验结果有很大的影响。
在电路设计和编程之前,我们应反复研究题目要求,对题目涉及的情况进行比较充分的分析,以便设计出精简合理的电路、编写出更加符合题意的程序;因此在设计电路和编程序之前一定要做好充分的准备,首先要理清自己的思路,格局题目要求,结合各个微机芯片的主要功能,设计出符合要求的电路,然后再将电路思路