微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 测试测量 > Labview > 求教大牛LabVIEW温度采集的问题

求教大牛LabVIEW温度采集的问题

时间:10-02 整理:3721RD 点击:
我现在下位机的程序已经准备好了,发送的数据是“32.231”这种格式的数据,上位机的LabVIEW程序应该怎么编?这是我下位机的程序,AT89S52单片机,DS18B20温度传感器,,真心求助大牛的帮助!
#include
#include
#define uchar unsigned char
#define uint unsigned int                  
/***************************************
        定义一个8us的延时
****************************************/
#define nops() {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}//每个nop都得有分号  
#define ulong unsigned long
sbit DQ=P1^2;
uchar code table[11]={0x77,0x14,0xb3,0xb6,0xd4,0xe6,0xe7,0x34,0xf7,0xf4,0x00};
uchar digit[8]={0,0,0,0,0,0,0,0};                //数码管只显示后六位      
/*******************************************
    延时时间约为9-10us
*******************************************/
void delay(unsigned int i)//延时函数   
{
        while(i--);
}                                                                                                                                                  
/******************************   
// 18b20初始化函数     
*******************************/
uchar Init_DS18B20()
{
        unsigned char x=0;
        DQ = 1;                   //DQ复位   
    delay(8);                  //稍做延时     
        DQ = 0;                    //单片机将DQ拉低      
        delay(80);                 //精确延时 大于 480us         
        DQ = 1;                    //拉高总线        
        delay(10);                //等待器件做出反应   
        x=DQ;                      //稍做延时后 如果x=0则初始化成功 x=1则初始化失败     
        delay(5);
        return x;
}
/******************************
// 读一个字节   
*******************************/
unsigned char ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)        //移动8次得到一个byte     
{
        DQ=1;
        DQ = 0;         // 给脉冲信号   
          dat>>=1;        //数据全部右移1位(把数据最高位空出来,用于接收新的单总线bit数据)
          DQ = 1;        // 给脉冲信号   
          nops();         //DS18B20输出的数据在下降沿(下降沿产生读时隙)产生后15us后有效。  
                              //以上就是产生一个读时隙  
                            //在主机产生读时隙后,DS18B20开始发送0或1到总线上   
        if(DQ)          //如果此时DQ为1则将数据暂存的最高位置1,否则忽略处理(不处理最高位为0)
        dat|=0x80;
        delay(5);                //所有的读时隙必须至少有60us的持续时间     
                                //数据被右移8次后,形成了一个完整byte(8个bit)数据   
}
        return(dat);                //送回读出的数据      
}
/******************************
//写一个字节,dat-要写入单总线的数据     
*******************************/         
void WriteOneChar(unsigned char dat)
{
        unsigned char i=0;
        for (i=8; i>0; i--)                //循环8次,连续送出8个bit     
        {
               DQ=1;
                _nop_();                       
                DQ = 0;                //拉低单总线                                                       
                  DQ = dat&0x01;        //将dat数据最低位放到数据总线上      
                  delay(5);                //延时等待DS18b20器件读取该位数据     
                  DQ = 1;                //释放总线                     
                  dat>>=1;                //数据右移一位      
        }
        delay(50);                        //延时稳定               
}
/******************************     
// 读取温度,返回:当前温度整数部分数值      
*******************************/
unsigned int ReadTemperature(void)
{
unsigned int a=0;
unsigned int b=0;
unsigned int t=0;
Init_DS18B20();                        //DS18B20初始化(判断器件是否存在)
                                                   //不需要写while(Init_DS18B20())
delay(50);                                                   //因为它一直初始化,肯定初始化会成功   
WriteOneChar(0xCC);                // 跳过读序号列号的操作   
WriteOneChar(0x44);                // 启动温度转换
delay(200);                                //等待转换结束   
Init_DS18B20();                        //每次通信前都要初始化   
WriteOneChar(0xCC);                 //跳过读序号列号的操作            
WriteOneChar(0xBE);         //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=ReadOneChar();                //读出DS18B20温度数据低8位MSB               
b=ReadOneChar();                //读出DS18B20温度数据的高8位LSB(内部寄存器编号自加)   
b<<=8;
t=b+a;
return(t);                                //返回温度整数部分的数值   
}
void dis_led()
{   
        uint k;
        uchar i;
        k=ReadTemperature()*62.5;
        digit[0]=k%10+48;
        digit[1]=k%100/10+48;
        digit[2]=k%1000/100+48;
        digit[3]=k%10000/1000+48;
        digit[4]=k/10000+48;
                                                                //        for(i=0;i<8;i++)
                SBUF=digit[4];                                                //SCON=0;                                                        //选择串口工作方式0   
                while(TI==0);
                TI=0;
                SBUF=digit[3];                                                //SCON=0;                                                        //选择串口工作方式0   
                while(TI==0);
                TI=0;
                SBUF=0x2e;                  //....
                while(TI==0);
                TI=0;
                SBUF=digit[2];        //7                                        //SCON=0;                                                        //选择串口工作方式0   
                while(TI==0);
                TI=0;
                SBUF=digit[1];        //00                                        //SCON=0;                                                        //选择串口工作方式0   
                while(TI==0);
                TI=0;
                                                        //        {   
                SBUF=digit[0];                                                //SCON=0;                                                        //选择串口工作方式0   
                while(TI==0);
                TI=0;
                delay(5000);                                                //                if(i!=3)
                                                        //                SBUF=table[digit[i]];                //断码送入串行口收发缓冲器  
}                                                        //                while(TI==0);
                                                        //                TI=0;  
                                                        //                }
                                                        //                else
                                                        //                {
                                                        //                SBUF=(table[digit[i]])|0x08;
                                                        //                while(TI==0);                                //判断是否传送完毕     
                                                        //                TI=0;
                                                        //                }                                                //  
                                                        //   }
void main()
{  
        SCON=0x50;
        TMOD=0x20;
        TH1=TL1=0xfd;
        TR1=1;
    while(1)
        {
                dis_led();
        }
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top