DS18b20测温程序设计
来源:互联网 发布:ictr软件手机版 编辑:程序博客网 时间:2024/04/29 16:42
DS18b20,只有单一的I/O口,时序非常复杂,也造成了代码编写的困难,经过一天的研究终于搞定,代码如下(部分代码摘自网上):
<pre name="code" class="html">#include"reg52.h"#include"intrins.h"sbit wx=P2^6;sbit dx=P2^7;sbit DQ=P2^0;#define unit unsigned int #define uchar unsigned charunsigned char table[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};//延时函数(12MHZ晶振):void Delayus(unsigned char t){ //此函数精确计算:18+6*(t-1)=延时时间(us) while(t--);}//延时函数msvoid delayms(unit m){ unit i,j; for(i=0;i<=m;i++) for(j=0;j<=110;j++); } //清理数码管 void ClrData() { P0 = 0xff; //发送要显示的段码dx = 1;dx = 0;P0 = 0xff; //发送要显示的位码,只显示一位数字wx = 1;wx = 0;}//DS18b20复位void Rst_18b20(){ DQ=0;//拉低,开始复位操作 Delayus(100);//延时至少480us DQ=1;//拉高,释放总线控制权 while(DQ);//等待器件应答(器件拉低),约15-60us后 while(!DQ);//应答脉冲出现后,等待器件拉高,约60-240us后 }//DS18b20写命令函数void Write_18b20(uchar com){unsigned char i; for(i=0;i<8;i++) { DQ=0;//开始写操作 _nop_(); _nop_();//至少延时1us DQ=com&0x01;//写数据 Delayus(2);//延时,器件在45us内采样 DQ=1;//释放总线控制权 com>>=1; //右移1位,写下一位 } } //DS18b20读命令函数 uchar Read_18b20() { unsigned char i,rdata=0; for(i=0;i<8;i++) { DQ=0;//开始读操作 _nop_();_nop_();//至少延时1us DQ=1;//释放总线控制权,15us内要读取数据 if(DQ==1) rdata|=0x01<<i; Delayus(10);//延时要大于45us.读0时,45us后器件才拉高总线 } return rdata;}//读出温度函数unit Read_tem(){ float t; uchar temp1,temp2; unit temp3; Rst_18b20();//复位 Write_18b20(0xcc);//写命令,跳过ROM编码命令 Write_18b20(0x44); //转换命令 while(!DQ);//等待转换完成 Rst_18b20();//复位 Write_18b20(0xcc);//写命令,跳过ROM编码命令 Write_18b20(0xbe);//读取暂存器字节命令 temp1=Read_18b20();//读低字节 temp2=Read_18b20();//读高字节 Rst_18b20();//复位 temp3=temp2; temp3=temp3<<8|temp1;//两个字节合并为一个int型数据 t=temp3*0.0625; temp3=t*10+0.5;return temp3;}void Display(uchar m,uchar n){ uchar i; i=~(0x01<<m); P0=i; wx=1; wx=0; P0=n; dx=1; dx=0; delayms(1); } void main() { uchar A,T,S; int temp; ClrData(); while(1) { temp=Read_tem();S=temp/100;T=(temp0)/10;A=temp;if(temp<0) //温度小于0度{ Display(0, 0xBF); //显示负号}Display(1, table[S]); //显示十位delayms(2);Display(2,table[T]-0x80); //显示个位,减0x80是为了能显示小数点delayms(2);Display(3, table[A]); //显示小数位delayms(2);}}
0 0
- DS18b20测温程序设计
- DS18B20 构成测温系统
- DS18B20 测温程序
- DS18B20单线多点测温 单线多DS18B20测温
- 基于DS18B20测温系统解决方案
- 测温芯片DS18B20详细解读
- 测温芯片DS18B20详细解读
- 测温芯片DS18B20详细解读
- 基于CC2430和DS18B20的无线测温系统设计
- 基于ARM和DS18B20的数字测温系统
- DS18B20温度传感器测温显示在数码管上(29.9℃)
- 51单片机 DS18B20 (测温度 读取序列号 温度警报)
- 我的第一个DS18B20温度传感器多点测温程序(草稿)
- DS18B20多点测温(读序列,匹配序列,51 C程序,1602显示)
- DS18B20工作在寄存电源时(多点测温),在msp430上测试通过
- DS18b20测温C程序 带协议解释 TX-1C实验板(更改端口即可使用)
- 模拟实时测温,1602显示,一个I/O口上挂两个温感DS18B20,实现于仿真上PROTEUS
- ds18b20
- iOS开发47-iOS 单例的学习和使用
- 线段树杭电1754 I hate it
- Java用WebSocket + tail命令实现Web实时日志
- 剑指offer3 从尾到头打印链表
- 20 Linux Server Hardening Security Tips
- DS18b20测温程序设计
- 随想随记
- 5.8 几何着色阶段
- 图书管理系统 UML用例图
- hdu5568
- 素数03
- 改变当前任务堆栈中既存的Activity的顺序
- linux学习笔记之用户切换
- 文章标题