📄 ds18b20.lst
字号:
C51 COMPILER V6.12 DS18B20 10/31/2008 14:32:15 PAGE 1
C51 COMPILER V6.12, COMPILATION OF MODULE DS18B20
OBJECT MODULE PLACED IN .\ds18b20.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE .\ds18b20.c DEBUG OBJECTEXTEND
stmt level source
1 /*********************************************
2 **项目: DS18B20驱动程序(EE01学习板演示程序)
3
4 **作者:一线工人
5
6 **网站:电子工程师之家 www.eehome.cn
7
8 *********************************************/
9 #include <reg52.h>
10
11
12 #define uchar unsigned char
13 #define uint unsigned int
14 uint temp;
15 uchar tplsb,tpmsb; // 温度值低位、高位字节
16
17 sbit DQ = P1^3; // 数据通信线DQ
18 sbit dm=P1^4;
19 sbit wm=P1^5;
20 sbit led=P1^6;
21 unsigned char code table1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,
22 0x00,0x10,0x08,0x03,0x46,0x21,0x06,0x0E};
23
24 unsigned char code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
25 0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};//带小数的段码表
26
27 /********************** 延时t毫秒***************** */
28 void delay(uint t)
29 {
30 1 uint i;
31 1 while(t--)
32 1 {
33 2 for (i=0;i<125;i++) // 对于11.0592M时钟,约延时1ms
34 2 {}
35 2 }
36 1 }
37
38 /*******************产生复位脉冲初始化DS18B20**************/
39 void reset(void)
40 {
41 1 uint i;
42 1 DQ = 0;
43 1 i = 100; //拉低约900us
44 1 while (i>0) i--;
45 1
46 1 DQ = 1; // 产生上升沿
47 1 i = 4;
48 1 while (i>0) i--;
49 1 }
50
51 /********************* 等待应答脉冲*********************/
52 void wait(void)
53 {
54 1 uint i;
55 1 while(DQ);
C51 COMPILER V6.12 DS18B20 10/31/2008 14:32:15 PAGE 2
56 1 while(~DQ); // 检测到应答脉冲
57 1 i = 4;
58 1 while (i>0) i--;
59 1 }
60
61 /********************读取数据的一位,满足读时隙要求**************/
62 bit readbit(void)
63 {
64 1 uint i;
65 1 bit b;
66 1 DQ = 0;
67 1 i++;
68 1 DQ = 1;
69 1 i++;i++; // 延时15us以上,读时隙下降沿后15us,DS18B20输出数据才有效
70 1 b = DQ;
71 1 i = 8;
72 1 while(i>0) i--;
73 1 return (b);
74 1 }
75
76 /******************* 读取数据的一个字节**************************/
77 uchar readbyte(void)
78 {
79 1 uchar i,j,b;
80 1 b = 0;
81 1 for (i=1;i<=8;i++)
82 1 {
83 2 j = readbit();
84 2 b = (j<<7)|(b>>1);
85 2 }
86 1 return(b);
87 1 }
88
89 /******************写数据的一个字节,满足写1和写0的时隙要求************/
90 void writebyte(uchar b)
91 {
92 1 uint i;
93 1 uchar j;
94 1 bit btmp;
95 1 for(j=1;j<=8;j++)
96 1 {
97 2 btmp = b&0x01;
98 2 b = b>>1; // 取下一位(由低位向高位)
99 2 if (btmp)
100 2 {
101 3
102 3 DQ = 0;
103 3 i++;i++; // 延时,使得15us以内拉高
104 3 DQ = 1;
105 3 i = 8;
106 3 while(i>0) i--; // 整个写1时隙不低于60us
107 3 }
108 2 else
109 2 {
110 3
111 3 DQ = 0;
112 3 i = 8;
113 3 while(i>0) i--; // 保持低在60us到120us之间
114 3 DQ = 1;
115 3 i++;
116 3 i++;
117 3 }
C51 COMPILER V6.12 DS18B20 10/31/2008 14:32:15 PAGE 3
118 2 }
119 1 }
120
121 /************************* 启动温度转换********************/
122 void convert(void)
123 {
124 1 reset(); // 产生复位脉冲,初始化DS18B20
125 1 wait(); // 等待DS18B20给出应答脉冲
126 1 delay(1); // 延时
127 1 writebyte(0xcc); // skip rom 命令
128 1 writebyte(0x44); // convert T 命令
129 1 }
130
131 /********************* 读取温度值****************************/
132 uint readtemp(void)
133 { float tt;
134 1 reset(); // 产生复位脉冲,初始化DS18B20
135 1 wait(); // 等待DS18B20给出应答脉冲
136 1 delay(1); // 延时
137 1 writebyte(0xcc); // skip rom 命令
138 1 writebyte(0xbe); // read scratchpad 命令
139 1 tplsb = readbyte(); // 温度值低位字节(其中低4位为二进制的“小数”部分)
140 1 tpmsb = readbyte(); // 高位值高位字节(其中高5位为符号位)
141 1 temp=tpmsb;
142 1 temp<<=8;
143 1 temp=temp|tplsb;
144 1 tt=temp*0.0625;
145 1 temp=tt*10+0.5;
146 1 return temp;
147 1 }
148
149 /**********************显示程序****************************/
150 void display(uint temp)
151 {
152 1 uchar A1,A2,A2t,A3;
153 1 A1=temp/100;
154 1 A2t=temp%100;
155 1 A2=A2t/10;
156 1 A3=A2t%10;
157 1 P0=0X01; //选通第一位数码管
158 1 wm=1;
159 1 wm=0;
160 1 P0=table[A1];//显示百位
161 1 dm=1;
162 1 dm=0;
163 1 delay(1);
164 1 P0=0xff;//关位码
165 1 dm=1;
166 1 dm=0;
167 1
168 1
169 1 P0=0x02;//选通第二位数码管
170 1 wm=1;
171 1 wm=0;
172 1 P0=table1[A2];//显示十位
173 1 dm=1;
174 1 dm=0;
175 1 delay(1);
176 1 P0=0xff;//关位码
177 1 dm=1;
178 1 dm=0;
179 1
C51 COMPILER V6.12 DS18B20 10/31/2008 14:32:15 PAGE 4
180 1 P0=0x04;//选通第三位数码管
181 1 wm=1;
182 1 wm=0;
183 1 P0=table[A3];//显示个位
184 1 dm=1;
185 1 dm=0;
186 1 delay(1);
187 1 P0=0xff;//关位码
188 1 dm=1;
189 1 dm=0;
190 1 }
191 void main(void)
192 {
193 1 led=0;
194 1 delay(1); // 延时1ms
195 1 convert(); // 启动温度转换,需要750ms
196 1 delay(1000); // 延时1s
197 1 readtemp(); // 读取温度
198 1 while(1)
199 1 {
200 2
201 2 convert();
202 2
203 2 display(readtemp());
204 2
205 2 }
206 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 495 ----
CONSTANT SIZE = 32 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 4 5
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 + -