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

📄 t2cal31x.lst

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