搜索
bottom↓
回复: 35

18b20+上位机温度采集及显示(上位机用VC)

[复制链接]

出0入0汤圆

发表于 2011-2-24 10:10:31 | 显示全部楼层 |阅读模式
这是我做的18b20温度显示,做了一个上位机,晒一下,大家学习交流一下。下面是下位机的源程序:
/*****************************************************************
*程序名称:18b20数码管显示温度            
*程序功能:   显示实时温度监测,带上位机     
*端口定义: DQ -P1^7   
*编写:muye414  
*修改:
*修改何处:   
*****************************************************************/
#include <reg52.h>
#include <string.h>
#include <stdio.h>

#define XTAL 11059200    // CUP 晶振频率
#define baudrate 9600    // 通信波特率
#define uchar unsigned char
#define uint unsigned int
#define duan P0  //数码管显示的段选
#define wei  P2   //数码管显示的位选

/*********************函数声明************************/
void Send_Byte(uchar);
void Send_Str(char);
void send_char(void);
/*********************函数声明结束********************/
sbit DQ = P1^7;   // 定义DS18B20端口DQ
sbit BEEP = P3^7; //蜂鸣器端口定义
bit sendtempflag=0;
uchar presence ;
float f_temp;
uint temp;

uchar code  LEDData1[ ]={0x40,0x79,0x24,0x30,0x19,0x12,
       0x02,0x78,0x00,0x10,0xff};//带小数点的共阳数码管"0-9"段码数字
uchar code  LEDData[ ]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,
                     0x82,0xF8,0x80,0x90,0xff};//共阳数码管段码
uchar code  ditab[16] = {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,
                         0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};//温度的小数位
uchar data  temp_data[2] = {0x00,0x00};
uchar data  display[5] ={0x00,0x00,0x00,0x00,0x00};
void beep();

bit  flash=0;    // 显示开关标记
bit  flag_zf=0;   // 正负温度标志
/**********************************************************/
void Delay(unsigned int num)// 延时函数
{
   while( --num );
}
/*********************************************************

********************以下为1820相关函数*******************

/*********************************************************/
uchar Init_DS18B20(void) // 初始化ds1820
{
  
  DQ = 1;      // DQ复位
  Delay(8);    // 稍做延时
  DQ = 0;      // 单片机将DQ拉低
  Delay(90);   // 精确延时 大于 480us
  DQ = 1;       // 拉高总线
  Delay(8);
  presence = DQ;    // 如果=0则初始化成功 =1则初始化失败
  Delay(100);
  DQ = 1;
     
     return(presence); // 返回信号,0=presence,1= no presence
}

/**********************************************************/
uchar ReadOneChar(void) // 读一个字节
{
unsigned char i = 0;
unsigned char dat = 0;
for (i = 8; i > 0; i--)
    {
DQ = 0; // 给脉冲信号
dat >>= 1;
DQ = 1; // 给脉冲信号
     if(DQ)
     dat |= 0x80;
     Delay(4);
    }
     return (dat);
}
/**********************************************************/
void WriteOneChar(unsigned char dat)// 写一个字节
{
  unsigned char i = 0;
  for (i = 8; i > 0; i--)
    {
   DQ = 0;
   DQ = dat&0x01;
   Delay(5);
   DQ = 1;
   dat>>=1;
    }
}
/*********************************************************/
Read_Temperature(void)// 读取温度
{
   uchar a,b;
   Init_DS18B20();
   if(presence==1)        
    {
     beep();Delay(25000);
     flash=1;
  }                        // DS18B20不正常,蜂鸣器报警
else
    {
  flash=0;
WriteOneChar(0xCC);  // 跳过读序号列号的操作
WriteOneChar(0x44);  // 启动温度转换
Init_DS18B20();
WriteOneChar(0xCC);  // 跳过读序号列号的操作
WriteOneChar(0xBE);  // 读取温度寄存器
a = ReadOneChar();   // 温度低8位
b = ReadOneChar();   // 温度高8位
temp_data[0]=a;
temp_data[1]=b;
temp=b;
temp<<=8;
temp=temp|a;
f_temp=temp*0.0625;
temp=f_temp*10+0.5;//后面小数取一位,并四舍五入
f_temp=f_temp+0.05;
return temp;
    }
}
/*********************************************************/
void Disp_Temperature()// 显示温度
{
  unsigned char  n=0;
  if(temp_data[1]>7)                  //当温度高八位中的高五位全为O
  { flag_zf=1;                     // 所测温度为负时,要进行转换
temp_data[1]=!( temp_data[1]);
  temp_data[0]=!( temp_data[0]);
temp_data[0]= temp_data[0]+1;
if(temp_data[0]==0)
  { temp_data[1]= temp_data[1]+1;}
  }
else
  {flag_zf=0;}  //判断测得的温度数据是正还是负,如果为正,不做任何处理

display[4]=temp_data[0]&0x0f;
display[0]=ditab[display[4]];     // 查表得小数位的值

display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);
display[3]=display[4]/100;//百位
display[1]=display[4]%100;//存储十位和个位
display[2]=display[1]/10;//十位
display[1]=display[1]%10;//个位

if(flag_zf==1)
{duan=0xbf;//"-"
wei=0x02;
Delay(100);}      //温度为负数时第二个数码管显示负号
if(!display[3])          // 高位为0,不显示
   {
    display[3]=0x0a;              
    if(!display[2])      // 次高位为0,不显示
    display[2]=0x0a;
    }
  duan = 0xc6;    // 显示 C
  wei = 0xfe;    // 位选线为P2.7口,LED为共阳极显示,当位选线为低电平时选通
  Delay(100);

  duan = 0x9c;    // 显示 °  
  wei = 0xfd;   // 选中P2.6口
  Delay(100);

  duan = 0x7F; //在个位上显示小数点"."
  wei = 0xf7;  //位选
  Delay(100);

  duan =LEDData[display[0]] ;  // 显示小数位
  wei = 0xfb;      //p2.5
  Delay(100);
  
  duan =LEDData[display[1]];  // 显示个位
  wei = 0xf7;
  Delay(100);

  duan =LEDData[display[2]];  // 显示十位
  wei = 0xef;      
  Delay(100);

  duan =LEDData[display[3]];  // 显示百位
  wei = 0xdf;
  Delay(100);

  wei = 0xff;                // 关闭显示
}
/*********************************************************

******************1820相关函数到此结束*******************

/*********************************************************/
void beep(void)
{
    unsigned char i;
    for (i=0;i<100;i++)
    {
       Delay(120);
       BEEP=!BEEP;                // BEEP取反
    }
    BEEP=1;                        // 关闭蜂鸣器


}
/*********************************************************

********************以下为初始化函数*********************

/*********************************************************/
void Init(void)
{
  
TMOD = 0x20;   // 定时器1工作于8位自动重载模式, 用于产生波特率

// TH1=(uchar)(256 - (XTAL / (32L * 12L * baudrate)));
// TL1=(uchar)(256 - (XTAL / (32L * 12L * baudrate)));   // 定时器1赋初值

TH1=0xfd;   //Baud:9600 fosc="11.0592"MHz
TL1=0xfd;
SCON = 0x50;   // 设定串行口工作方式- 模式 1, 8-bit UART, 使能接收
     //串口设置为方式1,REN=1,允许接收

PCON &= 0x00;   // 波特率不倍增
// ES=1;   //打开串口中断
TR1 = 1;    // 启动定时器1
// EA  = 1;     // "中断总允许"
// IE = 0x00;    // 禁止任何中断
}
/*********************************************************

********************以下为串口相关函数*******************

/*********************************************************/
void sendchar(char *ch)
{
do{
  SBUF=*ch++;//发送数据
  while(!TI);//等待发送完毕,标志置1
  TI=0; //标志清零
   }
while(*ch);//循环直至发送完毕
}


/*********************************************************

*************************主函数**************************

/*********************************************************/
void main()
{
   uchar buff[4];
   Init();

   while(1)
   {
      Read_Temperature();    // 读取温度
   if (flash==0)            
   {
  sprintf(buff,"%f",f_temp);//将浮点温度格式化为字符型
  Disp_Temperature();   // 显示温度
     sendchar(buff);       // 传送采集的温度
   }
     else
    {
     wei = 0x00 ;    // DS18B20不正常,关闭显示
    }



   }
}

/******************************************************************/
下面是上位机的截图,上位机简单美化了一下,其中用到了Edit类、按键类等。


(原文件名:vc1.jpg)

(原文件名:VC3.jpg)

实拍图


(原文件名:IMG0698A.jpg)



上位机程序共享出来
上位机源程序ourdev_618148AOGWI2.rar(文件大小:4.00M) (原文件名:Temper.rar)

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2011-2-26 21:16:26 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-3-4 17:23:28 | 显示全部楼层
mark  THANK YOU!

出0入0汤圆

发表于 2011-3-21 01:27:11 | 显示全部楼层
着手1820

出0入0汤圆

发表于 2011-3-21 10:13:06 | 显示全部楼层
好好

出0入0汤圆

发表于 2011-5-5 11:34:30 | 显示全部楼层
不错,学习下。

出0入0汤圆

发表于 2011-5-12 21:14:07 | 显示全部楼层
引用图片【楼主位】junmin414
-----------------------------------------------------------------------

(原文件名:vc1.jpg)

出0入0汤圆

发表于 2011-5-17 10:53:54 | 显示全部楼层
为什么我的不能显示呢

出0入0汤圆

 楼主| 发表于 2011-5-23 22:48:17 | 显示全部楼层
具体情况说一下!!!

出0入0汤圆

发表于 2011-5-23 22:51:17 | 显示全部楼层
不错,不错,看看下位机程序

出0入0汤圆

发表于 2011-5-25 08:00:30 | 显示全部楼层
无法打开下位机EXE文件

出0入0汤圆

 楼主| 发表于 2011-5-25 08:32:24 | 显示全部楼层
装有VC(Visual C++)吗?没装VC的话,没法打开的。我在建工程的时候没有设置好,致使没装VC是打不开的!装了的话打开***.dsw文件,然后运行就行了!

出0入0汤圆

发表于 2011-5-25 08:52:30 | 显示全部楼层
装了VC也打不开EXE文件

出0入0汤圆

发表于 2011-5-25 09:02:28 | 显示全部楼层
能把原理图发上来吗?测温范围是多少度呢?谢谢

出0入0汤圆

 楼主| 发表于 2011-5-25 21:12:53 | 显示全部楼层
18B20数据手册有说明的,自己看一下吧!零下20左右到一百多摄氏度吧,应该是120左右。具体是多少我也不太记得了!原理图很简单的,学过51应该都不是难事!
我传一下上来吧!给你参考一下!!

(原文件名:1.jpg)


(原文件名:2.jpg)

出0入0汤圆

发表于 2011-6-29 09:05:03 | 显示全部楼层
很需要上位机,正好

出0入0汤圆

发表于 2011-12-10 00:20:20 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-12-12 13:41:43 | 显示全部楼层
很好~顶~~

出0入0汤圆

发表于 2012-1-16 19:23:01 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-1-20 23:56:36 | 显示全部楼层
留个记号,谢谢了

出0入0汤圆

发表于 2012-1-27 21:07:49 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-2-22 13:52:45 | 显示全部楼层
这个是 vc  还是 C++builder

出0入0汤圆

发表于 2012-3-10 20:57:53 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-3-25 12:57:14 | 显示全部楼层
顶一个!

出0入0汤圆

发表于 2012-3-25 21:27:53 | 显示全部楼层
顶一个。        

出0入0汤圆

发表于 2012-4-14 14:51:49 来自手机 | 显示全部楼层
标记…学习了!

出0入0汤圆

发表于 2012-4-30 20:39:14 | 显示全部楼层
楼主,下位机程序没用啊,什么原因???……

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2012-5-3 09:55:18 | 显示全部楼层
楼上,你keil软件的提示是:没有发现文件和路径。你重新建一个工程,把文件加进来。试试

出0入0汤圆

发表于 2012-5-3 10:06:25 | 显示全部楼层
支持!!!!!!!!!!!!!!1

出0入0汤圆

发表于 2012-11-3 11:38:30 | 显示全部楼层
junmin414 发表于 2011-5-25 08:32
装有VC(Visual C++)吗?没装VC的话,没法打开的。我在建工程的时候没有设置好,致使没装VC是打不开的!装 ...

我最近也在做下位机  把程序烧写到我焊接的电路板上面可以正常显示温度  但是要往上位机发送数据时 发送的数据和正常的温度不一致  
我用串口调试助手测试了下   收到的数据是乱码?  不知道什么原因?想请教你一下@    当上位机向下位机发送数据1时下位机传送显示的温度
下面是我的程序  希望那你帮我看下我的问题?   谢谢
#include<reg51.H>
#include<absacc.H>
#include <intrins.h>                  
#include<stdio.h>

#define XTAL 110592;//CPU晶振频率
#define baudrate 9600 //通信波特率

#define uchar unsigned char
#define uint unsigned int

//不带小数点
uchar code TAB[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//带小数点
uchar code TAB1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};                  

sbit DQ=P3^3;  //定义DS18B20的端口DQ

void delay(uint i)        //精确延时程序
{
       
        while(i--);
}

void DelayMS(uint ms)
{
        uchar i;
        while(ms--) for(i=0;i<120;i++);
}

void display(int k)//数码管显示
{
        P2=0xf7;
        P0=0x39; //显示C
        DelayMS(1);

        P2=0xfb;
        P0=0x63;//显示°
        DelayMS(1);
       
        P2=0xfd;
        P0=TAB[k%10];//显示个位
    DelayMS(1);

        P2=0xfe;
        P0=TAB[k/10%10];//显示十位
        DelayMS(1);
       
}


init_DS(void) //DS18B20初始化
{
        uchar x=0;
        DQ=1; //DQ复位
        delay(8); //延时
        DQ=0; //单片机拉低总线
        delay(85); //延时
        DQ=1; //释放总线,单片机拉高总线
        delay(14);
        x=DQ; //稍作延时后,如果X=0则初始化成功,X=1则失败
        delay(20);
}

Read(void)           //读一个字节
{
        uchar i=0;
        uchar dat=0;
        for(i=8;i>0;i--)
                {
                        DQ=0; //给脉冲信号
                        dat>>=1; //让脉冲读到的位数据,依次从高位移到低位
                                DQ=1; //释放总线
                        if(DQ) //控制器进行采样                          
                                dat|=0x80; //读出数据放入高位,最后右移到低位
                        delay(4); //延时
                }
        return(dat);
}  


write(uchar dat) //写一个字节
{
        uchar i=0;
        for(i=8;i>0;i--)
                {
                        DQ=0; //拉低总线
                        DQ=dat&0x01; //从低位开始写入
                        delay(5);
                        DQ=1; //写完后释放总线
                        dat>>=1;
                       
                }
        delay(4); //延时
}


Readtem(void) //获取温度
{
        uchar a=0,b=0;

        float t=0,t1;
        init_DS();        //初始化
        write(0xcc);//跳过读序列号操作
        write(0x44);//启动温度转换
        delay(125);

        init_DS();  //初始化
        write(0xcc);//跳过读序列号操作
        write(0xbe);//        读温度寄存器
       
        a=Read();//读取温度低位LSB
        b=Read();//读取温度低位HSB
        t1=(a&0x0f)*0.0625;//取小数部分
       
        t=((b<<4)|(a>>4));//取整数部分
        return(t);       
}

void init(void)         //串口初始化
{
   EA=1; //中断总允许

   TMOD=0x20;//设置定时器1为工作方式2

   TH1=0xfd;//给定时器赋初值
   TL1=0xfd;
   TR1=1;//启动定时器1

   //SCON=0x50;//设置串行口工作方式1,允许接收
   //PCON&=0x00;//波特率不倍增

   SM0=0;
   SM1=1;
   REN=1;

   
   IE=0x00;//禁止任何中断
}



void send_char(uchar c) //传送温度数据
{
    SBUF = c;
        while(TI == 0);
        TI = 0;

}

void main()//主函数
{
   float tp;
   unsigned char dataREC = 0X00;
   init();
   while(1)
    {
   tp=Readtem(); //读取温度
   display((uint) tp); //显示温度
   if(RI)   //是否有数据到来
    {
      RI=0;
          dataREC = SBUF;
      if(dataREC == 49)  //是否开始采集温度
          {
      send_char((uchar) tp);//传送采集的温度
  }
  }
}
}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2012-11-30 16:52:26 | 显示全部楼层
你好,请问一下上位机怎么做的?有什么资料可以推荐的吗?我研究了一年还没搞定上位机谢谢你了
你的上位机代码我用vc++ 6.0打开了,但是编译运行不成功
谢谢指导!

出0入0汤圆

发表于 2013-5-1 17:03:51 | 显示全部楼层
这个软件缺少个曲线图像显示,有的话就更完美了

出0入0汤圆

发表于 2013-5-1 17:18:47 | 显示全部楼层
1240257186 发表于 2012-11-30 16:52
你好,请问一下上位机怎么做的?有什么资料可以推荐的吗?我研究了一年还没搞定上位机谢谢你了
你的 ...

网上有例程,
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 16:16

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表