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

📄 uart1.lst

📁 新华龙c8051f020单片机 串口调试示例程序
💻 LST
字号:
C51 COMPILER V7.02b   UART1                                                                08/27/2008 10:59:03 PAGE 1   


C51 COMPILER V7.02b, COMPILATION OF MODULE UART1
OBJECT MODULE PLACED IN uart1.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\c51.exe uart1.c DB OE

stmt level    source

   1          /***************************************************************
   2          功能:实现ADC0采样芯片温度,通过LCD显示,并通过串口1(J13)发送到PC机,请使用串口调试工具调试!
   3               注:试验时把ADC0的工作基准VREF0(J7_5和J7_6或J7_2和J7_6)和LCD电源跳线(J18_1和J18_2)联接好!
   4          作者:ZDP
   5          时间:2005-11-30
   6          版本:V1.0
   7          用外部基准:
   8                                           J7
   9                  NC                      1       2       内部VREF
  10                  外部VREF        3       4       内部DAC工作基准输入
  11                  外部VREF        5---6   内部ADC0工作基准输入
  12                  外部VREF        7       8       内部ADC1工作基准输入
  13          或用内部基准:
  14                                           J7
  15                  NC                      1       2-      内部VREF
  16                  外部VREF        3       4 |     内部DAC工作基准输入
  17                  外部VREF        5       6-      内部ADC0工作基准输入
  18                  外部VREF        7       8       内部ADC1工作基准输入
  19          ***************************************************************/
  20          #include <c8051f020.h>                 // SFR declarations
  21          #include <stdio.h>
  22          #include <INTRINS.H>
  23          //-----------------------------------------------------------------------------
  24          // 16-bit SFR Definitions for 'F02x
  25          //-----------------------------------------------------------------------------
  26          
  27          sfr16 DP       = 0x82;                 // data pointer
  28          sfr16 TMR3RL   = 0x92;                 // Timer3 reload value
  29          sfr16 TMR3     = 0x94;                 // Timer3 counter
  30          sfr16 ADC0     = 0xbe;                 // ADC0 data
  31          sfr16 ADC0GT   = 0xc4;                 // ADC0 greater than window
  32          sfr16 ADC0LT   = 0xc6;                 // ADC0 less than window
  33          sfr16 RCAP2    = 0xca;                 // Timer2 capture/reload
  34          sfr16 T2       = 0xcc;                 // Timer2
  35          sfr16 RCAP4    = 0xe4;                 // Timer4 capture/reload
  36          sfr16 T4       = 0xf4;                 // Timer4
  37          sfr16 DAC0     = 0xd2;                 // DAC0 data
  38          sfr16 DAC1     = 0xd5;                 // DAC1 data
  39          
  40          
  41          sbit LIGHTH       = P2^6;
  42          sbit LIGHTL       = P2^7;
  43          #define BAUDRATE     115200            // Baud rate of UART in bps
  44          #define SYSCLK       22118400          // SYSCLK frequency in Hz
  45          #define SAMPLE_RATE  50000             // Sample frequency in Hz
  46          #define INT_DEC      256               // integrate and decimate ratio
  47          #define AMX0SL_AIN   8                             // 0=AIN0....7=AIN7,8=TEMP
  48          
  49          void SYSCLK_Init (void);
  50          void PORT_Init (void);
  51          void UART1_Init (void);
  52          void ADC0_Init (void);
  53          void Timer3_Init (int counts);
  54          void ADC0_ISR (void);
  55          void LCD_Init(void);
C51 COMPILER V7.02b   UART1                                                                08/27/2008 10:59:03 PAGE 2   

  56          
  57          unsigned char xdata NCDdata[6]={0x30,0x30,0x30,0x2e,0x30,0x30};
  58          long result;
  59          unsigned char *lcdpoint;        //指向 lcddata数组的指针
  60          unsigned char lcd_data_count;   //要显示的数据个数 
  61          
  62          void main (void) {
  63   1         long temperature,x;
  64   1         int temp_int, temp_frac,a;
*** ERROR C100 IN LINE 64 OF UART1.C: unprintable character 0xA3 skipped
*** ERROR C100 IN LINE 64 OF UART1.C: unprintable character 0xAC skipped
  65   1         char data1;
  66   1      
  67   1         WDTCN = 0xde;                       // disable watchdog timer
  68   1         WDTCN = 0xad;
  69   1      
  70   1         SYSCLK_Init ();                     // initialize oscillator
  71   1         PORT_Init ();                       // initialize crossbar and GPIO
  72   1         UART1_Init ();                      // initialize UART0
  73   1         Timer3_Init (SYSCLK/SAMPLE_RATE);   // initialize Timer3 to overflow at
  74   1                                             // sample rate
  75   1         for(a=0;a<0xffffffff;a++)
*** ERROR C202 IN LINE 75 OF UART1.C: 'a': undefined identifier
  76   1       {
  77   2        LIGHTH = 1; 
  78   2        LIGHTL = 0;
  79   2        delay(999999);
  80   2        LIGHTH = 0; 
  81   2        LIGHTL = 1;
  82   2       }
  83   1         ADC0_Init ();                       // init ADC
  84   1      
  85   1              AD0EN = 1;                         // enable ADC
  86   1      
  87   1          EA = 1;  
  88   1              while(result==0);                                       //等于0,侧等待ADC0的第一个数据                    
  89   1              while (1) {
  90   2            EA = 0;                          // 关中断
  91   2            temperature = result;
  92   2            EA = 1;                          //开中断
  93   2            //转换为实际温度数据
  94   2            temperature = temperature - 42380;
  95   2            temperature = (temperature * 100L) / 156;
  96   2            temp_int = temperature / 100;
  97   2            temp_frac = temperature - (temp_int * 100);
  98   2                printf ("Temperature is %+02d.%02d\n", temp_int, temp_frac);//把温度数据通过串口发送至PC机
  99   2                //在LCD上显示温度
 100   2                //LCD显示数据处理
 101   2      
 102   2                NCDdata[0]=temp_int/100+0x30;NCDdata[1]=(temp_int%100)/10+0x30;NCDdata[2]=(temp_int%100)%10+0x30;
 103   2                NCDdata[4]=temp_frac/10+0x30;NCDdata[5]=temp_frac%10+0x30;
 104   2      
 105   2      
 106   2                LCD_Init();                           //LCD初始化
 107   2                P2  = 0xA0;                           //准备送数据
 108   2                lcdpoint=&NCDdata;                                    //取地址
 109   2                for(lcd_data_count=6;lcd_data_count>0;lcd_data_count--)
 110   2                { 
 111   3                              data1=*lcdpoint;                                //读出数据                              
 112   3                          P3 = data1;                                         //写数据到端口
 113   3                              P2 = 0X20;
 114   3                      P2 = 0XA0;                                              //控制LCD       
C51 COMPILER V7.02b   UART1                                                                08/27/2008 10:59:03 PAGE 3   

 115   3                      lcdpoint++;
 116   3                              for(x=0;x<0x5000;x++);
 117   3                }
 118   2                for(data1=0;data1<0x6;data1++)
 119   2                {
 120   3                              for(x=0;x<0xffff;x++)
 121   3                              {_nop_();}
 122   3             }
 123   2              }
 124   1      }
 125          
 126          //-----------------------------------------------------------------------------
 127          // SYSCLK配置
 128          //-----------------------------------------------------------------------------
 129          // 配置系统时钟使用外部晶振22.1184MHz
 130          
 131          void SYSCLK_Init (void)
 132          {
 133   1         int i;                              // delay counter
 134   1      
 135   1         OSCXCN = 0x67;                      // start external oscillator with
 136   1                                             // 22.1184MHz crystal
 137   1         for (i=0; i < 256; i++) ;           // XTLVLD blanking interval (>1ms)
 138   1      
 139   1         while (!(OSCXCN & 0x80)) ;          // Wait for crystal osc. to settle
 140   1      
 141   1         OSCICN = 0x88;                      // select external oscillator as SYSCLK
 142   1                                             // source and enable missing clock
 143   1                                             // detector
 144   1      }
 145          
 146          //-----------------------------------------------------------------------------
 147          // PORT配置
 148          //-----------------------------------------------------------------------------
 149          void PORT_Init (void)
 150          {
 151   1      //   XBR0    = 0x07;                     // Enable UART0
 152   1      //   XBR1    = 0x00;
 153   1         XBR2    = 0x44;                     // Enable crossbar and weak pull-ups
 154   1         P0MDOUT |= 0x01;                    // enable TX0 as a push-pull output
 155   1         P1MDOUT |= 0x01;
 156   1         P2MDOUT  = 0xe0;                    // P2口设为推挽方式
 157   1         P3MDOUT  = 0xff;                    // P2口设为推挽方式
 158   1      }
 159          
 160          //-----------------------------------------------------------------------------
 161          // UART0配置
 162          //-----------------------------------------------------------------------------
 163          // Configure the UART0 using Timer1, for <baudrate> and 8-N-1.
 164          void UART1_Init (void)
 165          {
 166   1         SCON1   = 0x50;                     // SCON0: mode 1, 8-bit UART, enable RX
 167   1         TMOD    = 0x20;                     // TMOD: timer 1, mode 2, 8-bit reload
 168   1         TH1    = -(SYSCLK/BAUDRATE/16);     // set Timer1 reload value for baudrate
 169   1         TR1    = 1;                         // start Timer1
 170   1         CKCON |= 0x10;                      // Timer1 uses SYSCLK as time base
 171   1         PCON  |= 0x10;                      // SMOD01 = 1
 172   1         SCON1 |= 0x2;                       // Indicate TX0 ready
 173   1      }
 174          
 175          //-----------------------------------------------------------------------------
 176          // ADC0配置,T3定时启动ADC
C51 COMPILER V7.02b   UART1                                                                08/27/2008 10:59:03 PAGE 4   

 177          //-----------------------------------------------------------------------------
 178          void ADC0_Init (void)
 179          {
 180   1         ADC0CN = 0x05;                      // ADC0 T3定时采样,左对齐
 181   1         REF0CN = 0x07;                      // 启用内部基准源
 182   1         AMX0SL = AMX0SL_AIN;                // 选择采样输入源
 183   1         ADC0CF = (SYSCLK/2500000) << 3;     // ADC conversion clock = 2.5MHz
 184   1         ADC0CF |= 0x01;                     // PGA gain = 2
 185   1      
 186   1         EIE2 |= 0x02;                       // 启用 ADC 中断
 187   1      }
 188          
 189          //-----------------------------------------------------------------------------
 190          // Timer3配置,T3定时启动ADC
 191          //-----------------------------------------------------------------------------
 192          void Timer3_Init (int counts)
 193          {
 194   1         TMR3CN = 0x02;
 195   1         TMR3RL  = -counts;
 196   1         TMR3    = 0xffff;
 197   1         EIE2   &= ~0x01;
 198   1         TMR3CN |= 0x04;
 199   1      }
 200          
 201          //-----------------------------------------------------------------------------
 202          // ADC0采样中断
 203          //-----------------------------------------------------------------------------
 204          void ADC0_ISR (void) interrupt 15
 205          {
 206   1         static unsigned int_dec=INT_DEC;    
 207   1         static long accumulator=0L;                     
 208   1      
 209   1         AD0INT = 0;                                             // 清 ADC 中断标志位
 210   1      
 211   1      
 212   1              accumulator += ADC0;               // 累加ADC采样数据
 213   1         int_dec--;                          // 指针减1
 214   1      
 215   1         if (int_dec == 0) {                 // 累加完了吗?
 216   2            int_dec = INT_DEC;               // 指针复位
 217   2            result = accumulator >> 8;
 218   2            accumulator = 0L;                // 累加和变量清0
 219   2         }
 220   1      }
 221          //LCD初始化
 222          void LCD_Init(void)
 223          {unsigned long x;
 224   1         P2 = 0X80;
 225   1         for(x=0;x<1000;x++);
 226   1         //P7 = 0x30;                         /*一行显示*/
 227   1         P3 = 0x38;                           /*两行显示*/
 228   1         P2 = 0X00;//0x08;
 229   1         P2 = 0X80;//0x09; 
 230   1         for(x=0;x<1000;x++);
 231   1         P3 = 0x0e;
 232   1         P2 = 0x00;
 233   1         P2 = 0x80;
 234   1         for(x=0;x<1000;x++);
 235   1         P3=  0x06;
 236   1         P2 = 0x00;
 237   1         P2 = 0x80;
 238   1         for(x=0;x<5000;x++);
C51 COMPILER V7.02b   UART1                                                                08/27/2008 10:59:03 PAGE 5   

 239   1         P3 = 0x01;
 240   1         P2 = 0x00;
 241   1         P2 = 0x80; 
 242   1         for(x=0;x<5000;x++);
 243   1      }

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

⌨️ 快捷键说明

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