查看: 2268|回复: 0

数据采集系统中PC机与MCS- 51单片机的串行通信设计

[复制链接]
  • TA的每日心情
    擦汗
    3 天前
  • 签到天数: 1492 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2013-12-29 18:50:21 | 显示全部楼层 |阅读模式
    分享到:
    数据采集系统中PC机与MCS- 51单片机的串行通信设计
    向科, 刘晓燕, 文方
    (贵州大学电气工程学院,贵州 贵阳550003)
    摘要: 介绍了MCS-51单片机与微机的串行通信方法,详细说明此串行通信方法在数据采集系统中应用,
    并给出了串行通信,数据采集系统的硬件连接方法和软件编写。
    关键词: PC; MCS-51; RS-232C;Visual C++ 6.0;数据采集
    中图分类号:TP273+.5; 文献标识码:B
    0 引言
    近年来,由于PC机(个人计算机)优越的性价比和丰富的软件资源,己成为计算机应用的主流机种。
    而MCS- 51系列单片机在工业控制系统中也越来越得到广泛的应用,它以价格低、功能全、体积小、
    抗干扰能力强、开发应用方便等特点己渗透到了各个应用领域。特别是利用其能直接进行全双工
    通讯的特点,在数据采集、智能仪器仪表、家用电器和过程控制中作为智能前沿机。但由于单片
    机的计算能力有限,难以进行复杂的数据处理,因此应用一种高性能的计算机对系统的所有智能前
    沿机进行管理和控制,己成为一种发展方向。在功能比较复杂的控制系统中,通常以PC为主机,单
    片机为从机,由单片机完成数据的采集及对装置的控制,而由主机完成各种复杂的数据处理及对单
    片机的控制。本文设计一个数据采集系统,实现对4路模拟量进行数据采集,四路模拟量信号分别
    为:1-5V电压信号,4-20mA电流信号,0-60mV电压信号,0-200Ω电阻,数据采集由单片机完成,采
    集数据通过串口通信传送到上位机(PC机)上显示。
    1 硬件部分设计
    1.1 AT89C51芯片的串行口
    AT89C51芯片内有一个全双工的串行口,它有4种工作方式:方式0,串行接口为移位寄存器I/O方式
    ;方式1,串行口被控制为8位的异步通信接口传送一帧信息为10位,其中1位为起始位,8位为数据位
    ,1位停止位,波特率可变;方式2和3,则被定义为9位的异步通信接口,传送一帧信息为11位,其中
    1位起始位,8位数据位,1位是附加的可程控为1或0的第9位数据,1位停止位。其工作方式的选择由
    片内的特殊功能寄存器SCON(串行口控制寄存器)的设置完成。此处串行口采用方式1。
    1.2 PC机的RS-232C串行接口
    通常,PC机的主板会提供一个打印机输出并行端口(LPT),两个串行口(COM1、COM2),并行口主要进
    行短距离的数据传送,至少需要8根数据线同时进行数据的传送,因而传送速率较快。而长距离
    的数据传送只能采用串行口,串行口只需要三根数据线进行数据传送,传送距离较长,投资较少,但
    传送速率较低。RS-232C也是人们常用的网络通信接口,此处PC机与单片机的通信便采用该串行口。
    1.3 电平的转换
    由于PC机(上位机)与MCS-51单片机是通过异步通讯口进行接口的。PC机异步通讯口采用的是RS-
    232C串行总线标准,该标准采用的是负逻辑:即逻辑“1”的电平是-5V∽-12V,逻辑“0”的电平是
    +5V∽+12V;而 MCS-51的异步通讯口采用的标准是TTL正逻辑:即逻辑“1”为高电平3.8 V左右,逻
    辑“0”为低电平0.3 V左右。PC机与MCS-51单片机进行通讯必须进行TTL-RS232C电平的转换。电
    平转换用到的芯片为MC14488和MC14489( 配对使用),ICL232,MAX232.本例采用MAX232芯片,该芯片
    采用单一的+5V供电,外围电路简单,运行可靠,电路如下图所示。
    1.4 模/数转换接口电路
    在模/数转换电路中,用了一片ADC0809作为模/数转换芯片。此芯片是8路8位逐次逼近型A/D转换
    CMOS器件,能对多路模拟信号进行分时采集和A/D转换,并直接与MCS-51单片机总线接口,直接驱动
    数据总线。因为需要采集四个通道,所以需要74LS373锁存对应的通道地址,为满足A/D 转换芯片
    ADC0809工作频率低于560K的需要,需要两级D触发器对AT89C51引脚ALE输出的大约2M频率进行四
    分频, 四个通道数据分别由四片LM398采样保持,输入到A/D转换器ADC0809对应的IN-0、IN-1、
    IN-2、IN-3端,由程序控制分别转换。
    1.5 采集通道电路
    被采集的伏特,毫伏,毫安,电阻信号由下图中的共同的“信号输入”口输入,选择何种信号输入由
    上位机决定,由下图中INPUT输出到上图中的LM398输入端,考虑要采集毫安级信号,为了不再损失
    信号,采用继电器作为转换开关(开关闭合时内阻小),型号为9013的三级管作为它的驱动管,又由
    于AT89C51引脚输出的控制信号直接驱动不了三极管9013,再经过两次非门后,增加了驱动能力后
    方可驱动。
    下图中k1,k3同时闭合时,即p1.0,p1.2输出高电平,加上上图中P1.6 输 出的高电平,因此采集
    控制信号地址为45h,作为测量1~5V,4~20MA信号的控制地址,原因是1~5V信号不需要放大,又
    能满足测量4~20MA信号需要。
    下图中k2,k4同时闭合时,即p1.1,p1.3输出高电平,加上上图中P1.6输出的高电平,因此采集
    控制信号地址为4ah,作为测量4~60mv信号控制地址,原因是4~60mv信号需要放大到~5v。
    下图中比较器U1,U2为主要器件组成正反馈平衡式恒流源提供给待测电阻0~200Ω被测量时用,
    因为测量电阻时需要用到恒流源,其大小由电阻R1设定。k5,k6同时闭合时,即p1.4,p1.5输出高
    电平,再加上上图中P1.6输出的高电平,因此采集控制信号地址为70h,作为测量0~200Ω电阻信
    号控制地址。
    2 软件部分设计
    2.1 上位机编程
    在Windows环境下实现串行通信目前通常有三种方法:一是利用Windows API的通信函数;二是利用
    Micuosoft Visual C++的标准通信函数直接对串行口进行操作,前者虽然使用面积广,但由于比较
    复杂,专业化程序高,使用起来会遇到很多问题;后者则需要掌握串行通信口的物理地址。第三种方
    法是使用Micuosoft Visual C++的通信控件MSComm,这种方法可以很容易地解决上述两种方法中的
    不足,使用起来方便、直观。本系统采用第三种方法,利用控件解决串行通信的问题。Micuosoft
    Visual C++的MSComm控件提供两种通讯方式:事件驱动方式和查询通讯方式,本实例采用前者。
    以下是MSComm控件的常用属性和方法:
    Commport:设置或返回串口号。
    Setting:以字符串的形式设置或返回串口通信参数。
    Portopen:用于打开或关闭串口,或者返回串口的开、关状态。
    InputMode:设置或返回接收数据的类型。
    Inputlen:设置或返回一次从接收缓冲区中读取的字符数。
    InBufferSize:设置或返回接收缓冲区的大小,缺省值为1024字节。
    InBufferCount:设置或返回接收缓冲区中等待读取的字节个数。
    Input:从接收缓冲区中读取数据并清空该缓冲区,该属性设计时无效,运行时只读。OutBufferSize:
    设置或返回发送缓冲区的大小,缺省信为512字节。
    OutBufferCount:设置或返回发送缓冲区中等待计算机发送的字符数。
    Output:向发送缓冲区发送数据,该属性设计时无效,运行时只读。
    设置好这些属性和方法,程序就可以很容易编出来了,下面具体说明通信程序的编制。
    2.1.1 用户界面编程
    上位机程序使用Visual C++ 6.0语言编写,首先是实现用户界面。
    2.1.1.1 串口设置界面
    在此界面中,用户可以选择串行口的通信波特率,选择串口COM1,还是串口COM2通信,串口是否连接好测试。
    通信端口初始化程序设计如下:
    BOOL COMMSETTINGDLG::OnInitDialog()
    {
    CDialog::OnInitDialog();
    CheckRadioButton(IDC_4800RADIOBAUD,IDC_19200RADIOBAUD,m_baudID);
    CheckRadioButton(IDC_RADIOCOM1,IDC_RADIOCOM2,m_portID);
    m_MSComm.SetCommPort(m_port);
    switch(m_baud)
    {
    case 1:
    m_MSComm.SetSettings("4800,n,8,1");
    break;
    case 2:
    m_MSComm.SetSettings("9600,n,8,1");
    break;
    default:
    m_MSComm.SetSettings("19200,n,8,1");
    }
    m_MSComm.SetInBufferSize(1024); //接收缓冲区
    m_MSComm.SetOutBufferSize(1024); //发送缓冲区
    m_MSComm.SetInputMode(1); //以二进制方式读写数据
    m_MSComm.SetInputLen(0); //设置当前接收区数据长度为0,表示全部读取
    m_MSComm.SetRThreshold(4); //接收缓冲区有4个及4个以上字符时,
    //将引发接收数据的OnComm事件
    if(!m_MSComm.GetPortOpen())
    m_MSComm.SetPortOpen(TRUE); //打开串口
    m_MSComm.GetInput(); //先预读缓冲区以清除残留数据
    return TRUE; // return TRUE unless you set the focus to a control
    }
    波特率与串口选择程序设计示意图如下:
    2.1.1.2 采集通道设置及数据显示
    实现对4路模拟量进行数据采集,四路模拟量信号分别为:1-5V电压信号,4-20mA电流信号,
    0-60mV电压信号,0-200Ω电阻,数据采集由AT89C51单片机完成,采集数据传送到上位机(PC机)上显示。
    采集通道设置界面:
    采集通道设置程序设计示意图如下:

    数据显示界面:
    其中显示程序设计如下:
    void STARTDLG::OnComm()
    {
    // TODO: Add your control notification handler code here
    VARIANT variant_inp;
    COleSafeArray safearray_inp;
    unsigned char x1,x2,x3,x4;
    float y;
    long i=0;
    if(m_MSComm.GetCommEvent()==2)
    {
    variant_inp=m_MSComm.GetInput(); //读缓冲区
    safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
    safearray_inp.GetElement(&i,&x1);//转换为BYTE型数组
    float t1=float(x1);
    y=calculate(t1,s1);
    m_1Edit.Format("%f %s",y,s1);
    i=1;
    safearray_inp.GetElement(&i,&x2);//转换为BYTE型数组
    float t2=float(x2);
    y=calculate(t2,s2);
    m_2Edit.Format("%f %s",y,s2);
    i=2;
    safearray_inp.GetElement(&i,&x3);//转换为BYTE型数组
    float t3=float(x3);
    y=calculate(t3,s3);
    m_3Edit.Format("%f %s",y,s3);
    i=3;
    safearray_inp.GetElement(&i,&x4);//转换为BYTE型数组
    float t4=float(x4);
    y=calculate(t4,s4);
    m_4Edit.Format("%f %s",y,s4);
    }
    UpdateData(FALSE);
    }
    float STARTDLG::calculate(float x, CString s)
    {
    float y1;
    if(s=="V")
    y1=(x-0x01)/(0xff-0x01)*5;
    else if(s=="mA")
    y1=(x-0x01)/(0xde-0x01)*20;
    else if(s=="mV")
    y1=(x-0x02)/(0xc1-0x02)*60;
    else
    y1=(x-0x05)/(0x88-0x05)*200;
    return y1;
    }
    2.2 下位机编程
    2.2.1 下位机软件模块分为采集模块,接受模块,发送模块
    2.2.1.1采集模块:
    采集通道1~4对应地址分别存储在70h~73h单元中,初始采集地址为45h,其中70h~73h单元中存
    储的地址随时随上位机的采集通道设置改变而改变,由发来的数据通过比较后确定下次采集地址
    为多少。一次循环采集四个通道,采集到的四个数据分别存储在60h~63h单元中等待发送模块来发送。
    2.2.1.2接受模块:
    接受模块功能在发送模块过程中进行,以便为发送模块中的波特率服务,因为上下位机波特率一
    致,才能正确地传送数据,下位机波特率受上位机波特率控制,一旦下位机接受到上位机数据,就转
    入接受处理模块程序中,通过数据比较后确定是修改波特率,还是修改通道的采集地址。
    2.2.1.3 发送模块:
    循环取60h~63h单元中四个数据来发送给上位机。
    2.2.2 下位机初始化程序设计如下:
    org 000h
    ajmp main
    org 100h
    main: mov TMOD,#20h ;定时器工作在方式2
    mov TL1,#0fah ;初始时波特率为9600Hz
    mov TH1,#0fah
    mov PCON,#80h ;波特率倍增
    mov SCON,#50h ;窜口工作在方式1
    clr ES ;关闭窜口中断
    setb TR1 ;启动定时器1
    2.2.3 下位机软件流程图如下:
    3 结语:
    通过以上的介绍,可以看出PC机与MCS-51单片机通讯系统的软硬件是很容易实现的,经过长时间的
    运行,系统可靠。在实际的应用控制系统中,可将之投入应用,把MCS- 51单片机的应用系统作为现
    场信号采集装置或信号预处理或执行装置,PC机作为远程人机交互装置,既简单可靠又经济理想。
    4 参考文献:
    [1] 龚建伟编著.Visual C++/Turbo C串口通信编程实践.北京:电子工业出版社,2004
    [2] 胡汉才.单片机原理及其接口技术[Ml.北京:清华大学出版社,1996
    [3] 李朝青.PC机及单片机数据通信技术.北京:北京航空航天大学出版社,1999
    [4] 何立民编著.单片机应用系统设计.北京航空航天大学出版.1993
    [5] 张友德. 80c51系列单片机原理与应用技术手册[M].北京:北京航空航天出版社,1992.
    Design of Serial Communication between PC and MCS-51 Microcontroller in Data Acquisition System
    Xiang ke, Liu xiao-yan, Wen fang
    ( College of Electrical Engineering, Guizhou University , Guiyang, 550003)
    Abstract: This paper introduces a serial communication method between MCS-51 Microcontroller
    and PC computer. The application of this serial communication method in data acquisition
    system is described in detail. Besides, the method of the full serial communication,
    connected hardware and designed software of the data acquisition system is also here.
    Key Word: PC computer; MCS-51; Visual C++ 6.0; data acquisition
    作者简介:
    向 科(1975—)男,贵州大学电气工程学院硕士研究生,主要研究方向为计算机测控技术、 CAN总线在智能仪表中的应用。
    刘晓燕(1982— )女,贵州大学电气工程学院硕士研究生,主要研究方向为计算机测控技术、网络单片机的开发与应用。
    文 方 (1956—), 男,贵州大学电气工程学院副院长,教授,主要研究方向为智能仪表应用等
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-6-3 04:28 , Processed in 0.106675 second(s), 15 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.