www.openedv.com
您好,欢迎您!    会员注册 | 登入 
公告:欢迎访问www.openedv.com开源电子网,开源共享共同进步,祝您新年快乐,万事如意!
设为首页 | 加入收藏
论坛首页 » 51单片机 前往: 
18b20+上位机温度显示(上位机用VC做的)
发表人 内容
[Down] [Up]
[楼主位] muye414


等级:NO
注册时间:
2010/12/16 23:24
文章: 60
来自: 广西
离线

这是我做的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类、按键类等。


 


实拍图


上位机程序共享出来
更新一下上位机,上图:




 





这篇文章被编辑了 2 次. 最近一次更新是在 2011/03/07 10:44


悠悠木叶随风落,翩翩起舞伴蝶飞!     --幽木叶
[加为好友] 回复 引用回复
[Down] [Up]
[1楼] QiYuan

等级:NO
注册时间:
2010/12/14 20:52
文章: 45
离线

good
沙发~~


[加为好友] 回复 引用回复
[Down] [Up]
[2楼] muye414


等级:NO
注册时间:
2010/12/16 23:24
文章: 60
来自: 广西
离线

有谁做过实时曲线绘制的上位机吗?正在弄,有研究的互相学习一下!原子哥不知道做过没有!



悠悠木叶随风落,翩翩起舞伴蝶飞!     --幽木叶
[加为好友] 回复 引用回复
[Down] [Up]
[3楼] wolfdong7

等级:NO
注册时间:
2010/12/19 20:18
文章: 208
来自: 湖南
离线

请问LZ用什么软件做上位机的?



虽然我不属牛,但是我还是希望某一天能够像正点原子一样牛!
[加为好友] 回复 引用回复
[Down] [Up]
[4楼] 张洋

等级:NO
注册时间:
2010/12/14 10:47
文章: 337
来自: 广州
离线

Cool,谢谢楼主支持!



希望openedv能给大家提供一个友好的技术交流平台!
[加为好友] 回复 引用回复
[Down] [Up]
[5楼] muye414


等级:NO
注册时间:
2010/12/16 23:24
文章: 60
来自: 广西
离线

上位机是用Vvisual C++6.0编写的。有谁做过实时曲线绘制的上位机吗?正在弄,有研究的互相学习一下!



悠悠木叶随风落,翩翩起舞伴蝶飞!     --幽木叶
[加为好友] 回复 引用回复
[Down] [Up]
[6楼] 正点原子


等级:NO
注册时间:
2010/12/02 10:41
文章: 8097
来自: 湖南
离线

回复【5楼】 muye414 :
-------------------------------
以前用BCB的时候就想,后面没头绪,作罢了...




我的淘宝小店:http://shop62103354.taobao.com
[加为好友] 回复 引用回复
[Down] [Up]
[7楼] muye414


等级:NO
注册时间:
2010/12/16 23:24
文章: 60
来自: 广西
离线

原子哥,你也没弄过实时曲线绘制的上位机吗?你不是做了一个串口调试的上位机吗?我想你一定对上位机应该挺有研究的。



悠悠木叶随风落,翩翩起舞伴蝶飞!     --幽木叶
[加为好友] 回复 引用回复
[Down] [Up]
[8楼] 正点原子


等级:NO
注册时间:
2010/12/02 10:41
文章: 8097
来自: 湖南
离线

回复【7楼】 muye414 :
-------------------------------
我上位机弄过几个简单的程序罢了。没深究啊,你先做先驱,以后向你请教啊!



我的淘宝小店:http://shop62103354.taobao.com
[加为好友] 回复 引用回复
[Down] [Up]
[9楼] 爱上cmu

等级:NO
注册时间:
2011/03/03 21:59
文章: 9
离线

用VB做上位机简单,画曲线也简单,我做过四个温度同时显示
不过被老师和谐了 改了数据库 


[加为好友] 回复 引用回复
[Down] [Up]
[10楼] muye414


等级:NO
注册时间:
2010/12/16 23:24
文章: 60
来自: 广西
离线

回复【9楼】 爱上cmu :
-------------------------------
那你那还有资料吗?原理应该是相通的。如果可以的话,能给我一份吗?我想参考一下,用VC来编。



悠悠木叶随风落,翩翩起舞伴蝶飞!     --幽木叶
[加为好友] 回复 引用回复
[Down] [Up]
[11楼] tank234


等级:NO
注册时间:
2011/05/30 09:50
文章: 1
来自: 广州
离线

回复【楼主位】 muye414 :
---------------------------------
首先谢谢LZ分享,不过我下载附件总是下载不下来,所以想麻烦LZ把附件发一份到我邮箱里,我的邮箱是297034303@qq.com
再次感谢!



浮云,一切都是浮云!、~
[加为好友] 回复 引用回复
[Down] [Up]
[12楼] 正点原子


等级:NO
注册时间:
2010/12/02 10:41
文章: 8097
来自: 湖南
离线

我这里可以下载啊...



我的淘宝小店:http://shop62103354.taobao.com
[加为好友] 回复 引用回复
[Down] [Up]
[13楼] muye414


等级:NO
注册时间:
2010/12/16 23:24
文章: 60
来自: 广西
离线

建议用浏览器自带的下载器下载,有时候用迅雷下不了的。推荐使用世界之窗、360或者其他的!呵呵···



悠悠木叶随风落,翩翩起舞伴蝶飞!     --幽木叶
[加为好友] 回复 引用回复
[Down] [Up]
[14楼] dgdzov

等级:NO
注册时间:
2011/03/22 17:59
文章: 14
离线


好东西。
顶一下。


[加为好友] 回复 引用回复
[Down] [Up]
[15楼] weiyanda2008

等级:NO
注册时间:
2011/06/02 01:21
文章: 35
来自: 广州
离线

学习了


[加为好友] 回复 引用回复
[Down] [Up]
[16楼] buyiyouling

等级:NO
注册时间:
2011/09/06 14:24
文章: 1
离线

我这有上位机绘制曲线的程序~自己测试过可以用的,不知道怎么传的


[加为好友] 回复 引用回复
[Down] [Up]
[17楼] 正点原子


等级:NO
注册时间:
2010/12/02 10:41
文章: 8097
来自: 湖南
离线

回复【16楼】 buyiyouling :
---------------------------------
点击回复文章,就可以看到有一堆的空间图标,选择上传附件即可.



我的淘宝小店:http://shop62103354.taobao.com
[加为好友] 回复 引用回复
[Down] [Up]
[18楼] 正点原子


等级:NO
注册时间:
2010/12/02 10:41
文章: 8097
来自: 湖南
离线

下面有个附件的按钮.



我的淘宝小店:http://shop62103354.taobao.com
[加为好友] 回复 引用回复
[Down] [Up]
[19楼] letianpai

等级:NO
注册时间:
2011/09/03 01:21
文章: 7
来自: 西安
离线

回复【楼主位】 muye414 :
---------------------------------
大哥 请教一下vc++6.0编写上位机通过串口采集单片机的温度 当不断采集温度的时候 上位机界面上的其他控件
基本就不能响应了 怎么样可以缓解一下 



sara
[加为好友] 回复 引用回复
[Down] [Up]
[20楼] muye414


等级:NO
注册时间:
2010/12/16 23:24
文章: 60
来自: 广西
离线

其他控件?比如说呢?



悠悠木叶随风落,翩翩起舞伴蝶飞!     --幽木叶
[加为好友] 回复 引用回复
[Down] [Up]
[21楼] letianpai

等级:NO
注册时间:
2011/09/03 01:21
文章: 7
来自: 西安
离线

回复【20楼】 muye414 :
---------------------------------
比如说 我还要一个按钮进行压力转换 但当不断接受温度数据时 这个按钮就死了 整个界面也卡死了 关闭按钮也不起作用 只有温度显示控件好着  但当把接收温度数据的时间间隔改大点 比如1s 就好多了 但还是有问题 



sara
[加为好友] 回复 引用回复
[Down] [Up]
[22楼] 六画玄辉

等级:NO
注册时间:
2011/11/21 10:16
文章: 31
离线

很值得学习的一个例子,顶!!!


[加为好友] 回复 引用回复
[Down] [Up]
[23楼] 螃蟹爱虫


等级:NO
注册时间:
2011/09/03 00:18
文章: 372
来自: 广东
离线

毕业设计就是做了一个有画图曲线的上位机和下位机的课题。。。


[加为好友] 回复 引用回复
[Down] [Up]
[24楼] muye414


等级:NO
注册时间:
2010/12/16 23:24
文章: 60
来自: 广西
离线

回复【21楼】 letianpai :
---------------------------------
你的具体代码我不知晓所以也不好说,我也做过个温湿度的上位机,用232进行通信的时候,上位机接收数据的同时也可以控制下位机动作,没什么影响也没出现你说的现象。如果用485的话,因为485是半双工下位机动作就稍有点滞后了。不知道你是用什么通信协议,232?485?这可能跟你上位机发送的数据长度有关吧!我的就发一个字符而已



悠悠木叶随风落,翩翩起舞伴蝶飞!     --幽木叶
[加为好友] 回复 引用回复
 
前往: 

Powered by ALIENTEK工作室 © 粤ICP备12000418号-1