4
基于LabVIEW的串口温度监控系统设计
2010-12-13 20:41:19 admin 浏览:5307次 【

基于LabVIEW的串口温度监控系统设计

张兴成  20051001168

摘要:本系统利用 DS18B20 数字温度传感器和 Atmel 公司生产的 AVR 系列ATmega16 单片机采集被测环境温度,将测得的数据经串口传给计算机。计算机利用 LabVIEW VISA 读取串口数据并进行处理和显示,实现基于VISA的串口温度采集监控。

关键词:DS18B20  温度传感器  AVR  单片机  VISA  串口

1、 概述

实时数据采集是工业控制系统中必不可少的组成部分,是进行工业分析,工业处理和工业控制的依据。近年来由于大规模集成电路、单片机、计算机等在工业控制领域中的广泛应用,数字化的数据采集成为必然。这就对传感器的A/D性能,单片机的数据采集、处理和传输性能,计算机接口与通信技术提出了更高的要求。

关键词:DS18B20  温度传感器  AVR  单片机  VISA  串口

1、 概述

实时数据采集是工业控制系统中必不可少的组成部分,是进行工业分析,工业处理和工业控制的依据。近年来由于大规模集成电路、单片机、计算机等在工业控制领域中的广泛应用,数字化的数据采集成为必然。这就对传感器的A/D性能,单片机的数据采集、处理和传输性能,计算机接口与通信技术提出了更高的要求。

1、 概述

实时数据采集是工业控制系统中必不可少的组成部分,是进行工业分析,工业处理和工业控制的依据。近年来由于大规模集成电路、单片机、计算机等在工业控制领域中的广泛应用,数字化的数据采集成为必然。这就对传感器的A/D性能,单片机的数据采集、处理和传输性能,计算机接口与通信技术提出了更高的要求。

实时数据采集是工业控制系统中必不可少的组成部分,是进行工业分析,工业处理和工业控制的依据。近年来由于大规模集成电路、单片机、计算机等在工业控制领域中的广泛应用,数字化的数据采集成为必然。这就对传感器的A/D性能,单片机的数据采集、处理和传输性能,计算机接口与通信技术提出了更高的要求。

本系统采用Atmel 公司生产的高速8位单片机AVR 系列  ATmega16 单片机作为温度数据采集和传输的主控芯片,温度传感器采用单总线方式的集成数字温度传感器 DS18B20 。采集得到的数据利用单片机经串口通讯的方式传输至计算机的串口。计算机上位机软件采用数据处理能力超强的LabVIEW软件编写,利用其所带的VISA驱动进行串口的数据采集和处理,实现基于VISA的串口温度采集监控。

2、 硬件设计

AVR单片机是1997年由ATMEL公司研发出的增强型内置FlashRISC(Reduced Instruction Set CPU) 精简指令集高速8位单片机。AVR的单片机可以广泛应用于计算机外部设备、工业实时控制、仪器仪表、通讯设备、家用电器等各个领域,它与51单片机、PIC单片机相比具有一系列的优点:

1:在相同的系统时钟下AVR运行速度最快;

2: 芯片内部的FlsahEEPROMSRAM容量较大;

3:所有型号的FlashEEPROM都可以反复烧写、全部支持在线编程烧写(ISP)

2、 硬件设计

AVR单片机是1997年由ATMEL公司研发出的增强型内置FlashRISC(Reduced Instruction Set CPU) 精简指令集高速8位单片机。AVR的单片机可以广泛应用于计算机外部设备、工业实时控制、仪器仪表、通讯设备、家用电器等各个领域,它与51单片机、PIC单片机相比具有一系列的优点:

1:在相同的系统时钟下AVR运行速度最快;

2: 芯片内部的FlsahEEPROMSRAM容量较大;

3:所有型号的FlashEEPROM都可以反复烧写、全部支持在线编程烧写(ISP)

AVR单片机是1997年由ATMEL公司研发出的增强型内置FlashRISC(Reduced Instruction Set CPU) 精简指令集高速8位单片机。AVR的单片机可以广泛应用于计算机外部设备、工业实时控制、仪器仪表、通讯设备、家用电器等各个领域,它与51单片机、PIC单片机相比具有一系列的优点:

1:在相同的系统时钟下AVR运行速度最快;

2: 芯片内部的FlsahEEPROMSRAM容量较大;

3:所有型号的FlashEEPROM都可以反复烧写、全部支持在线编程烧写(ISP)

1:在相同的系统时钟下AVR运行速度最快;

2: 芯片内部的FlsahEEPROMSRAM容量较大;

3:所有型号的FlashEEPROM都可以反复烧写、全部支持在线编程烧写(ISP)

2: 芯片内部的FlsahEEPROMSRAM容量较大;

3:所有型号的FlashEEPROM都可以反复烧写、全部支持在线编程烧写(ISP)

3:所有型号的FlashEEPROM都可以反复烧写、全部支持在线编程烧写(ISP)

4:多种频率的内部RC振荡器、上电自动复位、看门狗、启动延时等功能,零外围电路也可以工作;

5:每个IO口都可以以推换驱动的方式输出高、低电平,驱动能力强;

6:内部资源丰富,一般都集成ADDA模数器、PWMSPIUSARTTWII2C通信口、丰富的中断源等。

目前支持AVR单片机编译器的语言主要有汇编语言、C语言、BASIC语言等。其中C编译器主要有CodeVisionAVRAVRGCCIARICCAVR等,C语言编译器由于它具有功能强大、 运用灵活、代码小、运行速度快等先天性的优点,使得它在专业程序设计上具有不可代替的地位。

5:每个IO口都可以以推换驱动的方式输出高、低电平,驱动能力强;

6:内部资源丰富,一般都集成ADDA模数器、PWMSPIUSARTTWII2C通信口、丰富的中断源等。

目前支持AVR单片机编译器的语言主要有汇编语言、C语言、BASIC语言等。其中C编译器主要有CodeVisionAVRAVRGCCIARICCAVR等,C语言编译器由于它具有功能强大、 运用灵活、代码小、运行速度快等先天性的优点,使得它在专业程序设计上具有不可代替的地位。

6:内部资源丰富,一般都集成ADDA模数器、PWMSPIUSARTTWII2C通信口、丰富的中断源等。

目前支持AVR单片机编译器的语言主要有汇编语言、C语言、BASIC语言等。其中C编译器主要有CodeVisionAVRAVRGCCIARICCAVR等,C语言编译器由于它具有功能强大、 运用灵活、代码小、运行速度快等先天性的优点,使得它在专业程序设计上具有不可代替的地位。

目前支持AVR单片机编译器的语言主要有汇编语言、C语言、BASIC语言等。其中C编译器主要有CodeVisionAVRAVRGCCIARICCAVR等,C语言编译器由于它具有功能强大、 运用灵活、代码小、运行速度快等先天性的优点,使得它在专业程序设计上具有不可代替的地位。

DSl8B20数字温度计提供9(二进制)温度读数,指示器件的温度。信息经过单线接口送入DSl8B20或从DSl8B20送出,因此从主机CPUDSl8B20仅需一条线(和地线) DSl8B20的电源可以由数据线本身提供而不需要外部电源。因为每一个DSl8B20在出厂时已经给定了唯一的序号,因此任意多个DSl8B20可以存放在同一条单线总线上,这允许在许多不同的地方放置温度敏感器件。DSl8B20的测量范围从-55摄氏度到+125摄氏度增量值为0.5摄氏度。可在l s(典型值)内把温度变换成数字。系统的硬件设计主要分为四个部分:单片机、供电电路、DS18B20、串口通讯。

 

1.jpg

1:单片机部分电路设计

单片机部分的电路设计如图1所示,主要包括复位电路、ISP接口、JTAG接口、晶振电路、A/D参考电压电路(此部分用于AD采集,本系统并未使用)。复位电路使用了钳位二极管钳位,防止触点电压过高烧坏RESET引脚。

2.jpg

2.jpg

 

2.jpg

2:供电电路设计                       3DS18B20电路设计

供电电路如图2所示,供电电路使用了BM1117进行稳压,防止电压过高烧坏单片机,并可以提高系统适应电压的范围,即使供电电压高于单片机正常工作电压也可以由BM1117稳压到单片机正常工作电压的范围。

DS18B20 的工作电路如图3所示,采用外部供电而非总线供电的方式,只需一个电容和两个电阻。

3.jpg

3.jpg

 

3.jpg

4:串口通信电路

串口通信采用Max232进行电平转换,电路原理图如图4所示,实物照片如图5所示。

4.jpg

5:实物照片

3、 软件设计

下位机软件采用C语言编写,包括DS18B20的读写和串口通信两个主要部分。上位机软件采用LabVIEW编写。相关程序段如下所示:

获取DS18B20数据:

下位机软件采用C语言编写,包括DS18B20的读写和串口通信两个主要部分。上位机软件采用LabVIEW编写。相关程序段如下所示:

获取DS18B20数据:

获取DS18B20数据:

uint8 gettemp(void)         //读取温度值

{

    uint8 temh,teml,wm0,wm1,wm2,wm3,temp; 

    uint8 temh,teml,wm0,wm1,wm2,wm3,temp; 

     init_1820();        //复位18b20 

     write_1820(0xCC);   // 跳过ROM

     write_1820(0x44);  // 温度变换

     write_1820(0xCC);   // 跳过ROM

     write_1820(0x44);  // 温度变换

     write_1820(0x44);  // 温度变换

     init_1820(); 

     write_1820(0xCC);  // 跳过ROM

     write_1820(0xbe);  // 读暂存存储器

     teml=read_1820();  //读数据 

     temh=read_1820(); 

     write_1820(0xCC);  // 跳过ROM

     write_1820(0xbe);  // 读暂存存储器

     teml=read_1820();  //读数据 

     temh=read_1820(); 

     write_1820(0xbe);  // 读暂存存储器

     teml=read_1820();  //读数据 

     temh=read_1820(); 

     teml=read_1820();  //读数据 

     temh=read_1820(); 

     temh=read_1820(); 

     wm0=teml>>4;       //只要高8位的低四位和低8位的高四位,温度范围0~99

     wm1=temh<<4;

     wm2=wm1+wm0;        //16进制转10进制

 return wm2;

}

系统下位机主函数:

void main(void)

{

unsigned char i=0,tmp=0;

unsigned char i=0,tmp=0;

 USART_Init(9600); //波特率9600 初始化串口

 while(1)

 {

 tmp=gettemp();

 USART_Transmit(tmp);

}

 tmp=gettemp();

 USART_Transmit(tmp);

}

 USART_Transmit(tmp);

}

}

}

上位机软件采用当前测试测量应用最广泛的LabVIEW编写。LabVIEWLaboratory Virtual instrument Engineering)是一种图形化的编程语言,它广泛地被工业界、学术界和研究实验室所接受,视为一个标准的数据采集和仪器控制软件。LabVIEW集成了与满足GPIBVXIRS-232RS-485协议的硬件及数据采集卡通讯的全部功能。它还内置了便于应用TCP/IPActiveX等软件标准的库函数。这是一个功能强大且灵活的软件。利用它可以方便地建立自己的虚拟仪器,其图形化的界面使得编程及使用过程都生动有趣。

图形化的程序语言,又称为“G”语言。使用这种语言编程时,基本上不写程序代码,取而代之的是流程图或流程图。它尽可能利用了技术人员、科学家、工程师所熟悉的术语、图标和概念,因此,LabVIEW是一个面向最终用户的工具。它可以增强你构建自己的科学和工程系统的能力,提供了实现仪器编程和数据采集系统的便捷途径。使用它进行原理研究、设计、测试并实现仪器系统时,可以大大提高工作效率。

利用LabVIEW,可产生独立运行的可执行文件,它是一个真正的32位编译器。像许多重要的软件一样,LabVIEW提供了WindowsUNIXLinuxMacintosh的多种版本。

上位机的软件前后面板如图6所示:

5.jpg

5.jpg

 

5.jpg

6 上位机软件前后面板视图

4、 结束语

本系统利用数字化的温度传感器进行温度的采集监控,利用串口通信将采集的温度数据传给电脑,利用电脑进行数据处理和显示。既实现了采集监控的功能,又可以进行数据的进一步处理和分析。

附录:主要下位机程序代码

18B20.c

本系统利用数字化的温度传感器进行温度的采集监控,利用串口通信将采集的温度数据传给电脑,利用电脑进行数据处理和显示。既实现了采集监控的功能,又可以进行数据的进一步处理和分析。

附录:主要下位机程序代码

18B20.c

附录:主要下位机程序代码

18B20.c

18B20.c

#include "config.h"

uint8 count,wmh,wml; //count为实际温度,wmh为温度的高位,wml为温度的低位

void init_1820(void) 

{ 

SET_TEM_DDR;      //设置数据端口为输出

 SET_TEM_SDT;  

  CLR_TEM_SDT; 

   delay_us(480);    //480us以上 

   SET_TEM_SDT; 

SET_TEM_DDR;      //设置数据端口为输出

 SET_TEM_SDT;  

  CLR_TEM_SDT; 

   delay_us(480);    //480us以上 

   SET_TEM_SDT; 

 SET_TEM_SDT;  

  CLR_TEM_SDT; 

   delay_us(480);    //480us以上 

   SET_TEM_SDT; 

  CLR_TEM_SDT; 

   delay_us(480);    //480us以上 

   SET_TEM_SDT; 

   delay_us(480);    //480us以上 

   SET_TEM_SDT; 

   SET_TEM_SDT; 

    CLR_TEM_DDR; 

 

 

 

 

 

    delay_us(20);     //15~60us 

 

 

 

 

 

    while(CHECK_TEM_SDT); 

 

 

 

 

 

    SET_TEM_DDR; 

 

 

 

 

 

    SET_TEM_SDT; 

 

 

 

 

 

    delay_us(140);    //60~240us 

 

 

 

 

 

}

 

 

 

 

 

void write_1820(uint8 data) 

 

 

 

 

 

{    

 

 

 

 

 

    uint8 i; 

 

 

 

 

 

    for(i=0;i<8;i++) 

 

 

 

 

 

    { 

 

 

 

 

 

       CLR_TEM_SDT;  //从高到低,产生写间隙

 

 

 

 

 

       if(data&(1<    ////写数据,先写低位

 

 

 

 

 

          SET_TEM_SDT; 

 

 

 

 

 

       else 

 

 

 

 

 

         CLR_TEM_SDT; 

 

 

 

 

 

       delay_us(40);     //15~60us 

 

 

 

 

 

       SET_TEM_SDT; 

 

 

 

 

 

    } 

 

 

 

 

 

    SET_TEM_SDT; 

 

 

 

 

 

}

 

 

 

 

 

uint8 read_1820(void) 

 

 

 

 

 

{     

 

 

 

 

 

    uint8 temp,k,n; 

 

 

 

 

 

    temp=0; 

 

 

 

 

 

    for(n=0;n<8;n++) 

 

 

 

 

 

    {

 

 

 

 

 

      CLR_TEM_SDT; 

 

 

 

 

 

      SET_TEM_SDT;  //从高到低再到高,产生读间隙

 

 

 

 

 

      CLR_TEM_DDR;           //设为输入 

 

 

 

 

 

      k=CHECK_TEM_SDT;       //读数据,从低位开始 

 

 

 

 

 

      if(k) 

 

 

 

 

 

        temp|=(1< 

 

 

 

 

 

      else 

 

 

 

 

 

        temp&=~(1< 

 

 

 

 

 

      delay_us(50);         //60~120us     

 

 

 

 

 

      SET_TEM_DDR;  //设为输出

 

 

 

 

 

    } 

 

 

 

 

 

   return (temp); 

 

 

 

 

 

} 

 

 

 

 

 

uint8 gettemp(void)         //读取温度值

 

 

 

 

 

{ 

 

 

 

 

 

     uint8 temh,teml,wm0,wm1,wm2,wm3,temp;

 

 

 

 

 

     init_1820();        //复位18b20 

 

 

 

 

 

     write_1820(0xCC);   // 跳过ROM

 

 

 

 

 

     write_1820(0x44);  // 温度变换

 

 

 

 

 

     init_1820(); 

 

 

 

 

 

     write_1820(0xCC);  // 跳过ROM

 

 

 

 

 

     write_1820(0xbe);  // 读暂存存储器

 

 

 

 

 

     teml=read_1820();  //读数据 

 

 

 

 

 

     temh=read_1820(); 

 

 

 

 

 

     wm0=teml>>4;       //只要高8位的低四位和低8位的高四位,温度范围0~99

 

 

 

 

 

     wm1=temh<<4;   

 

 

 

 

 

     wm2=wm1+wm0;        //16进制转10进制

 

 

 

 

 

        return wm2;

 

 

 

 

 

}

 

 

 

 

 

Sio.c

 

 

 

 

 

#include "config.h"

 

 

 

 

 

void USART_Init( unsigned int baud )

 

 

 

 

 

{

 

 

 

 

 

unsigned int tmp;

 

 

 

 

 

/* 设置波特率*/

 

 

 

 

 

tmp= F_CPU/baud/16-1;

 

 

 

 

 

UBRRH = (unsigned char)(tmp>>8);

 

 

 

 

 

UBRRL = (unsigned char)tmp;

 

 

 

 

 

/* 接收器与发送器使能*/

 

 

 

 

 

UCSRB = (1< 

 

/* 设置帧格式: 8 个数据位, 2 个停止位*/

 

 

 

 

 

UCSRC = (1< 

 

}

 

 

 

 

 

// 数据发送【发送5 8 位数据位的帧】

 

 

 

 

 

void USART_Transmit( unsigned char data )

 

 

 

 

 

{

 

 

 

 

 

/* 等待发送缓冲器为空 */

 

 

 

 

 

while ( !( UCSRA & (1< 

 

;

 

 

 

 

 

/* 将数据放入缓冲器,发送数据 */

 

 

 

 

 

UDR = data;

 

 

 

 

 

}

 

 

 

 

 

// 数据接收【以5 8 个数据位的方式接收数 据帧】

 

 

 

 

 

unsigned char USART_Receive( void )

 

 

 

 

 

{

 

 

 

 

 

/* 等待接收数据*/

 

 

 

 

 

while ( !(UCSRA & (1< 

 

;

 

 

 

 

 

/* 从缓冲器中获取并返回数据*/

 

 

 

 

 

return UDR;

 

 

 

 

 

}

 

 

 

 

 

Main.c

 

 

 

 

 

#include "config.h"

 

 

 

 

 

void main(void)

 

 

 

 

 

{

 

 

 

 

 

 unsigned char tmp=0;

 

 

 

 

 

 USART_Init(9600); //波特率9600 初始化串口

 

 

 

 

 

while(1)

 

 

 

 

 

 {

 

 

 

 

 

  tmp=gettemp();

 

 

 

 

 

  USART_Transmit(tmp);

 

 

 

 

 

 }

 

 

 

 

 

}

 

 

 

 

 

 

2:供电电路设计                       3DS18B20电路设计

供电电路如图2所示,供电电路使用了BM1117进行稳压,防止电压过高烧坏单片机,并可以提高系统适应电压的范围,即使供电电压高于单片机正常工作电压也可以由BM1117稳压到单片机正常工作电压的范围。

DS18B20 的工作电路如图3所示,采用外部供电而非总线供电的方式,只需一个电容和两个电阻。

3.jpg

3.jpg

 

3.jpg

4:串口通信电路

串口通信采用Max232进行电平转换,电路原理图如图4所示,实物照片如图5所示。

4.jpg

5:实物照片

3、 软件设计

下位机软件采用C语言编写,包括DS18B20的读写和串口通信两个主要部分。上位机软件采用LabVIEW编写。相关程序段如下所示:

获取DS18B20数据:

下位机软件采用C语言编写,包括DS18B20的读写和串口通信两个主要部分。上位机软件采用LabVIEW编写。相关程序段如下所示:

获取DS18B20数据:

获取DS18B20数据:

uint8 gettemp(void)         //读取温度值

{

    uint8 temh,teml,wm0,wm1,wm2,wm3,temp; 

    uint8 temh,teml,wm0,wm1,wm2,wm3,temp; 

     init_1820();        //复位18b20 

     write_1820(0xCC);   // 跳过ROM

     write_1820(0x44);  // 温度变换

     write_1820(0xCC);   // 跳过ROM

     write_1820(0x44);  // 温度变换

     write_1820(0x44);  // 温度变换

     init_1820(); 

     write_1820(0xCC);  // 跳过ROM

     write_1820(0xbe);  // 读暂存存储器

     teml=read_1820();  //读数据 

     temh=read_1820(); 

     write_1820(0xCC);  // 跳过ROM

     write_1820(0xbe);  // 读暂存存储器

     teml=read_1820();  //读数据 

     temh=read_1820(); 

     write_1820(0xbe);  // 读暂存存储器

     teml=read_1820();  //读数据 

     temh=read_1820(); 

     teml=read_1820();  //读数据 

     temh=read_1820(); 

     temh=read_1820(); 

     wm0=teml>>4;       //只要高8位的低四位和低8位的高四位,温度范围0~99

     wm1=temh<<4;

     wm2=wm1+wm0;        //16进制转10进制

 return wm2;

}

系统下位机主函数:

void main(void)

{

unsigned char i=0,tmp=0;

unsigned char i=0,tmp=0;

 USART_Init(9600); //波特率9600 初始化串口

 while(1)

 {

 tmp=gettemp();

 USART_Transmit(tmp);

}

 tmp=gettemp();

 USART_Transmit(tmp);

}

 USART_Transmit(tmp);

}

}

}

上位机软件采用当前测试测量应用最广泛的LabVIEW编写。LabVIEWLaboratory Virtual instrument Engineering)是一种图形化的编程语言,它广泛地被工业界、学术界和研究实验室所接受,视为一个标准的数据采集和仪器控制软件。LabVIEW集成了与满足GPIBVXIRS-232RS-485协议的硬件及数据采集卡通讯的全部功能。它还内置了便于应用TCP/IPActiveX等软件标准的库函数。这是一个功能强大且灵活的软件。利用它可以方便地建立自己的虚拟仪器,其图形化的界面使得编程及使用过程都生动有趣。

图形化的程序语言,又称为“G”语言。使用这种语言编程时,基本上不写程序代码,取而代之的是流程图或流程图。它尽可能利用了技术人员、科学家、工程师所熟悉的术语、图标和概念,因此,LabVIEW是一个面向最终用户的工具。它可以增强你构建自己的科学和工程系统的能力,提供了实现仪器编程和数据采集系统的便捷途径。使用它进行原理研究、设计、测试并实现仪器系统时,可以大大提高工作效率。

利用LabVIEW,可产生独立运行的可执行文件,它是一个真正的32位编译器。像许多重要的软件一样,LabVIEW提供了WindowsUNIXLinuxMacintosh的多种版本。

上位机的软件前后面板如图6所示:

5.jpg

5.jpg

 

5.jpg

6 上位机软件前后面板视图

4、 结束语

本系统利用数字化的温度传感器进行温度的采集监控,利用串口通信将采集的温度数据传给电脑,利用电脑进行数据处理和显示。既实现了采集监控的功能,又可以进行数据的进一步处理和分析。

附录:主要下位机程序代码

18B20.c

本系统利用数字化的温度传感器进行温度的采集监控,利用串口通信将采集的温度数据传给电脑,利用电脑进行数据处理和显示。既实现了采集监控的功能,又可以进行数据的进一步处理和分析。

附录:主要下位机程序代码

18B20.c

附录:主要下位机程序代码

18B20.c

18B20.c

#include "config.h"

uint8 count,wmh,wml; //count为实际温度,wmh为温度的高位,wml为温度的低位

void init_1820(void) 

{ 

SET_TEM_DDR;      //设置数据端口为输出

 SET_TEM_SDT;  

  CLR_TEM_SDT; 

   delay_us(480);    //480us以上 

   SET_TEM_SDT; 

SET_TEM_DDR;      //设置数据端口为输出

 SET_TEM_SDT;  

  CLR_TEM_SDT; 

   delay_us(480);    //480us以上 

   SET_TEM_SDT; 

 SET_TEM_SDT;  

  CLR_TEM_SDT; 

   delay_us(480);    //480us以上 

   SET_TEM_SDT; 

  CLR_TEM_SDT; 

   delay_us(480);    //480us以上 

   SET_TEM_SDT; 

   delay_us(480);    //480us以上 

   SET_TEM_SDT; 

   SET_TEM_SDT; 

    CLR_TEM_DDR; 

 

 

 

 

 

    delay_us(20);     //15~60us 

 

 

 

 

 

    while(CHECK_TEM_SDT); 

 

 

 

 

 

    SET_TEM_DDR; 

 

 

 

 

 

    SET_TEM_SDT; 

 

 

 

 

 

    delay_us(140);    //60~240us 

 

 

 

 

 

}

 

 

 

 

 

void write_1820(uint8 data) 

 

 

 

 

 

{    

 

 

 

 

 

    uint8 i; 

 

 

 

 

 

    for(i=0;i<8;i++) 

 

 

 

 

 

    { 

 

 

 

 

 

       CLR_TEM_SDT;  //从高到低,产生写间隙

 

 

 

 

 

       if(data&(1<    ////写数据,先写低位

 

 

 

 

 

          SET_TEM_SDT; 

 

 

 

 

 

       else 

 

 

 

 

 

         CLR_TEM_SDT; 

 

 

 

 

 

       delay_us(40);     //15~60us 

 

 

 

 

 

       SET_TEM_SDT; 

 

 

 

 

 

    } 

 

 

 

 

 

    SET_TEM_SDT; 

 

 

 

 

 

}

 

 

 

 

 

uint8 read_1820(void) 

 

 

 

 

 

{     

 

 

 

 

 

    uint8 temp,k,n; 

 

 

 

 

 

    temp=0; 

 

 

 

 

 

    for(n=0;n<8;n++) 

 

 

 

 

 

    {

 

 

 

 

 

      CLR_TEM_SDT; 

 

 

 

 

 

      SET_TEM_SDT;  //从高到低再到高,产生读间隙

 

 

 

 

 

      CLR_TEM_DDR;           //设为输入 

 

 

 

 

 

      k=CHECK_TEM_SDT;       //读数据,从低位开始 

 

 

 

 

 

      if(k) 

 

 

 

 

 

        temp|=(1< 

 

 

 

 

 

      else 

 

 

 

 

 

        temp&=~(1< 

 

 

 

 

 

      delay_us(50);         //60~120us     

 

 

 

 

 

      SET_TEM_DDR;  //设为输出

 

 

 

 

 

    } 

 

 

 

 

 

   return (temp); 

 

 

 

 

 

} 

 

 

 

 

 

uint8 gettemp(void)         //读取温度值

 

 

 

 

 

{ 

 

 

 

 

 

     uint8 temh,teml,wm0,wm1,wm2,wm3,temp;

 

 

 

 

 

     init_1820();        //复位18b20 

 

 

 

 

 

     write_1820(0xCC);   // 跳过ROM

 

 

 

 

 

     write_1820(0x44);  // 温度变换

 

 

 

 

 

     init_1820(); 

 

 

 

 

 

     write_1820(0xCC);  // 跳过ROM

 

 

 

 

 

     write_1820(0xbe);  // 读暂存存储器

 

 

 

 

 

     teml=read_1820();  //读数据 

 

 

 

 

 

     temh=read_1820(); 

 

 

 

 

 

     wm0=teml>>4;       //只要高8位的低四位和低8位的高四位,温度范围0~99

 

 

 

 

 

     wm1=temh<<4;   

 

 

 

 

 

     wm2=wm1+wm0;        //16进制转10进制

 

 

 

 

 

        return wm2;

 

 

 

 

 

}

 

 

 

 

 

Sio.c

 

 

 

 

 

#include "config.h"

 

 

 

 

 

void USART_Init( unsigned int baud )

 

 

 

 

 

{

 

 

 

 

 

unsigned int tmp;

 

 

 

 

 

/* 设置波特率*/

 

 

 

 

 

tmp= F_CPU/baud/16-1;

 

 

 

 

 

UBRRH = (unsigned char)(tmp>>8);

 

 

 

 

 

UBRRL = (unsigned char)tmp;

 

 

 

 

 

/* 接收器与发送器使能*/

 

 

 

 

 

UCSRB = (1< 

 

/* 设置帧格式: 8 个数据位, 2 个停止位*/

 

 

 

 

 

UCSRC = (1< 

 

}

 

 

 

 

 

// 数据发送【发送5 8 位数据位的帧】

 

 

 

 

 

void USART_Transmit( unsigned char data )

 

 

 

 

 

{

 

 

 

 

 

/* 等待发送缓冲器为空 */

 

 

 

 

 

while ( !( UCSRA & (1< 

 

;

 

 

 

 

 

/* 将数据放入缓冲器,发送数据 */

 

 

 

 

 

UDR = data;

 

 

 

 

 

}

 

 

 

 

 

// 数据接收【以5 8 个数据位的方式接收数 据帧】

 

 

 

 

 

unsigned char USART_Receive( void )

 

 

 

 

 

{

 

 

 

 

 

/* 等待接收数据*/

 

 

 

 

 

while ( !(UCSRA & (1< 

 

;

 

 

 

 

 

/* 从缓冲器中获取并返回数据*/

 

 

 

 

 

return UDR;

 

 

 

 

 

}

 

 

 

 

 

Main.c

 

 

 

 

 

#include "config.h"

 

 

 

 

 

void main(void)

 

 

 

 

 

{

 

 

 

 

 

 unsigned char tmp=0;

 

 

 

 

 

 USART_Init(9600); //波特率9600 初始化串口

 

 

 

 

 

while(1)

 

 

 

 

 

 {

 

 

 

 

 

  tmp=gettemp();

 

 

 

 

 

  USART_Transmit(tmp);

 

 

 

 

 

 }

 

 

 

 

 

}

 

 

 

 

 

 

单片机部分的电路设计如图1所示,主要包括复位电路、ISP接口、JTAG接口、晶振电路、A/D参考电压电路(此部分用于AD采集,本系统并未使用)。复位电路使用了钳位二极管钳位,防止触点电压过高烧坏RESET引脚。

2.jpg

2.jpg

 

2.jpg

2:供电电路设计                       3DS18B20电路设计

供电电路如图2所示,供电电路使用了BM1117进行稳压,防止电压过高烧坏单片机,并可以提高系统适应电压的范围,即使供电电压高于单片机正常工作电压也可以由BM1117稳压到单片机正常工作电压的范围。

DS18B20 的工作电路如图3所示,采用外部供电而非总线供电的方式,只需一个电容和两个电阻。

3.jpg

3.jpg

 

3.jpg

4:串口通信电路

串口通信采用Max232进行电平转换,电路原理图如图4所示,实物照片如图5所示。

4.jpg

5:实物照片

3、 软件设计

下位机软件采用C语言编写,包括DS18B20的读写和串口通信两个主要部分。上位机软件采用LabVIEW编写。相关程序段如下所示:

获取DS18B20数据:

下位机软件采用C语言编写,包括DS18B20的读写和串口通信两个主要部分。上位机软件采用LabVIEW编写。相关程序段如下所示:

获取DS18B20数据:

获取DS18B20数据:

uint8 gettemp(void)         //读取温度值

{

    uint8 temh,teml,wm0,wm1,wm2,wm3,temp; 

    uint8 temh,teml,wm0,wm1,wm2,wm3,temp; 

     init_1820();        //复位18b20 

     write_1820(0xCC);   // 跳过ROM

     write_1820(0x44);  // 温度变换

     write_1820(0xCC);   // 跳过ROM

     write_1820(0x44);  // 温度变换

     write_1820(0x44);  // 温度变换

     init_1820(); 

     write_1820(0xCC);  // 跳过ROM

     write_1820(0xbe);  // 读暂存存储器

     teml=read_1820();  //读数据 

     temh=read_1820(); 

     write_1820(0xCC);  // 跳过ROM

     write_1820(0xbe);  // 读暂存存储器

     teml=read_1820();  //读数据 

     temh=read_1820(); 

     write_1820(0xbe);  // 读暂存存储器

     teml=read_1820();  //读数据 

     temh=read_1820(); 

     teml=read_1820();  //读数据 

     temh=read_1820(); 

     temh=read_1820(); 

     wm0=teml>>4;       //只要高8位的低四位和低8位的高四位,温度范围0~99

     wm1=temh<<4;

     wm2=wm1+wm0;        //16进制转10进制

 return wm2;

}

系统下位机主函数:

void main(void)

{

unsigned char i=0,tmp=0;

unsigned char i=0,tmp=0;

 USART_Init(9600); //波特率9600 初始化串口

 while(1)

 {

 tmp=gettemp();

 USART_Transmit(tmp);

}

 tmp=gettemp();

 USART_Transmit(tmp);

}

 USART_Transmit(tmp);

}

}

}

上位机软件采用当前测试测量应用最广泛的LabVIEW编写。LabVIEWLaboratory Virtual instrument Engineering)是一种图形化的编程语言,它广泛地被工业界、学术界和研究实验室所接受,视为一个标准的数据采集和仪器控制软件。LabVIEW集成了与满足GPIBVXIRS-232RS-485协议的硬件及数据采集卡通讯的全部功能。它还内置了便于应用TCP/IPActiveX等软件标准的库函数。这是一个功能强大且灵活的软件。利用它可以方便地建立自己的虚拟仪器,其图形化的界面使得编程及使用过程都生动有趣。

图形化的程序语言,又称为“G”语言。使用这种语言编程时,基本上不写程序代码,取而代之的是流程图或流程图。它尽可能利用了技术人员、科学家、工程师所熟悉的术语、图标和概念,因此,LabVIEW是一个面向最终用户的工具。它可以增强你构建自己的科学和工程系统的能力,提供了实现仪器编程和数据采集系统的便捷途径。使用它进行原理研究、设计、测试并实现仪器系统时,可以大大提高工作效率。

利用LabVIEW,可产生独立运行的可执行文件,它是一个真正的32位编译器。像许多重要的软件一样,LabVIEW提供了WindowsUNIXLinuxMacintosh的多种版本。

上位机的软件前后面板如图6所示:

5.jpg

5.jpg

 

5.jpg

6 上位机软件前后面板视图

4、 结束语

本系统利用数字化的温度传感器进行温度的采集监控,利用串口通信将采集的温度数据传给电脑,利用电脑进行数据处理和显示。既实现了采集监控的功能,又可以进行数据的进一步处理和分析。

附录:主要下位机程序代码

18B20.c

本系统利用数字化的温度传感器进行温度的采集监控,利用串口通信将采集的温度数据传给电脑,利用电脑进行数据处理和显示。既实现了采集监控的功能,又可以进行数据的进一步处理和分析。

附录:主要下位机程序代码

18B20.c

附录:主要下位机程序代码

18B20.c

18B20.c

#include "config.h"

uint8 count,wmh,wml; //count为实际温度,wmh为温度的高位,wml为温度的低位

void init_1820(void) 

{ 

SET_TEM_DDR;      //设置数据端口为输出

 SET_TEM_SDT;  

  CLR_TEM_SDT; 

   delay_us(480);    //480us以上 

   SET_TEM_SDT; 

SET_TEM_DDR;      //设置数据端口为输出

 SET_TEM_SDT;  

  CLR_TEM_SDT; 

   delay_us(480);    //480us以上 

   SET_TEM_SDT; 

 SET_TEM_SDT;  

  CLR_TEM_SDT; 

   delay_us(480);    //480us以上 

   SET_TEM_SDT; 

  CLR_TEM_SDT; 

   delay_us(480);    //480us以上 

   SET_TEM_SDT; 

   delay_us(480);    //480us以上 

   SET_TEM_SDT; 

   SET_TEM_SDT; 

    CLR_TEM_DDR; 

 

 

 

 

 

    delay_us(20);     //15~60us 

 

 

 

 

 

    while(CHECK_TEM_SDT); 

 

 

 

 

 

    SET_TEM_DDR; 

 

 

 

 

 

    SET_TEM_SDT; 

 

 

 

 

 

    delay_us(140);    //60~240us 

 

 

 

 

 

}

 

 

 

 

 

void write_1820(uint8 data) 

 

 

 

 

 

{    

 

 

 

 

 

    uint8 i; 

 

 

 

 

 

    for(i=0;i<8;i++) 

 

 

 

 

 

    { 

 

 

 

 

 

       CLR_TEM_SDT;  //从高到低,产生写间隙

 

 

 

 

 

       if(data&(1<    ////写数据,先写低位

 

 

 

 

 

          SET_TEM_SDT; 

 

 

 

 

 

       else 

 

 

 

 

 

         CLR_TEM_SDT; 

 

 

 

 

 

       delay_us(40);     //15~60us 

 

 

 

 

 

       SET_TEM_SDT; 

 

 

 

 

 

    } 

 

 

 

 

 

    SET_TEM_SDT; 

 

 

 

 

 

}

 

 

 

 

 

uint8 read_1820(void) 

 

 

 

 

 

{     

 

 

 

 

 

    uint8 temp,k,n; 

 

 

 

 

 

    temp=0; 

 

 

 

 

 

    for(n=0;n<8;n++) 

 

 

 

 

 

    {

 

 

 

 

 

      CLR_TEM_SDT; 

 

 

 

 

 

      SET_TEM_SDT;  //从高到低再到高,产生读间隙

 

 

 

 

 

      CLR_TEM_DDR;           //设为输入 

 

 

 

 

 

      k=CHECK_TEM_SDT;       //读数据,从低位开始 

 

 

 

 

 

      if(k) 

 

 

 

 

 

        temp|=(1< 

 

 

 

 

 

      else 

 

 

 

 

 

        temp&=~(1< 

 

 

 

 

 

      delay_us(50);         //60~120us     

 

 

 

 

 

      SET_TEM_DDR;  //设为输出

 

 

 

 

 

    } 

 

 

 

 

 

   return (temp); 

 

 

 

 

 

} 

 

 

 

 

 

uint8 gettemp(void)         //读取温度值

 

 

 

 

 

{ 

 

 

 

 

 

     uint8 temh,teml,wm0,wm1,wm2,wm3,temp;

 

 

 

 

 

     init_1820();        //复位18b20 

 

 

 

 

 

     write_1820(0xCC);   // 跳过ROM

 

 

 

 

 

     write_1820(0x44);  // 温度变换

 

 

 

 

 

     init_1820(); 

 

 

 

 

 

     write_1820(0xCC);  // 跳过ROM

 

 

 

 

 

     write_1820(0xbe);  // 读暂存存储器

 

 

 

 

 

     teml=read_1820();  //读数据 

 

 

 

 

 

     temh=read_1820(); 

 

 

 

 

 

     wm0=teml>>4;       //只要高8位的低四位和低8位的高四位,温度范围0~99

 

 

 

 

 

     wm1=temh<<4;   

 

 

 

 

 

     wm2=wm1+wm0;        //16进制转10进制

 

 

 

 

 

        return wm2;

 

 

 

 

 

}

 

 

 

 

 

Sio.c

 

 

 

 

 

#include "config.h"

 

 

 

 

 

void USART_Init( unsigned int baud )

 

 

 

 

 

{

 

 

 

 

 

unsigned int tmp;

 

 

 

 

 

/* 设置波特率*/

 

 

 

 

 

tmp= F_CPU/baud/16-1;

 

 

 

 

 

UBRRH = (unsigned char)(tmp>>8);

 

 

 

 

 

UBRRL = (unsigned char)tmp;

 

 

 

 

 

/* 接收器与发送器使能*/

 

 

 

 

 

UCSRB = (1< 

 

/* 设置帧格式: 8 个数据位, 2 个停止位*/

 

 

 

 

 

UCSRC = (1< 

 

}

 

 

 

 

 

// 数据发送【发送5 8 位数据位的帧】

 

 

 

 

 

void USART_Transmit( unsigned char data )

 

 

 

 

 

{

 

 

 

 

 

/* 等待发送缓冲器为空 */

 

 

 

 

 

while ( !( UCSRA & (1< 

 

;

 

 

 

 

 

/* 将数据放入缓冲器,发送数据 */

 

 

 

 

 

UDR = data;

 

 

 

 

 

}

 

 

 

 

 

// 数据接收【以5 8 个数据位的方式接收数 据帧】

 

 

 

 

 

unsigned char USART_Receive( void )

 

 

 

 

 

{

 

 

 

 

 

/* 等待接收数据*/

 

 

 

 

 

while ( !(UCSRA & (1< 

 

;

 

 

 

 

 

/* 从缓冲器中获取并返回数据*/

 

 

 

 

 

return UDR;

 

 

 

 

 

}

 

 

 

 

 

Main.c

 

 

 

 

 

#include "config.h"

 

 

 

 

 

void main(void)

 

 

 

 

 

{

 

 

 

 

 

 unsigned char tmp=0;

 

 

 

 

 

 USART_Init(9600); //波特率9600 初始化串口

 

 

 

 

 

while(1)

 

 

 

 

 

 {

 

 

 

 

 

  tmp=gettemp();

 

 

 

 

 

  USART_Transmit(tmp);

 

 

 

 

 

 }

 

 

 

 

 

}

 

 

 

 

 

 

2:供电电路设计                       3DS18B20电路设计

供电电路如图2所示,供电电路使用了BM1117进行稳压,防止电压过高烧坏单片机,并可以提高系统适应电压的范围,即使供电电压高于单片机正常工作电压也可以由BM1117稳压到单片机正常工作电压的范围。

DS18B20 的工作电路如图3所示,采用外部供电而非总线供电的方式,只需一个电容和两个电阻。

3.jpg

3.jpg

 

3.jpg

4:串口通信电路

串口通信采用Max232进行电平转换,电路原理图如图4所示,实物照片如图5所示。

4.jpg

5:实物照片

3、 软件设计

下位机软件采用C语言编写,包括DS18B20的读写和串口通信两个主要部分。上位机软件采用LabVIEW编写。相关程序段如下所示:

获取DS18B20数据:

下位机软件采用C语言编写,包括DS18B20的读写和串口通信两个主要部分。上位机软件采用LabVIEW编写。相关程序段如下所示:

获取DS18B20数据:

获取DS18B20数据:

uint8 gettemp(void)         //读取温度值

{

    uint8 temh,teml,wm0,wm1,wm2,wm3,temp; 

    uint8 temh,teml,wm0,wm1,wm2,wm3,temp; 

     init_1820();        //复位18b20 

     write_1820(0xCC);   // 跳过ROM

     write_1820(0x44);  // 温度变换

     write_1820(0xCC);   // 跳过ROM

     write_1820(0x44);  // 温度变换

     write_1820(0x44);  // 温度变换

     init_1820(); 

     write_1820(0xCC);  // 跳过ROM

     write_1820(0xbe);  // 读暂存存储器

     teml=read_1820();  //读数据 

     temh=read_1820(); 

     write_1820(0xCC);  // 跳过ROM

     write_1820(0xbe);  // 读暂存存储器

     teml=read_1820();  //读数据 

     temh=read_1820(); 

     write_1820(0xbe);  // 读暂存存储器

     teml=read_1820();  //读数据 

     temh=read_1820(); 

     teml=read_1820();  //读数据 

     temh=read_1820(); 

     temh=read_1820(); 

     wm0=teml>>4;       //只要高8位的低四位和低8位的高四位,温度范围0~99

     wm1=temh<<4;

     wm2=wm1+wm0;        //16进制转10进制

 return wm2;

}

系统下位机主函数:

void main(void)

{

unsigned char i=0,tmp=0;

unsigned char i=0,tmp=0;

 USART_Init(9600); //波特率9600 初始化串口

 while(1)

 {

 tmp=gettemp();

 USART_Transmit(tmp);

}

 tmp=gettemp();

 USART_Transmit(tmp);

}

 USART_Transmit(tmp);

}

}

}

上位机软件采用当前测试测量应用最广泛的LabVIEW编写。LabVIEWLaboratory Virtual instrument Engineering)是一种图形化的编程语言,它广泛地被工业界、学术界和研究实验室所接受,视为一个标准的数据采集和仪器控制软件。LabVIEW集成了与满足GPIBVXIRS-232RS-485协议的硬件及数据采集卡通讯的全部功能。它还内置了便于应用TCP/IPActiveX等软件标准的库函数。这是一个功能强大且灵活的软件。利用它可以方便地建立自己的虚拟仪器,其图形化的界面使得编程及使用过程都生动有趣。

图形化的程序语言,又称为“G”语言。使用这种语言编程时,基本上不写程序代码,取而代之的是流程图或流程图。它尽可能利用了技术人员、科学家、工程师所熟悉的术语、图标和概念,因此,LabVIEW是一个面向最终用户的工具。它可以增强你构建自己的科学和工程系统的能力,提供了实现仪器编程和数据采集系统的便捷途径。使用它进行原理研究、设计、测试并实现仪器系统时,可以大大提高工作效率。

利用LabVIEW,可产生独立运行的可执行文件,它是一个真正的32位编译器。像许多重要的软件一样,LabVIEW提供了WindowsUNIXLinuxMacintosh的多种版本。

上位机的软件前后面板如图6所示:

5.jpg

5.jpg

 

5.jpg

6 上位机软件前后面板视图

4、 结束语

本系统利用数字化的温度传感器进行温度的采集监控,利用串口通信将采集的温度数据传给电脑,利用电脑进行数据处理和显示。既实现了采集监控的功能,又可以进行数据的进一步处理和分析。

附录:主要下位机程序代码

18B20.c

本系统利用数字化的温度传感器进行温度的采集监控,利用串口通信将采集的温度数据传给电脑,利用电脑进行数据处理和显示。既实现了采集监控的功能,又可以进行数据的进一步处理和分析。

附录:主要下位机程序代码

18B20.c

附录:主要下位机程序代码

18B20.c

18B20.c

#include "config.h"

uint8 count,wmh,wml; //count为实际温度,wmh为温度的高位,wml为温度的低位

void init_1820(void) 

{ 

SET_TEM_DDR;      //设置数据端口为输出

 SET_TEM_SDT;  

  CLR_TEM_SDT; 

   delay_us(480);    //480us以上 

   SET_TEM_SDT; 

SET_TEM_DDR;      //设置数据端口为输出

 SET_TEM_SDT;  

  CLR_TEM_SDT; 

   delay_us(480);    //480us以上 

   SET_TEM_SDT; 

 SET_TEM_SDT;  

  CLR_TEM_SDT; 

   delay_us(480);    //480us以上 

   SET_TEM_SDT; 

  CLR_TEM_SDT; 

   delay_us(480);    //480us以上 

   SET_TEM_SDT; 

   delay_us(480);    //480us以上 

   SET_TEM_SDT; 

   SET_TEM_SDT; 

    CLR_TEM_DDR; 

 

 

 

 

 

    delay_us(20);     //15~60us 

 

 

 

 

 

    while(CHECK_TEM_SDT); 

 

 

 

 

 

    SET_TEM_DDR; 

 

 

 

 

 

    SET_TEM_SDT; 

 

 

 

 

 

    delay_us(140);    //60~240us 

 

 

 

 

 

}

 

 

 

 

 

void write_1820(uint8 data) 

 

 

 

 

 

{    

 

 

 

 

 

    uint8 i; 

 

 

 

 

 

    for(i=0;i<8;i++) 

 

 

 

 

 

    { 

 

 

 

 

 

       CLR_TEM_SDT;  //从高到低,产生写间隙

 

 

 

 

 

       if(data&(1<    ////写数据,先写低位

 

 

 

 

 

          SET_TEM_SDT; 

 

 

 

 

 

       else 

 

 

 

 

 

         CLR_TEM_SDT; 

 

 

 

 

 

       delay_us(40);     //15~60us 

 

 

 

 

 

       SET_TEM_SDT; 

 

 

 

 

 

    } 

 

 

 

 

 

    SET_TEM_SDT; 

 

 

 

 

 

}

 

 

 

 

 

uint8 read_1820(void) 

 

 

 

 

 

{     

 

 

 

 

 

    uint8 temp,k,n; 

 

 

 

 

 

    temp=0; 

 

 

 

 

 

    for(n=0;n<8;n++) 

 

 

 

 

 

    {

 

 

 

 

 

      CLR_TEM_SDT; 

 

 

 

 

 

      SET_TEM_SDT;  //从高到低再到高,产生读间隙

 

 

 

 

 

      CLR_TEM_DDR;           //设为输入 

 

 

 

 

 

      k=CHECK_TEM_SDT;       //读数据,从低位开始 

 

 

 

 

 

      if(k) 

 

 

 

 

 

        temp|=(1< 

 

 

 

 

 

      else 

 

 

 

 

 

        temp&=~(1< 

 

 

 

 

 

      delay_us(50);         //60~120us     

 

 

 

 

 

      SET_TEM_DDR;  //设为输出

 

 

 

 

 

    } 

 

 

 

 

 

   return (temp); 

 

 

 

 

 

} 

 

 

 

 

 

uint8 gettemp(void)         //读取温度值

 

 

 

 

 

{ 

 

 

 

 

 

     uint8 temh,teml,wm0,wm1,wm2,wm3,temp;

 

 

 

 

 

     init_1820();        //复位18b20 

 

 

 

 

 

     write_1820(0xCC);   // 跳过ROM

 

 

 

 

 

     write_1820(0x44);  // 温度变换

 

 

 

 

 

     init_1820(); 

 

 

 

 

 

     write_1820(0xCC);  // 跳过ROM

 

 

 

 

 

     write_1820(0xbe);  // 读暂存存储器

 

 

 

 

 

     teml=read_1820();  //读数据 

 

 

 

 

 

     temh=read_1820(); 

 

 

 

 

 

     wm0=teml>>4;       //只要高8位的低四位和低8位的高四位,温度范围0~99

 

 

 

 

 

     wm1=temh<<4;   

 

 

 

 

 

     wm2=wm1+wm0;        //16进制转10进制

 

 

 

 

 

        return wm2;

 

 

 

 

 

}

 

 

 

 

 

Sio.c

 

 

 

 

 

#include "config.h"

 

 

 

 

 

void USART_Init( unsigned int baud )

 

 

 

 

 

{

 

 

 

 

 

unsigned int tmp;

 

 

 

 

 

/* 设置波特率*/

 

 

 

 

 

tmp= F_CPU/baud/16-1;

 

 

 

 

 

UBRRH = (unsigned char)(tmp>>8);

 

 

 

 

 

UBRRL = (unsigned char)tmp;

 

 

 

 

 

/* 接收器与发送器使能*/

 

 

 

 

 

UCSRB = (1< 

 

/* 设置帧格式: 8 个数据位, 2 个停止位*/

 

 

 

 

 

UCSRC = (1< 

 

}

 

 

 

 

 

// 数据发送【发送5 8 位数据位的帧】

 

 

 

 

 

void USART_Transmit( unsigned char data )

 

 

 

 

 

{

 

 

 

 

 

/* 等待发送缓冲器为空 */

 

 

 

 

 

while ( !( UCSRA & (1< 

 

;

 

 

 

 

 

/* 将数据放入缓冲器,发送数据 */

 

 

 

 

 

UDR = data;

 

 

 

 

 

}

 

 

 

 

 

// 数据接收【以5 8 个数据位的方式接收数 据帧】

 

 

 

 

 

unsigned char USART_Receive( void )

 

 

 

 

 

{

 

 

 

 

 

/* 等待接收数据*/

 

 

 

 

 

while ( !(UCSRA & (1< 

 

;

 

 

 

 

 

/* 从缓冲器中获取并返回数据*/

 

 

 

 

 

return UDR;

 

 

 

 

 

}

 

 

 

 

 

Main.c

 

 

 

 

 

#include "config.h"

 

 

 

 

 

void main(void)

 

 

 

 

 

{

 

 

 

 

 

 unsigned char tmp=0;

 

 

 

 

 

 USART_Init(9600); //波特率9600 初始化串口

 

 

 

 

 

while(1)

 

 

 

 

 

 {

 

 

 

 

 

  tmp=gettemp();

 

 

 

 

 

  USART_Transmit(tmp);

 

 

 

 

 

 }

 

 

 

 

 

}

 

 

 

 

 

 

4 条评论
查看更多评论
  • 附件包括开题报告、论文、源程序1本选题的意义及国内外发展状况1.1研究目的和意义    随着工业自动化程度不断发展,对位移测量的精准度、效率以及..

    浏览:3457次 评论:0
    2020-02-21 09:30:14
浏览:4924次 评论:0
2018-05-13 22:08:20
浏览:7485次 评论:1
2018-04-14 20:41:34
  • 摘 要:探讨在MATLAB中使用FIS编辑器与Simulink相结合的方法构造模糊推理结构,并通过MATLAB Script Node实现LabVIEW与MATLAB的混合编程,设计出具有模糊自整..

    浏览:4048次 评论:0
    2017-07-28 15:43:26
  • 摘要:针对现代工业过程控制中实时通讯要求和现场总线存在的缺点,用现在流行的开放式标准接口技术OPC规范,设计了一种基于LabV IEW的PC与PCC实时数据通讯方..

    浏览:4070次 评论:0
    2017-07-28 15:27:50
作者专栏
  • 威威猫

    注册时间:2024-04-23 23:51:14

  • 自由的蚂蚁

    注册时间:2024-04-15 13:48:28

  • 2204020104

    注册时间:2024-04-14 14:34:22

  • 段816

    注册时间:2024-04-09 16:42:31

  • 万家伟

    注册时间:2024-04-02 09:01:06

Copyright@http://nilab.com.cn all rights reserved 备案号:京ICP备12043750号-1
Powered by qibosoft V9.0 Code © 2003-2017 qibosoft
LABVIEW之家 QQ:181237912; email:Labviewzj@qq.com 项目合作 微信及手机:18510627229