|
/***************讀取DS18B20溫度,通共陰數(shù)碼管顯示**************/
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
code uchar seven_seg[] = {0xFA,0x22,0xB9,0xAB,0x63,0xCB,0xDB,0xA2,0xFB,0xEB};
code uchar seven_bit[] = {0xfe,0xfd,0xfb,0xf7,0xff};///{0x01,0x02,0x04,0x08,0x00};
uint timer;
uint temp;
sbit DQ = P2^0;
void delay(uint x)
{
while(x--);
}
void Init_DS18B20(void)
{
unsigned char x=0;
DQ = 1; //DQ復(fù)位
delay(8); //稍做延時(shí)
DQ = 0; //單片機(jī)將DQ拉低
delay(80); //精確延時(shí) 大于 480us
DQ = 1; //拉高總線
delay(14);
x=DQ; //稍做延時(shí)后 如果x=0則初始化成功 x=1則初始化失敗
delay(20);
}
/******************************從18B20中讀一個(gè)字節(jié)****************************/
uchar Read_OneChar(void)
{
uchar i = 0;
uchar dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 給脈沖信號(hào)
dat >>= 1;
DQ = 1; // 給脈沖信號(hào)
if(DQ)
dat |= 0x80;
delay(8);
}
return(dat);
}
/******************************向18B20中寫一個(gè)字節(jié)****************************/
void Write_OneChar(uchar dat)
{
uchar i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
delay(10);
DQ = 1;
dat >>= 1;
}
delay(8);
}
/***********************************讀取溫度**********************************/
uint Read_Temperature(void)
{
int t=0;
float tt=0;
uchar temp_L,temp_H; //溫度低8位,和高8位
EA=0; //關(guān)中斷,以免意外
Init_DS18B20();
Write_OneChar(0xcc); // 跳過讀序號(hào)列號(hào)的操作
Write_OneChar(0xbe); // 讀取溫度寄存器等(共可讀9個(gè)寄存器) 前兩個(gè)就是溫度
temp_L = Read_OneChar(); //讀取溫度值低位
temp_H = Read_OneChar(); //讀取溫度值高位
Init_DS18B20();
Write_OneChar(0xcc); //跳過讀序號(hào)列號(hào)的操作
Write_OneChar(0x44); //啟動(dòng)溫度轉(zhuǎn)換
t=temp_H;
t<<=8;
t=t|temp_L;
tt=t*0.0625;
t= tt*10+0.5;
EA=1; //開中斷
return(t);
}
/********延時(shí)函數(shù)************/
void delay_time(uint time)
{uint a,b;
for(a=0;a<time;a++)
for(b=0;b<2;b++);
}
/********初始化中斷函數(shù)************/
void timer0_init(void) //初始化
{
TMOD = 0x01;
TH0 = 0xec;
TL0 = 0x78;
TR0 = 1;
EA = 1;
ET0 = 1;
}
/************************************************************************/
void timer0_isr(void) interrupt 1 //中斷
{
TH0 = (65535-1000)/256;
TL0 = (65535-1000)%256;
timer++;
}
/**********顯示函數(shù)************/
void display_num(uint num)
{
P3=seven_bit[1];
P1=seven_seg[num/100%10];
delay_time(10);
P1=0;
P3=seven_bit[2];
P1=seven_seg[num/10%10]+0x80;
delay_time(10);
P1=0;
P3=seven_bit[3];
P1=seven_seg[num%10];
delay_time(10);
P1=0;
}
/***********主函數(shù)*************/
void main(void)
{
timer0_init();
while(1)
{
display_num(temp+1); // temp2
if(timer>1000)
{timer=0;temp=Read_Temperature();}
}
}
|
|