📄 ds18b20c2.c
字号:
/****************************************************************
/* 这是直接用C51高级语言编写的DS18B20转换程序-没有调用汇编语言,*/
/* 文件名DS18B20C.C */
/* 功能:本程序主要是读出单个DS18B20芯片转换后的温度值,范围 */
/* (-55℃~125℃)。单片机的P1.0接DS18B20 的BQ。 */
/* flag为温度值的正负号标志单元, flag 为"1"时表示温度值为负值*/
/* ,为"0"时表示温度值为正值。 变量cc中保存读出的温度值。 */
/* 本程序仅适合单个DS18B20 和51单片机的连接,晶振为12MHZ左右。*/
/****************************************************************/
#include <REG52.H>
#define uchar unsigned char
#define uint unsigned int
sbit DQ =P1^0; //定义端口
union{
uchar c[2];
uint x;
}temp;
uchar flag;
uint cc;
void delay(uint useconds) //延时程序
{
for(;useconds>0;useconds--);
}
uchar ow_reset(void) //复位
{
uchar presence;
DQ = 0; // DQ 低电平
delay(29); // 480us
DQ = 1; // DQ 高电平
delay(3); // 等待
presence = DQ; // presence 信号
delay(25);
return(presence); // 0允许, 1 = 禁止
}
uchar read_byte(void) //从1-wire 总线上读取一个字节
{
uchar i;
uchar value = 0;
for (i=8;i>0;i--)
{
value>>=1;
DQ = 0;
DQ = 1;
delay(1);
if(DQ)value|=0x80;
delay(6);
}
return(value);
}
void write_byte(uchar val) //向 1-wire 总线上写一个字节
{
uchar i;
for (i=8; i>0; i--) // 一次写一字节
{
DQ = 0;
DQ = val&0x01;
delay(5);
DQ = 1;
val=val/2;
}
delay(5);
}
uchar Read_Temperature(void) //读取温度
{
ow_reset();
write_byte(0xCC); // 跳过 ROM
write_byte(0xBE); // 读
temp.c[1]=read_byte();
temp.c[0]=read_byte();
ow_reset();
write_byte(0xCC);
write_byte(0x44); // 开始
return temp.x/2;
}
void main() //主程序
{
delay(10);
EA=0;
flag=0;
Read_Temperature(); //读取双字节温度
cc=temp.c[0]*256.0+temp.c[1];
if (temp.c[0]>0xf8) {flag=1;cc=~cc+1;}
cc=cc*0.0625; //计算出温度值
while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -