📄 ds18b20.c
字号:
//适用于11.0592M的晶振,为其他的频率则需要修改延时时间
void tem_Delay(unsigned int tc) //显示延时程序
{
while( tc != 0 )
{
unsigned int i;
for(i=0; i<100; i++);
tc--;
}
}
void tem_dmsec (unsigned int count) //延时部分
{
unsigned char i;
while(count--)
{
for(i=0;i<115;i++);
}
}
void tmreset (void) //发送复位
{
unsigned char i;
tem_conDAT=0;
for(i=0;i<103;i++);
tem_conDAT = 1;
for(i=0;i<4;i++);
}
bit tmrbit (void) //读一位
{
unsigned int i;
bit dat;
tem_conDAT = 0;
i++;
tem_conDAT= 1;
i++; i++; //微量延时
dat =tem_conDAT;
for(i=0;i<8;i++);
return (dat);
}
unsigned char tmrbyte (void) //读一个字节
{
unsigned char i,j,dat;
dat = 0;
for (i=1;i<=8;i++)
{
j = tmrbit();
dat = (j << 7) | (dat >> 1);
}
return (dat);
}
void tmwbyte (unsigned char dat) //写一个字节
{
unsigned char j,i;
bit testb;
for (j=1;j<=8;j++)
{
testb = dat & 0x01;
dat = dat >> 1;
if (testb)
{
tem_conDAT = 0; //写0
i++; i++;
tem_conDAT = 1;
for(i=0;i<8;i++);
}
else
{
tem_conDAT = 0; //写0
for(i=0;i<8;i++);
tem_conDAT = 1;
i++; i++;
}
}
}
void tmstart (void) //发送ds1820 开始转换
{
tmreset(); //复位
tem_dmsec(1); //延时
tmwbyte(0xcc); //跳过序列号命令
tmwbyte(0x44); //发转换命令44H,
}
void tmrtemp (void) //读取温度
{
unsigned char a,b;
tmreset (); //复位
tem_dmsec (1); //延时
tmwbyte (0xcc); //跳过序列号命令
tmwbyte (0xbe); //发送读取命令
a = tmrbyte (); //读取低位温度
b = tmrbyte (); //读取高位温度
if(b>0x7f) //最高位为1时温度是负
{
a=~a; //补码转换,取反加一
b=~b+1;
temfg=0; //读取温度为负时temfg=0
}
temsdata = a/16+b*16; //整数部分 上电时精度缺省为12位,b中为整数高位,a中高四位为整数位
temsdata1=temsdata/10; //整数十位
temsdata2=temsdata%10; //整数个位
temxiaoshu1 = (a&0x0f)*10/16; //小数第一位,注小数部分的计算,a的低4位为小数位,最大为15,对应99,
temxiaoshu2 = (a&0x0f)*100/16%10; //小数第二位 这个过程有转换
temxiaoshu=temxiaoshu1*10+temxiaoshu2; //小数两位
}
void DS18B20(void)
{
tmstart();
temfg=1; //作为子函数被调用时,temfg需要初始化
tmrtemp(); //读取温度,执行完毕温度将存于TMP中 //
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -