51单片机+DS18b20+数码管显示

51单片机+DS18b20+数码管显示


  • Proteus仿真
    在这里插入图片描述

主程序代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
//#include <reg51.h>
#include <AT89X52.H>
#include "temp.h"
sbit DULA=P2^0;
sbit WELA=P2^1;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};//光阴数码管断码
uchar DisplayData[8];

void DigDisplay();

//温度各位提取
void datapros(int temp)
{
// float tp;
bit negative;//负数标志
int TempH,TempL;
if(temp&0x8000)
{
negative=1;
temp=~temp; //取反加1
temp +=1;
}
else negative=0;

TempH=temp>>4; //分解出整数
TempL=temp&0x0F; //分解出小数
TempL=TempL\*6/10; //保留一位小数
temp=(TempH|TempL)\*10;
if(negative==1)
DisplayData[0]=0x40;//显示负号
else if(TempH/100==0)//小于100
DisplayData[0]=0x00;
DisplayData[1]=table[temp/1000%10];//百位
DisplayData[2]=table[temp/100%10];//十位
DisplayData[3]=table[temp/10%10]|0x80;//个位
DisplayData[4]=table[temp%10];//十分位
}
//数码管显示
void DigDisplay()
{
static uchar i=0;
P0=0x00;
DULA=1;
DULA=0;
switch(i)
{
case 0: P0=0xfe; break;
case 1: P0=0Xfd; break;
case 2: P0=0Xfb; break;
case 3: P0=0Xf7; break;
case 4: P0=0Xef; break;
}
WELA=1;
WELA=0;
P0=DisplayData[i];
DULA=1;
DULA=0;
i++;
i%=5;
}

void main()
{
while(1)
{
datapros(Ds18b20ReadTemp());
DigDisplay();
}
}

  • temp.c文件代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include "temp.h"
#include <intrins.h>

void delay\_us(uchar us)//约2us延时函数
{
while(--us);
}
void delay(uchar z)//约1ms延时函数
{
while(z--)
{
delay\_us(245);
delay\_us(245);
}
}
//读一个字节
uchar read\_byte()
{
uchar i,dat;
for(i=0;i<8;i++)
{
DS=0;
dat>>=1;
DS=1;
if(DS)
dat|=0x80;
delay\_us(25);
}
return (dat);
}
//写一个字节
void write\_byte(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
DS=0;
DS=dat&0x01;
delay\_us(25);//延时
DS=1;//释放总线准备下一次数据的写入
dat>>=1;
}
}
//单总线初始化时序
bit ds\_init()
{
bit i;
DS=1;
delay\_us(5);
DS=0;
delay\_us(200);//拉低总线499.45us,总线上的温度传感器将会被全部复位
delay\_us(200);
DS=1;//释放总线
delay\_us(50);//延时37.95us,等待温度传感器发回存在信号
i=DS;
delay\_us(25);//延时141.95us,读取温度传感器存在的时间
return (i);
}
int Ds18b20ReadTemp()
{
uint H,i;
uchar L;
ds\_init();//初始化温度传感器
write\_byte(0xcc);//发送跳跃ROM指令
write\_byte(0x44);//发送温度转换指令
delay(5);
ds\_init();//初始化温度传感器
write\_byte(0xcc);//发送跳跃ROM指令
write\_byte(0xbe);//读取温度传感器暂存器的值
L=read\_byte();
H=read\_byte();
H<<=8;
i=L+H;
return(i);
}


  • temp.h头文件代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#ifndef \_temp\_H
#define \_temp\_H
#include <AT89X52.H>

#ifndef uchar
#define uchar unsigned char
#endif

#ifndef uint
#define uint unsigned int
#endif

sbit DS=P1^0;

int Ds18b20ReadTemp();


#endif

仿真资源和程序源码

1
2
3
链接:https://pan.baidu.com/s/10fFZUz5IF3EshJ5t2vkIaA 
提取码:8584