本文包含原理图、PCB、源代码、封装库、中英文PDF等资源
您需要 登录 才可以下载或查看,没有账号?注册会员
×
作业:用STC89C52和DS18B20组成实现高温55.5度时红色LED灯亮,低温44.4度时绿色灯亮。如下图。
听老师说了很多DS18B20怎么读写的,看不懂,怎么写啊?以下是该坛剪过来的,不需要显示代码,怎么把55.5各44.4放入程序中?谁能帮我改一下.多谢
sbit io_DS18B20_DQ = P2^3 ;
#define DS18B20_DQ_HIGH io_DS18B20_DQ = 1 ;
#define DS18B20_DQ_LOW io_DS18B20_DQ = 0 ;
#define DS18B20_DQ_READ io_DS18B20_DQ
/*******************************************************************
* 保存温度值的数组.依次存放正负标志,温度值十位,个位,和小数位 *
*******************************************************************/
uint8 Temperature[ 4 ] ;
void v_Delay10Us_f( uint16 Count )
{
while( --Count )
{
_nop_();
}
}
/**************************************************************************
* Function: uint8 v_Ds18b20Init_f( void ) *
* Description: 初始化DS18B20 *
* Parameter: *
* *
* Return: 返回初始化的结果(0:复位成功 1:复位失败) *
**************************************************************************/
uint8 v_Ds18b20Init_f( void )
{
uint8 Flag ;
DS18B20_DQ_HIGH //稍作延时
v_Delay10Us_f( 3 ) ;
DS18B20_DQ_LOW //总线拉低
v_Delay10Us_f( 80 ) ; //延时大于480us
DS18B20_DQ_HIGH //总线释放
v_Delay10Us_f( 15 ) ;
Flag = DS18B20_DQ_READ ; //如果Flag为0,则复位成功,否则复位失败
return Flag ;
}
/******************************************************************************
* Function: void v_Ds18b20Write_f( uint8 Cmd ) *
* Description: 向DS18B20写命令 *
* Parameter: Cmd: 所要写的命令 *
* *
* Return: *
******************************************************************************/
void v_Ds18b20Write_f( uint8 Cmd )
{
uint8 i ;
for( i = 8 ; i > 0 ; i-- )
{
DS18B20_DQ_LOW //拉低总线,开始写时序
DS18B20_DQ_READ = Cmd & 0x01 ; //控制字的最低位先送到总线
v_Delay10Us_f( 5 ) ; //稍作延时,让DS18B20读取总线上的数据
DS18B20_DQ_HIGH //拉高总线,1bit写周期结束
Cmd >>= 1 ;
}
}
/******************************************************************************
* Function: uint8 v_Ds18b20Read_f( void ) *
* Description: 向DS18B20读取一个字节的内容 *
* Parameter: *
* *
* Return: 读取到的数据 *
******************************************************************************/
uint8 v_Ds18b20Read_f( void )
{
uint8 ReadValue, i ;
for( i = 8 ; i > 0 ; i-- )
{
DS18B20_DQ_LOW
ReadValue >>= 1 ;
DS18B20_DQ_HIGH
if( DS18B20_DQ_READ == 1 )
ReadValue |= 0x80 ;
v_Delay10Us_f( 3 ) ;
}
return ReadValue ;
}
/******************************************************************************
* Function: uint16 v_Ds18b20ReadTemp_f( void ) *
* Description: 读取当前的温度数据(只保留了一位小数) *
* Parameter: *
* *
* Return: 读取到的温度值 *
******************************************************************************/
uint16 v_Ds18b20ReadTemp_f( void )
{
uint8 TempH, TempL ;
uint16 ReturnTemp ;
/* if( v_Ds18b20Init_() ) return ; //复位失败,在这里添加错误处理的代码 */
v_Ds18b20Init_f() ; /复位DS18B20
v_Ds18b20Write_f( 0xcc ) ; //跳过ROM
v_Ds18b20Write_f( 0x44 ) ; //启动温度转换
v_Ds18b20Init_f() ;
v_Ds18b20Write_f( 0xcc ) ; //跳过ROM
v_Ds18b20Write_f( 0xbe ) ; //读取DS18B20内部的寄存器内容
TempL = v_Ds18b20Read_f() ; //读温度值低位(内部RAM的第0个字节)
TempH = v_Ds18b20Read_f() ; //读温度值高位(内部RAM的第1个字节)
ReturnTemp = TempH ;
ReturnTemp <<= 8 ;
ReturnTemp |= TempL ; //温度值放在变量ReturnTemp中
return ReturnTemp ;
}
/******************************************************************************
* Function: void v_TemperatureUpdate_f( void ) *
* Description:读取当前的温度数据并转化存放在数组Temperature(只保留了一位小数) *
* Parameter: *
* *
* Return: *
******************************************************************************/
void v_TemperatureUpdate_f( void )
{
uint8 Tflag = 0 ;
uint16 TempDat ;
float Temp ;
TempDat = v_Ds18b20ReadTemp_f() ;
if( TempDat & 0xf000 )
{
Tflag = 1 ;
TempDat = ~TempDat + 1 ;
}
Temp = TempDat * 0.0625 ;
TempDat = Temp * 10 ;
Temperature[ 0 ] = Tflag ; //温度正负标志
Temperature[ 1 ] = TempDat / 100 + '0' ; //温度十位值
Temperature[ 2 ] = TempDat % 100 / 10 + '0' ; //温度个位值
Temperature[ 3 ] = TempDat % 10 + '0' ;//温度小数位
} |
|