DS18B20程序
时间:10-02
整理:3721RD
点击:
#include"12.h"
#include<intrins.h>
#define uint8 unsigned char
#define uint16 unsigned int
sbit beep=P3^1;
sbit DQ=P3^4;
uint8 TPH,TPL;
uint8 code Segment[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void Delay10us(uint16 us);
void Ds18b20Rst();
void Ds18b20WriteByte(uint8 Data);
void Display(float temp);
void di(float temp);
uint8 Ds18b20ReadByte();
void main()
{
uint16 tempHex;
float temp;
while(1)
{
Ds18b20Rst();
Ds18b20WriteByte(0xcc);
Ds18b20WriteByte(0x44);
while(!DQ);
Ds18b20Rst();
Ds18b20WriteByte(0xcc);
Ds18b20WriteByte(0xbe);
TPL=Ds18b20ReadByte();
TPH=Ds18b20ReadByte();
tempHex=TPH;
tempHex=(tempHex<<8)+TPL;
temp=tempHex/16.0;
Display(temp);
di(temp);
}
}
void Delay10us(uint16 us)
{
us=us*1;
while(us--)
{
_nop_();
_nop_();
}
}
void Ds18b20Rst()
{
CY=1;
while(CY)
{
DQ=0;
Delay10us(48);
DQ=1;
Delay10us(6);
CY=DQ;
Delay10us(46);
DQ=1;
Delay10us(46);
}
}
void Ds18b20WriteByte(uint8 Data)
{
uint8 i;
for(i=0;i<8;i++)
{
DQ=0;
_nop_();
_nop_();
Data>>=1;
DQ=CY;
Delay10us(6);
DQ=1;
_nop_();
}
}
uint8 Ds18b20ReadByte()
{
uint8 i,Data;
for(i=0;i<8;i++)
{
Data>>=1;
DQ=0;
_nop_();
_nop_();
DQ=1;
_nop_();
_nop_();
if(DQ)
Data|=0x80;
Delay10us(6);
}
return Data;
}
/****************************************************************************************************
*****************************************************************************************************
下面是你需要改的,根据具体电路连接,选择的IO口不同
*****************************************************************************************************
***************************************************************************************************/
void Display(float temp)
{
P2=Segment[(uint16)temp/100];P1=0X7F;
Delay10us(1);
P2=Segment[(uint16)temp%100/10];P1=0XBF;
Delay10us(1);
P2=Segment[(uint16)temp%10]|0x80;P1=0XDF;
Delay10us(1);
P2=Segment[(uint16)(temp*10)%10];P1=0XEF;
Delay10us(1);
}
void di(float temp)
{
uint16 num;
if(temp>=30)
{
num++;
Delay10us(10);
if(num==50)
{
beep=~beep;
num=0;
}
}
if(temp<30)
{
num=0;
beep=1;
}
}
/****************************************************************************************************
*****************************************************************************************************
上面是你需要改的,根据具体电路连接,选择的IO口不同
*****************************************************************************************************
***************************************************************************************************/
#include<intrins.h>
#define uint8 unsigned char
#define uint16 unsigned int
sbit beep=P3^1;
sbit DQ=P3^4;
uint8 TPH,TPL;
uint8 code Segment[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void Delay10us(uint16 us);
void Ds18b20Rst();
void Ds18b20WriteByte(uint8 Data);
void Display(float temp);
void di(float temp);
uint8 Ds18b20ReadByte();
void main()
{
uint16 tempHex;
float temp;
while(1)
{
Ds18b20Rst();
Ds18b20WriteByte(0xcc);
Ds18b20WriteByte(0x44);
while(!DQ);
Ds18b20Rst();
Ds18b20WriteByte(0xcc);
Ds18b20WriteByte(0xbe);
TPL=Ds18b20ReadByte();
TPH=Ds18b20ReadByte();
tempHex=TPH;
tempHex=(tempHex<<8)+TPL;
temp=tempHex/16.0;
Display(temp);
di(temp);
}
}
void Delay10us(uint16 us)
{
us=us*1;
while(us--)
{
_nop_();
_nop_();
}
}
void Ds18b20Rst()
{
CY=1;
while(CY)
{
DQ=0;
Delay10us(48);
DQ=1;
Delay10us(6);
CY=DQ;
Delay10us(46);
DQ=1;
Delay10us(46);
}
}
void Ds18b20WriteByte(uint8 Data)
{
uint8 i;
for(i=0;i<8;i++)
{
DQ=0;
_nop_();
_nop_();
Data>>=1;
DQ=CY;
Delay10us(6);
DQ=1;
_nop_();
}
}
uint8 Ds18b20ReadByte()
{
uint8 i,Data;
for(i=0;i<8;i++)
{
Data>>=1;
DQ=0;
_nop_();
_nop_();
DQ=1;
_nop_();
_nop_();
if(DQ)
Data|=0x80;
Delay10us(6);
}
return Data;
}
/****************************************************************************************************
*****************************************************************************************************
下面是你需要改的,根据具体电路连接,选择的IO口不同
*****************************************************************************************************
***************************************************************************************************/
void Display(float temp)
{
P2=Segment[(uint16)temp/100];P1=0X7F;
Delay10us(1);
P2=Segment[(uint16)temp%100/10];P1=0XBF;
Delay10us(1);
P2=Segment[(uint16)temp%10]|0x80;P1=0XDF;
Delay10us(1);
P2=Segment[(uint16)(temp*10)%10];P1=0XEF;
Delay10us(1);
}
void di(float temp)
{
uint16 num;
if(temp>=30)
{
num++;
Delay10us(10);
if(num==50)
{
beep=~beep;
num=0;
}
}
if(temp<30)
{
num=0;
beep=1;
}
}
/****************************************************************************************************
*****************************************************************************************************
上面是你需要改的,根据具体电路连接,选择的IO口不同
*****************************************************************************************************
***************************************************************************************************/
做实物好使吗,有的仿真好使,实物不好使
谢谢小编分享,辛苦了。
多谢大神分享