📄 digthermo.lst
字号:
C51 COMPILER V8.02 DIGTHERMO 05/15/2008 21:15:01 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE DIGTHERMO
OBJECT MODULE PLACED IN DigThermo.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE DigThermo.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /*此程序实现了ds18b20温度传感器的单线数据采集,并且通过LED显示小数和整数部分*/
2 #include "DigThermo.h"
3
4 /* 延时t*11us */
5 void delay(uint t)
6 {
7 1 for(;t>0;t--);
8 1 }
9
10 /* 产生复位脉冲初始化DS18B20 */
11 void TxReset(void)
12 { char presence=1;
13 1 while(presence)
14 1 {
15 2 while(presence)
16 2 {
17 3 DQ=1;_nop_();_nop_();//从高拉倒低
18 3 DQ=0;
19 3 delay(50); //550 us
20 3 DQ=1;
21 3 delay(6); //66 us
22 3 presence=DQ; //presence=0 复位成功,继续下一步
23 3 }
24 2 delay(45); //延时500 us
25 2 presence=~DQ;
26 2 }
27 1 DQ=1; //拉高电平
28 1 }
29
30 /* 读取数据的一个字节 */
31 uchar RdByte(void)
32 {
33 1 uchar i;
34 1 uchar value=0;
35 1 for(i=8;i>0;i--)
36 1 {
37 2 DQ=1;_nop_();_nop_();
38 2 value>>=1;
39 2 DQ=0;_nop_();_nop_();_nop_();_nop_(); //4 us
40 2 DQ=1;_nop_();_nop_();_nop_();_nop_(); //4 us
41 2 if(DQ)value|=0x80;
42 2 delay(6); //66 us
43 2 }
44 1 DQ=1;
45 1 return(value);
46 1 }
47
48 /* 写数据的一个字节 */
49 void WrByte(uchar val)
50 {
51 1 uchar i;
52 1 for(i=8;i>0;i--)
53 1 {
54 2 DQ=1;_nop_();_nop_(); //从高拉倒低
55 2 DQ=0;_nop_();_nop_();_nop_();_nop_(); //5 us
C51 COMPILER V8.02 DIGTHERMO 05/15/2008 21:15:01 PAGE 2
56 2 DQ=val&0x01; //最低位移出
57 2 delay(6); //66 us
58 2 val=val/2; //右移1位
59 2 }
60 1 DQ=1;
61 1 delay(1);
62 1 }
63 /*功能匹配*/
64 bit match_rom(uchar *rom)
65 {
66 1 uchar i;
67 1 TxReset();
68 1 WrByte(0x55);
69 1 for(i=8;i>0;i--)
70 1 {
71 2 WrByte(*(rom+i-1));
72 2 }
73 1 return 1;
74 1 }
75
76 /* 读取温度值 */
77 void RdTemp(uchar *serial)
78 {
79 1 TxReset(); // 产生复位脉冲,初始化DS18B20
80 1 delay(200); // 延时
81 1 WrByte(0xcc); // skip rom 命令
82 1 WrByte(0x44); // read scratchpad 命令
83 1 delay(1); // 延时
84 1 match_rom(serial); //匹配
85 1 WrByte(0xbe); // convert T 命令
86 1 tplsb = RdByte(); // 温度值低位字节(其中低4位为二进制的“小数”部分)
87 1 tpmsb = RdByte(); // 高位值高位字节(其中高5位为符号位)
88 1 }
89
90 /*对采集到的数据进行处理*/
91 void DataChange()
92 {
93 1 uint tem;
94 1 uchar temp,flag;
95 1 uchar low,j;
96 1 if(tpmsb>7)
97 1 {
98 2 flag=1;
99 2 tem=tpmsb;
100 2 tem<<=8;
101 2 tem=tem|tplsb; // 两字节合成一个整型变量。
102 2 tem=(tem^0xffff);//异或
103 2 tem=tem+1; //取反加1
104 2 tplsb=tem&0xff;
105 2 tpmsb=tem>>8;
106 2 }
107 1 temp=tpmsb<<4&0x70;
108 1 temp=temp|(tplsb>>4);
109 1 display[6]=temp/100; // 取百位数据暂存
110 1 display[5]=temp%100/10; // 取十位数据暂存
111 1 display[4]=temp%100%10;; // 取个位数据暂存
112 1 low=tplsb&0x0f;
113 1 switch(low) //处理小数部分,对于12位的分辨率,以0.625和对应的数据相乘可以得出16种情况0000~1111
114 1 {
115 2
116 2 case 0:
117 2 display[3]=0;
C51 COMPILER V8.02 DIGTHERMO 05/15/2008 21:15:01 PAGE 3
118 2 break;
119 2 case 1:
120 2 display[3]=0;
121 2 display[2]=6;
122 2 display[1]=2;
123 2 display[0]=5;
124 2 break;
125 2 case 2:
126 2 display[3]=1;
127 2 display[2]=2;
128 2 display[1]=5;
129 2 break;
130 2 case 3:
131 2 display[3]=1;
132 2 display[2]=8;
133 2 display[1]=7;
134 2 display[0]=5;
135 2 break;
136 2 case 4:
137 2 display[3]=2;
138 2 display[2]=5;
139 2 break;
140 2 case 5:
141 2 display[3]=3;
142 2 display[2]=1;
143 2 display[1]=2;
144 2 display[0]=5;
145 2 break;
146 2 case 6:
147 2 display[3]=3;
148 2 display[2]=7;
149 2 display[1]=5;
150 2 break;
151 2 case 7:
152 2 display[3]=4;
153 2 display[2]=3;
154 2 display[1]=7;
155 2 display[0]=5;
156 2 break;
157 2 case 8:
158 2 display[3]=5;
159 2 break;
160 2 case 9:
161 2 display[3]=5;
162 2 display[2]=6;
163 2 display[1]=2;
164 2 display[0]=5;
165 2 break;
166 2 case 10:
167 2 display[3]=6;
168 2 display[2]=2;
169 2 display[1]=5;
170 2 break;
171 2 case 11:
172 2 display[3]=6;
173 2 display[2]=8;
174 2 display[1]=7;
175 2 display[0]=5;
176 2 break;
177 2 case 12:
178 2 display[3]=7;
179 2 display[2]=5;
C51 COMPILER V8.02 DIGTHERMO 05/15/2008 21:15:01 PAGE 4
180 2 break;
181 2 case 13:
182 2 display[3]=8;
183 2 display[2]=1;
184 2 display[1]=2;
185 2 display[0]=5;
186 2 break;
187 2 case 14:
188 2 display[3]=8;
189 2 display[2]=7;
190 2 display[1]=5;
191 2 break;
192 2 case 15:
193 2 display[3]=9;
194 2 display[2]=3;
195 2 display[1]=7;
196 2 display[0]=5;
197 2 break;
198 2 default:break;
199 2 }
200 1
201 1 if(flag) //把负号标志放在整数最高位不是0的前一位
202 1 {
203 2 if(display[6]==0&display[5]!=0) display[6]=16;
204 2 if(display[6]==0&display[5]==0&display[4]!=0) display[5]=16;
205 2 if(display[6]==0&display[5]==0&display[4]==0) display[5]=16;
206 2 flag=0;
207 2 }
208 1 for(j=6;j>3;j--)
209 1 {
210 2 if(display[j]!=0)
211 2 break;
212 2 if(j==4) break; //当第一个整数位为0时,此位的0显示;
213 2 display[j]=17; // 使为0的数据不显示
214 2 }
215 1
216 1 }
217 /*uchar * read_rom(void)
218 {
219 uchar rom[8],i;
220 TxReset();
221 WrByte(0x33);
222 for(i=7;i>=0;i--)
223 {
224 rom[i]=RdByte();
225 }
226 return &rom[0];
227 } */
228
229 /*定时中断,显示采集的温度*/
230 void t0(void) interrupt 1 using 0
231 {
232 1 uchar i,tr;
233 1 P2=0xff;
234 1 if(i==4)//使第四位带有小数点
235 1 tr=0x80;
236 1 else //其他位小数点不显示
237 1 tr=0x00;
238 1 P0=(tr|dispcode[display[i]]);
239 1 P2=dispbitcode[7-i];
240 1 i++;
241 1 if(i==8) i=0;
C51 COMPILER V8.02 DIGTHERMO 05/15/2008 21:15:01 PAGE 5
242 1 TH0=(65536-2200)/256;
243 1 TL0=(65536-2200)%256;
244 1
245 1 }
246
247 /*主函数*/
248 void main(void)
249 {
250 1 uchar i;
251 1 TMOD=0x01;
252 1 TH0=(65536-2200)/256;
253 1 TL0=(65536-2200)%256;
254 1 TR0=1;
255 1 ET0=1;
256 1 EA=1;
257 1 while(1)
258 1 {
259 2 delay(130);
260 2 RdTemp(get_serial+i*8); // 读取温度
261 2 display[7]=i+10; //显示当前传感器的编号
262 2 DataChange(); //数据处理
263 2 i++ ;
264 2 if(i==3) i=0;
265 2 }
266 1
267 1 }
268
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 768 ----
CONSTANT SIZE = 18 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 42 8
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -