DS18B20.H文件是温度传感器的驱动 大家可以另存为到硬盘下载到电脑
- /*把我一直珍藏的程序全部拿出来,给大家共享,这也让我想起来,我刚学的时候,搜集资料是那么辛苦,而且找不到完整的资料,我将把我整理的和自己制作的H文件共享出来,只要修改定义端口,便可以随意的调用,以后我还会慢慢完善我的C资料,也希望大家给我指出程序的漏洞和缺点,已达到相互学习目地。*/
- #ifndef __DS18B20_H__
- #define __DS18B20_H__
- #include<intrins.h>
- #define uch unsigned char //给unsigned char 起别名 uch
- sbit DQ=P2^3;///////////////定义一个数据端口
- unsigned char TLV_ds=0 ; ///采集到的温度高8 位
- unsigned char THV_ds=0; ////采集到的温度低8 位
- unsigned char bwei_ds; /////整数百位
- unsigned char shwei_ds; ////整数十位
- unsigned char gwei_ds; /////整数个位
- unsigned char shfen_ds; ////十分位
- unsigned char bfen_ds; /////百分位
- //------------------------------------------------
- //延时函数
- void delay_ds(uch x,uch y) //误差0,12M
- {
- uch a,b;
- for(b=x;b>0;b--)
- for(a=y;a>0;a--);
- }
- //-----------------------------------------------
- //复位DS18B20 函数
- void reset_ds(void)
- {
- char presence=1;
- while(presence)
- {
- DQ=0; //////////////////主机拉至低电平
- delay_ds(1,80); ///////延时大于480us
- DQ=1; //////////////////释放总线等电阻拉高总线,并保持15~60us
- delay_ds(1,7); /////////延时20us
-
- if(DQ==1) presence=1; //没有接收到应答信号,继续复位
- else presence=0; ///////接收到应答信号
- delay_ds(1,64); ////////延时430us
- }
- }
- //-----------------------------------------------
- //写18b20 写字节函数
- void write_byte_ds(uch val_ds)
- {
- uch i;
- uch temp_ds;
- for(i=8;i>0;i--)
- {
- temp_ds=val_ds&0x01; //最低位移出
- DQ=0;
- if(temp_ds==1) DQ=1; //如果写1,拉高电平
- delay_ds(1,11); ///////延时63us
- DQ=1;
- _nop_();
- _nop_(); //////////////延时6us
- val_ds=val_ds>>1; /////右移一位
- }
- }
- //------------------------------------------------
- //18b20 读字节函数
- uch read_byte_ds(void)
- {
- uch i;
- uch value_ds=0; ///读出温度
- static bit j;//////静态变量
- for(i=8;i>0;i--)
- {
- DQ=0; /////////拉低给脉冲信号
- value_ds>>=1;//右移并起到延时作用
- DQ=1; /////////拉至高电平
- _nop_(); /////延时6us等待响应
- j=DQ;
- if(j) value_ds|=0x80;//写入高电平
- delay_ds(1,11); ///////延时63us
- }
- return(value_ds);
- }
- //-------------------------------------------------
- //启动温度转换函数
- void get_temp_ds()
- {
- int i=10;
- int T_ds;
- float tt;
- DQ=1;
- reset_ds(); ///////////复位等待从机应答
- write_byte_ds(0XCC); //忽略ROM 匹配
- write_byte_ds(0X44); //发送温度转化命令
- while(i--)
- {
- delay_ds(50,100); //确保温度转换完成所需要的时间
- }
- reset_ds(); /////////////再次复位,等待从机应答
- write_byte_ds(0XCC); ////忽略ROM 匹配
- write_byte_ds(0XBE); ////发送读温度命令
- TLV_ds=read_byte_ds(); //读出温度低8
- THV_ds=read_byte_ds(); //读出温度高8 位
- DQ=1;////////////////////释放总线
- T_ds=THV_ds;////////写入高八位
- T_ds<<=8;///////////高八位上移
- T_ds=T_ds|TLV_ds;///写入低八位
- tt=T_ds*0.0625;/////直接计算,单位万分之一度
- T_ds= tt*100+0.5; //可校准,单位0.01度
-
- bwei_ds=T_ds/10000;////////显示百位
- shwei_ds=T_ds%10000/1000;//显示十位
- gwei_ds=T_ds%1000/100;/////显示个位
- shfen_ds=T_ds%100/10;//////显示十分位
- bfen_ds=T_ds%10;///////////显示百分位
- }
- #endif
复制代码
调用方法研究:http://www.51hei.com/bbs/dpj-218922-1.html
|