ds18b20c语言显示小数位,DS18b20数码管显示时小数位不变,请高手指点,这是为什么?...

#include <.>

//unsigned char SEG[8]=0;

uint8 a=0;

uint8 Tflag = 0 ;

code uint16 LedDisplayCode[] =

{

0xC0,/*0*/

0xF9,/*1*/

0xA4,/*2*/

0xB0,/*3*/

0x99,/*4*/

0x92,/*5*/

0x82,/*6*/

0xF8,/*7*/

0x80,/*8*/

0x90,/*9*/

0x88,/*A*/

0x83,/*b*/

0xC6,/*C*/

0xA1,/*d*/

0x86,/*E*/

0x8E,/*F*/

0xBF,/*-*/

};

sbit io_led_seg_cs =P3^6;

sbit io_led_bit_cs =P3^7;

void SendLedBitData (uint8 date)

{

uint8 temp;

temp = (0x01

io_led_bit_cs=1;

io_led_bit_cs=0;

}

void SendLedSegData(uint8 date)

{

P0=date;

io_led_seg_cs=1;

io_led_seg_cs=0;

}

sbit io_DS18B20_DQ = P1^0 ;

#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[5] ;

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(只保留了一位小数) *

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

void v_TemperatureUpdate_f( void )

{

uint16 TempDat ;

float Temp ;

TempDat = v_Ds18b20ReadTemp_f() ;

if( TempDat & 0xf000 )

{

Tflag = 1 ;

TempDat = ~ TempDat + 1 ;

}

Temp = TempDat >> 4; // (TempDat * 0.0625 ) 请大家不要用乘以,不知道为什么可以看我上面的贴子

TempDat = Temp * 10;// 保留1位小数

Temperature[ 0 ] = Tflag ; //温度正负标志

Temperature[ 1 ] = TempDat / 100 ; //温度十位值

Temperature[ 2 ] = (TempDat % 100) / 10 ; //温度个位值

Temperature[ 3 ] = TempDat % 10; //温度小数位---- 0.1

// Temperature[ 4 ] = (TempDat%10)/10; //温度小数位---- 0.01

}

void main()

{

v_Ds18b20Init_f( );

Uart_Init();

while(1)

{

v_TemperatureUpdate_f();

for(a=0;a<5;a++)

{

uart_sendbyte(Temperature[ a ]);

}

for(a=0;a<5;a++)

{

if(a==0&&Tflag==1) //当温度为负数时,显示的格式为:-24.4

{

SendLedBitData(a);

SendLedSegData(LedDisplayCode[17]);

//continue;

}

if(a==0&&(Tflag==0)) //当温度为正数时,显示的格式为:24.4

{

SendLedBitData(a);

SendLedSegData(0xff);

//continue;

}

if(a==2)

{

SendLedBitData(a);

SendLedSegData(((LedDisplayCode[Temperature[a]]) & (0x7f)));

//uart_sendbyte(((LedDisplayCode[Temperature[a]]) & (0x7f)));

//continue;

}

if(a==1||a==3||a==4)

{

SendLedBitData(a);

SendLedSegData(LedDisplayCode[Temperature[a]]);

}

/*------------------------*/

SendLedBitData(0xff); //消隐语句,否则数码管有余晖

SendLedSegData( 0xff );

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值