|
#include<STC12C5A60S2.h>
#include<intrins.h>
sbit DQ=P0^0;
unsigned int Temperature,Temp_Flag;
//延时函数
void delay_us(unsigned char a1,b1,c1)
{
unsigned char a,b,c;
for(a=0;a<a1;a++)
for(b=0;b<b1;b++)
for(c=0;c<c1;c++);
}
//DB18B20初始化
void DS18B20_Reset()
{
bit presence=1;
while(presence)
{
delay_us(2);
DQ=0;
delay_us(480);
DQ=1; //DQ=1表示释放总线?
delay_us(50);
if(!DQ) presence=0;
delay_us(430);
}
}
//写DS18B20数据线从高到低写时序开始
void DS18B20_Write(unsigned char wDate)
{
unsigned int i;
for(i=0;i<8;i++)
{
DQ=0;
delay_us(1);
DQ=wDate&0x01; //将数据的最低位传到数据总线DQ?
delay_us(60);
DQ=1; //释放总线?
delay_us(1);
wDate=wDate>>1;
}
}
//DS1302 读字节函数
unsigned char DS18B20_Read()
{
unsigned char j,Temp=0;
for(j=0;j<8;j++)
{
Temp>>=1;
DQ=0;
delay_us(1);
DQ=1;
delay_us(6);
if(DQ) Temp|=0x80;
delay_us(60);
}
return (Temp);
}
//读温度函数
void Read_Temperature()
{
unsigned int Temp1=0,Temp2=0;
DS18B20_Reset(); //DS18B20 复位
DS18B20_Write(0xCC); //跳过 ROM
DS18B20_Write(0x44); //温度转换
DS18B20_Reset(); //DS18B20复位
DS18B20_Write(0xCC); //跳过 ROM
DS18B20_Write(0xbe); //跳过 RAM
Temp1=DS18B20_Read(); //读低八位
Temp2=DS18B20_Read(); //读高八位
DS18B20_Reset(); //DS18B20复位,表示读取结束
if(Temp2&0xf8)
{
Temp_Flag=1;
Temperature=((Temp2<<8)|Temp1);
Temperature= ((~Temperature)+1);
Temperature*= 0.0625;
}
else
{
Temp_Flag=0;
Temperature = (((Temp2<<8 ) | Temp1 ) * 0.0625);
}
}
//初始化串口1
void InitUSART( )
{
SCON=0x50;
TMOD=0X20;
TH1=0XF7;
TL1=0XF7;
TR1=1;
}
//串口1发送数据
void Tx_Byte(unsigned char T_Byte)
{
SBUF=T_Byte;
while(TI==0);
TI=0;
}
void main()
{
Read_Temperature();
InitUSART( );
while(1)
{
if(Temp_Flag==1)
Tx_Byte(‘-’
Tx_Byte(Temperature);
}
}
我改来改去一直显示我标红周围有错,错误提示如图
|
|