资源描述:
《存储测试中pc机与单片机串行通信程序设计》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、第20卷第11期计算机应用Vol.20,No.112000年11月ComputerApplicationsNov.,2000文章编号:1001-9081(2000)11-0077-02存储测试中PC机与单片机串行通信程序设计何瑛,薛伟,李永新,朱明武(南京理工大学105教研室,江苏南京210094)摘要:基于32位操作系统Windows98下的工控PC机和单片机进行串行通信,利用LabVIEW对上位机编制串口通信程序,C51编制下位单片机的通信程序,用单片机对存储单元NVSRAM中存储的数据进行并串转换实现与PC的数据传输。关键词:串行通信;LabVIEW;C51;
2、单片机中图分类号:TP311.52文献标识码:A串行通信在工程实现中有着广泛的应用,本文位停止位,无奇偶校验,若晶振频率为11.0592MHz,介绍在Windows98下用图形化编程软件LabVIEW5取波特率为9600b/s。下位机按接收到的指令工作,和C51语言开发PC机和单片机通信程序的一些经若主控机发出无效或错误指令,将不做任何控制,并验。显示Error。系统中采用89C51作为下位机,工控PC机为上2程序实现位机,二者通过RS-232串口接收或发送数据和指令。传输介质为二芯屏蔽电缆。2.1主机通信软件实现RS-232信号和单片机串口信号的电平转换采用MAX
3、233A,它是具有双驱动器、双接收器的通讯器接口电路,不需外接电容而进行倍压及电压极性转换,只需+5V供电,电源电流为5mA,传输率200Kbps。串行接口电路原理如图1所示。图1串行接口电路原理图1通信协议系统中PC机承担主控任务,负责存储测试系统中通信参数的设定,程序用LabVIEW5.0编写。单片机接受PC机指令,并根据指令信息对NVSRAM图2串口函数(初始化、字节计数、读写、中断、打开)中数据进行并串转换并上传数据。通信协议如下:在主机通信软件设计中,采用LabVIEW图形化采用RS-232异步通信方式,51单片机串行口共有语言作为编程环境。LabVIEW
4、是NI推出的图形化四种工作方式。其中方式1为8位异步串行通信方编程平台,它把高级语言中的函数封装为图形功能式,其波特率是可变的,1位起始位,8位数据位,1模块,图标间连线表示在各功能模块间的数据传递,收稿日期:2000205224作者简介:何瑛(1974-),女,博士研究生,主要研究方向:虚拟仪器、存储测试.©1994-2008ChinaAcademicJournalElectronicPublishingHouse.Allrightsreserved.http://www.cnki.net78计算机应用2000年编程方式简单、直观、便于使用。在串口通信运用用户直接
5、调用,从而提高了程序的编写效率。中,LabVIEW有相应模块使用户可以迅速组建自己首先89C51将串口初始化为1位起始位、8位数的应用系统。据位、1位停止位,单片机晶振为11.0592MHz,波特主程序运行后,首先设置串口,如选择端口、设率为9600b/s,来读取NVRAM掉电前测得的64字节定波特率及接收字节数等。然后打开串口,先向单数据,其具体设置见程序清单。片机发送BB,使单片机开始并串转换,主机开始接收并判断接收缓冲区字节数。完成设定字节数的接收任务后,关闭串口,并进行数据存盘,同时完成图形显示功能。封装好的串口函数有:串口初始化、串口字节大小计数、串口读写
6、、串口中断等。其中打开、关闭串口都已封装在串口初始化、串口中断等函数中了。当然也可以单独调用。另外,LabVIEW5.0串口通信中也有现成读串口的VI(serialreadwithtimeout)可以直接调用。主机通信读串口数据显示操作界面如图3所示。2.2下位机的C51串行通信程序89C51单片机程序采用C51语言编写。C51语言是专为8051系列单片机设计的高性能C编译器,图3主机通信读串口数据显示操作界面它采用符合ANSI标准的C语言编程,能够产生高速3程序清单度和简洁形式的目标代码,在代码效率和执行速度上可以和汇编语言相比,并且具有丰富的库函数供3.1串口读
7、数据LabVIEW块流图图4串口读数据LabVIEW块流图3.2C51程序清单{P0=0;P1=0;P2=0;P3=0;//SetallMCUpinslow#include″reg51.h″TMOD=0X20;//定时器1方式2SCON=0X70;#include″absacc.h″PCON=0X00;//设置串行口方式#include″math.h″TL1=0XFD;//在11.0592MHz下,设定波特率9600#defineucharunsignedcharTH1=0XFD;#defineuintunsignedintTR1=1;//SettheUART}