📄 温度计.c
字号:
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P3^0;
uchar flag1;
uchar tempL=0;
uchar tempH=0;
uint tt;
float temperature;
unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};
uchar code table1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
uchar code scan_con[4]={0x01,0x02,0x04,0x08};
uchar data Dis_play[4]={0X00,0x00,0x00,0x00};
void delay(uint i)
{
while(i--);
}
Init_DS18B20(void)
{
uchar x=0;
DQ = 1; //DQ复位
delay(8);
DQ = 0; //单片机将DQ拉低
delay(80); //精确延时 大于 480us
DQ = 1;
delay(14);
x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
delay(20);
}
// 读字节子函数
ReadOneChar(void)
{
uchar i = 0;
uchar dat = 0;
for (i=8;i>0;i--)
{
DQ = 0;
dat>>=1; // 数据右移一位
DQ = 1;
if(DQ) // DQ为1
dat|=0x80; // 读出数据
delay(4);
}
return(dat);
}
// 写字节子函数
WriteOneChar(unsigned char dat)
{
uchar i = 0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01; //写入一位数据
delay(5);
DQ = 1;
dat>>=1;
}
}
// 发送温度转换命令
ReadTemperature(void)
{
Init_DS18B20();
WriteOneChar(0xcc);
WriteOneChar(0x44); //启动温度转换
delay(125);
Init_DS18B20();
WriteOneChar(0xcc); //跳过读序列号的操作
WriteOneChar(0xbe); //读温度寄存器(头两个值分别为温度的低位和高位)
tempL=ReadOneChar();
tempH=ReadOneChar();
if(tempH>0xfd)
{
flag1=1;
temperature=(65536-((tempH*256)+tempL))*0.0625;
tt=temperature*10+0.5;
delay(200);
return(tt);
}
else
{
temperature=((tempH*256)+tempL)*0.0625;
tt=temperature*10+0.5;
delay(200);
return(tt);
}
}
void tem_deal(uint tem)
{
Dis_play[0]=0xff;
Dis_play[0]=tem/1000;
Dis_play[1]=tem/100%10;
Dis_play[2]=tem%100/10;
Dis_play[3]=tem%10;
if(!Dis_play[0])
{
Dis_play[0]=0x0a;
if(!Dis_play[1])
{
Dis_play[1]=0x0a;
}
}
if(flag1)
{
Dis_play[0]=0x0b;
}
}
void display()
{
char k;
for(k=0;k<4;k++)
{
if (k==2)
{
P2=scan_con[k];
P0=table1[Dis_play[k]];
}
else
{
P2=scan_con[k];
P0=table[Dis_play[k]];
}
delay(500);
}
}
void main()
{
do
{
flag1=0;
tem_deal(ReadTemperature());
display();
}
while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -