13板外的第一个扩展DS18B20温度测量2实际制做.docx

上传人:b****3 文档编号:2815815 上传时间:2022-11-15 格式:DOCX 页数:16 大小:213.26KB
下载 相关 举报
13板外的第一个扩展DS18B20温度测量2实际制做.docx_第1页
第1页 / 共16页
13板外的第一个扩展DS18B20温度测量2实际制做.docx_第2页
第2页 / 共16页
13板外的第一个扩展DS18B20温度测量2实际制做.docx_第3页
第3页 / 共16页
13板外的第一个扩展DS18B20温度测量2实际制做.docx_第4页
第4页 / 共16页
13板外的第一个扩展DS18B20温度测量2实际制做.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

13板外的第一个扩展DS18B20温度测量2实际制做.docx

《13板外的第一个扩展DS18B20温度测量2实际制做.docx》由会员分享,可在线阅读,更多相关《13板外的第一个扩展DS18B20温度测量2实际制做.docx(16页珍藏版)》请在冰豆网上搜索。

13板外的第一个扩展DS18B20温度测量2实际制做.docx

13板外的第一个扩展DS18B20温度测量2实际制做

13、板外的第一个扩展——DS18B20温度测量

(2)实际制做

2008-07-2823:

38

这个扩展,电路很简单,板子就不用做了吧!

把电路焊好就行了。

这个是原理图:

实际接线图如下:

接好的实物图如下:

接下来就是写程序了,我们还是一步步地来完成:

① 向总线发出复位信号:

sbitTMDAT=P1^1;   //设P1.1为TMDAT

  voidtmreset(void)

{

uinti;

TMDAT=0;    //将总线拉低

i=103;

while(i>0)i--;   //延时700微秒

TMDAT=1;     //释放总线

i=4;

while(i>0)i--;   //延时40微秒

}

②检测总线上是否有器件应答(是否有存在信号):

voidtmpre(void)

{

uinti;

while(TMDAT);    //检测低电平的存在。

否则一直循环。

while(~TMDAT);//检测高电平的存在。

否则一直循环。

i=4;

while(i>0)i--;    //延时

}

这段程序就是检测一个先低后高的脉冲的存在。

说明有器件应答了。

③从DS18B20上读一个bit

bittmrbit(void)

{

uinti;

bitdat;

TMDAT=0;  //先将总线拉低

i++;             //延时一微秒

TMDAT=1;  //释放总线

i++;

i++;           //延时两微秒

dat=TMDAT;   //读取总线

i=8;

while(i>0)i--;    //延时

return(dat);

}

④向总线写一个bit

voidtmwbit(bittestb)

{

if(testb)                   //如果是1

      {TMDAT=0;    //先拉低总线

        i++;i++;           //延时2微秒

        TMDAT=1;    //释放总线

        i=8;

        while(i>0)i--;  //延时40微秒

      }

    else                    //如果是0

      {TMDAT=0;    //先拉低总线

        i=8;

        while(i>0)i--;  //延时40微秒

        TMDAT=1;     //释放总线

        i++;i++;         //延时2微秒

      }

}

我这么写大家能看懂吧!

与单片机连接图:

好!

现在上完整的程序:

(要慢慢的读了)

//LCD12864

//**********************************************************

//连线表:

CPU=89C51   SysClock=12MHz                    *

//RS=P2.0  R/W=P2.1   E=P2.2   CS1=P2.3   CS2=P2.4    *

//DB0-DB7=P3.0-P3.7      /Reset=InBoard                  *

//**********************************************************

//DS18B20

//**********************************************************

//连线表:

CPU=89C51   SysClock=12MHz                    *

//单总线:

TMDAT=P1.1

//               

//**********************************************************

#include

#include

#include

#include

#include

#defineucharunsignedchar

#defineuintunsignedint

/********************LCD引脚定义********************/

#defineDataPortP3    //LCD128*64I/O信号管脚

sbit   RS=P2^0;     //数据指令

sbit   RW=P2^1;     //读写

sbit   E  =P2^2;     //使能

sbit   CSL=P2^3;     //左片选

sbit   CSR=P2^4;     //右片选

ucharPage;            //页地址

ucharCol;             //列地址

ucharcodeASC_5x7[];  //5×7阵点字模

ucharstr[4];          //char的值转换成字符串

/********************DS18B20引脚定义********************/

sbitTMDAT=P1^1;

/********************DS18B20函数定义*******************/

voiddmsec(uintcount);//延时(count)毫秒

voidtmreset(void);   //产生复位信号

voidtmpre(void);     //检测器件应答信号

bittmrbit(void);     //从总线读一个bit

uchartmrbyte(void);  //从总线读一个字节

voidmwbyte(uchardat);//向总线写一个字节

voidtmstart(void);   //启动一次温度转换

uchartmrtemp(void);  //读取温度数据

/********************LCD函数定义*******************/

voidBusyL(void);         //左屏检测忙

voidBusyR(void);         //右屏检测忙

voidCheckBusy(void);     //读取忙信号

voidDelay(uintMS);      //延时

voidLocatexy(void);      //将屏幕横向0-12纵向0-7转换成左、右屏的的X、Y

voidWriteCommandL(ucharCommandByte);   //向左屏写入指令

voidWriteCommandR(ucharCommandByte);   //向右屏写入指令

ucharReadData(void);      //读数据

voidWriteData(ucharDataByte);   //写数据

voidLcmClear(void);      //清屏

voidLcmInit(void);       //初始化

uchar*uchartostr(unsignedcharunm);           //将值转成字符串

voidLcmPutAsc(ucharasc);    //显示一个5×7的ASC字符

voidLcmPutstr(ucharrow,uchary,uchar*str);      //在设定位置显示字符串

/*****************DS18B20函数体定义****************/

voiddmsec(uintcount)

{

uinti;

while(count--)

  {for(i=0;i<125;i++){}

  }

}

voidtmreset(void)

{

uinti;

TMDAT=0;

i=103;

while(i>0)i--;

TMDAT=1;

i=4;

while(i>0)i--;

}

voidtmpre(void)

{

uinti;

while(TMDAT);

while(~TMDAT);

i=4;

while(i>0)i--;

}

bittmrbit(void)

{

uinti;

bitdat;

TMDAT=0;

i++;

TMDAT=1;

i++;

i++;

dat=TMDAT;

i=8;

while(i>0)i--;

return(dat);

}

uchartmrbyte(void)

{

uchari,j,dat;

dat=0;

for(i=1;i<=8;i++)

{j=tmrbit();

   dat=(j<<7)|(dat>>1);

}

return(dat);

}

voidtmwbyte(uchardat)

{

uinti;

ucharj;

bittestb;

for(j=1;j<=8;j++)

  {testb=dat&0x01;

    dat=dat>>1;

    if(testb)

      {TMDAT=0;

        i++;i++;

        TMDAT=1;

        i=8;

        while(i>0)i--;

      }

    else

      {TMDAT=0;

        i=8;

        while(i>0)i--;

        TMDAT=1;

        i++;i++;

      }

  }

}

voidtmstart(void)

{

tmreset();

tmpre();

dmsec

(1);

tmwbyte(0xcc);

tmwbyte(0x44);

}

uchartmrtemp(void)

{

uchara,b,y1,y2,y3;

tmreset();

tmpre();

dmsec

(1);

tmwbyte(0xcc);

tmwbyte(0xbe);

a=tmrbyte();

b=tmrbyte();

y1=a>>4;

y2=b<<4;

y3=y1|y2;

return(y3);

}

/************LCD12864函数体***************/

/***************************/

/*检查Busy                */

/***************************/

voidBusyL(void)

{

       CSL=1;

       CSR=0;

       CheckBusy();

}

voidBusyR(void)

{

       CSL=0;

       CSR=1;

      

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 成人教育 > 自考

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1