📄 temper.lst
字号:
C51 COMPILER V8.02 TEMPER 08/21/2007 01:09:34 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE TEMPER
OBJECT MODULE PLACED IN temper.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE temper.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <AT89X52.H>
2 #include <INTRINS.H>
3
4 unsigned char code displaybit[]={0xfe,0xfd,0xfb,0xf7,
5 0xef,0xdf,0xbf,0x7f};
6 unsigned char code displaycode[]={0x3f,0x06,0x5b,0x4f,
7 0x66,0x6d,0x7d,0x07,
8 0x7f,0x6f,0x77,0x7c,
9 0x39,0x5e,0x79,0x71,0x00};
10
11 unsigned char code dotcode[32]={0,3,6,9,12,16,19,22,
12 25,28,31,34,38,41,44,48,
13 50,53,56,59,63,66,69,72,
14 75,78,81,84,88,91,94,97};
15
16
17 sbit SDA=P1^6;
18 sbit SCL=P1^7;
19
20 unsigned char displaybuffer[8]={0,1,2,3,4,5,6,7};
21 unsigned char eepromdata[8];
22 unsigned char temperdata[2];
23
24 unsigned char timecount;
25 unsigned char displaycount;
26
27 bit secondflag=0;
28 unsigned char secondcount=0;
29 unsigned char retn;
30 unsigned int result;
31 unsigned char x;
32 unsigned int k;
33 unsigned int ks;
34
35
36
37 void delay(void);
38 void delay10ms(void);
39 void i_start(void);
40 void i_stop(void);
41 void i_init(void);
42 void i_ack(void);
43 bit i_clock(void);
44 bit i_send(unsigned char i_data);
45 unsigned char i_receive(void);
46
47 bit start_temperature_T(void);
48 bit read_temperature_T(unsigned char *p);
49
50 void delay(void)
51 {
52 1 _nop_();
53 1 _nop_();
54 1 _nop_();
55 1 _nop_();
C51 COMPILER V8.02 TEMPER 08/21/2007 01:09:34 PAGE 2
56 1 _nop_();
57 1 _nop_();
58 1 }
59
60 void delay10ms(void)
61 {
62 1 unsigned int i;
63 1 for(i=0;i<1000;i++)
64 1 {
65 2 delay();
66 2 }
67 1
68 1 }
69
70 void i_start(void)
71 {
72 1 SCL=1;
73 1 delay();
74 1 SDA=0;
75 1 delay();
76 1 SCL=0;
77 1 delay();
78 1 }
79
80 void i_stop(void)
81 {
82 1 SDA=0;
83 1 delay();
84 1 SCL=1;
85 1 delay();
86 1 SDA=1;
87 1 delay();
88 1 SCL=0;
89 1 delay();
90 1 }
91
92 void i_init(void)
93 {
94 1 SCL=0;
95 1 i_stop();
96 1 }
97
98 void i_ack(void)
99 {
100 1 SDA=0;
101 1 i_clock();
102 1 SDA=1;
103 1 }
104
105 bit i_clock(void)
106 {
107 1 bit sample;
108 1
109 1 SCL=1;
110 1 delay();
111 1 sample=SDA;
112 1 _nop_();
113 1 _nop_();
114 1 SCL=0;
115 1 delay();
116 1 return(sample);
117 1 }
C51 COMPILER V8.02 TEMPER 08/21/2007 01:09:34 PAGE 3
118
119
120 bit i_send(unsigned char i_data)
121 {
122 1 unsigned char i;
123 1
124 1 for(i=0;i<8;i++)
125 1 {
126 2 SDA=(bit)(i_data & 0x80);
127 2 i_data=i_data<<1;
128 2 i_clock();
129 2 }
130 1 SDA=1;
131 1 return(~i_clock());
132 1 }
133
134 unsigned char i_receive(void)
135 {
136 1 unsigned char i_data=0;
137 1 unsigned char i;
138 1
139 1 for(i=0;i<8;i++)
140 1 {
141 2 i_data*=2;
142 2 if(i_clock()) i_data++;
143 2 }
144 1 return(i_data);
145 1 }
146
147 bit start_temperature_T(void)
148 {
149 1 i_start();
150 1 if(i_send(0x90))
151 1 {
152 2 if(i_send(0xee))
153 2 {
154 3 i_stop();
155 3 delay();
156 3 return(1);
157 3 }
158 2 else
159 2 {
160 3 i_stop();
161 3 delay();
162 3 return(0);
163 3 }
164 2 }
165 1 else
166 1 {
167 2 i_stop();
168 2 delay();
169 2 return(0);
170 2 }
171 1 }
172
173 bit read_temperature_T(unsigned char *p)
174 {
175 1 i_start();
176 1 if(i_send(0x90))
177 1 {
178 2 if(i_send(0xaa))
179 2 {
C51 COMPILER V8.02 TEMPER 08/21/2007 01:09:34 PAGE 4
180 3 i_start();
181 3 if(i_send(0x91))
182 3 {
183 4 *(p+1)=i_receive();
184 4 i_ack();
185 4 *p=i_receive();
186 4 i_stop();
187 4 delay();
188 4 return(1);
189 4 }
190 3 else
191 3 {
192 4 i_stop();
193 4 delay();
194 4 return(0);
195 4 }
196 3 }
197 2 else
198 2 {
199 3 i_stop();
200 3 delay();
201 3 return(0);
202 3 }
203 2 }
204 1 else
205 1 {
206 2 i_stop();
207 2 delay();
208 2 return(0);
209 2 }
210 1 }
211
212
213 void main(void)
214 {
215 1 P1=0xff;
216 1 timecount=0;
217 1 displaycount=0;
218 1
219 1 TMOD=0x21;
220 1 TH1=0x06;
221 1 TL1=0x06;
222 1 TR1=1;
223 1 ET1=1;
224 1 ET0=1;
225 1 EA=1;
226 1
227 1
228 1 if(start_temperature_T()) //向DS1624发送启动A/D温度转换命令,成功则启动T0定时1s。
229 1 {
230 2 secondflag=0;
231 2 secondcount=0;
232 2 TH0=55536/256;
233 2 TL0=55536%256;
234 2 TR0=1;
235 2 }
236 1
237 1 while(1)
238 1 {
239 2 if(secondflag==1)
240 2 {
241 3 secondflag=0;
C51 COMPILER V8.02 TEMPER 08/21/2007 01:09:34 PAGE 5
242 3 TR0=0;
243 3 if(read_temperature_T(temperdata)) //T0定时1s时间到,读取DS1624的温度值
244 3 {
245 4 for(x=0;x<8;x++)
246 4 {
247 5 displaybuffer[x]=16;
248 5 }
249 4 x=2;
250 4 result=temperdata[1]; //将读取的温度值进行数据处理,并送到显示缓冲区
251 4 while(result/10)
252 4 {
253 5 displaybuffer[x]=result%10;
254 5 result=result/10;
255 5 x++;
256 5 }
257 4 displaybuffer[x]=result;
258 4 result=temperdata[0];
259 4 result=result>>3;
260 4 displaybuffer[0]=(dotcode[result])%10;
261 4 displaybuffer[1]=(dotcode[result])/10;
262 4 if(start_temperature_T()) //温度值数据处理完毕,重新启动DS1624开始温度转换
263 4 {
264 5 secondflag=0;
265 5 secondcount=0;
266 5 TH0=55536/256;
267 5 TL0=55536%256;
268 5 TR0=1;
269 5 }
270 4 }
271 3 }
272 2 }
273 1 }
274
275
276 void t0(void) interrupt 1 using 0 //T0用于定时1s时间到
277 {
278 1 secondcount++;
279 1 if(secondcount==100)
280 1 {
281 2 secondcount=0;
282 2 secondflag=1;
283 2 }
284 1 TH0=55536/256;
285 1 TL0=55536%256;
286 1 }
287
288
289 void t1(void) interrupt 3 using 0 //T1定时1ms用数码管的动态刷新
290 {
291 1 timecount++;
292 1 if(timecount==4) //T1定时1ms到
293 1 {
294 2 timecount=0;
295 2 P2=0xff;
296 2 if (displaycount==5)
297 2 {
298 3 P0=(displaycode[displaybuffer[7-displaycount]] | 0x80); //在该位同时还要显示小数点
299 3 }
300 2 else
301 2 {
302 3 P0=displaycode[displaybuffer[7-displaycount]];
303 3 }
C51 COMPILER V8.02 TEMPER 08/21/2007 01:09:34 PAGE 6
304 2 P2=displaybit[displaycount];
305 2 displaycount++;
306 2 if(displaycount==8)
307 2 {
308 3 displaycount=0;
309 3 }
310 2 }
311 1 }
312
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 567 ----
CONSTANT SIZE = 57 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 29 3
IDATA SIZE = ---- ----
BIT SIZE = 1 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -