⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 adc_temp.lst

📁 C8051F310单片机应用程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
 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 + -