|
#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);
}
}
我改來改去一直顯示我標紅周圍有錯,錯誤提示如圖
|
|