?? ds18b20.c
字號(hào):
//溫度測(cè)量實(shí)驗(yàn)
#include<reg51.h>
#include<intrins.h>
sbit data1=P1^0;
sbit clk=P1^1;
sbit DQ=P3^3;
//延時(shí)子程序,延時(shí)時(shí)間以12M晶振為準(zhǔn),延時(shí)時(shí)間為30us×time
void delay(unsigned char time)
{
unsigned char m,n;
for(n=0;n<time;n++)
for(m=0;m<2;m++){}
}
/***********************************************************
寫一位數(shù)據(jù)子程序
***********************************************************/
void write_bit(unsigned char bitval)
{
EA=0;
DQ=0; //拉低DQ以開始一個(gè)寫時(shí)序
if(bitval==1)
{
_nop_();
DQ=1; //如要寫1,則將總線置高
}
delay(5); //延時(shí)90us供DA18B20采樣
DQ=1; //釋放DQ總線
_nop_();
_nop_();
EA=0;
}
/***********************************************************
寫一字節(jié)數(shù)據(jù)子程序
***********************************************************/
void write_byte(unsigned char val)
{
unsigned char i;
unsigned char temp;
EA=0;
for(i=0;i<8;i++) //寫一字節(jié)數(shù)據(jù),一次寫一位
{
temp=val>>i; //移位操作,將本次要寫的位移到最低位
temp=temp&1;
write_bit(temp); //向總線寫該位
}
delay(7); //延時(shí)120us后
EA=1;
}
/***********************************************************
讀一位數(shù)據(jù)子程序
***********************************************************/
unsigned char read_bit()
{
unsigned char i,value_bit;
EA=0;
DQ=0; //拉低DQ,開始讀時(shí)序
_nop_();
_nop_();
DQ=1; //釋放總線
for(i=0;i<2;i++){} //8us delay
value_bit=DQ;
EA=1;
return(value_bit);
}
/***********************************************************
讀一字節(jié)數(shù)據(jù)子程序
***********************************************************/
unsigned char read_byte()
{
unsigned char i,value=0;
EA=0;
for(i=0;i<8;i++)
{
if(read_bit()) //讀一字節(jié)數(shù)據(jù),一個(gè)時(shí)序中讀一次,并作移位處理
value|=0x01<<i;
delay(4); //延時(shí)80us以完成此次都時(shí)序,之后再讀下一數(shù)據(jù)
}
EA=1;
return(value);
}
/***********************************************************
復(fù)位子程序
***********************************************************/
unsigned char reset()
{
unsigned char presence;
EA=0;
DQ=0; //拉低DQ總線開始復(fù)位
delay(30); //保持低電平480us
DQ=1; //釋放總線
delay(3); //等待芯片應(yīng)答信號(hào) 75us
presence=DQ; //獲取應(yīng)答信號(hào)
delay(28); //延時(shí)以完成整個(gè)時(shí)序
EA=1;
return(presence); //返回應(yīng)答信號(hào),有芯片應(yīng)答返回0,無芯片則返回1
}
//獲取溫度子程序
void get_temper()
{
unsigned char i,j;
do
{
i=reset(); //復(fù)位
}while(i!=0); //1為無反饋信號(hào)
i=0xcc; //發(fā)送設(shè)備定位命令
write_byte(i);
i=0x44; //發(fā)送開始轉(zhuǎn)換命令
write_byte(i);
delay(180); //延時(shí)
do
{
i=reset(); //復(fù)位
}while(i!=0); //0為無反饋信號(hào)C,再次復(fù)位
i=0xcc; //設(shè)備定位
write_byte(i);
i=0xbe; //讀出緩沖區(qū)內(nèi)容
write_byte(i);
j=read_byte(); //先讀出低位
i=read_byte(); //后讀出高位
i=(i<<4)&0x7f; //屏蔽最高位(一位符號(hào)位)
j=j>>4;
temper=i|j;
}
void disp_1(unsigned char disp_num1[6])
{
unsigned char n,a,k,m;
for(n=0;n<6;n++)
{
k=disp_num1[n];
for(a=0;a<8;a++)
{
clk=0;
m=(disp_num1[n]&1);
disp_num1[n]>>=1;
if(m==1)
data1=1;
else
data1=0;
_nop_();
clk=1;
_nop_();
}
}
}
//顯示子程序 功能:將占空比溫度轉(zhuǎn)化為單個(gè)字符,顯示占空比和測(cè)得到的溫度
void display()
{
unsigned char code number[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xe6};
unsigned char disp_num[6];
unsigned int k,k1;
k=high_time;
k=k%1000;
k1=k/100;
if(k1==0)
disp_num[0]=0;
else
disp_num[0]=0x60;
k=k%100;
disp_num[1]=number[k/10];
disp_num[2]=number[k%10];
disp_num[3]=0;
k=temper;
k=k%100;
disp_num[4]=number[k/10];
disp_num[5]=number[k%10];
disp_1(disp_num);
}
/***********************************************************
主程序
***********************************************************/
main()
{
EX1=0; //關(guān)外部中斷
high_time=50; //初始化為占空比50%,周期為200ms
low_time=50;
get_temper();
display();
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -