DS18B20 MSP430 C程序

发布者:第二眼帅哥最新更新时间:2020-08-05 来源: elecfans关键字:DS18B20  MSP430  C程序 手机看文章 扫描二维码
随时随地手机看文章

DS18B20 MSP430程序

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

/**********************************************************/
//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)用于

系统延时



// 温度的十进制编码(查表用)
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;   &

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);

// 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

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}


关键字:DS18B20  MSP430  C程序 引用地址:DS18B20 MSP430 C程序

上一篇:经典MCU探究:MSP430关键硬件电路设计要诀
下一篇:sed1335的msp430程序

推荐阅读最新更新时间:2024-11-07 18:25

DS18b20温度检测与显示库程序
************************************************************************************************** DS18b20.H ******************* DQ 接 p2.2 ******************* #ifndef __DS18b20_H__ #define __DS18b20_H__ #include msp430f2232.h ********************************* ** 引脚定义 ** ********************************* #de
[单片机]
<font color='red'>DS18b20</font>温度检测与显示库程序
MSP430 定时器A和B 中断定时 1秒操作
/******************** TimerA0 1秒定时 TIMER B 1 秒定时溢出中断 :MCLK = 2MHz DCOCLK LFXT1 = 32768Hz ACLK ***********************/ #include msp430x14x.h unsigned int i; unsigned int times,times_b; unsigned int sec; /***** 定时器A 初使化 *******/ void TimerA_Init(void) { TACTL = TASSEL_1 + ID0 + TACLR ; //ACLK=32768Hz ,清除tar ,2分频 CCT
[单片机]
MSP430F149学习之路——按键与LED
代码 1 /*********************************** 2 程序功能:用按键控制LED状态 3 缺点:按键按下后无法改变LED灯的状态,可以利用板上的复位键^~^ 4 *************************************/ 5 #include msp430x14x.h 6 7 int k,i=0; 8 void int_clk(); 9 void led(int n); 10 void main() 11 { 12 WDTCTL = WDTPW + WDTHOLD; 13 int_clk(); 14 P1DIR = 0Xf0; 15 P1OUT =
[单片机]
PLC程序设计规范与编程建议
一套完整的PLC程序,并不仅仅是使系统能够运行起来这么简单,它也需要完整的注释、精良的架构、良好的可扩展性、完备的报警保护系统、运行前的模拟系统。 1. 简单性 使PLC程序尽可能简单。简单的含义就是尽可能的使用标准化的程序框架,尽可能使用简单的指令。 要想程序简单,从大的方面讲,要优化程序结构,用流程控制指令简化程序,从小的方面讲还要用功能强的指令取代功能单一的指令,以及注意指令的安排顺序等。 2. 可读性 要求所设计的程序可读性要好。这不仅便于程序设计者加深对程序的理解,便于调试,而且,还要便于别人读懂你的程序,便于使用者维护。必要时,也可使程序推广。 要使程序可读性好,所设计的程序就要尽可能清晰。要注意层次,实现
[嵌入式]
PL<font color='red'>C程序</font>设计规范与编程建议
基于MSP430的嵌入式DTMF拨号解码器实现方案
摘 要: 本文介绍了一种基于MSP430的嵌入式DTMF拨号解码器实现方案。DTMF拨号部分使用4根I/O线的电阻网络,配合软件产生DTMF信号。利用 MSP430F133 内置的ADC,并采用改进的Goertzel算法,实现DTMF信号的实时解码。该方案成本低、性能可靠,已经得到了实际应用。 引言 DTMF(双音多频)信号是电话网中常用的信令,无论是家用电话、移动电话还是程控交换机上,多采用DTMF信号发送接收号码。DTMF技术还可以用于电力线载波通信等场合。可见,DTMF拨号和解码在通信系统及其它方面有着广泛的应用。通常DTMF信号的检测采用专用芯片或DSP来实现,但其成本较高。本文介绍了一种低成本的基于MSP430F13
[单片机]
基于<font color='red'>MSP430</font>的嵌入式DTMF拨号解码器实现方案
基于MSP430单片机的Profibus-DP通信接口的开发
      0 引言   Profibus是开放的、与制造商无关、无知识产权保护的标准。因此世界上任何人都可以获得该标准并设计各自的软硬件解决方案。Pro-fibus-DP通信接口的开发有两种方案选择:单片机+软件;单片机+Profibus通信芯片ASIC。   方案2中Profibus-DP协议完全由Profibus通信ASIC来实现,单片机主要处理用户程序。因此方案2开发周期相对少很多,本文将采用单片机+Profibus通信ASIC来实现Profibus通信接口的设计。    1 Profibus-DP基本特性   Profibus包括三个兼容系列:Profibus-FMS,Profibus-DP,Profib
[嵌入式]
关于MSP430的精准延时__delay_cycles的分析
首先我们先看以下代码: #define CPU_F ((double)8000000) //CPU_F代表系统选用的主时钟大小,单位Hz #define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0)) #define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0)) 分析上述代码: 一、8000000为MSP430板载的外部高速晶振提供的8MHz的主时钟频率,单位为Hz 二、__delay_cycle
[单片机]
基于MSP430F149单片机的电子血压计设计
  1 引言   测量血压的传统仪器是机械式水银血压计,电子血压计近几年才在市场上出现。电子血压计与传统血压计相比,虽然操作简单、使用方便,但准确性、稳定性往往不太理想。本设计力求准确、稳定,以适用于老年人或病人随时监测自己血压情况及临床医学检测。   2 系统的硬件设计   本设计采用Motorola公司的MPX53GC硅压式传感器和TI公司MSP430F149单片机为主要器件, 构成电子血压计,系统构成如图1。系统由MCU、 传感器、LCD液晶显示器、操作面板、充放气控制 电路、气泵和气阀、蜂鸣器、存贮器、电源等部分 构成。      2.1 微处理器的选择   单片机是整个系统的大脑,它不仅要对系统进 行
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved