#include <AT89X52.H>
#include <intrins.h>
unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
char info=23;
sbit DQ =P3^7; //定义通信端口 ;
bit LOG =0; //定义正负标志位;
unsigned char a[5]={11,11,11,11,11};
unsigned char temp_H,temp_L;//温度的高八位和低八位
void delay02s(void)
{
unsigned char i,j;
for(i=20;i>0;i--)
for(j=20;j>0;j--)
//for(k=248;k>0;k--)
;
}
/*************************延时程序段************************/
void Delay(unsigned char times)
{
do{;}while(--times);
}
void dispchar(char infotext)
{
if (P3_0==0)
{
P3_1=0;
P2=dispcode[infotext/10];
delay02s();
P3_0=1;
} else
{
P3_0=0;
P2=dispcode[infotext%10];
delay02s();
P3_1=1;
}
delay02s();
}
/******************复位时序或者说是初始化时序***************/
unsigned char reset(void)
{
unsigned char Answerback;
DQ = 0; //拉低单总线
Delay(240); //至少480us
DQ = 1; //释放单总线
Delay(15); //等待响应
Answerback=DQ; //得到器件响应
Delay(240); // 延迟480us
return(Answerback); //返回器件响应,0=有器件, 1 = 无器件
}
/****************从 1-wire 总线上读取一个字节***************/
unsigned char read_byte(void)
{
unsigned char i;
for (i=8;i>0;i--)
{
DQ = 0; //拉低 DQ,在15US之内就必须释放单总线。
DQ = 1; //再拉高,即释放单总线。
CY=DQ; //读取数据;
CY=ACC&0x01;//将数据循环右移
Delay(30); //不管是读1还是读0都至少需要60us的时间
}
return(ACC);//返回读出的数据
}
/*****************向 1-WIRE 总线上写一个字节*****************/
void write_byte(char val)
{
unsigned char i;ACC=val;
for (i=8;i>0;i--)
{
DQ = 0; //拉低单总线
CY= ACC&0x01;//从低位向高位依取出ACC的值
DQ =CY; //把CY的值赋给单总线,?
Delay(30); //至少需要60us的时间
DQ = 1;
}
Delay(30); //到120US之间。
}
/***********读取温度并且进行换算以及正负判断等***************/
void Read_Temperature(void)
{
while(reset()); //初始化
write_byte(0xCC); //跳过序列号检测
write_byte(0xBE); //读内部单元
temp_L=read_byte(); //低八位
temp_H=read_byte(); //高八位
while(reset()); //初始化
write_byte(0xCC); //跳过 ROM
write_byte(0x44); //开始温度转换
if((temp_H&0xf8)!=0x00)//判断是否为负。
{
LOG=1; //为1表示为负数;
temp_H=~temp_H;
temp_L=~temp_L;
if(temp_L==255) //向高位进1;
{temp_H++;temp_L=0;}
else
{temp_L+=1;}
}
temp_H&=0x07;//由于最高可以测量125度所以只取temp_H的最高3位。
temp_H<<=4; //还原整数部分
temp_H+=temp_L>>4; //还原整数部分
temp_L=(temp_L&0x0f)*25/4;//小数部分0.06的整数倍
}
void main(void)
{
unsigned char result;
unsigned char x,n;
while(1)
{
Read_Temperature();
result=temp_H;
Delay(40000);
// for(n=2000;n>0;n--)
{
dispchar(result);
}
// dispchar(info);
// dispchar(info);
/*
while(result/10)//整数部分用数组A[0]~A[2]保存;
{
a[x]=result%10;
result/=10;x--;
}
a[x]=result;
*/
/*
Read_Temperature();
result=temp_H;
while(result/10)//整数部分用数组A[0]~A[2]保存;
{
a[x]=result%10;
result/=10;x--;
}
a[x]=result;
for(n=0;n<6;n++)//清除显示。以便重新装入显示代码
a[n]=11;
result=temp_H;
x=2;
while(result/10)//整数部分用数组A[0]~A[2]保存;
{
a[x]=result%10;
result/=10;x--;
}
if(LOG==1) //为温度负数LOG等于1
{
a[x-1]=10;//显示字符-表示为负;
LOG=0; //正负标志复位。
}
a[3]=temp_L/10;//小数部分用数组A[4]来储存;
a[4]=temp_L%10;//小数部分用数组A[5]来储存;
for(n=200;n>0;n--)
{Display();Display();
Display();Display();
} */
//dispchar(a[1]+a[0]*10);
}
}
/*
void t0(void) interrupt 1 using 0
{
TH0=(65536-4000)/256;
TL0=(65536-4000)%256;
P1=dispcode[dispbuf[dispcount]];
P2=dispbitcode[dispcount];
dispcount++;
if(dispcount==8)
{
dispcount=0;
}
}
*/
评论0