📄 adc_temp.lst
字号:
209 //
210 // Configure the UART0 using Timer1, for <BAUDRATE> and 8-N-1.
211 //
212 void UART0_Init (void)
213 {
214 1 SCON0 = 0x10; // SCON0: 8-bit variable bit rate
215 1 // level of STOP bit is ignored
216 1 // RX enabled
217 1 // ninth bits are zeros
218 1 // clear RI0 and TI0 bits
219 1 if (SYSCLK/BAUDRATE/2/256 < 1) {
220 2 TH1 = -(SYSCLK/BAUDRATE/2);
221 2 CKCON &= ~0x0B; // T1M = 1; SCA1:0 = xx
222 2 CKCON |= 0x08;
223 2 } else if (SYSCLK/BAUDRATE/2/256 < 4) {
224 2 TH1 = -(SYSCLK/BAUDRATE/2/4);
225 2 CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 01
226 2 CKCON |= 0x09;
227 2 } else if (SYSCLK/BAUDRATE/2/256 < 12) {
228 2 TH1 = -(SYSCLK/BAUDRATE/2/12);
229 2 CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 00
230 2 } else {
231 2 TH1 = -(SYSCLK/BAUDRATE/2/48);
232 2 CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 10
233 2 CKCON |= 0x02;
234 2 }
235 1
236 1 TL1 = TH1; // init Timer1
237 1 TMOD &= ~0xf0; // TMOD: timer 1 in 8-bit autoreload
238 1 TMOD |= 0x20;
239 1 TR1 = 1; // START Timer1
C51 COMPILER V7.50 ADC_TEMP 10/19/2006 16:46:02 PAGE 5
240 1 TI0 = 1; // Indicate TX0 ready
241 1 }
242
243 //-----------------------------------------------------------------------------
244 // Timer2_Init SYSCLK no Interrupt
245 //-----------------------------------------------------------------------------
246 //
247 // Configure Timer2 to auto-reload at interval specified by <counts> (no
248 // interrupt generated) using SYSCLK as its time base.
249 //
250 void Timer2_Init (int counts)
251 {
252 1 TMR2CN = 0x00; // STOP Timer2; Clear TF2H and TF2L;
253 1 // disable low-byte interrupt; disable
254 1 // split mode; select internal timebase
255 1 CKCON |= 0x10; // Timer2 uses SYSCLK as its timebase
256 1
257 1 TMR2RL = -counts; // Init reload values
258 1 TMR2 = TMR2RL; // Init Timer2 with reload value
259 1 ET2 = 0; // disable Timer2 interrupts
260 1 TR2 = 1; // start Timer2
261 1 }
262
263 //-----------------------------------------------------------------------------
264 // Support Subroutines
265 //-----------------------------------------------------------------------------
266
267 //-----------------------------------------------------------------------------
268 // wait_soak_time
269 //-----------------------------------------------------------------------------
270 //
271 // This routine waits for the number of seconds indicated in the constant
272 // <SOAK_TIME>.
273 //
274 void wait_soak_time (unsigned char soak_time)
275 {
276 1 unsigned char i;
277 1
278 1 for( i = soak_time; i != 0; i--) {
279 2 wait_one_second();
280 2 printf ("Soaking...%d\n", (int) i);
281 2 }
282 1 }
283
284 //-----------------------------------------------------------------------------
285 // wait_one_second
286 //-----------------------------------------------------------------------------
287 //
288 // This routine uses timer 2 to insert a delay of approximately one second.
289 // Timer 2 overflows <TIMER2_RATE> times per second
290 //
291 void wait_one_second (void)
292 {
293 1 unsigned int count;
294 1 TF2H = 0; // Clear Timer2 overflow flag
295 1 TR2 = 1; // Start Timer2
296 1
297 1 for (count = TIMER2_RATE; count != 0; count--) {
298 2 while (!TF2H); // wait for overflow
299 2 TF2H = 0; // clear overflow indicator
300 2 }
301 1
C51 COMPILER V7.50 ADC_TEMP 10/19/2006 16:46:02 PAGE 6
302 1 TR2 = 0; // Stop Timer2
303 1 }
304
305 //-----------------------------------------------------------------------------
306 // calibrate
307 //-----------------------------------------------------------------------------
308 //
309 void calibrate (void)
310 {
311 1
312 1 bit EA_state=EA; // Preserves EA state
313 1 unsigned char xdata * codePtr; // Used to write calibration
314 1 // Value into FLASH memory
315 1 unsigned int code* data pread; // FLASH read pointer
316 1
317 1 long temp_offset; // stores returned value from ADC
318 1 pread = (unsigned int code *) TEMP_OFFSET;
319 1
320 1 wait_soak_time(SOAK_TIME); // let temperature of device stabilize
321 1 temp_offset= (long) measure (); // Read oversampled ADC code
322 1
323 1 // now calculate the 0 DEG C offset value using <temp_offset>, the
324 1 // temp sensor gain (TEMP_SENSOR_GAIN), and the ambient temperature.
325 1
326 1 temp_offset = temp_offset - ((long) AMB_TEMP *
327 1 TEMP_SENSOR_GAIN / VREF * 65536 / 1000);
328 1
329 1 codePtr=(unsigned char xdata*) &TEMP_OFFSET;
330 1 // Point to TEMP_OFFSET
331 1
332 1 EA = 0; // Disable interrupts
333 1
334 1
335 1 FLKEY=0xA5; // Input first key code
336 1 FLKEY=0xF1; // Input second key code,
337 1 // FLASH is now unlocked
338 1
339 1 PSCTL |= 0x01; // Enable FLASH Writes
340 1 *codePtr = (temp_offset>>8); // Write high byte of temp_gain
341 1
342 1 PSCTL &= ~0x01; // disable FLASH Writes
343 1
344 1 codePtr++; // Move to low byte of
345 1 // TEMP_OFFSET in FLASH to
346 1 // Store low byte of temp_gain
347 1
348 1 FLKEY=0xA5; // Input first key code
349 1 FLKEY=0xF1; // Input second key code,
350 1 // FLASH is now unlocked
351 1
352 1 PSCTL |= 0x01; // Enable FLASH Writes
353 1
354 1 *codePtr =temp_offset; // Write low byte of temp_gain
355 1
356 1
357 1 PSCTL = 0x00; // Disable FLASH Writes
358 1 EA = EA_state; // Restore interrupt state
359 1
360 1 }
361
362 //-----------------------------------------------------------------------------
363 // measure
C51 COMPILER V7.50 ADC_TEMP 10/19/2006 16:46:02 PAGE 7
364 //-----------------------------------------------------------------------------
365 //
366 // This routine averages 16383 ADC samples and returns a 16-bit unsigned
367 // result.
368 //
369 unsigned int measure (void)
370 {
371 1 unsigned i; // Sample counter
372 1 unsigned long accumulator=0L; // Here's where we integrate the
373 1 // ADC samples
374 1 unsigned int currval;
375 1
376 1 AD0INT = 0;
377 1 AD0BUSY = 1;
378 1
379 1 // read the ADC value and add to running total
380 1 i = 0;
381 1 do
382 1 {
383 2 while (!AD0INT); // Wait for conversion to complete
384 2 AD0INT = 0; // Clear end-of-conversion indicator
385 2
386 2 currval=ADC0; // Store latest ADC conversion
387 2 AD0BUSY = 1; // Initiate conversion
388 2 accumulator += currval; // Accumulate
389 2 i++; // Update counter
390 2 } while (i != 16383);
391 1 return (unsigned int) (accumulator >> 8);
392 1 // shift to obtain a 16-bit result (14 + 10 = 24 - 8 = 16) bits
393 1 }
394
395
396 int get_temp (void)
397 {
398 1 unsigned int ADC_code;
399 1 long result;
400 1
401 1 ADC_code = measure();
402 1
403 1 result = ADC_code - TEMP_OFFSET;
404 1
405 1 // result = result * (VREF / 65536) * (1000 / TEMP_SENSOR_GAIN) * ( 100 )
406 1 // the equation above is re-arranged for fixed-point math.
407 1
408 1 result = result * (long) VREF / 256 * 1000 / TEMP_SENSOR_GAIN * 100 / 256;
409 1
410 1 return (int) result;
411 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 801 ----
CONSTANT SIZE = 92 ----
XDATA SIZE = 14 ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 21
IDATA SIZE = ---- ----
BIT SIZE = ---- 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -