6163|2

1

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

DS18b20数码管显示时小数位不变,请高手指点,这是为什么? [复制链接]

同上:DS18b20数码管显示时小数位不变,请高手指点,这是为什么?直接用串口把温度发出来小数位一直为0,请指点

#include
#include <.\head\Uart.h>
//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<
P2 = temp;
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 );

}

}
}

此帖出自单片机论坛

最新回复

    我把小数位的计算式改了改,但只显示2,3,8等数字,而且刷新的速度还没个位快  详情 回复 发表于 2010-9-10 18:19
点赞 关注
 

回复
举报

1759

帖子

0

TA的资源

裸片初长成(高级)

沙发
 

你看看时序是否正确。网上有很多参考程序的。你可以看看。

此帖出自单片机论坛
 
个人签名南京璞晓电子   www.cpx0.com需要
msn:njlianjian@hotmail.com
 

回复

11

帖子

0

TA的资源

一粒金砂(中级)

板凳
 

好像不是时序的问题

    我把小数位的计算式改了改,但只显示2,3,8等数字,而且刷新的速度还没个位快
此帖出自单片机论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
【干货上新】电源解决方案和技术第二趴 | DigiKey 应用探索站
当月好物、电源技术资源、特色活动、DigiKey在线实用工具,干货多多~

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网 8

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表