|
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 );
}
} }
|
|