📄 gsm-
字号:
C51 COMPILER V7.06 DS18B20 06/13/2010 15:40:38 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE DS18B20
OBJECT MODULE PLACED IN ds18b20.OBJ
COMPILER INVOKED BY: E:\WorkSpace\Keil\C51\BIN\C51.EXE ds18b20.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 /*DS18B20命令:
2 READ ROM 33H 读rom
3 MATCH ROM 55H 匹配rom
4 SKIP ROM CCH 跳过rom
5 SEARCH ROM F0H 搜索rom
6 ALARM ROM ECH 警告rom
7 WRITE SCRATCHPAD 4EH 写暂存器
8 READ SCRATCHPAD BEH 读暂存器
9 COPY SCRATCHPAD 48H 复制暂存器
10 COVERT T 44H 温度转换开始
11 RECALL E2 B8H 重调用E2存储器
12 READ POWER SUPPLY B4H 读供电方式
13 */
14
15 #ifndef DS18B20_H
16 #define DS18B20_H
17 #include "common.h"
18
19 sbit DS18B20=P2^0; //自已定义IO口
20
21 unsigned char L_18B20,H_18B20; //分别存放低八位 高八位的数据;
22 unsigned char fg=0,zhengshu,xiaoshu1,xiaoshu2; //fg为负数标志位,zhengshu是温度的整数部分,xiaoshu1是十分位,
-xiaoshu2是百分位
23
24
25 void Reset_18B20(void); //ds18b20复位程序
26 void Wait_18B20(); //等待程序,等待ds18b20应答
27 bit Readbit_18B20(void); //读取一个bit的数据
28 unsigned char Readbyte_18B20(void); //读取一个字节的数据
29 void Writebyte_18B20(unsigned char b); //写一个字节(控制字)
30 void Convert(void); //开始转换
31 void Read_18B20(void); //读取ds18b20
32
33
34 void Reset_18B20(void)//ds18b20复位程序
35 {
36 1 unsigned char i;
37 1 DS18B20=0;
38 1 i=110;
39 1 while(i>0)i--;
40 1 DS18B20=1;
41 1 i=6;
42 1 while(i>0)i--;
43 1 }
44
45 void Wait_18B20()//等待程序,等待ds18b20应答
46 {
47 1 unsigned char i=255;
48 1 while(DS18B20)
49 1 {
50 2 i--;
51 2 if(i==0) return; //超时
52 2 }
53 1 while(~DS18B20)
54 1 {
C51 COMPILER V7.06 DS18B20 06/13/2010 15:40:38 PAGE 2
55 2 i--;
56 2 if(i==0) return;//超时
57 2
58 2 }
59 1 i=6;
60 1 while(i>0)i--;
61 1 }
62
63 bit Readbit_18B20(void) //读取一个bit的数据
64 {
65 1 unsigned char i;
66 1 bit b;
67 1 DS18B20=0;
68 1 i++;i++;
69 1 DS18B20=1;
70 1 i++;i++;i++;i++;i++;
71 1 b=DS18B20;
72 1 i=13;
73 1 while(i>0)i--;
74 1 return b;
75 1 }
76
77 unsigned char Readbyte_18B20(void) //读取一个字节的数据
78 {
79 1 unsigned char i,j,b;
80 1 b=0;
81 1 for(i=1;i<=8;i++)
82 1 {
83 2 j=Readbit_18B20();
84 2 b=(j<<7)|(b>>1); //又玩野
85 2 }
86 1 return b;
87 1 }
88
89 void Writebyte_18B20(unsigned char b)//写一个字节(控制字)
90 {
91 1 unsigned char j,i;
92 1 bit temp;
93 1 for(j=1;j<=8;j++)
94 1 {
95 2 temp=b&0x01;
96 2 b=b>>1;
97 2 if(temp) // 写“1”
98 2 {
99 3 DS18B20=0;
100 3 i++;i++;i++;i++;i++;
101 3 DS18B20=1;
102 3 i=13;
103 3 while(i>0)i--;
104 3 }
105 2 else //写“0”
106 2 {
107 3 DS18B20=0;
108 3 i=13;
109 3 while(i>0)i--;
110 3 DS18B20=1;
111 3 i++;i++;i++;i++;i++;
112 3 }
113 2 }
114 1 }
115
116 void Convert(void) //开始转换
C51 COMPILER V7.06 DS18B20 06/13/2010 15:40:38 PAGE 3
117 {
118 1 Reset_18B20();
119 1 Wait_18B20(); //等待应答脉冲
120 1 Writebyte_18B20(0xcc); //跳过序列号脉冲
121 1 Writebyte_18B20(0x44); //转换命令
122 1 }
123
124
125 void Read_18B20(void) //读取ds18b20
126 {
127 1 Convert();
128 1 Reset_18B20();
129 1 Wait_18B20();
130 1 Writebyte_18B20(0xcc); //跳过ROM
131 1 Writebyte_18B20(0xbe); //发送读取命令
132 1 L_18B20=Readbyte_18B20(); //读取低八位数据
133 1 H_18B20=Readbyte_18B20(); //读取高八位数据
134 1 if(H_18B20>0x7f) //最高位为1时温度是负
135 1 {
136 2 L_18B20=~L_18B20; //补码转换,取反加一
137 2 H_18B20=~H_18B20+1;
138 2 fg=1; //读取温度为负时fg=1
139 2 }
140 1 zhengshu=L_18B20/16+H_18B20*16; //整数部分
141 1 xiaoshu1=(L_18B20&0x0f)*10/16; //小数第一位
142 1 xiaoshu2=(L_18B20&0x0f)*100/16%10;//小数第二位
143 1
144 1 }
145
146 #endif
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 231 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 6 ----
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 + -