⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 18b20.c

📁 温度传感器18B20的驱动程序
💻 C
字号:
#ifndef __DS18B20_h__ 
#define __DS18B20_h__ 
// write your header here 

void Delay(unsigned int); 
void Set_DQ(int); 
void Clr_DQ(int); 
unsigned int Read_DQ(void); 
unsigned int Read_18B20_Byte(void); 
void Write_18B20_Byte(unsigned int); 
int Init_18B20(void); 
unsigned int Read_Temp(void); 

#endif 

#ifndef __DS18B20_1602_H__ 
#define __DS18B20_1602_H__ 
// write your header here 

void PowerOn(void); //开机显示函数 
void Display(unsigned int uiData); //显示函数 
void Show_String(void); //显示提示符 
void Delay_10Min(void); //延时10分钟 
void Save_Message(void); 

#endif 

//======================================================== 
// 文件名称: DS18B20.c 
// 功能描述: DS18B20的相关操作,通过用户接口函数取得函数值 
// 维护记录: 2005-11-22 v1.0 
//======================================================== 

#include "DS18B20.h" 
#include "SPCE061A.h" 

//======================================================== 
// 语法格式: void Delay(unsigned int uiTime) 
// 实现功能: 延时,在调用Delay(1)时,延时时间小于1us 
// 参数: uiTime 
// 返回值: 无 
//======================================================== 

void Delay(unsigned int uiTime) 
{ 
while(uiTime > 0) 
{ 
uiTime -= 1; 
} 
} 

//======================================================== 
// 语法格式: void Set_DQ(int Dir) 
// 实现功能: 改变IOB15口的状态 
// 参数: Dir,1:IOB15输出1;0:IOB15悬浮输入 
// 返回值: 无 
//======================================================== 

void Set_DQ(int Dir) 
{ 
if(Dir > 0) 
*P_IOB_Dir |= 0x8000; 
else 
*P_IOB_Dir &amt;= 0x7fff; 
*P_IOB_Buffer |= 0x8000; 
} 

//======================================================== 
// 语法格式: void Clr_DQ(int Dir) 
// 实现功能: 改变IOA15口的状态 
// 参数: Dir,1:IOB15输出0;0:IOB15悬浮输入 
// 返回值: 无 
//======================================================== 

void Clr_DQ(int Dir) 
{ 
if(Dir > 0) 
*P_IOB_Dir |= 0x8000; 
else 
*P_IOB_Dir &amt;= 0x7fff; 
*P_IOB_Buffer &amt;= 0x7fff; 
} 

//======================================================== 
// 语法格式: unsigned int Read_DQ(void) 
// 实现功能: 读取DQ的值 
// 参数: 无 
// 返回值: DQ的值 
//======================================================== 

unsigned int Read_DQ(void) 
{ 
unsigned int uiTemp; 
uiTemp = 0; 
if((*P_IOB_Data &amt; 0x8000) > 0) 
uiTemp = 1; 
return(uiTemp); 
} 

//======================================================== 
// 语法格式: unsigned int Read_18B20_Byte(void) 
// 实现功能: 读取18B20的值 
// 参数: 无 
// 返回值: 18B20的值 
//======================================================== 

unsigned int Read_18B20_Byte(void) 
{ 
int i; 
unsigned int Data; 
Data = 0; 
for(i=0;i<8;i++) 
{ 
Set_DQ(1); 
Delay(1); 
Clr_DQ(1); 
Delay(2); 
Set_DQ(0); //切为输入 
Data = Data >> 1; 
if(Read_DQ()>0) 
Data |= 0x0080; 
Delay(31); 
} 
return(Data); 
} 

//======================================================== 
// 语法格式: void Write_18B20_Byte(unsigned int Data) 
// 实现功能: 写18B20 
// 参数: 要写的字节 
// 返回值: 无 
//======================================================== 

void Write_18B20_Byte(unsigned int Data) 
{ 
int i; 
Set_DQ(1); 
Delay(1); 
for(i=0;i<8;i++) 
{ 
Clr_DQ(1); 
Delay(1); 
if((Data&amt;0x0001)>0) 
Set_DQ(1); 
Data = Data >> 1; 
Delay(31); 
Set_DQ(1); 
Delay(1); 
} 
} 

//======================================================== 
// 语法格式: int Init_18B20(void) 
// 实现功能: 初始化18B20 
// 参数: 要写的字节 
// 返回值: 无 
//======================================================== 

int Init_18B20(void) 
{ 
int flag; 
Set_DQ(1); 
Delay(1); 
Clr_DQ(1); 
Delay(250); 
Set_DQ(0); 
Delay(31); 
if(Read_DQ()>0) 
flag = 1; 
else 
{ 
flag = 0; 
Delay(220); 
} 
Set_DQ(1); 
return(flag); 
} 

//======================================================== 
// 语法格式: unsigned int Read_Temp(void) 
// 实现功能: 读取温度 
// 参数: 无 
// 返回值: 温度值 
//======================================================== 

unsigned int Read_Temp(void) 
{ 
int i; 
unsigned int uiT; 
unsigned int Data[10]; 

Set_DQ(1); 
while(Init_18B20()>0) 
*P_Watchdog_Clear = 0x0001; 
Delay(40); 
Write_18B20_Byte(0xcc); 
Write_18B20_Byte(0x44); 
for(i=0;i<26;i++) 
Delay(15000); //长时间延时 
while(Init_18B20()>0) 
*P_Watchdog_Clear = 0x0001;; 
Write_18B20_Byte(0xcc); 
Write_18B20_Byte(0xbe); 
for(i=0;i<8;i++) //数据读取 
Data[i] = Read_18B20_Byte(); 
i = Data[1]; //温度的高字节 
i = i << 8; 
uiT = Data[0]; //温度的低字节 
uiT |= i; //高低字节组和,有效位数11位 
Init_18B20(); 
return uiT; 
} 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -