5295|3

6

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

cc2530用18b20采集温度传给pc机的程序,上网上搜到了在lcd上显示的程序,现在怎么改 [复制链接]

只用一个zigbee就能串口显示 ,这个程序也有错误,在小于32℃时显示的是负的 ,现在求一个修改,能在串口上显示且数值正确

18.18B20 Sensor.rar

61.42 KB, 下载次数: 63

此帖出自RF/无线论坛

最新回复

ds18b20采集模块lct2662m,                                     ds18b20采集仪表 LCT2201C   采集数据显示   培训视频    详情 回复 发表于 2019-9-27 12:28

点评

/******************************************************************************* Filename: 18B20_sensor.c Target: cc2530 Author: UNique Revised: 14/7-2011 Revision: 1.  详情 回复 发表于 2013-7-2 11:13
点赞 关注
 

回复
举报

6

帖子

0

TA的资源

一粒金砂(中级)

沙发
 

回复 楼主q137226446 的帖子

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

Filename:     18B20_sensor.c
Target:       cc2530
Author:       UNique
Revised:      14/7-2011
Revision:     1.1
Email:        cyliu@stu.xidian.edu.cn
INFO:         把底板上的18B20管脚连接到P3的20管脚

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

/******************************************************************************
* INCLUDES
*/
#include "LCD3310.h"
#include "ioCC2530.h"
#include "DS18B20.h"

/******************************************************************************
* CONSTANTS
*/



extern __code const unsigned char font6x8[][6];
/******************************************************************************
* TYPEDEFS
*/

/******************************************************************************
* GLOBAL VARIABLES
*/
static UINT8 ch[8];
/******************************************************************************
* LOCAL VARIABLES
*/

/******************************************************************************
* LOCAL FUNCTIONS
*/
void myApp_ReadExTemperature( void );
/******************************************************************************
*
* @fn 18B20_sensor_main
*
* @brief
*
*
* Parameters:
*
* @param  void
*
* @return void
*
******************************************************************************/
void main(void)
{
   DISABLE_ALL_INTERRUPTS();
   SET_MAIN_CLOCK_SOURCE(0);
   initLcd();
   LCD_write_english_string(0,1,"Temperature:");
   LCD_write_english_string(0,3,"not calibrate");

   while(1)
   {
    myApp_ReadExTemperature();
    lcdUpdateLine(LINE1, (char *)ch);

     // wait one second
     halWait(250);
     halWait(250);
     halWait(250);
     halWait(250);
   }
}

/******************************************************************************
* @fn          myApp_ReadExTemperature
*
* @brief       Reports true temperature sensor reading
*
* @param
*
* @return
*/
void myApp_ReadExTemperature( void )
{
  
  UINT8 temh,teml;
  UINT16 num;
  
  read_data();           // 读取温度
  
  teml=sensor_data_value[0];
  temh=sensor_data_value[1];
  num=teml*625;          //小数部分的取值每位代表0.0625(精度)
  if(flag==1)            //判断正负温度
  {
   ch[0]='-';              //+0x2d 为变"-"ASCII码
  }
  else ch[0]='+';   
  if(temh/100==0)
   ch[1]=' ';
  else ch[1]=temh/100+0x30;      //+0x30 为变 0~9 ASCII码
  if((temh/10%10==0)&&(temh/100==0))
   ch[2]=' ';
  else ch[2]=temh/10+48;//%10+0x30;
  ch[3]=temh%10+48;
  ch[4]='.';
  ch[5]=num/1000+0x30;//忽略小数点后1位的数
  ch[6]='C';//忽略小数点后1位的数
  ch[7]=0;//结束符
}














上面这是18b20_sensor.c程序


下面时18b20.c程序

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

Filename:     DS18B20.c
Target:       cc2530
Author:       UNique
Revised:      14/7-2011
Revision:     1.1
Email:        cyliu@stu.xidian.edu.cn

******************************************************************************/
#include "DS18B20.h"

UINT8 id[8];
UINT8 sensor_data_value[2];
UINT8 flag;

void Delay_nus(UINT16 s)
{
  while (s--)
  {
    asm("NOP");
    asm("NOP");
    asm("NOP");
  }
}

void init_1820(void)
{
  SET_OUT;
  SET_DQ;//输出1
  CL_DQ;
  Delay_nus(550);//拉低一段时间
  SET_DQ;//释放
  SET_IN;//输入
  Delay_nus(40); //释放总线后等待15-60us
  while(IN_DQ)  {;}//等待回复
  Delay_nus(240);//回复的低电平在60到240us  
  SET_OUT;
  SET_DQ;//回到初始DQ=1;
}

void write_1820(UINT8 x)  
{  
  UINT8 m;   
  SET_OUT;
  for(m=0;m<8;m++)  
  {  
     CL_DQ;
     if(x&(1<      SET_DQ;
     else  
     CL_DQ;  
     Delay_nus(40);   //15~60us  
     SET_DQ;  
  }
  SET_DQ;  
}


UINT8 read_1820(void)  
{   
  UINT8 temp,k,n;   
  temp=0;  
  for(n=0;n<8;n++)  
  {  
    CL_DQ;     
    SET_DQ;
    SET_IN;  
    k=IN_DQ;    //读数据,从低位开始  
    if(k)  
    temp|=(1<     else  
    temp&=~(1<     Delay_nus(70); //60~120us      
    SET_OUT;
  
  }  
  return (temp);  
}  
//搜索ID
void get_id()
{     
  init_1820();        //resert
  write_1820(0x33);
  
  for(unsigned char ii=0;ii<8;ii++)
  {
    id[ii]=read_1820();
  }
}



void read_data(void)
{
  UINT8 temh,teml;
  UINT8 a,b,c;

  init_1820();  //复位18b20  
  write_1820(0xcc);   // 发出转换命令 搜索器件
  write_1820(0x44);     //启动  
  Delay_nus(50000);
  init_1820();  
  write_1820(0xcc);
  write_1820(0xbe);
      
  teml=read_1820();  //读数据  
  temh=read_1820();  
  if(temh&0x80)//判断正负
  {
    flag=1;
    c=0;
    c=c|temh;
    c=c&0x00ff;
    c=c<<8;
    a=c;

    a=c|teml;

    a=(a^0xffff);//异或
    a=a+1;  //取反加1
    teml=a&0x0f;
    temh=a>>4;
  }
  else
  {
    flag=0;   //为正
    a=temh<<4;
    a+=(teml&0xf0)>>4; //得到高位的值
    b=teml&0x0f;
    temh=a;
    teml=b&0x00ff;
  }
  sensor_data_value[0]=teml;
  sensor_data_value[1]=temh;
}
此帖出自RF/无线论坛
 
 

回复

11

帖子

0

TA的资源

一粒金砂(中级)

板凳
 

这个我做过

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////----->DS18B20部分程序     EndDevice

void TempDelay(unsigned int us){
        while(us--);
}


void Init18b20 (void)
{
        P0DIR |= 0x02;   //P0_1输出
        D18B20=1;
        TempDelay(5);
        D18B20=0;
        TempDelay(1280);   //delay 480--960 uS//   1280  stand for 480 us
        D18B20=1;
        TempDelay(106);   //delay 15--60 uS//        106 stand for 40 us
        P0DIR &= ~0x02;   //P0_1 输入   对于CC2530芯片
        if(D18B20==0)           //读DS18B20的状态
                flag = 1;   //detect 1820 success!
        else
                flag = 0;    //detect 1820 fail!
        TempDelay(500);       //60---240 us
        P0DIR |= 0x02;
        D18B20 = 1;
}


void WriteByte (unsigned char wr)  //单字节写入
{
        unsigned char i;
        for (i=0;i<8;i++)
        {
                P0DIR |= 0x02;
                D18B20 = 0;
                TempDelay(5);
                D18B20=wr&0x01;
                TempDelay(120);   //delay 45 uS //5
                D18B20=1;
                TempDelay(5);
                wr >>= 1;
        }
}


unsigned char ReadByte (void)     //读取单字节
{
        unsigned char  i,u=0;
        for(i=0;i<8;i++)
        {
                P0DIR |= 0x02;
                D18B20 = 0;
                TempDelay(3);
                u >>= 1;
                D18B20 = 1;
                P0DIR &= ~0x02;
                if(D18B20==1)  //读取DS18B20的状态
                u |= 0x80;
                TempDelay (40);///////////////////////////////////////////读取的时候延时准确性很重要
               
        }
        return(u);
}

void read_bytes (unsigned char  j)          //什么时候用这个函数  有什么作用~
{
         unsigned char i;
         if(flag==1)
         {
           for(i=0;i            {
                    *p = ReadByte();
                    temp_buff = *p;
                    p++;
           }
         }
         else if(flag==2)
         {
           for(i=0;i            {
                    *p = ReadByte();
                    id_buff = *p;
                    p++;
           }
         }
         
         else
         {
          for(i=0;i            {
                    *p = ReadByte();
                    p++;
           }
         }
         flag=0;
         
}


void read_temp(void)          //什么时候用这个函数  有什么作用~
{
         unsigned char i;
         for(i=0;i<2;i++)
         {
                  *p = ReadByte();
                  
                  
                  if(i==0)
                  {
                    temp_buff[0] = *p;
                  }
                  
                  if(i==1)
                  {
                    temp_buff[1] = *p;
                  }
                  p++;
         }
}

unsigned char CRC (unsigned char j)
{
           unsigned char i,crc_data=0;
          for(i=0;i             crc_data = CrcTable[crc_data^temp_buff];
    return (crc_data);
}

void GemTemp (void)
{
    flag = 1;
   read_bytes (9);
   if (CRC(9)==0) //校验正确
   {
            Temperature = (temp_buff[1]&0x07)*16 + temp_buff[0]/16;
//            Temperature *= 0.625;
                //Temperature /= 16;
            TempDelay(5);
   }
}


void Config18b20 (void)  //重新配置报警限定值和分辨率
{
     Init18b20();
     WriteByte(0xcc);  //skip rom
     WriteByte(0x4e);  //write scratchpad
     WriteByte(0x19);  //上限
     WriteByte(0x1a);  //下限
     WriteByte(0x7f);     //set 12 bit (0.0625)
     Init18b20();
     WriteByte(0xcc);  //skip rom
     WriteByte(0x48);  //保存设定值
     Init18b20();
     WriteByte(0xcc);  //skip rom
     WriteByte(0xb8);  //回调设定值
}

void ReadID (void)//读取器件 id
{
        Init18b20();
        WriteByte(0x33);  //read rom
        flag = 2;
        read_bytes(8);
        //id_buff
}


void TemperatuerResult(void)
{
          //p = id_buff;
          ReadID();
        p = id_buff;
          Config18b20();
        Init18b20 ();
        WriteByte(0xcc);   //skip rom
        WriteByte(0x44);   //Temperature convert

        Init18b20 ();
        WriteByte(0xcc);   //skip rom
        WriteByte(0xbe);   //read Temperature
        //read_temp();
        p = temp_buff;
        GemTemp();
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////DS18B20部分程序

将这部分程序添加在*_App.c哪个文件中,并另外建一个 .h文件,把#define  D18B20  P0_1

void TempDelay (unsigned int us);
void Init18b20 (void);
void WriteByte (unsigned char wr);  //单字节写入
unsigned char ReadByte (void);
void read_bytes (unsigned char j);
void read_temp(void);
unsigned char CRC (unsigned char j);
void GemTemp (void);
void Config18b20 (void);
void ReadID (void);
void TemperatuerResult(void);


char  flag = 0;
unsigned char  temp_buff[9]; //存储读取的字节,read scratchpad为9字节,read rom ID为8字节
unsigned char  id_buff[8];
unsigned char  *p;
unsigned char  crc_data;


unsigned char  CrcTable [256]={
0,  94, 188,  226,  97,  63,  221,  131,  194,  156,  126,  32,  163,  253,  31,  65,
157,  195,  33,  127,  252,  162,  64,  30,  95,  1,  227,  189,  62,  96,  130,  220,
35,  125,  159,  193,  66,  28,  254,  160,  225,  191,  93,  3,  128,  222,  60,  98,
190,  224,  2,  92,  223,  129,  99,  61,  124,  34,  192,  158,  29,  67,  161,  255,
70,  24,  250,  164,  39,  121,  155,  197,  132,  218,  56,  102,  229,  187,  89,  7,
219,  133, 103,  57,  186,  228,  6,  88,  25,  71,  165,  251,  120,  38,  196,  154,
101,  59, 217,  135,  4,  90,  184,  230,  167,  249,  27,  69,  198,  152,  122,  36,
248,  166, 68,  26,  153,  199,  37,  123,  58,  100,  134,  216,  91,  5,  231,  185,
140,  210, 48,  110,  237,  179,  81,  15,  78,  16,  242,  172,  47,  113,  147,  205,
17,  79,  173,  243,  112,  46,  204,  146,  211,  141,  111,  49,  178,  236,  14,  80,
175,  241, 19,  77,  206,  144,  114,  44,  109,  51,  209,  143,  12,  82,  176,  238,
50,  108,  142,  208,  83,  13,  239,  177,  240,  174,  76,  18,  145,  207,  45,  115,
202,  148, 118,  40,  171,  245,  23,  73,  8,  86,  180,  234,  105,  55,  213, 139,
87,  9,  235,  181,  54,  104,  138,  212,  149,  203,  41,  119,  244,  170,  72,  22,
233,  183,  85,  11,  136,  214,  52,  106,  43,  117,  151,  201,  74,  20,  246,  168,
116,  42,  200,  150,  21,  75,  169,  247,  182,  232,  10,  84,  215,  137,  107,  53};
当做 DS18B20.h文件,添加进去就好。

最后在你得 任务循环中 用 TemperatuerResult();  这个函数,结果是 Temperature变量  ,就是温度值了~~~~
此帖出自RF/无线论坛
 
 
 

回复

203

帖子

0

TA的资源

一粒金砂(高级)

4
 

ds18b20采集模块lct2662m,                                     ds18b20采集仪表 LCT2201C

 

采集数据显示

 

培训视频 

此帖出自RF/无线论坛
个人签名北京长信物联科技有限公司
专业的USB温湿度传感器、485温湿度传感器、气体传感器、64路DS18B20温度采集模块厂商。
www.lct2000.cn
QQ:1930227091
 
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
快速回复 返回顶部 返回列表