📄 ds18b20.lst
字号:
C51 COMPILER V8.02 DS18B20 04/24/2007 17:29:57 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE DS18B20
OBJECT MODULE PLACED IN ds18b20.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE ds18b20.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include "main.h"
2 //#include "reg52.h"
3
4 unsigned char Temperature_Lsm;
5 unsigned char Temperature_Msm;
6 sbit P1_0=P1^0;
7 float Temperature_Buffer; // 温度值的变量;
8 unsigned char Flag=0; // 结果为负和正的标志位。
9
10
11
12 void Delay (unsigned int count)
13 {
14 1 unsigned int i;
15 1 while (count)
16 1 {
17 2 i =200;
18 2 while (i>0)
19 2 i--;
20 2 count--;
21 2 }
22 1 }
23
24
25
26 float Data_Process(unsigned char H_Temperature,unsigned char L_Temperature)
27 {
28 1 unsigned char i;
29 1 unsigned char Temper;
30 1 float Buffer_Float=0.0;
31 1
32 1 Flag=H_Temperature&0x08; //若最高位为1则为负温
33 1 if(Flag)
34 1 {
35 2 H_Temperature=~H_Temperature+1; //如果为负温则取原码 /*采集的数据是用补码表示的*/
36 2 L_Temperature=~L_Temperature+1; //如果为负温则取原码 /*采集的数据是用补码表示的*/
37 2 }
38 1 else
39 1 {
40 2 H_Temperature=H_Temperature; //如果为正温则保持
41 2 L_Temperature=L_Temperature; //如果为正温则保持
42 2 }
43 1 Temper=L_Temperature;
44 1
45 1 for(i=0;i<4;i++)
46 1 {
47 2 if(Temper&0x01)
48 2 {
49 3 Buffer_Float=Buffer_Float+(1.0/(1<<(4-i))); //计算小数值
50 3 Temper>>=1;
51 3 }
52 2 else
53 2 Temper>>=1;
54 2
55 2 }
C51 COMPILER V8.02 DS18B20 04/24/2007 17:29:57 PAGE 2
56 1 L_Temperature>>=4; //高四位的值移道小数位去
57 1 H_Temperature=((H_Temperature<<4)&0x7f); //高字节的数据作移四位并把符号位清零
58 1 //以便与低字节的数据进行或操作
59 1 Buffer_Float=(H_Temperature|L_Temperature)+Buffer_Float; //最后的温度值
60 1
61 1 return (Buffer_Float);
62 1
63 1 }
64
65
66 void Temperature_Reset(void) // 发送复位和初始化
67 {
68 1 unsigned int i;
69 1 P1_0 = 0;
70 1 i = 103;
71 1 while (i>0)
72 1 i--; // 延时
73 1 P1_0 = 1;
74 1 i = 4;
75 1 while (i>0)
76 1 i--;
77 1 }
78
79 bit Temperature_Readbit(void) // 读取数据的一位
80 {
81 1 unsigned int i;
82 1 bit dat;
83 1 P1_0 = 0;
84 1 i++;
85 1 P1_0 = 1;
86 1 i++;
87 1 i++; //延时
88 1 dat = P1_0;
89 1 i = 8;
90 1 while (i>0)
91 1 i--; // 延时
92 1 return (dat);
93 1 }
94
95 unsigned char Temperature_Readchar(void) //读一个字节
96 {
97 1 unsigned char i,j,dat;
98 1 dat = 0;
99 1 for (i=1;i<=8;i++)
100 1 {
101 2 j =Temperature_Readbit();
102 2 dat = (j << 7) | (dat >> 1);
103 2 }
104 1 return (dat);
105 1 }
106
107 void Temperature_Write(unsigned char dat) //写一个字节
108 {
109 1 unsigned int i;
110 1 unsigned char j;
111 1 bit testb;
112 1 for (j=1;j<=8;j++)
113 1 {
114 2 testb = dat & 0x01;
115 2 dat = dat >> 1;
116 2 if (testb)
117 2 {
C51 COMPILER V8.02 DS18B20 04/24/2007 17:29:57 PAGE 3
118 3 P1_0 = 0; // 写0
119 3 i++;
120 3 i++;
121 3 P1_0 = 1;
122 3 i = 8;
123 3 while (i>0)
124 3 i--;
125 3 }
126 2 else
127 2 {
128 3 P1_0 = 0; // 写0
129 3 i = 8;
130 3 while (i>0)
131 3 i--;
132 3 P1_0 = 1;
133 3 i++;
134 3 i++;
135 3 }
136 2 }
137 1 }
138
139 void Temperature_Change(void) // ds1820 开始转换
140 {
141 1 Temperature_Reset(); // 复位
142 1 //tmpre (); // 等待存在脉冲
143 1 Delay (1); // 延时
144 1 Temperature_Write(0xcc); // 跳过序列号命令
145 1 Temperature_Write(0x44); // 发转换命令 44H,
146 1 }
147
148 void Read_Temperature(void) // 读取温度
149 {
150 1 Temperature_Reset(); // 复位
151 1 Delay (1); // 延时
152 1 Temperature_Write(0xcc); // 跳过序列号命令
153 1 Temperature_Write(0xbe); // 发送读取命令
154 1 Temperature_Lsm= Temperature_Readchar(); // 读取低位温度
155 1 Temperature_Msm= Temperature_Readchar(); //读取高位温度
156 1 Temperature_Buffer=Data_Process(Temperature_Msm,Temperature_Lsm); //进行整数和小数的处理
157 1 }
158
159
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 435 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 7 8
IDATA SIZE = ---- ----
BIT SIZE = ---- 2
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -