?? cewen.c
字號:
#include<reg52.h>
#include<math.h>
unsigned char code SEG[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff};
unsigned int i=0,fuhao=11,baiwei=0,shiwei=0,gewei=0,xiaoshu=0;
sbit DQ=P3^5;//定義通信端口
//延時函數(shù)
void delay(unsigned int j)
{
while(j--);
}
//初始化函數(shù)
Init_DS18B20(void)
{
unsigned char x=0;
DQ=1;//DQ復(fù)位
delay(8);//稍作延時
DQ=0;//單片機將DQ拉低
delay(80);//精確延時 大于 480 us
DQ=1;
delay(14);
x=DQ;//稍作延時后 如果x=0則初始化成功 x=1則初始化失敗
delay(20);
//P1=0x00;
}
//讀一個字節(jié)
ReadOneChar(void)
{
unsigned char k=0;
unsigned char dat=0;
for(k=8;k>0;k--)
{
DQ=0;//給脈沖信號
dat>>=1;
DQ=1;//給脈沖信號
if(DQ)
dat|=0x80;
delay(4);
}
return(dat);
}
//寫一個字節(jié)
WriteOneChar(unsigned char dat)
{
unsigned char j=0;
for(j=8;j>0;j--)
{
DQ=0;
DQ=dat&0x01;
delay(5);
DQ=1;
dat>>=1;
}
//delay(4);
}
//讀取溫度
ReadTemperature(void)
{
unsigned char a=0;
unsigned char b=0;
unsigned int t=0;
float tt=0;
Init_DS18B20();
WriteOneChar(0xCC);//跳過讀序號列號的操作
WriteOneChar(0x44);//啟動溫度轉(zhuǎn)換
Init_DS18B20();
WriteOneChar(0xCC);//跳過度序號列號的操作
WriteOneChar(0xBE);//讀取溫度寄存器等(共可讀9個寄存器)前兩個就是溫度
a=ReadOneChar();
b=ReadOneChar();
t=b;
t<<=8;
t=t|a;
if(b&0xf8)
{
t=(~t)+1;
tt=0-t*0.0625;
}
else
tt=t*0.0625;
tt=tt*10+0.5;//放大10倍輸出并四舍五入- 此行沒用
return(tt);
}
void SHOWTEMP( int t)
{
if(t<0)
fuhao=10;
else fuhao=11;
t=abs(t);
shiwei=t/100;
gewei=(t-shiwei*100)/10;
xiaoshu=t-shiwei*100-gewei*10;
i++;
if(i>4) i=1;
if(i==1)
{ P0=0xfe; P2=SEG[fuhao]; }
if(i==2)
{
P0=0xfd; P2=SEG[shiwei]; }
if(i==3)
{ P0=0xfb; P2=SEG[gewei]-0x80;}
if(i==4)
{ P0=0xf7; P2=SEG[xiaoshu]; }
}
SHOW(void) interrupt 1
{
TH0=0xfc;
TL0=0x17;
TR0=1;
}
int main()
{
int temp=0;
TH0=0xfc;
TL0=0x17;
TR0=1; IE=0x82; TMOD=0x01;
while(1)
{
temp=ReadTemperature();//讀溫度
SHOWTEMP(temp);
}
return 0;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -