;
文章:行业新闻EDA文摘电源技术无线通信测量仪表嵌入式类电子技术制造技术半导体网络/协议展会实验家电维修  
  下载:EDA教程电源技术电子书籍电子元件无线通信通信网络电路图纸嵌入式类单片机传感/控制电子教材模拟数字
.... 音视频类
消费电子机械电子行业软件C/C++FPGA/ASIC规则标准家电维修DSPIC资料ARM软件电路图电子技术论坛
 
位置:电子发烧友 > 行业新闻 > 嵌入式类 > 单片机类 >DS18B20 MSP430 C程序 退出登录 用户管理
栏目导航


· 单片机类 · 接口/总线/驱动
· ARM · DSP
· FPGA/ASIC技术 · 设计应用
· 嵌入式操作系统 · 电视卡
热门文章
· [组图] 电子元器件基础知识...
· [图文] USB接口定义
· [图文] 三极管开关电路图
· [组图] RS232 RS485接口原理...
· [组图] [组图]电动车充电器...
· [组图] 电子捕鱼器电路图
· [组图] 高品质音调电路的制...
· [组图] JRC4558电路
· [图文] M51134P低音炮电路图...
· [图文] TL494脉宽调制控制电...
相关文章

· ds18b20汇编程序与c...
· [组图] ds18b20引脚图管脚图...
· [组图] DS18B20型数字温度传...

DS18B20 MSP430 C程序
作者:本站  来源:www.elecfans.com  发布时间:2008-10-8 13:47:37 减小字体 增大字体

DS18B20 MSP430程序

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 
#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)用于<-- 2007-12-5 23:40:31-->

系统延时



// 温度的十进制编码(查表用)
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_R
eadTemp(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;   &<-- 2007-12-5 23:40:31-->

sp;  // 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);<-- 2007-12-5 23:40:31-->

// 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(res
ult);       // 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 sa<-- 2007-12-5 23:40:31-->

mples 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();
&nbs
p; //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    Delay10us();
}

[] [返回上一页] [打 印] [收 藏]
 
∷相关文章评论∷    (评论内容只代表网友观点,与本站立场无关!) [更多评论...]
 
关于本站- 意见反馈 - 网站导航 - 帮助 - 隐私政策 - 联系我们 - 使用条款 - 安全承诺 - 友情连接
站长QQ:39550527 Powered by: 飓风网络(电路图
Copyright 2006-2008 Elecfans.Com.电子发烧友: 粤ICP备07065979号All Rights Reserved