📄 wenkong_ds18b20.txt
字号:
#include <REGX52.H>
#include <stdio.h>
#include <math.h>
#define uchar unsigned char
#define uint unsigned int
uint TEMP; // 温度值的变量;
uchar flag1; // 结果为负和正的标志位。
void display(void);
uchar LEDData [] = { 0x28, 0x7E, 0xA2, 0x62, 0x74, 0x61, 0x21, 0x7A, 0x20, 0x60};
void delayms(short i);
void delay (unsigned int count)
{
unsigned int i;
while (count)
{
i =200;
while (i>0) i--;
count--;
}
}
void tmreset (void) // 发送复位和初始化
{
unsigned int i;
P3_5 = 0;
i = 103;
while (i>0) i--; // 延时
P3_5= 1;
i = 4;
while (i>0) i--;
}
bit tmpread (void) // 读取数据的一位
{
unsigned int i;
bit dat;
P3_5= 0; i++;
P3_5= 1; i++; i++; //延时
dat = P3_5;
i = 8; while (i>0) i--; // 延时
return (dat);
}
unsigned char tmpread2 (void) //读一个字节
{
unsigned char i,j,dat;
dat = 0;
for (i=1;i<=8;i++)
{
j = tmpread ();
dat = (j << 7) | (dat >> 1);
}
return (dat);
}
void tmpwrite (unsigned char dat) //写一个字节
{
unsigned int i;
unsigned char j;
bit testb;
for (j=1;j<=8;j++)
{
testb = dat & 0x01;
dat = dat >> 1;
if (testb)
{
P3_5 = 0; // 写0
i++; i++;
P3_5 = 1;
i = 8; while (i>0) i--;
}
else
{
P3_5 = 0; // 写0
i = 8; while (i>0) i--;
P3_5 = 1;
i++; i++;
}
}
}
void tmpchange(void) // ds1820 开始转换
{
tmreset (); // 复位
//tmpre (); // 等待存在脉冲
delay (1); // 延时
tmpwrite (0xcc); // 跳过序列号命令
tmpwrite (0x44); // 发转换命令 44H,
}
void tmp (void) // 读取温度
{
unsigned int a,b,d;
tmreset (); // 复位
delay (1); // 延时
tmpwrite (0xcc); // 跳过序列号命令
tmpwrite (0xbe); // 发送读取命令
a = tmpread2 (); // 读取低位温度
b = tmpread2 (); //读取高位温度
b=b<<8;
d=a+b;
if(0x80&b!=0)
{
flag1=1; //若b为1则为负温
TEMP=~d+1; //如果为负温则去除其补码
}
else
TEMP=d;
}
//rom() // 读取器件序列号子程序
//{
// tmreset (); //复位
// delay (1); //延时
// tmpwrite(0x33); //发送读序列号子程序
//}
void display(void)
{
unsigned int div;
unsigned char tm[11],i;
unsigned char shi,ge,_1,_2,_3,_4;
float m=0,n=0,s=0.0625;
div=0x01;
for (i=0;i<11;i++)
{
if((TEMP&div)!=0)
tm[i]=1;
else
tm[i]=0;
div =div << 1;
}
for (i=0;i<11;i++)
{
m=tm[i]*s;
s*=2;
n+=m;
}
shi=(int)(n/10);
ge=(int)n-shi*10;
_1=(int)((n-(int)n)*10);
_2=(int)(n*100)-shi*1000-ge*100-_1*10;
_3=(int)(n*1000)-shi*10000-ge*1000-_1*100-_2*10;
_4=(int)(n*10000)-shi*100000-ge*10000-_1*1000-_2*100-_3*10;
P2_1=0;
if(shi!=0)
P0=LEDData[shi];
else
P0=0xff;
delayms(15);
P2_1=1;
P2_2=0;
P0=LEDData[ge]&0xdf;
delayms(15);
P2_2=1;
P2_3=0;
P0=LEDData[_1];
delayms(15);
P2_3=1;
P2_4=0;
P0=LEDData[_2];
delayms(15);
P2_4=1;
P2_5=0;
P0=LEDData[_3];
delayms(15);
P2_5=1;
P2_6=0;
P0=LEDData[_4];
delayms(15);
P2_6=1;
}
void delayms(short i)
{
int j=0;
int k=0;
k=i*3;
while(j<k) j++;
}
main()
{
do{
tmpchange(); // 开始温度转换
// 读取延时
tmp(); //读取温度
display();
}while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -