#include "stm32f10x.h"
#include "SysTick.h"
#include "Extern.h"
#include "main.h" //宏定义文件(全部)
#include "stdlib.h"
#include "ds18b20.h"
//&&&&&&&&&&&&&&&&&&&
char teat;
float Temperature;
//&&&&&&&&&&&&&&&&&&&
//#define DS1820_DIR P2DIR
//#define DS1820_IN P2IN
//#define DS1820_OUT P2OUT
//#define DS1820_DQ BIT4 //定义DS1820的接口
// DS1820 ROM命令宏定义
#define ReadRom 0x33
#define MatchRom 0x55
#define SearchRom 0xf0
#define AlertSearch 0xec
#define CopyScratchpad 0x48
#define SkipRom 0xcc
#define ReadPower 0xb4
// DS1820 功能命令宏定义
#define ConvertTemperature 0x44
#define ReadScratchpad 0xbe
#define WriteScratchpad 0x4e
#define RecallE 0xb8
//#define SMCLK 7500 //(KHz)用于系统延时
// 变量定义
unsigned char GetScratchpad[9];
unsigned char ResultTemperatureH; //温度值的高八位(为0则温度值为正,否则为负)
unsigned char ResultTemperatureL; //温度值的低八位(表示温度值)
unsigned char COUNT_REMAIN;
unsigned char COUNT_PER;
void DS1820_WriteBit(unsigned char oww_dat);
void DS1820_WriteByte(unsigned char oww_dat);
void DS1820_ReadTemp(void); //读取当前温度值
unsigned char DS1820_Init(void);
unsigned char DS1820_ReadBit(void);
unsigned char DS1820_ReadByte(void);
//void Delay10us(void);
//void DelayX10us(unsigned char x10us);
//void Delay_ms(unsigned int number);
void Delay10us(u32 Stime);
void Delay_us(u32 Stime1);
void GPIO_Configuration1(void) ;
void GPIO_Configuration2(void) ;
// 功能函数定义
void GPIO_Configuration1(void)
{
GPIO_InitTypeDef ds18b20_in;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE);
ds18b20_in.GPIO_Pin = GPIO_Pin_10;
ds18b20_in.GPIO_Speed = GPIO_Speed_50MHz;
ds18b20_in.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOC, &ds18b20_in);
}
void GPIO_Configuration2(void)
{
GPIO_InitTypeDef ds18b20_out;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE);
ds18b20_out.GPIO_Pin = GPIO_Pin_10;
ds18b20_out.GPIO_Speed = GPIO_Speed_50MHz;
ds18b20_out.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOC, &ds18b20_out);
}
void Delay10us(u32 Stime)
{
u32 i;
for(i=0;i<Stime;i++)
{
Delay_us(10);
}
}
//void Delay_us(u32 Stime1)
//{
// u32 i,j=0;
//
// for(i=0;i<Stime1;i++)
// {
// j++;
// }
//}
//void Delay_us(u32 Nus)
//{
// SysTick->LOAD=Nus*9; //时间加载
// SysTick->CTRL|=0x01; //开始倒数
// while(!(SysTick->CTRL&(1<<16))); //等待时间到达
// SysTick->CTRL=0X00000000; //关闭计数器
// SysTick->VAL=0X00000000; //清空计数器
//}
unsigned char DS1820_Init(void){
unsigned char result;
GPIO_Configuration2(); // ow output
GPIO_ResetBits( GPIOC, GPIO_Pin_10); //DS1820_DQ=0;
Delay_us(500); // Bus master pulling low 480us minimum;
GPIO_SetBits(GPIOC, GPIO_Pin_10);// DS1820_DQ=1;
Delay_us(48); // Resister pull up 15-60us;
GPIO_Configuration1();
result =GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_10); //DS1820_IN & DS1820_DQ;
GPIO_Configuration2(); // ow output
Delay_us(500); // End of timeslot total 480us;
return(result); // any 1 wire device ?result:=1 no devide; ?result:=0 have device;
Delay_us(200);
GPIO_Configuration2(); // ow output
GPIO_SetBits(GPIOC, GPIO_Pin_10);// DS1820_DQ=1;
Delay_us(280);
}//Intialization the 1-wire devices;
unsigned char DS1820_ReadBit(void){
unsigned char result1;
GPIO_Configuration2(); // ow output
GPIO_ResetBits( GPIOC, GPIO_Pin_10); //DS1820_DQ=0;
Delay_us(2);
GPIO_SetBits(GPIOC, GPIO_Pin_10);// DS1820_DQ=1;
Delay_us(2);
GPIO_Configuration1(); // ow input
result1 = GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_10); //DS1820_IN &DS1820_DQ;
GPIO_Configuration2(); // ow output
GPIO_SetBits(GPIOC, GPIO_Pin_10);// DS1820_DQ=1;
return(result1); // return the result of the 1-wire devide;
}//Read a bit on the 1-wire bus;
void DS1820_WriteBit(unsigned char oww_dat){
GPIO_Configuration2(); // ow output
GPIO_ResetBits( GPIOC, GPIO_Pin_10); //DS1820_DQ=0;
Delay_us(15);
if (1 == oww_dat)
{
GPIO_SetBits(GPIOC, GPIO_Pin_10);// DS1820_DQ=1;
}
else
{
GPIO_ResetBits( GPIOC, GPIO_Pin_10); //DS1820_DQ=0;
}//Write a bit to the 1-wire bus;
}
unsigned char DS1820_ReadByte(void){
unsigned char i,j;
unsigned char result=0;
for(i = 0; i < 8; i++)
{
if(DS1820_ReadBit())
{
result |= 0x01 << i;
result|=0x80;
}
Delay_us(50);
GPIO_Configuration2(); // ow output
GPIO_SetBits(GPIOC, GPIO_Pin_10);// DS1820_DQ=1;
Delay_us(2);
} // ??
return(result); // return the result of the 1-wire device;
}//Read a byte from the 1-wire bus;
void DS1820_WriteByte(unsigned char oww_dat){
unsigned char i,temp;
for(i = 0; i < 8; i++){
temp = oww_dat >> i;
temp &= 0x01;
DS1820_WriteBit(temp);
}
Delay_us(80); // ??
GPIO_SetBits(GPIOC, GPIO_Pin_10);// DS1820_DQ=1;
Delay_us(2); // ??
}//Write a byte to the 1-wire bus;
void DS1820_ReadTemp(void)
{ //float Temperature;
int i;
//float TEMPERATURE;
DS1820_Init();
//if(result1==1)result1=2;
DS1820_WriteByte(SkipRom);
Delay_us(1);
//There is just one DS1820 on the bus;
DS1820_WriteByte(ConvertTemperature);
Delay_us(8000);
//Start to convert temperature;
DS1820_Init();
DS1820_WriteByte(SkipRom);
DS1820_WriteByte(ReadScratchpad);
for(i=0;i<9;i++){
GetScratchpad[i]=DS1820_ReadByte();
// GetScratchpad[0]=DS1820_ReadByte();//TEMPERATURE LSB;
// GetScratchpad[1]=DS1820_ReadByte();//TEMPERATURE MSB;
// GetScratchpad[2]=DS1820_ReadByte();//TH/USER BYTE 1;
// GetScratchpad[3]=DS1820_ReadByte();//TL/USER BYTE 2;
// GetScratchpad[4]=DS1820_ReadByte();//RESERVED;
// GetScratchpad[5]=DS1820_ReadByte();//RESERVED;
// GetScratchpad[6]=DS1820_ReadByte();//COUNT REMAIN;
// GetScratchpad[7]=DS1820_ReadByte();//COUNT PER °C;
// GetScratchpad[8]=DS1820_ReadByte();//CRC;
}
ResultTemperatureL=GetScratchpad[0];
ResultTemperatureH=GetScratchpad[1];
COUNT_REMAIN=GetScratchpad[6];
COUNT_PER=GetScratchpad[7];
Temperature=((ResultTemperatureH*256)+ResultTemperatureL)*0.0625; //Result of temperature;
Delay10us(10);
// return Temperature;
}
|