原创 DS18B20 MSP430程序

2007-7-7 12:31 5584 8 9 分类: MCU/ 嵌入式

MSP430高级开发板上的DS18B20温度传感器的程序

MSP430高级开发板: >>点击进入

欢迎转载本站程序 请注明来自于www.just430.cn


/**********************************************************/
//MSP430 Advanced Developping Components - [DS18B20_430.C]
////DS18B20 One-Wire Digital Thermometer Demos
////->>> http://www.just430.cn
////->>> tel 0)13500717874
/**********************************************************/
//MSP430高级实验开发组件 - DS18B20单线温度传感器示例程序
//硬件连接:
//     MSP430 Broad                   DS18B20
//   ------------------         ------------------
//   |      P23       | ------> |       DQ       |
//   ------------------         ------------------
//当前演示程序功能描述:
//循环进行温度检测,将结果分别保存在
// ResultSignal  温度符号(0x01为负)
// ResultTemperatureH 温度整数
// ResultTemperatureLH 温度小数(高两位)
// ResultTemperatureLL 温度小数(低两位)
//如果系统存在ZLG7289键盘显示模块,则可以显示温度
//**更多资料参考DS18B20数据手册以及ZLG7289_430.C
/*********************************************************/


#include  <msp430x14x.h>
#include "ZLG7289_430.C"


#define DS18B20_DIR  P2DIR
#define DS18B20_IN  P2IN
#define DS18B20_OUT  P2OUT


#define DS18B20_DQ  BIT3  //定义DS18B20的接口


// DS18B20 ROM命令宏定义
#define ReadRom   0x33
#define MatchRom  0x55
#define SearchRom  0xf0
#define AlertSearch  0xec
#define CopyScratchpad  0x48
#define SkipRom   0xcc
#define ReadPower  0xb4


// DS18B20 功能命令宏定义
#define ConvertTemperature 0x44
#define ReadScratchpad  0xbe
#define WriteScratchpad  0x4e
#define RecallE   0xb8


#define SMCLK   4000  //(KHz)用于系统延时



// 温度的十进制编码(查表用)
unsigned char decimalH[16]={00,06,12,18,25,31,37,43,50,56,62,68,75,81,87,93};
unsigned char decimalL[16]={00,25,50,75,00,25,50,75,00,25,50,75,00,25,50,75};


// 变量定义
unsigned char GetScratchpad[9];
unsigned char ResultTemperatureH;  //温度的整数部分
unsigned char ResultTemperatureLH;  //温度的小数部分(高位)
unsigned char ResultTemperatureLL;  //温度的小数部分(低位)
 
void DS18B20_WriteBit(unsigned char oww_dat);
void DS18B20_WriteByte(unsigned char oww_dat);
void DS18B20_ReadTemp(void);
unsigned char DS18B20_Init(void);
unsigned char DS18B20_ReadBit(void);
unsigned char DS18B20_ReadByte(void);
void Delay10us(void);
void DelayX10us(unsigned char x10us);


/****************************
void main(void) {
 volatile unsigned int i,j;
 WDTCTL = WDTPW + WDTHOLD;  //停止看门狗
 
 BCSCTL1 &= ~XT2OFF;   //XT2 = HF XTAL
 do {
  IFG1 &= ~OFIFG;   //Clear OSCFault flag
  for (i=0xFF;i>0;i--);  //Time for flag to set
 }while((IFG1&OFIFG));   //OSCFault flag still set?
 BCSCTL2 |= (SELM1 + SELS);  //MCLK = SMCLK = XT2
 
 DS18B20_Init();    //初始化DS18B20
 
 Z7289_Init();
 
 while(1) {
  DS18B20_ReadTemp();
  i=ResultTemperatureH/10;
  j=ResultTemperatureH-(i*10);
  Z7289_Show(7,1,i);
  Z7289_Show(6,1,j);
  Z7289_Show(5,1,0x0C);
  i=ResultTemperatureLH/10;
  j=ResultTemperatureLH-(i*10);
  Z7289_Show(4,1,i);
  Z7289_Show(3,1,j);
  i=ResultTemperatureLL/10;
  j=ResultTemperatureLL-(i*10);
  Z7289_Show(2,1,i);
  Z7289_Show(1,1,j);
 }
}
****************************/


// 功能函数定义


unsigned char DS18B20_Init(void){
  unsigned char result;
  DS18B20_DIR |= DS18B20_DQ;       // ow output
  DS18B20_OUT &= ~DS18B20_DQ;      // DS18B20_DQ=0;
  DelayX10us(48);       // Bus master pulling low 480us minimum;
  DS18B20_OUT |= DS18B20_DQ;       // DS18B20_DQ=1;
  DelayX10us(6);        // Resister pull up 15-60us;
  DS18B20_DIR &= ~DS18B20_DQ;      // ow input
  result = DS18B20_IN & DS18B20_DQ;
  DS18B20_DIR |= DS18B20_DQ;       // ow output
  DelayX10us(48);       // End of timeslot total 480us;
  return(result);       // any 1 wire device ?result:=1 no devide; ?result:=0 have device;
}//Intialization the 1-wire devices;


unsigned char DS18B20_ReadBit(void){
  unsigned char result;
  DS18B20_DIR |= DS18B20_DQ;       // ow output
  DS18B20_OUT &= ~DS18B20_DQ;      // DS18B20_DQ=0;
  _NOP();               // Start of timeslot;
  DS18B20_OUT |= DS18B20_DQ;       // DS18B20_DQ=1;
  _NOP();_NOP();_NOP();_NOP();
          // Wait from the start;
  DS18B20_DIR &= ~DS18B20_DQ;      // ow input
  result = DS18B20_IN & DS18B20_DQ;
  DS18B20_DIR |= DS18B20_DQ;       // ow output
  return(result);       // return the result of the 1-wire devide;
}//Read a bit on the 1-wire bus;


void DS18B20_WriteBit(unsigned char oww_dat){
  DS18B20_DIR |= DS18B20_DQ;       // ow output
  DS18B20_OUT &= ~DS18B20_DQ;      // DS18B20_DQ=0;
  if (1 == oww_dat)
    DS18B20_OUT |= DS18B20_DQ;     // DS18B20_DQ=1;
  DelayX10us(10);       // Remain the state for 100us;
  DS18B20_OUT |= DS18B20_DQ;       // DS18B20_DQ=1;
}//Write a bit to the 1-wire bus;


unsigned char DS18B20_ReadByte(void){
  unsigned char i;
  unsigned char result="0";
  for(i = 0; i < 8; i++){
    if(DS18B20_ReadBit())
      result |= 0x01 << i;
    DelayX10us(12);     // ??
  }
  return(result);       // return the result of the 1-wire device;
}//Read a byte from the 1-wire bus;


void DS18B20_WriteByte(unsigned char oww_dat){
  unsigned char i,temp;
  for(i = 0; i < 8; i++){
    temp = oww_dat >> i;
    temp &= 0x01;
    DS18B20_WriteBit(temp);
  }
  DelayX10us(7);        // ??
}//Write a byte to the 1-wire bus;



void DS18B20_ReadTemp(void)
{ unsigned char tempH,tempL;
 DS18B20_Init();
 DS18B20_WriteByte(SkipRom);
 _NOP();
  //There is just one DS1820 on the bus;
 DS18B20_WriteByte(ConvertTemperature);
 DelayX10us(10);
  //Start to convert temperature;
 DS18B20_Init();
 DS18B20_WriteByte(SkipRom);
 _NOP();
 DS18B20_WriteByte(ReadScratchpad);
 GetScratchpad[0]=DS18B20_ReadByte();
  //Master samples the LSB temperature from the scratchpad;
 GetScratchpad[1]=DS18B20_ReadByte();
  //Master samples the MSB temperature from the scratchpad;
 GetScratchpad[2]=DS18B20_ReadByte();
  //Master samples the Th register or userbyte1 from the scratchpad;
 GetScratchpad[3]=DS18B20_ReadByte();
  //Master samples the Tl register or userbyte0 from the scratchpad;
 GetScratchpad[4]=DS18B20_ReadByte();
  //Master samples the configuration register from the scratchpad;
 GetScratchpad[5]=DS18B20_ReadByte();
  //Master samples the reservedbyte from the scratchpad;
 GetScratchpad[6]=DS18B20_ReadByte();
  //Master samples the reservedbyte from the scratchpad;
 GetScratchpad[7]=DS18B20_ReadByte();
  //Master samples the reservedbyte from the scratchpad;
 GetScratchpad[8]=DS18B20_ReadByte();
  //Master samples the CRC from the scratchpad;
 tempH=(GetScratchpad[1] << 4) | (GetScratchpad[0] >> 4);
 tempL=(GetScratchpad[0] & 0x0f);
 DS18B20_Init();
  //Issue a reset to terminate left parts;
 //if(tempH & 0x80)
 //{ tempH=~tempH;
 // tempL=~tempL+1;
 // ResultSignal=1;
 // //Negative temperature;
 //}
 ResultTemperatureH=tempH;
 ResultTemperatureLL=decimalL[tempL];
 ResultTemperatureLH=decimalH[tempL];
  //Result of temperature;
}//Read the byte0 and byte1 from scratchpad;


 


void Delay10us(void){
  unsigned char i;
  for (i=0; i<(SMCLK/500-3); i++);
}


//  Time is accurately !!
void DelayX10us(unsigned char x10us){
  unsigned int i;
  for (i=0; i<x10us; i++)
    Delay10us();
}

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户188647 2009-5-17 23:05

3k
相关推荐阅读
用户88827 2008-07-12 15:09
播放MP3的LPC板子Music-LPC2103: LPC2103 + VS1003 + LCD +
Music-LPC2103的PCB终于回来了 但是这次作的很少 不过还好 没有任何BUG出现 我发现画双面板很多时候要比4层的麻烦多的现在就把他的图片放出来吧介绍一下这个不大不小的东西ARM7TDMI...
用户88827 2008-06-06 19:44
taobao 一个钻了 哈哈
恭喜自己一下 欢迎大家访问我的店铺http://shop34362821.taobao.com/还有我的网站www.OurEDA.cnwww.Just430.cn...
用户88827 2008-06-06 19:39
Easy-MSP430 V1.1
 这就是V1.1的Easy430了 相对于之前的Easy430板子  我们增加了Nokia5110 LCD接口5个按键2个LED指示灯74HC595驱动的8段数码管而去掉了右侧的焊盘 这个板子同样提供...
用户88827 2008-03-15 10:25
EasyNET2103
EasyNET-2103是EasyNET系列开发板的第二款 其基本构成如下:核心 NXP ARM7 LPC2103(128KROM/32KRAM)网络 ENC28J60/HR911105A存储 SD/...
用户88827 2008-03-02 18:08
LPC2103和wiggler
最近刚刚回来EasyLPC2103http://auction1.taobao.com/auction/item_detail-0db1-40f6cd9461452ea2cd1b4e693fa2f5f...
用户88827 2007-12-09 09:09
终于把easynet弄完了
昨天有焊了一个完整的以太网板子 前一个还没焊完就被人给买走了 @@这个弄好了 测试了一个晚上的CS8900部分还是很稳定的 #/bin/sh`/bin/ping 192.168.10.252 -i 0...
EE直播间
更多
我要评论
1
8
关闭 站长推荐上一条 /3 下一条