|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区
您需要 登录 才可以下载或查看,没有账号?立即注册
×
/*
********************************************************************************
*文件名 : device_18b20.c
*作用 : 温度传感器功能函数
*原理 : PD8,PD9,PD10,PD11,PD12,PD13作为温度检测的6个管脚
********************************************************************************
*/
#include "drive.h"
#include "system.h"
#include "app.h"
//IO操作函数
//#define DS18B20_DQ_OUT PDout(0) //数据端口 PD8
#define DS18B20_DQ_OUT_PORT GPIOD
#define DS18B20_DQ_OUT_CLK RCC_APB2Periph_GPIOD
#define DS18B20_DQ_OUT_PIN GPIO_Pin_8| GPIO_Pin_9|GPIO_Pin_10| GPIO_Pin_11| GPIO_Pin_12| GPIO_Pin_13| GPIO_Pin_14| GPIO_Pin_15
#define Set_DS18B20_DQ_OUT {GPIO_SetBits(DS18B20_DQ_OUT_PORT,DS18B20_DQ_OUT_PIN);}
#define Clr_DS18B20_DQ_OUT {GPIO_ResetBits(DS18B20_DQ_OUT_PORT,DS18B20_DQ_OUT_PIN);}
//#define DS18B20_DQ_IN PDin(0) //数据端口 PD8
#define DS18B20_DQ_IN_PORT GPIOD
#define DS18B20_DQ_IN_CLK RCC_APB2Periph_GPIOD
#define DS18B20_DQ_IN_PIN GPIO_Pin_8| GPIO_Pin_9|GPIO_Pin_10| GPIO_Pin_11| GPIO_Pin_12| GPIO_Pin_13 | GPIO_Pin_14| GPIO_Pin_15
#define DS18B20_DQ_IN (GPIO_ReadInputData(DS18B20_DQ_IN_PORT))
//IO方向设置
#define DS18B20_IO_IN() { GPIO_InitTypeDef GPIO_InitStructure ; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8| GPIO_Pin_9|GPIO_Pin_10| GPIO_Pin_11| GPIO_Pin_12| GPIO_Pin_13| GPIO_Pin_14| GPIO_Pin_15;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz ;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING ;GPIO_Init(GPIOD ,&GPIO_InitStructure) ;}
#define DS18B20_IO_OUT() { GPIO_InitTypeDef GPIO_InitStructure ; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8| GPIO_Pin_9|GPIO_Pin_10| GPIO_Pin_11| GPIO_Pin_12| GPIO_Pin_13| GPIO_Pin_14| GPIO_Pin_15 ;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz ;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD ;GPIO_Init(GPIOD ,&GPIO_InitStructure) ;}
//复位DS18B20
void DS18B20_Rst(void)
{
DS18B20_IO_OUT(); //SET PA0 OUTPUT
Clr_DS18B20_DQ_OUT; //拉低DQ
DelayUs(550); //拉低750us
//DisableIrq();
Set_DS18B20_DQ_OUT; //DQ=1
DelayUs(10); //15US
//EnableIrq();
}
//等待DS18B20的回应
//返回1:未检测到DS18B20的存在
//返回0:存在
//byte DS18B20_Check(void)
void DS18B20_Check(void)
{
// DisableIrq();
DS18B20_IO_IN();
//while ((DS18B20_DQ_IN&0x3f00)==0x3f00);
while ((DS18B20_DQ_IN&0x3f00)==0x0000);
DelayUs(240);
// EnableIrq();
// byte retry=0;
// DS18B20_IO_IN(); //SET PA0 INPUT
// while ((DS18B20_DQ_IN&0x3f00==0x3f00)&&retry<200)
// {
// retry++;
// DelayUs(1);
// }
// if(retry>=200)return 1;
// else retry=0;
// while ((DS18B20_DQ_IN&0x3f00==0x0000)&&retry<240)
// {
// retry++;
// DelayUs(1);
// }
// if(retry>=240)return 1;
// return 0;
}
//从DS18B20读取一个位
//返回值:1/0
byte DS18B20_Read_Bit(void) // read one bit
{
byte data;
ushort data16;
DisableIrq();
DS18B20_IO_OUT();
Clr_DS18B20_DQ_OUT;
DelayUs(1);
Set_DS18B20_DQ_OUT;
DS18B20_IO_IN();
DelayUs(1); //12
data16=DS18B20_DQ_IN;
data16>>=8;
data=(byte)data16;
DelayUs(20); //50
return data;
EnableIrq();
}
//写一个字节到DS18B20
//dat:要写入的字节
void DS18B20_Write_Byte(byte dat)
{
byte j;
byte testb;
DS18B20_IO_OUT();//SET PA0 OUTPUT;
DisableIrq();
for (j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if (testb)
{
//DisableIrq();
Clr_DS18B20_DQ_OUT;// Write 1
DelayUs(1);
Set_DS18B20_DQ_OUT;
DelayUs(30); //60
// EnableIrq();
}
else
{
//DisableIrq();
Clr_DS18B20_DQ_OUT;// Write 0
DelayUs(30); //60
Set_DS18B20_DQ_OUT;
DelayUs(1);
//EnableIrq();
}
}
EnableIrq();
}
void Change_res(byte res)
{
DS18B20_Rst(); //复位
DS18B20_Check();
DS18B20_Write_Byte(0xcc); //跳过Rom
DS18B20_Write_Byte(0x4e); //写暂存器
DS18B20_Write_Byte(0x02); //写TH
DS18B20_Write_Byte(0x01); //写TL
DS18B20_Write_Byte(res); //写结构寄存器
DS18B20_Rst(); //复位
DS18B20_Check();
DS18B20_Write_Byte(0xcc); //跳过Rom
DS18B20_Write_Byte(0x48); //把暂存器内容写到EPRam中
}
//开始温度转换
void DS18B20_Start(void)// ds1820 start convert
{
//DisableIrq();
DS18B20_Rst();
DS18B20_Check();
//EnableIrq();
//DisableIrq();
DS18B20_Write_Byte(0xcc);// skip rom 跳跃查询指令
DS18B20_Write_Byte(0x44);// convert 收到此指令后芯片将进行一次温度转换,将转换的温度值放入RAM的第1、2地址
//EnableIrq();
}
//byte DS18B20_Init(void)
//{
// GPIO_InitTypeDef GPIO_InitStructure; //GPIO
// RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE ); //使能PORTA口时钟
// /* Configure PA0 */
// GPIO_InitStructure.GPIO_Pin = DS18B20_DQ_OUT_PIN; //SPI CS
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //复用推挽输出
// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
// GPIO_Init(DS18B20_DQ_OUT_PORT, &GPIO_InitStructure);
// /* Deselect the PA0 Select high */
// GPIO_SetBits(DS18B20_DQ_OUT_PORT,DS18B20_DQ_OUT_PIN);
// DS18B20_Rst();
// return DS18B20_Check();
//}
//从ds18b20得到温度值
//返回值:温度值 (-55~125)
void DS18B20_Get_Temp(void)
{
short i;
byte j,k,Mask;
byte temp;
//DisableIrq();
//System.Device.Usart1.Close;
DS18B20_Start (); // ds1820 start convert
//DisableIrq();
DS18B20_Rst();
DS18B20_Check();
DS18B20_Write_Byte(0xcc);// skip rom
DS18B20_Write_Byte(0xbe);// convert 将从RAM中读数据,读地址从地址0开始
//EnableIrq();
for(k=0;k<16;k++)
{
DS18B20_buff[k]= DS18B20_Read_Bit();
}
//OS the resoult of Temperature
for(i=15;i>=0;i--)
{
Mask = 0x01;
for(j=0;j<8;j++)
{
Outtemp[j] = Outtemp[j]<<1;
if(DS18B20_buff&Mask) Outtemp[j]++;
Mask = Mask<<1;
}
}
for(i=0;i<6;i++)
{
if((Outtemp&0xf100)==0xf100)
{
Outtemp=~Outtemp;
temp=1; //温度为负
}
else temp=0;//温度为正
Outtemp>>=4;
switch(i)
{App.InterfaceData.SysDisplay[0].OutTemp
case 0:
if(temp) App.InterfaceData.SysDisplay[0].OutTemp=-Outtemp;
else App.InterfaceData.SysDisplay[0].OutTemp=Outtemp;
break;
case 1:
if(temp) App.InterfaceData.SysDisplay[1].OutTemp=-Outtemp;
else App.InterfaceData.SysDisplay[1].OutTemp=Outtemp;
break;
case 2:
if(temp) App.InterfaceData.SysDisplay[2].OutTemp=-Outtemp;
else App.InterfaceData.SysDisplay[2].OutTemp=Outtemp;
break;
case 3:
if(temp) App.InterfaceData.SysDisplay[3].OutTemp=-Outtemp;
else App.InterfaceData.SysDisplay[3].OutTemp=Outtemp;
break;
case 4:
if(temp) App.InterfaceData.SysDisplay[4].OutTemp=-Outtemp;
else App.InterfaceData.SysDisplay[4].OutTemp=Outtemp;
break;
case 5:
if(temp) App.InterfaceData.SysDisplay[5].OutTemp=-Outtemp;
else App.InterfaceData.SysDisplay[5].OutTemp=Outtemp;
break;
}
}
//System.Device.Usart1.Open;
//EnableIrq();
}
void Init18b20(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10| GPIO_Pin_11| GPIO_Pin_12| GPIO_Pin_13| GPIO_Pin_14| GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOD, &GPIO_InitStructure);
//Change_res(0x1f); //设置传感器分辨率为9位,以0.5速度增长
} |
|