锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

51单片机的ds18b20驱动程序

时间:2024-05-14 12:37:11

//////////////////////////////////////////////////////头文件/////////////////////////////////////////////////////// /*******************************************************************************
* 标题: 18b20温度芯片驱动程序 *
* 文件: 18b20.h 18b20.c *
* 日期: 2010-3-11 *
* 版本: 1.12(试验通过版)可用51hei单片机 *
* 邮箱:
acsdf139@163.com qq:526083029 *
* 网站: 无 *
********************************************************************************
* 描述: *
* 用法:首先在主程序内添加头文件#include"18b20.c" *
* 在程序中使用ReadTemp();获取温度芯片内数据 *
* 使用 temp_to_str();函数将时间数据转换液晶字符 *
* *
********************************************************************************
*【版权】自己参照网上,朋友,以及书本资料上写的,所以没有版权 *
*【声明】此程序,可用于学习,参考及实际设计中,欢迎转载复制以及建议批评 *
*【技术支持】qq:526083029 小张 *
********************************************************************************/
#ifndef _18B20_H_
#define _18B20_H_ #define uchar unsigned char
#define rerom1820 0x33 // 读ROM指令
#define matchrom1820 0x55 // 匹配ROM指令
#define skiprom1820 0xCC // 跳过ROM指令
#define searchrom1820 0xF0 // 搜索ROM指令
#define alarmsearch1820 0xEC // 报警搜索指令
#define wrscratchpad1820 0x4E // 写暂存寄存器指令
#define rescratchpad1820 0xBE // 读暂存寄存器指令
#define copyscratchpad1820 0x48 // 复制暂存寄存器指令
#define convert1820 0x44 // 启动温度转换指令
#define recalle21820 0xB8 // 重新调出E2PROM的数据 /***********ds18b20延迟子函数*******/ extern void delaydq(uchar i); /**********ds18b20初始化函数**********************/ extern void dqinit(void); /***********ds18b20读一个字节**************/ extern uchar re1820b(void); /*************ds18b20写一个字节****************/ extern void wr1820b(uchar dat);
extern void ReadTemp(void);
extern void temp_to_str(); #endif ///////////////////////////////////////////////////////////c程序////////////////////////////////////////////// #include #include "18b20.h" #include //管脚定义 sbit DQ=P3^0; uchar TempBuffer[8]; uchar temp_value,temp2,xs,fflag; /************************************* 函数名:delaydq 函数功能:延时 参数:i(秒数) 返回:无 备注:无 *************************************/ void delaydq(uchar i) { while(i--); } /************************************* 函数名:dqinit 函数功能:初始化 参数:无 返回:无 备注:无 *************************************/ void dqinit(void) { uchar x=0; DQ = 1; //DQ 复位 delaydq(8);// 稍做延时 DQ = 0; // 单片机将DQ拉低 delaydq(80); // 精确延时 大于 480us DQ = 1; // 拉高总线 delaydq(14); x=DQ; // 稍做延时后 如果x=0则初始化成功 x=1则初始化失败 delaydq(20); } /************************************* 函数名:re1820b 函数功能:读数据 参数:无 返回:dat(数据) 备注:无 *************************************/ uchar re1820b(void) { uchar i=0; uchar dat = 0; for (i=8;i>0;i--) { DQ = 0; // 给脉冲信号 dat>>=1; DQ = 1; // 给脉冲信号 if(DQ) dat|=0x80; delaydq(4); } return(dat); } /************************************* 函数名:wr1820b 函数功能:写数据 参数:dat(数据) 返回:无 备注:无 *************************************/ void wr1820b(uchar dat) { unsigned char i=0; for (i=8; i>0; i--) { DQ = 0; DQ = dat&0x01; delaydq(5); DQ = 1; dat>>=1; } } /************************************* 函数名:ReadTemp 函数功能:温度转换 参数:无 返回:无 备注:无 *************************************/ void ReadTemp(void) { unsigned char a=0; unsigned char b=0; unsigned char t=0; dqinit(); wr1820b(0xCC); // 跳过读序号列号的操作 wr1820b(0x44); // 启动温度转换 delaydq(100); dqinit(); wr1820b(0xCC); // 跳过读序号列号的操作 wr1820b(0xBE); // 读取温度寄存器等(共可读9个寄存器) 前两个就是温度 delaydq(100); a=re1820b(); // 读取温度值低位 b=re1820b(); // 读取温度值高位 if(b>127) { b=(256-b);a=(256-a);fflag=1; // 负温度求补码 } temp_value=b<<4; temp_value+=(a&0xf0)>>4; temp2=a&0x0f; // 小数的值 xs=temp2*0.0625*10; // 小数位,若为0.5则算为5来显示 xs小数 } /************************************* 函数名:temp_to_str 函数功能:温度显示 参数:无 返回:无 备注:无 *************************************/ void temp_to_str() // 温度数据转换成液晶字符显示 { if(fflag==1) {TempBuffer[0]='-'; TempBuffer[1]=temp_value/10+'0';// 十位 TempBuffer[2]=temp_value%10+'0'; // 个位 TempBuffer[3]='.'; TempBuffer[4]=xs+'0'; TempBuffer[5]=0xdf; // 温度符号 TempBuffer[6]='C'; TempBuffer[7]='\0'; } else { Tem
锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章