📄 18b20.c
字号:
/*
18B20通讯程序 温度
*/
#include <C8051F020.h>
sbit DQ = P3^2;
void delayus(uint x) // x us
{
uint a;
x *= 3;
TH0 = 0;
TL0 = 0;
TR0 = 1;
do a = TH0*256+TL0;
while( a<x );
TR0 =0;
}
bit reset(void) //初始化18B20
{
static bit presence; //定义一个应答信号
DQ=0;
delayus(500); //置总线为低电平并保持至少480us
DQ=1; //等电阻拉高总线并保持15-60us
delayus(50);
//P3MDOUT &= ~4;
presence=DQ; //接受应答信号
delayus(200); //延时60-240us
//P3MDOUT |= 4;
return(presence); //返回应答信号
}
//************** 从18B20中读一个字节**************//
uchar read_byte(void)
{
uchar idata i;
uchar idata value=0;
for (i=0;i<8;i++)
{
DQ=0;
DQ=1;
value>>=1;
delayus(1);
if(DQ) value|=0x80;
delayus(1);
}
return(value);
}
//*********************向18B20中 写一个字节**************//
void write_byte(uchar val)
{
uchar idata i;
for (i=0;i<8;i++)
{
DQ=0;
delayus(1);
DQ = val & 0x01;
delayus(3);
DQ=1;
val>>=1;
}
}
void startT(void)
{
TR2 = 0;
while (reset()) ; //复位等待从机应答
write_byte(0XCC); //忽略ROM匹配
write_byte(0X44); //发送温度转化命令
TR2 = 1;
}
float ReadTemperature(void)
{
uchar idata teml,temh;
int idata tem;
float idata ttt;
//delayus(25000); //延时100-300us
TR2 = 0;
while( reset()); //再次复位,等待从机应答
delayus(500);
write_byte(0XCC); //忽略ROM匹配
write_byte(0XBE); //发送读温度命令
teml = read_byte(); //读出温度低8
temh = read_byte(); //读出温度高8位
tem=temh;
tem<<=8;
tem|=teml;
ttt=(float)tem*0.0625;
DQ=1; //释放总线
TR2 = 1;
return (ttt) ;
}
/*
void Delay( uint ms ) // 6M clock
{
uint i; // millisecond counter
for (i = 0; i < ms; i++)
{
TR0 = 0; // STOP Timer0
TH0 = (-6000000/1000) >> 8; // set Timer0 to overflow in 1ms
TL0 = -6000000/1000;
TR0 = 1; // START Timer0
while (TF0 == 0); // wait for overflow
TF0 = 0; // clear overflow indicator
}
}
main()
{
extern void Init_Device(void);
Init_Device();
EA = 0;
for(;;)
{
startT();
Delay(4000);
ReadTemperature();
}
} */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -