DS18B20温度检测带液晶上位机采集.docx

上传人:b****4 文档编号:6155004 上传时间:2023-05-09 格式:DOCX 页数:13 大小:28.65KB
下载 相关 举报
DS18B20温度检测带液晶上位机采集.docx_第1页
第1页 / 共13页
DS18B20温度检测带液晶上位机采集.docx_第2页
第2页 / 共13页
DS18B20温度检测带液晶上位机采集.docx_第3页
第3页 / 共13页
DS18B20温度检测带液晶上位机采集.docx_第4页
第4页 / 共13页
DS18B20温度检测带液晶上位机采集.docx_第5页
第5页 / 共13页
DS18B20温度检测带液晶上位机采集.docx_第6页
第6页 / 共13页
DS18B20温度检测带液晶上位机采集.docx_第7页
第7页 / 共13页
DS18B20温度检测带液晶上位机采集.docx_第8页
第8页 / 共13页
DS18B20温度检测带液晶上位机采集.docx_第9页
第9页 / 共13页
DS18B20温度检测带液晶上位机采集.docx_第10页
第10页 / 共13页
DS18B20温度检测带液晶上位机采集.docx_第11页
第11页 / 共13页
DS18B20温度检测带液晶上位机采集.docx_第12页
第12页 / 共13页
DS18B20温度检测带液晶上位机采集.docx_第13页
第13页 / 共13页
亲,该文档总共13页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

DS18B20温度检测带液晶上位机采集.docx

《DS18B20温度检测带液晶上位机采集.docx》由会员分享,可在线阅读,更多相关《DS18B20温度检测带液晶上位机采集.docx(13页珍藏版)》请在冰点文库上搜索。

DS18B20温度检测带液晶上位机采集.docx

DS18B20温度检测带液晶上位机采集

DS18B20温度检测(带液晶、上位机采集)

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

DS18B20温度检测(带1602液晶显示,修正负温度显示,新增支持上位机温度采集)

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

#include   //包含单片机寄存器的头文件

#include//包含_nop_()函数定义的头文件

unsignedcharcodedigit[10]={"0123456789"};    //定义字符数组显示数字

unsignedcharcodeStr[]={"TestbyDS18B20"};   //说明显示的是温度

unsignedcharcodeError[]={"Error!

Check!

"};    //说明没有检测到DS18B20

unsignedcharcodeTemp[]={"Temp:

"};            //说明显示的是温度

unsignedcharcodeCent[]={"Cent"};             //温度单位

unsignedcharfuhao;

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

函数功能:

向PC发送一个字节数据

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

voidSend(unsignedchardat)

{

  SBUF=dat;

  while(TI==0)

     ;

   TI=0;

}

//Send(tmp);       //发送数据i

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

以下是对液晶模块的操作程序

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

sbitRS=P2^0;          //寄存器选择位,将RS位定义为P2.0引脚

sbitRW=P2^1;          //读写选择位,将RW位定义为P2.1引脚

sbitE=P2^2;           //使能信号位,将E位定义为P2.2引脚

sbitBF=P0^7;          //忙碌标志位,,将BF位定义为P0.7引脚

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

函数功能:

延时1ms

(3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒

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

voiddelay1ms()

{

  unsignedchari,j;

for(i=0;i<10;i++)

  for(j=0;j<33;j++)

   ;  

}

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

函数功能:

延时若干毫秒

入口参数:

n

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

voiddelaynms(unsignedcharn)

{

  unsignedchari;

for(i=0;i

   delay1ms();

}

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

函数功能:

判断液晶模块的忙碌状态

返回值:

result。

result=1,忙碌;result=0,不忙

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

bitBusyTest(void)

{

   bitresult;

   RS=0;      //根据规定,RS为低电平,RW为高电平时,可以读状态

   RW=1;

   E=1;       //E=1,才允许读写

   _nop_();  //空操作

   _nop_();

   _nop_();

   _nop_();  //空操作四个机器周期,给硬件反应时间

   result=BF;//将忙碌标志电平赋给result

   E=0;        //将E恢复低电平

   returnresult;

}

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

函数功能:

将模式设置指令或显示地址写入液晶模块

入口参数:

dictate

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

voidWriteInstruction(unsignedchardictate)

{  

   while(BusyTest()==1);  //如果忙就等待

   RS=0;                 //根据规定,RS和R/W同时为低电平时,可以写入指令

   RW=0;  

   E=0;                  //E置低电平(根据表8-6,写指令时,E为高脉冲,

                       //就是让E从0到1发生正跳变,所以应先置"0"

   _nop_();

   _nop_();              //空操作两个机器周期,给硬件反应时间

   P0=dictate;           //将数据送入P0口,即写入指令或地址

   _nop_();

   _nop_();

   _nop_();

   _nop_();              //空操作四个机器周期,给硬件反应时间

   E=1;                  //E置高电平

   _nop_();

   _nop_();

   _nop_();

   _nop_();              //空操作四个机器周期,给硬件反应时间

   E=0;                 //当E由高电平跳变成低电平时,液晶模块开始执行命令

}

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

函数功能:

指定字符显示的实际地址

入口参数:

x

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

voidWriteAddress(unsignedcharx)

{

    WriteInstruction(x|0x80);//显示位置的确定方法规定为"80H+地址码x"

}

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

函数功能:

将数据(字符的标准ASCII码)写入液晶模块

入口参数:

y(为字符常量)

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

voidWriteData(unsignedchary)

{

   while(BusyTest()==1);

   RS=1;          //RS为高电平,RW为低电平时,可以写入数据

   RW=0;

   E=0;           //E置低电平(根据表8-6,写指令时,E为高脉冲,

                 //就是让E从0到1发生正跳变,所以应先置"0"

   P0=y;          //将数据送入P0口,即将数据写入液晶模块

   _nop_();

   _nop_();

   _nop_();

   _nop_();      //空操作四个机器周期,给硬件反应时间

   E=1;          //E置高电平

   _nop_();

   _nop_();

   _nop_();

   _nop_();       //空操作四个机器周期,给硬件反应时间

   E=0;           //当E由高电平跳变成低电平时,液晶模块开始执行命令

}

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

函数功能:

对LCD的显示模式进行初始化设置

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

voidLcdInitiate(void)

{

   delaynms(15);              //延时15ms,首次写指令时应给LCD一段较长的反应时间

   WriteInstruction(0x38);    //显示模式设置:

16×2显示,5×7点阵,8位数据接口

   delaynms(5);               //延时5ms ,给硬件一点反应时间

   WriteInstruction(0x38);

   delaynms(5);              //延时5ms ,给硬件一点反应时间

   WriteInstruction(0x38);    //连续三次,确保初始化成功

   delaynms(5);              //延时5ms ,给硬件一点反应时间

   WriteInstruction(0x0c);    //显示模式设置:

显示开,无光标,光标不闪烁

   delaynms(5);              //延时5ms ,给硬件一点反应时间

   WriteInstruction(0x06);    //显示模式设置:

光标右移,字符不移

   delaynms(5);               //延时5ms ,给硬件一点反应时间

   WriteInstruction(0x01);    //清屏幕指令,将以前的显示内容清除

   delaynms(5);            //延时5ms ,给硬件一点反应时间

}

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

以下是DS18B20的操作程序

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

sbitDQ=P3^3;

unsignedchartime;  //设置全局变量,专门用于严格延时

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

函数功能:

将DS18B20传感器初始化,读取应答信号

出口参数:

flag

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

bitInit_DS18B20(void)

{

   bitflag;        //储存DS18B20是否存在的标志,flag=0,表示存在;flag=1,表示不存在

   DQ=1;          //先将数据线拉高

   for(time=0;time<2;time++)//略微延时约6微秒

   ;

   DQ=0;          //再将数据线从高拉低,要求保持480~960us

   for(time=0;time<200;time++)//略微延时约600微秒

   ;        //以向DS18B20发出一持续480~960us的低电平复位脉冲

   DQ=1;          //释放数据线(将数据线拉高)

   for(time=0;time<10;time++)

   ;//延时约30us(释放总线后需等待15~60us让DS18B20输出存在脉冲)

   flag=DQ;         //让单片机检测是否输出了存在脉冲(DQ=0表示存在)     

   for(time=0;time<200;time++)//延时足够长时间,等待存在脉冲输出完毕

   ;

   return(flag);   //返回检测成功标志

}

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

函数功能:

从DS18B20读取一个字节数据

出口参数:

dat

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

unsignedcharReadOneChar(void)

{

  unsignedchari=0;

  unsignedchardat;//储存读出的一个字节数据

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

  {

   

   DQ=1;      //先将数据线拉高

   _nop_();    //等待一个机器周期

   DQ=0;     //单片机从DS18B20读书据时,将数据线从高拉低即启动读时序

   dat>>=1;

   _nop_();    //等待一个机器周期    

   DQ=1;    //将数据线"人为"拉高,为单片机检测DS18B20的输出电平作准备

   for(time=0;time<2;time++)

         ;     //延时约6us,使主机在15us内采样

   if(DQ==1)

      dat|=0x80;//如果读到的数据是1,则将1存入dat

   else

    dat|=0x00;//如果读到的数据是0,则将0存入dat

     //将单片机检测到的电平信号DQ存入r[i]

   for(time=0;time<8;time++)

       ;             //延时3us,两个读时序之间必须有大于1us的恢复期

    }                    

return(dat);   //返回读出的十进制数据

}

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

函数功能:

向DS18B20写入一个字节数据

入口参数:

dat

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

WriteOneChar(unsignedchardat)

{

unsignedchari=0;

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

  {

    DQ=1;        //先将数据线拉高

    _nop_();     //等待一个机器周期

    DQ=0;         //将数据线从高拉低时即启动写时序      

    DQ=dat&0x01;  //利用与运算取出要写的某位二进制数据,

                  //并将其送到数据线上等待DS18B20采样

    for(time=0;time<10;time++)

    ;//延时约30us,DS18B20在拉低后的约15~60us期间从数据线上采样

    DQ=1;         //释放数据线     

    for(time=0;time<1;time++)

    ;//延时3us,两个写时序间至少需要1us的恢复期

    dat>>=1;      //将dat中的各二进制位数据右移1位

    }

    for(time=0;time<4;time++)

           ;//稍作延时,给硬件一点反应时间

}

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

以下是与温度有关的显示设置

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

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

函数功能:

显示没有检测到DS18B20

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

voiddisplay_error(void)

{

      unsignedchari;

     WriteAddress(0x00);   //写显示地址,将在第1行第1列开始显示

     i=0;               //从第一个字符开始显示

    while(Error[i]!

='\0')//只要没有写到结束标志,就继续写

    {      

     WriteData(Error[i]);  //将字符常量写入LCD

     i++;                //指向下一个字符

     delaynms(100);       //延时100ms较长时间,以看清关于显示的说明

    }

    while

(1)             //进入死循环,等待查明原因

     ;

}

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

函数功能:

显示说明信息

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

voiddisplay_explain(void)

{

      unsignedchari;

     WriteAddress(0x00);   //写显示地址,将在第1行第1列开始显示

     i=0;               //从第一个字符开始显示

    while(Str[i]!

='\0')//只要没有写到结束标志,就继续写

    {      

     WriteData(Str[i]);  //将字符常量写入LCD

     i++;                //指向下一个字符

     delaynms(100);       //延时100ms较长时间,以看清关于显示的说明

    }

}

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

函数功能:

显示温度符号

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

voiddisplay_symbol(void)

{

      unsignedchari;

     WriteAddress(0x40);   //写显示地址,将在第2行第1列开始显示

     i=0;               //从第一个字符开始显示

    while(Temp[i]!

='\0')//只要没有写到结束标志,就继续写

    {      

     WriteData(Temp[i]);  //将字符常量写入LCD

     i++;                //指向下一个字符

     delaynms(50);       //延时1ms给硬件一点反应时间

    }

}

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

函数功能:

显示温度的小数点

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

voiddisplay_dot(void)

{        

WriteAddress(0x49);  //写显示地址,将在第2行第10列开始显示    

WriteData('.');     //将小数点的字符常量写入LCD

delaynms(50);        //延时1ms给硬件一点反应时间  

}

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

函数功能:

显示温度的符号

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

void  display_ice(unsignedcharfuhao)

{

   unsignedcharshow;   

show=fuhao;    

WriteAddress(0x45);  //写显示地址,将在第2行第10列开始显示    

WriteData(show);     //将小数点的字符常量写入LCD

delaynms(50);        //延时1ms给硬件一点反应时间  

}

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

函数功能:

显示温度的单位(Cent)

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

voiddisplay_cent(void)

{

          unsignedchari;   

     WriteAddress(0x4c);       //写显示地址,将在第2行第13列开始显示

     i=0;                   //从第一个字符开始显示

    while(Cent[i]!

='\0')    //只要没有写到结束标志,就继续写

    {     

     WriteData(Cent[i]);    //将字符常量写入LCD

     i++;                //指向下一个字符

     

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

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2