|
#include<stc12.h> //單片機(jī)型號(hào)stc125a60s2
#define uint unsigned int
#define uchar unsigned char
uchar code table[]={0xc0,0xcf,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x9c,0xc6};
uint shi,ge;
sbit DQ=P1^1; //DS18B20使能端
sbit D0=P2^7; //顯示溫度十位
sbit D1=P2^6; // 個(gè)位
sbit D2=P2^5; // 攝氏度的符號(hào)顯示
sbit D3=P2^4; // 攝氏度的符號(hào)顯示
void delay_18B20(unsigned int i)
{
while(i--);
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void Init_DS18B20(void) //初始化
{
unsigned char x=0;
DQ = 1; //DQ復(fù)位
delay_18B20(80); //稍做延時(shí)
DQ = 0; //單片機(jī)將DQ拉低
delay_18B20(800); //精確延時(shí) 大于 480us
DQ = 1; //拉高總線(xiàn)
delay_18B20(140);
x=DQ; delay_18B20(200);
}
unsigned char ReadOneChar(void) //寫(xiě)數(shù)據(jù)
{
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_18B20(40); //40
}
return(dat);
}
void WriteOneChar(uchar dat) //讀數(shù)據(jù)
{
unsigned char i=0;
for (i=8;i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
delay_18B20(50); //50
DQ = 1;
dat>>=1;
}
}
unsigned int ReadTemp(void) //返回溫度數(shù)據(jù)用于數(shù)碼管顯示
{
unsigned char a=0;
unsigned char b=0;
unsigned int temp_value=0;
Init_DS18B20();
WriteOneChar(0xCC);
WriteOneChar(0x44);
delay_18B20(1000);
Init_DS18B20();
WriteOneChar(0xCC);
WriteOneChar(0xBE);
delay_18B20(1000);
a=ReadOneChar(); //讀取溫度值低位
b=ReadOneChar(); //讀取溫度值高位
temp_value = b<<8; //兩個(gè)字節(jié)合為一個(gè)字節(jié)
temp_value |= a;
temp_value=temp_value*0.0625;//溫度在寄存器中為12位,0.0625為分辨率
return temp_value;
}
void display()//用數(shù)碼管顯示
{ uint t;
t=ReadTemp();
shi=t/10;
ge=t%10;
P0=table[shi];
D0=0;
delay(10);
D0=1;
P0=table[ge];
D1=0;
delay(10);
D1=1;
P0=table[10];
D2=0;
delay(10);
D2=1;
P0=table[11];
D3=0;
delay(10);
D3=1;
}
void main()
{
while(1)
display();
}
|
評(píng)分
-
查看全部評(píng)分
|