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
上一篇:经典MCU探究:MSP430关键硬件电路设计要诀
下一篇:sed1335的msp430程序
推荐阅读最新更新时间:2024-11-07 18:25
设计资源 培训 开发板 精华推荐
- LT4275BIDD IEEE 802.3at (Type 2) 25.5W 受电器件的典型应用电路
- LT1072CT 正降压转换器的典型应用
- 使用 Analog Devices 的 LT1026CN8 的参考设计
- 连续波激光器光纤放大器
- LTC2273CUJ 演示板,16 位,80Msps 串行 ADC,1MHz
- 使用 Microchip Technology 的 LM385BCOA-2.5 的参考设计
- EVAL-AD976CB,用于 AD976/AD976A 16 位 ADC 的评估板。 AD976/AD976A 能够实现 100/200 ksps 吞吐率,采用 +5V 单电源供电并使用并行接口
- 基于RT1064的人车跟随控制主板——双目测距
- 最小系统设计
- 具有高调光比和 LED 开路报告的 LT3756EUD-1 降压模式 1A LED 驱动器的典型应用电路