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