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

📄 main.lst

📁 用C8051F芯片完成的温度远程采集程序,发送,接受两个模块通信完成,内嵌CRC算法.
💻 LST
字号:
C51 COMPILER V8.02   MAIN                                                                  07/15/2007 21:35:23 PAGE 1   


C51 COMPILER V8.02, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE main.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include <c8051f020.h>
   2          #include <absacc.h>
   3          #include <intrins.h>
   4          #include "lcd_driver.h"
   5          #include "delay.h"
   6          #include "crc.h"
   7          
   8          //------------------------
   9          #define uchar unsigned char
  10          #define uint  unsigned int
  11          
  12          
  13          sfr16 DP       = 0x82;                 // data pointer
  14          sfr16 TMR3RL   = 0x92;                 // Timer3 reload value
  15          sfr16 TMR3     = 0x94;                 // Timer3 counter
  16          sfr16 ADC0     = 0xbe;                 // ADC0 data
  17          sfr16 ADC0GT   = 0xc4;                 // ADC0 greater than window
  18          sfr16 ADC0LT   = 0xc6;                 // ADC0 less than window
  19          sfr16 RCAP2    = 0xca;                 // Timer2 capture/reload
  20          sfr16 T2       = 0xcc;                 // Timer2
  21          sfr16 RCAP4    = 0xe4;                 // Timer4 capture/reload
  22          sfr16 T4       = 0xf4;                 // Timer4
  23          sfr16 DAC0     = 0xd2;                 // DAC0 data
  24          sfr16 DAC1     = 0xd5;                 // DAC1 data
  25          
  26          
  27          void  SYSCLK_Init(void);
  28          void  PORT_Init(void);
  29          void  Uart0_Init(void);
  30          void  uart0_sentbyte(uchar dat);
  31          void  uart0_recbyte(uchar dat);
  32          void  PCA0_Init(void);
  33          void  ADC0_Init(void);
  34          void  adc_cns(void);
  35          void  get_value(void);
  36          
  37          #define sysclk         22118400        // SYSCLK frequency in Hz
  38          #define baudrate       2400          // Baud rate of UART in bps
  39          #define freq           38000           // Frequency to generate in Hz
  40          #define length         18                  //数据长度 + 两字节CRC值
  41          #define begin          10
  42          
  43          
  44          uchar code welcome[]="    Welcome     Innovation Lab  ";
  45          
  46          
  47          float value;
  48          uchar xdata buffer[length+1]="00Tempera:000.00^C";
  49          
  50          extern uchar a;
  51          
  52          //-----------------------------------------------------------------------------
  53          // MAIN Routine
  54          //-----------------------------------------------------------------------------
  55          
C51 COMPILER V8.02   MAIN                                                                  07/15/2007 21:35:23 PAGE 2   

  56          void main (void)
  57          {  uchar i;
  58   1         SYSCLK_Init();                     // initialize oscillator
  59   1         PORT_Init();                       // initialize crossbar and GPIO
  60   1         LCD_Init();
  61   1         LCD_string(1,1,welcome);                       // 欢迎使用界面
  62   1      
  63   1         Uart0_Init();
  64   1         PCA0_Init();
  65   1         ADC0_Init();
  66   1         buffer[length] = 0;
  67   1      
  68   1         for (i=0;i<200;i++)
  69   1           delay(100,100);
  70   1         LCD_cmd(0x01);           //清屏                            
  71   1         EA = 1;            
  72   1         while(1)
  73   1          {
  74   2                 get_value();
  75   2                 CRC16_Get(buffer,length);
  76   2                 LCD_string(1,1,buffer+2);
  77   2      
  78   2                 uart0_sentbyte(0xff);     //起始码
  79   2                 for(i=0;i<length;i++)
  80   2                  {
  81   3                         uart0_sentbyte(buffer[i]);
  82   3                  }
  83   2                 uart0_sentbyte(0xfe);         //结束码  
  84   2      
  85   2                 for (i=0;i<200;i++)
  86   2                 delay(100,100);
  87   2              }
  88   1        
  89   1      }
  90          
  91          
  92          void SYSCLK_Init (void)
  93          {
  94   1         int i;                              // delay counter
  95   1         WDTCN = 0xde;                       // disable watchdog timer
  96   1         WDTCN = 0xad;    
  97   1      
  98   1         OSCXCN = 0x67;                      // start external oscillator with
  99   1         for (i=0; i < 256; i++);            // XTLVLD blanking interval (>1ms)
 100   1         while (!(OSCXCN & 0x80));           // Wait for crystal osc. to settle
 101   1         OSCICN = 0x88;                      // select external oscillator as SYSCLK
 102   1                                             // source and enable missing clock
 103   1                                             // detector
 104   1      }
 105          
 106          //-----------------------------------------------------------------------------
 107          // PORT_Init
 108          //-----------------------------------------------------------------------------
 109          //
 110          // Configure the Crossbar and GPIO ports
 111          //
 112          void PORT_Init (void)
 113          {
 114   1         XBR0    = 0x0c;                     // 串口0允许
 115   1         XBR1    = 0x00;
 116   1         XBR2    = 0x40;                     // Enable crossbar and weak pull-ups
 117   1         
C51 COMPILER V8.02   MAIN                                                                  07/15/2007 21:35:23 PAGE 3   

 118   1         P0MDOUT |= 0x07;
 119   1         P1MDOUT = 0xff;
 120   1         //P2MDOUT = 0xff;
 121   1         //P3MDOUT = 0xff;
 122   1         P74OUT  = 0xff;                    // P4-P7配置为推挽方式
 123   1      
 124   1      }
 125          
 126          
 127          void Uart0_Init(void)
 128          {
 129   1         SCON0  = 0x40;                      // SCON0: mode 1, 8-bit UART, disenable RX       //0x50 enable RX
 130   1         TMOD  |= 0x20;                      // TMOD: timer 1, mode 2, 8-bit reload
 131   1         TH1    = -(sysclk/baudrate/192);     // set Timer1 reload value for baudrate
 132   1         CKCON |= 0x00;                      // Timer1 uses SYSCLK/12 as time base
 133   1         PCON  |= 0x80;                      // SMOD0 = 1
 134   1         TR1    = 1;                         // start Timer1
 135   1       //  ES0    = 1;                         // enable UART0 interrupts
 136   1      }
 137          
 138          void uart0_sentbyte(uchar dat)
 139          {
 140   1         SBUF0 = dat;
 141   1         while(TI0 == 0);
 142   1         TI0 = 0;
 143   1      }
 144          
 145          void uart0_recbyte(uchar dat)
 146          {
 147   1         while(RI0 == 0);
 148   1         dat = SBUF0;
 149   1         RI0 = 0;
 150   1      }
 151          
 152          //-----------------------------------------------------------------------------
 153          // PCA0_Init
 154          //-----------------------------------------------------------------------------
 155          //
 156          // Configure PCA0:  PCA uses SYSCLK as time base; overflow interrupt
 157          // disabled.
 158          // Module 0 configured in Frequency Output mode to generate a frequency equal
 159          // to the constant FREQ.
 160          //
 161          void PCA0_Init (void)
 162          {
 163   1         // configure PCA time base to use SYSCLK; overflow interrupt disabled
 164   1         PCA0CN = 0x00;                      // Stop counter; clear all flags
 165   1         PCA0MD = 0x02;                      // 系统时钟四分频
 166   1      
 167   1         // Configure Module 0 to Frequency Output mode to toggle at 2*FREQ
 168   1         PCA0CPM0 = 0x46;                    // Frequency Output mode
 169   1         PCA0CPH0 = sysclk/freq/8;           // Set frequency
 170   1      
 171   1         // Start PCA counter
 172   1         CR = 1;
 173   1      }
 174          
 175          void ADC0_Init(void)
 176          {
 177   1         ADC0CN = 0x00;         // ADC0 禁止; 正常跟踪模式向AD0BUSY写‘1’启动ADC0转换 ADC0数据右对齐
 178   1         REF0CN = 0x03;         // 禁止温度传感器, 片内 VREF,和 VREF 输出缓冲器
 179   1         AMX0CF = 0x00;         //
C51 COMPILER V8.02   MAIN                                                                  07/15/2007 21:35:23 PAGE 4   

 180   1         AMX0SL = 0x00;         // 选择AIN0作为ADC多路转换输出
 181   1         ADC0CF = (sysclk/2500000) << 3;    // ADC转换时钟2.5MHz
 182   1         ADC0CF &= ~0x07;       // PGA增益 = 1
 183   1         EIE2 &= ~0x02;         // 禁止ADC0中断
 184   1         AD0EN = 1;             // 使能ADC0
 185   1      }
 186          
 187          void adc_cns(void)
 188          {
 189   1         uint i;
 190   1         uint v;        
 191   1         value = 0x00000000;
 192   1      
 193   1         for(i=0;i<10000;i++)
 194   1         {
 195   2             AD0INT = 0;      
 196   2             AD0BUSY = 1;                 // 向AD0BUSY写1将启动转换
 197   2             while(AD0INT == 0);
 198   2             v  = ADC0H*256;
 199   2             v |= ADC0L;
 200   2             value = value+v; 
 201   2         }  
 202   1           
 203   1         value = value/10000; 
 204   1         value = value*2.43/4096;
 205   1      }
 206          
 207          
 208          void get_value(void)
 209          {
 210   1         float res,res0;
 211   1         int tempera;
 212   1         adc_cns();                                           //(res/(10K+res)-100/10100)*4*51 = value
 213   1         res = value*101+204;                     //4V基准,51倍放大倍数
 214   1         res0= 20400-101*value;
 215   1         res = res*10000/res0;                        //得到铂丝电阻值
 216   1      
 217   1         tempera = (res-100)*100/0.3851;          //得到温度值并放大100倍
 218   1      
 219   1         if(tempera&0x8000)                           //如果温度为负数,转化为正数
 220   1           {
 221   2                      tempera = ~tempera;
 222   2                      tempera += 1;
 223   2                      buffer[begin]='-';
 224   2               }
 225   1         else 
 226   1           buffer[begin]='+';
 227   1      
 228   1         buffer[begin+1]=(uchar)(tempera/1000)+'0';
 229   1         buffer[begin+2]=(uchar)(tempera/100)%10+'0';
 230   1         buffer[begin+3]='.';
 231   1         buffer[begin+4]=(uchar)(tempera/10)%10+'0';
 232   1         buffer[begin+5]=(uchar)tempera%10+'0';
 233   1      
 234   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    700    ----
   CONSTANT SIZE    =     33    ----
   XDATA SIZE       =     19    ----
   PDATA SIZE       =   ----    ----
C51 COMPILER V8.02   MAIN                                                                  07/15/2007 21:35:23 PAGE 5   

   DATA SIZE        =      4      13
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -