📄 ds18b20.lst
字号:
C51 COMPILER V7.06 DS18B20 05/14/2009 00:04:42 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE DS18B20
OBJECT MODULE PLACED IN ds18b20.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE ds18b20.c COMPACT BROWSE DEBUG OBJECTEXTEND
stmt level source
1 #include <REG51.H>
2 #include "ds18b20.h"
3 #define uchar unsigned char
4 #define uint unsigned int
5 sbit DQ=P3^0;
6 uchar data tplsb,tpmsb;
7 /*延时tms*/
8 void delay(uint t)
9 {
10 1 uint i;
11 1 while(t--)
12 1 {
13 2 for (i=0;i<125;i++)
14 2 {;}
15 2 }
16 1 }
17 /* 产生复位脉冲初始化DS18B20 */
18 void TxReset(void)
19 {
20 1 uint i;
21 1 DQ=0;
22 1 /* 拉低约900us */
23 1 i=100;
24 1 while (i>0) i--;
25 1 DQ=1;
26 1 i=4;
27 1 while (i>0) i--;
28 1 }
29 /* 等待应答脉冲 */
30 void RxWait (void)
31 {
32 1 uint i;
33 1 while(DQ)
34 1 while(~DQ)
35 1 i=4;
36 1 while (i>0) i--;
37 1 }
38 /* 读取数据的一位,满足读时隙要求 */
39 bit RdBit(void)
40 {
41 1 uint i;
42 1 bit b;
43 1 DQ=0;
44 1 i++;
45 1 DQ=1;
46 1 i++;
47 1 i++;
48 1 b=DQ;
49 1 i=8;
50 1 while(i>0) i--;
51 1 return(b);
52 1 }
53 /* 读取数据的一个字节 */
54 uchar RdByte(void)
55 {
C51 COMPILER V7.06 DS18B20 05/14/2009 00:04:42 PAGE 2
56 1 uchar i,j,b;
57 1 b = 0;
58 1 for (i=1;i<=8;i++)
59 1 {
60 2 j = RdBit();
61 2 b = (j<<7)|(b>>1);
62 2 }
63 1 return(b);
64 1 }
65 /* 写数据的一个字节,满足写1和写0的时隙要求 */
66 void WrByte(uchar b)
67 {
68 1 uint i;
69 1 uchar j;
70 1 bit btmp;
71 1 for(j=1;j<=8;j++)
72 1 {
73 2 btmp = b&0x01;
74 2 b = b>>1;
75 2 if (btmp)
76 2 {
77 3 /* 写1 */
78 3 DQ = 0;
79 3 i++;i++; // 延时,使得15us以内拉高
80 3 DQ = 1;
81 3 i = 8;
82 3 while(i>0) i--; // 整个写1时隙不低于60us
83 3 }
84 2 else
85 2 {
86 3 /* 写0 */
87 3 DQ = 0;
88 3 i = 8;
89 3 while(i>0) i--; // 保持低在60us到120us之间
90 3 DQ = 1;
91 3 i++;
92 3 i++;
93 3 }
94 2 }
95 1 }
96
97 /* 启动温度转换 */
98 void convert(void)
99 {
100 1 TxReset(); // 产生复位脉冲,初始化DS18B20
101 1 RxWait(); // 等待DS18B20给出应答脉冲
102 1 delay(1); // 延时
103 1 WrByte(0xcc); // skip rom 命令
104 1 WrByte(0x44); // convert T 命令
105 1 }
106
107 /* 读取温度值 */
108 void RdTemp(void)
109 {
110 1 TxReset(); // 产生复位脉冲,初始化DS18B20
111 1 RxWait(); // 等待DS18B20给出应答脉冲
112 1 delay(1); // 延时
113 1 WrByte(0xcc); // skip rom 命令
114 1 WrByte(0xbe); // read scratchpad 命令
115 1 tplsb = RdByte(); // 温度值低位字节(其中低4位为二进制的“小数”部分)
116 1 tpmsb = RdByte(); // 高位值高位字节(其中高5位为符号位)
117 1
C51 COMPILER V7.06 DS18B20 05/14/2009 00:04:42 PAGE 3
118 1 }
119 void send (uchar *i)
120 {
121 1 uchar temG,temD;
122 1 temG=(tpmsb<<4)|(tplsb>>4);
123 1 *(i)=temG/100;
124 1 temG=temG%100;
125 1 *(i+1)=temG/10;
126 1 *(i+2)=temG%10;
127 1 temD=((tplsb&0x0f)*0.0625)*10; //1位小数部分
128 1 *(i+3)=temD;
129 1 }
130
131
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 399 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- 3
DATA SIZE = 2 ----
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 + -