日军舰撞我保钓船

公告 欢迎访问器件网,点此进入电子工程师论坛

本站主题: 推广非日产电子元器件及无日产器件的设计方案

液晶屏世界  器件销售 集成器件 分立器件 资讯中心 下载中心 电子工程师论坛

推广国产器件,振兴民族电子产业是我们的追求.如您需要器件选型,技术支持,采购,欢迎联系. 最新消息: 替换日产光耦TLP521,PC817的光耦K1010免费提供样品.

WIN95环境下微机与8031单片机的串行异步通讯

何维1 杨涛2 吴勇3 王志强1
1中国科学院成都计算机应用研究所,四川 成都 610041
2日达计算机系统(中国)有限公司,四川 成都 610016
3四川迈普电器有限公司,四川 成都 610041

摘要: 讨论了微机与8031单片机组成的连机系统,在Windows95环境下两机实现数据通讯。给出了两机的硬件连接方式,波特率确定和Windows95环境下通讯软件的实现。
关键字: 微机;8031单片机;RS-232接口;Widows95
中图分类号:TP368.1 文献标识码:B 文章编号:

1 引 言
在实时控制中,通常采用微机作为上位机与下层控制设备进行通讯,而且为实现控制设备的信号传给上位机,数据必须先传给一个数据收集器,再由数据收集器把收到数据传给上位机。同样上位机向控制设备传输命令也必须通过这个数据收集器。
本系统采用8031构成的单片机作为数据收集器,由于8031本身就包含一个全双工的异步串行通信接口,利用RS-232接口就能实现微机与8031单片机之间的全双工异步通讯。为了实现上位机的数据处理可视化,我们在Win95操作系统中使用MFC提供的Win32 API标准通讯函数和通信接口实现微机与8031单片机之间的串行异步通讯。上位机与单片机的连接采用零调制器连接方式实现互连,即RS-232的接收数据线与发送数据线交叉相连的。
2 硬件实现
RS-232的接口电平为-15V~-3V和+3V~+15V,而8031串行口采用TTL电平,采用电平转换器MC1488和MC1489分别将TTL电平转换为RS-232能识别的信号,以及把RS-232的电平转换为TTL电平,连接如图1所示。

图1 硬件连接
3 通讯协议
为了提高数据的传输速度,直接对二进制代码进行传输,即接收与发送数据为二进制代码,具体格式为:1位起始位,8位数据位,1.5位停止位,波特率为9600bps。
4 波特率设定
当8031采用定时器方式2,TMOD的高4位为02H,波特率为9600bps,系统晶振为11.059MHz,SMOD为1时,根据公式:
波特率=2SMOD/ 32×fosc / 12 / (256-X )
得到:X=250,转换为16进制为FAH。
确定波特率: MOV SMOD, #10H
MOV TH1, FAH
在Windows95环境中串行口被当作文件,通过对文件的操作来实现数据的发送与接收,其在Win32 API中对波特率的设定是通过对结构类型DCB的成员赋值,DCB的成员自动给8250芯片初始化来实现:
DCB dcb; //声明一个dcb对象;
dcb.BaudRate=9600; //确定微机通信采用9600bps波特率
dcb.ByteSize=8; //确定8位数据位
dcb.fParity=FALSE;
dcb.Parity=NOPARITY; //为了与8031的数据格式一致,确定不进行奇偶校验
dcb.StopBits=ONE5STOPBITS
或dcb.Parity=1; //确定采用8位数据位时停止位必须为1.5位。
dcb.fBinary=TRUE; // 确定数据传输为二进制;

5 软件实现
8031向SBUF寄存器取、送数据即为接收、发送数据,该寄存器的地址为99H。采用串行口方式1,TMOD的D6位为1,即SCON的高四位为40H时,其传送的数据包括1个起始位,8个数据位,1.5个停止位。为了使定时器能自动装载,采用定时器2方式,即TMOD的高四位为02H。
发送初始化:
MOV TMOD,#02H //置定时器1为方式2/
MOV SMOD, #10H //设波特率/
MOV TH1, FAH
SETB, TR1
MOV SCON, #40H //置串行口方式1,
/……发送数据部分/
接收初始化时TMOD的REN为1时,开始接收:
MOV TMOD,#02H //置定时器1为方式2
MOV SMOD, #10H //设波特率
MOV TH1, FAH
SETB, TR1
MOV SCON, #50H //置串行口REN为1
/……接收数据部分/
当要求发送中断时只须 MOV SCON, #02H,要求接收中断时只须 MOV SCON, #01H即可。
微机通过Windows95来进行数据交换必须有以下几步:首先要获得通讯资源,然后进行通讯设备初始化,再进行通讯,最后释放通讯资源:
为了获得通讯资源,首先在View类中创建通讯子类CommunicateView.h,并在其中声明变量,以获得设备句柄
HANDLE hCommuni;
然后在CommunicateView.cpp文件的OnInitialUpdate()函数中通过CreateFile函数来获得通讯资源:
hComuni=CreateFile( "COM2", //指明通讯串口为com2口
GENERIC_READ | GENERIC_WRITE, //设置读写模式
0, //不进行共享
NULL, //在Win95环境下,该项的成员被忽略
OPEN_ALWAYS , //当文件(设备)存在时,打开;否则建立新文件(设备)并打开,
FILE_ATTRIBUTE_TEMPORARY | FILE_FLAG_OVERLAPPED , //设置文件属性为临时文件和标志为异步读写文件
NULL //在Win95中该项为NULL,

通过SetupComm设置I/O缓冲区大小:
SetupComm( hComuni, //通讯设备必须为CreateFile()的返回值;
512, //输入缓冲区大小
512 //输出缓冲区大小
)
通过对dcb的初始化和SetCommState()来实现通讯端口设置:
dcb.BaudRate=9600;
dcb.ByteSize=8;
dcb.fParity=FALSE;
dcb.Parity=NOPARITY;
dcb.StopBits=ONE5STOPBITS //或dcb.Parity=1;
dcb.fBinary=TRUE;
SetCommState( hComuni, //通讯设备必须为CreateFile()的返回值
dcb)
数据的发送与接收通过ReadFile()和WriteFile()来实现,为了实现异步传输必须有一个结构来保存输入输出信息,Win32 API中提供了该类结构:OVERLAPPED,所以在CommunicateView.h文件中定义两个Private类型的对象:OVERLAPPED InformRead, InformWrite,并且还要将有关通讯资源的有关信息保存起来以供ReadFile()和WriteFile()使用,所以定义一个包括通讯资源的变量 COMSTAT m_ComState;
ReadFile( hComuni, //确定要读取的文件,文件必须由CreateFile()产生
&InBuffer, //为32位不确定数据类型的指针,指向要读取的内容
512 , //确定读取的字节数,
&m_ComState.cbInQue, //确定读取字节的地址
&InformRead //存放字节的地址
);
WriteFile( hComuni, //确定要写的文件,文件必须由CreateFile()产生
&OutBuffer, //为32位不确定数据类型的指针,指向要写的内容
512, //确定要写入的字节数,
&m_ComState.cbOutQue, //确定写入字节的地址
&InformWrite // 指向需要重写的I/O设备
);
进行完数据交换以后,需要释放设备资源:
CloseHandle(hComuni);

6 结 论
采用8031单片机和微机组成的系统,具有稳定的性能,已被为广泛应用于工业控制中。上位机采用Windows95运行环境,所传输的数据能非常直观反应到上位机,在进行上位机的通讯接口程序设计时不需涉及具体的计算机硬件,做到了与硬件无关,便于系统移植。并且Windows95支持多任务,比在DOS环境下更能有效利用计算机资源。

南京高略科技有限公司致力于国产器件和非日产器件推广
您如果需要相关器件或技术支持,请联系:
电话(TEL): 025-6885 3239 传真(FAX): 025-6885 3238

友情提醒: 下载链接在http://pdf.18ic.com电子工程师论坛的,都需要注册并发表精华文章:)

正确认识和理解抵制日货,欢迎点这里阅读器件网站长的大作,纪念抗战胜利60周年宣传资料

相关新闻:
无相关新闻

06-04-15 14:39:18


中国器件网 苏ICP备05063888号