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