📄 ds18b20的驱动.txt
字号:
温度传感器DS18B20驱动upsd单片机的C51源程序
By 西谱单片机 发表于 2006-4-20 19:10:13
#i nclude "upsd3200.h"
#i nclude"intrins.h"
sbit DQ= P1^7;
char WEN_ZERO=0;
bit flag; //DS18B20器件是否正常标志
extern uint wendu;
///////////////延时//////////////////
void delay (uint us)
{
while (us--);
}
//////////////DS18B20初始化--外部调用//////////
void init_18b20 (void)
{
DQ=1;
_nop_();
DQ=0;
delay(90); //delay 530 uS
DQ=1;
delay(6); //delay 100 uS
if(DQ==0)
flag=1; //detect 1820 success!
else
flag=0; //detect 1820 fail!
delay(20);
DQ=1;
}
/////////////DS18B20写//////////////
void write (uchar wr)
{
uchar i;
for (i=0;i<8;i++)
{
DQ=0;
_nop_();
DQ=wr&0x01;
delay(5); //delay 45 uS
DQ=1;
wr>>=1;
}
}
/////////////DS18B20读/////////////////
uint read_word (void)
{
uchar i;
uint u=0;
for(i=0;i<16;i++)
{
DQ=0;
u>>=1;
DQ=1;
if(DQ==1)
u|=0x8000;
delay (4);
}
return(u);
}
/*
///////DS18B20寄存器配置--外部调用///////////
void config (void)
{
if(flag)
{
write (0xcc); //跳过ROM命令
write (0x4e); //写暂存存储器
write (0x19); //TH=0
write (0x1a); //TL=0
write (0x7f); //set 11 bit (0.125)
init_18b20();
write (0xcc); //跳过ROM命令
write (0x48); //复制暂存存储器,在发出此命令之后,主机必须等待6ms,以待复制操作的完成
init_18b20();
write (0xcc); //跳过ROM命令
write (0xb8); //recall
delay (254);
delay (250);
init_18b20();
write (0xcc);
write (0xbe); //读暂存存储器命令
one=read_word();
two=read_word();
three=read_word();
}
}
*/
///////////读取温度--外部调用////////////////
void get_wendu (void)
{
uint bdata tem;
init_18b20();
if (flag)
{
write (0xcc); //跳过ROM命令
write (0x44); //启动温度转换
init_18b20 ();
write (0xcc); //跳过ROM命令
write (0xbe); //读暂存存储器命令
tem=read_word(); //读取温度
if(tem<0x8000)
{
wendu=tem*6.25; //温度大于0;
WEN_ZERO=0;
}
else
{
wendu=tem*(-0.0625); //温度小于0;
WEN_ZERO=1;
}
//write (0xec); //search alarm
}
}
3.驱动程序
/********************数码管显示DS18B20 温度与报警控制******************
*作者:☆华仔☆ QQ:656037228 欢迎交流
*时间:2008年12月04日
*更新时间:2008年12月15日晚
-----------------------------------------------
*主要功能:
正常的温度显示、报警控制。
-----------------------------------------------
*显示格式:
102.8°C 或 -21.3°C
-----------------------------------------------------------------------
*电路连接:
采用STC12C2052单片机,24兆赫晶振(其他频率晶振,只要修改延时就可以了),
用5位8段数码显示管,
4位显示温度(包括显示零下温度符号“-”),1位用作符号“°C”(倒放)
-----------------------------------------------------------------------
*DS18B20 端口位定义:
DQ → P3^5 ; 数据传送总线
-----------------------------------------------
BEEP → P3^7 ;蜂鸣器
PORT → P1 ;数码管数据总线
-----------------------------------------------
*显示方式:
数码管动态扫描
----------------------------------------------------------------
*报警方式:
在DS18B20检测出错或超出规定的温度范围报警,
报警时数码管闪动显示数字,在DS18B20检测出错时闪动显示ERROR
----------------------------------------------------------------
*****************下面是C51源程序********************/
//#include < reg51.h > //8051头文件
#include "STC12C2052AD.h"//2051头文件
//#include < intrins.h >
#define uchar unsigned char;
#define uint unsigned int;
typedef bit BOOL;
#define PORT P1 //数码管显示数据总线
sbit DQ = P3^5; //DS18B20数据总线
sbit BEEP=P3^7 ; //蜂鸣控制端
BOOL FLAG ;//初始化标志
BOOL ZF_FLGE;
void NoTemp();//DS18B20出错
uchar code DISData[12] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff,0xbf};//共阳数码管编码表*/
/*uchar code DISData[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00}; //共阴数码管编码表*/
uchar data temp_data[2] = {0x00,0x00};//温度数据寄存,存放格式【低位,高位】
uchar data display[5] = {0x00,0x00,0x00,0x00,0x00};//存放编辑,存放格式【小数位,个位,十位,百位,编辑位】
uchar code ditab[16] = {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x05,
0x05,0x06,0x07,0x07,0x08,0x08,0x09,0x09};//小数值
sbit DIN = P1^7;//小数点
BOOL flash=0;//显示开关标记
/********************************************************
*名称:Delay()
*功能:微妙级延时
*********************************************************/
void Delay(unsigned int Dtime)//延时函数
{
while( --Dtime );
}
/********************************************************
*名称:Delayms()
*功能:毫秒级延时
*********************************************************/
void Delayms(unsigned int Dtime)
{ unsigned char j;
for (; Dtime>0; Dtime--)
{ for (j=0; j<125; j++){;;}
}
}
/********************************************************
*名称:beep()
*功能:蜂鸣
*********************************************************/
void beep()
{
BEEP=0; //BEEP取反
Delayms(500);
BEEP=1; //关闭蜂鸣器
}
/********************************************************
*名称:Init_DS18B20()
*功能:初始化DS18B20,
*调用:Delay();
*返回值:FLAG
*********************************************************/
Init_DS18B20(void)//初始化ds1820
{
DQ = 1; //DQ复位
Delay(20);//稍做延时
DQ = 0;//单片机将DQ拉低
Delay(200); //精确延时 大于 480us
DQ = 1; //拉高总线
Delay(20);
FLAG = DQ; //如果=0则初始化成功 =1则初始化失败
Delay(240);
DQ = 1;
return(FLAG); //返回信号,等于0初始化成功,等于1则初始化失败
}
/********************************************************
*名称:ReadOneByte()
*功能:从DS18B20读出1字节数据
*调用:Delay();
*返回值:dat
*********************************************************/
ReadOneByte(void)//读一个字节
{
unsigned char i = 0;
unsigned char dat = 0;
for (i = 0; i < 8; i++)
{
DQ = 0; // 脉冲信号
dat = dat>>1;
DQ = 1; // 脉冲信号
if(DQ)
dat |= 0x80;
Delay(10);
}
return (dat);
}
/********************************************************
*名称:WriteOneByte()
*功能:往DS18B20写入1字节数据
*调用:Delay();
*返回值:无
*********************************************************/
void WriteOneByte(unsigned char dat)//写一个字节
{
unsigned char i = 0;
for (i = 8; i > 0; i--)
{
DQ = 0;// 脉冲信号
DQ = dat&0x01;//LSB在前
Delay(12);
DQ = 1;// 脉冲信号
dat>>=1;
}
}
/********************************************************
*名称:Read_Temp()
*功能:读取DS18B20温度数据
*调用:Init_DS18B20(); WriteOneByte(); ReadOneByte();
*返回值:无
*********************************************************/
Read_Temp(void)//读取温度
{
Init_DS18B20();//初始化DS18B20
if(FLAG==1) //等于1初始化失败
{ //beep();//DS18B20不正常,蜂鸣器报警
flash=1;//返回不正常标志
}
else
{
flash=0;//返回显示标志
WriteOneByte(0xCC); // 跳过ROM匹配操作
WriteOneByte(0x44); // 启动温度转换
Init_DS18B20();//读温度前先复位
WriteOneByte(0xCC); //跳过ROM匹配操作
WriteOneByte(0xBE); //读取温度寄存器
temp_data[0] = ReadOneByte(); //温度低8位
temp_data[1] = ReadOneByte(); //温度高8位
}
}
/*********************************************************
*名称:Edit_bit()
*功能:编辑显示位
*调用:无
*返回值:无
**********************************************************/
Edit_bit()
{ //编辑每一位要显示的内容
display[4]=temp_data[0]&0x0f;//小数编辑
display[0]=ditab[display[4]]; //查表得小数位的值
display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);//温度值
display[3]=display[4]/100;//取最高位
display[2]=(display[4]%100)/10;//次高位
display[1]=display[4]%10;//个位
}
/*********************************************************
*名称:Edit_Temp()
*功能:编辑读取的正负温度
*调用:Edit_bit()
*返回值:无
**********************************************************/
void Edit_Temp()//编辑温度
{
if ((temp_data[1]&0x0f8)>0) //高五位是正负温度值符号1=零下
{ZF_FLGE=1;//零下标志置位
temp_data[0]=(~temp_data[0])+1;//负温度算法
temp_data[1]=~temp_data[1];
Edit_bit();//编辑显示位
}
else
{ZF_FLGE =0;
Edit_bit();//编辑显示位
}
}
/*********************************************************
*名称:Disp_bit()
*功能:数码管位扫描
*调用:Delay()
*返回值:无
**********************************************************/
Disp_bit()
{
//PORT= 0x33; //显示小 °C符号
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -