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