⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds18b20.c

📁 nokia5110智能电子钟的设计ds1302+ds18b20+stc12c5a60s2
💻 C
字号:
/**************************************************************************************
*		         			子程序:底层程序     									  *			  					  
*						    功能:外部测温功能;         							  *
*     						调用子程序;		      								  *
*																					  *
***************************************************************************************/
# include "stc12c5a60s2.h"
#include "INTRINS.H" 
# include "macroandconst.h"
# include "main.h"
# include "nokia5110.h"
# include "delay.h"
sbit DQ = P1^5;                     //DS18B20的数据口位P3.3 

BYTE TPH;                           //存放温度值的高字节 
BYTE TPL;                           //存放温度值的低字节 

void DelayXus(BYTE n); 
void DS18B20_Reset(); 
void DS18B20_WriteByte(BYTE dat); 
BYTE DS18B20_ReadByte();
uint get_temperatuerResult();

 
uint get_temperatuerResult() 
{ 
	uint temperatuerResult;
    DS18B20_Reset();                //设备复位 
    DS18B20_WriteByte(0xCC);        //跳过ROM命令 
    DS18B20_WriteByte(0x44);        //开始转换命令 
    while (!DQ);                    //等待转换完成     
	DS18B20_Reset();                //设备复位 
    DS18B20_WriteByte(0xCC);        //跳过ROM命令 
    DS18B20_WriteByte(0xBE);        //读暂存存储器命令 

    TPL = DS18B20_ReadByte();       //读温度低字节 
    TPH = DS18B20_ReadByte();       //读温度高字节 

	temperatuerResult=TPH<<8;
    temperatuerResult|=TPL;
	return 	temperatuerResult;
	    
} 

 /************************************** 
复位DS18B20,并检测设备是否存在 
**************************************/ 
void DS18B20_Reset() 
{ 
    CY = 1; 
    while (CY) 
    { 
        DQ = 0;                     //送出低电平复位信号 
        DelayXus(240);              //延时至少480us 
        DelayXus(240); 
        DQ = 1;                     //释放数据线 
        DelayXus(60);               //等待60us 
        CY = DQ;                    //检测存在脉冲 
        DelayXus(240);              //等待设备释放数据线 
        DelayXus(180); 
    } 
} /************************************** 
从DS18B20读1字节数据 
**************************************/ 
BYTE DS18B20_ReadByte() 
{ 
    BYTE i; 
    BYTE dat = 0;     for (i=0; i<8; i++)             //8位计数器 
    { 
        dat >>= 1; 
        DQ = 0;                     //开始时间片 
        DelayXus(1);                //延时等待 
        DQ = 1;                     //准备接收 
        DelayXus(1);                //接收延时 
        if (DQ) dat |= 0x80;        //读取数据 
        DelayXus(60);               //等待时间片结束 
    }     
	return dat; 
} /************************************** 
向DS18B20写1字节数据 
**************************************/ 
void DS18B20_WriteByte(BYTE dat) 
{ 
    char i;     for (i=0; i<8; i++)             //8位计数器 
    { 
        DQ = 0;                     //开始时间片 
        DelayXus(1);                //延时等待 
        dat >>= 1;                  //送出数据 
        DQ = CY; 
        DelayXus(60);               //等待时间片结束 
        DQ = 1;                     //恢复数据线 
        DelayXus(1);                //恢复延时 
    } 
} 

void temperatuercheck()
{	  	
	  uint WENDU;
	  //uchar warring;
	  uchar ge,shi,bai,xiaoshu;
	  WENDU=get_temperatuerResult()*0.625;//放大十倍;

	  LCD_write_hanzi(0,0,6);
	  LCD_write_hanzi(1,0,7);	//temperature

	  LCD_write_hanzi(3,2,11);
	  bai=WENDU/1000;
	  shi=WENDU/100%10;
	  ge=WENDU/10%10;
	  xiaoshu=WENDU%10;
	  if(bai!=0)
	  LCD_write_shu(1,2,bai);
	  else
	  LCD_write_shu(1,2,90);

	  LCD_write_shu(2,2,shi);
	  LCD_write_shu(3,2,ge);
	  LCD_write_shu(4,2,87);
	  LCD_write_shu(5,2,xiaoshu);
	  
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -