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
原创粉丝点击