-
Notifications
You must be signed in to change notification settings - Fork 2
/
TemMeasure.c
99 lines (97 loc) · 3.51 KB
/
TemMeasure.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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
/***************************************************************************************************
工程名称: 18b20_1602
功能描述: 18B20传感器测温获取温度值储存在数组中。
硬件连接: 用1位杜邦线将J11_7与J17_1820连接,将1602液晶接口对应插接到P4接口。
维护记录: 2011-8-22
***************************************************************************************************/
#include"END.h"
//#include"intrins.h" //_nop_();延时函数用
sbit DQ=P2^7; //温度控制口
//**************************************************************************************************
//传感器初始化
//**************************************************************************************************
init_18b20()
{
uchar flag;
DQ=1;
delay(10); //延时
DQ=0;
delay(2000); //*延时,要求精度,要求大于480us*
DQ=1;
delay(200); //*延时,要求精度,要求大于15us*
flag=DQ; //DQ管脚送出60-240us的0脉冲,以示初始化成功
delay(10); //延时
}
//**************************************************************************************************
//写一个字节函数
//**************************************************************************************************
write_byte(uchar t)
{
uchar i;
for(i=0;i<8;i++) //循环8次写入1字节
{
DQ=0; //数据线置低
delay(20); //延时
DQ=t&0x01; //发送1位数据,最低位开始
delay(150); //*延时,要求精度*
DQ=1; //数据线置高
t=t>>1; //右移1位
}
}
//**************************************************************************************************
//读一个字节函数
//**************************************************************************************************
uchar read_byte()
{
uchar i,value=0;;
for(i=0;i<8;i++) //循环8次读取1字节
{
value=value>>1; //右移1位
DQ=0; //数据线置低
delay(10); //延时
DQ=1; //数据线置高
delay(10); //延时
if(DQ==1)value=value|0x80;//判断接收的1位数据是否为1
delay(50); //*延时,要求精度*
}
return(value);
}
//**************************************************************************************************
//数据处理子函数
//**************************************************************************************************
chuli(uint temperature)
{
float t;
if(temperature&0x8000) //判断是否为负数
{
temperature=~temperature+1;//取反加1
dis2[9]=0xb0; //显示负号
}
else
{
dis2[9]=0x2b; //显示正号
}
t=temperature*0.0625+0.05; //计算出温度值,百分位四舍五入
temperature=t*10; //本实验显示到小数点后1位,所以乘10,以便分离得到十分位
dis2[13]=temperature%10+0x30; //除10取余得温度十分位,1602只识别ASCII码,+0x30目的就是把16进制转ASCII
dis2[10]=temperature/100+0x30; //除100取整得温度十位
dis2[11]=temperature%100/10+0x30;//除100取余得十位和个位,然后除10取整得温度个位
}
//**************************************************************************************************
//温度采集函数
//**************************************************************************************************
uint get_temp()
{
uint dat;
uchar wenl,wenh;
init_18b20(); //复位
write_byte(0xcc); //不进行编号匹配
write_byte(0x44); //进行温度转换
init_18b20(); //复位
write_byte(0xcc); //不进行编号匹配
write_byte(0xbe); //发读命令
wenl=read_byte(); //温度低八位
wenh=read_byte(); //温度高八位
dat=(wenh<<8)+wenl; //数据高低8位合并
return(dat); //返回测量结果
}