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

📄 main.lst

📁 针对STC8051单片机的开发包
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.50   MAIN                                                                  09/30/2006 21:59:31 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN MAIN.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE SRC\MAIN.C BROWSE DEBUG OBJECTEXTEND PRINT(.\MAIN.lst) OBJECT(MAIN.obj)

line level    source

   1          /******************************************
   2          STC 单片机开发程序。V0_1_1
   3          //在KEIL uVision3中,如有不清楚的函数封装,选中后点右键,选择“GO TO Ddfinition Of 'XXXXXX'“
   4          //可以看到该函数的原形。
   5          
   6          //create by changshengwuji 
   7          //email: netspider@163.com
   8          //qq:    450353168
   9          //2006.05.03
  10          ********************************************************************/
  11          
  12          //5a 55 a2 51   read addr
  13          //5a 10 a5 0f   read integer t
  14          //5a 10 a3 0d   read tp
  15          //5a 10 a6 10   shut
  16          //5a 10 a7 11   open
  17          //5a 10 a1 0b   modify addr
  18          
  19          #include "../inc/MCS_X51.H"
  20          #include "../inc/hardmap.h"
  21          #include "../inc/MCS_X51LIB.H"
  22          #include "../inc/DS18B20.H"
  23          
  24          #include "../inc/stc_flash.H"
  25          
  26          #define EXT_11M      1                  //外部11.0592MHz晶体
  27           //#define EXT_1M               1                               //外部输入时钟1Mhz
  28           #define  UART_ERR      0XEE
  29          #define  UART_SUC   0XA0
  30          //------上位机命令---------------
  31          #define  SET_ADDR       0XA1    //设置本机地址
  32          #define  READ_ADDR      0XA2    //读取本机地址
  33          #define  READ_T         0XA3    //读取温湿度
  34          #define  HEAT           0XA4    //加热命令
  35          #define  READ_S         0XA5    //READ SHORT TEMPERATURE
  36          #define  SHUT           0XA6    //关
  37          #define  OPEN           0XA7    //开
  38          #define  TEST           0XA0    //TEST CODE
  39          
  40          #define  HEAD     0X5A     //帧头
  41          #define  ADDR     0X10          //默认本机地址
  42          
  43          #define  ERR_ADDR       0XE1    //设置地址错误应答
  44          #define  ERR_VERI       0XE2    //上位机发送的数据校验和不对应答。
  45          #define  ERR_TH         0XE3    //本机读取温湿度时出错应答。即后面的数据不可靠
  46          
  47          #define  SUCC_ADDR      0XF1    //设置地址成功应答
  48          #define  SUCC_TH        0XF2    //表示温湿度读数正确。
  49          #define  ASK            0XF8    //应答
  50          #define  SYS_ADDR       0XAA    //系统标志,表示该机的地址已经设置。
  51          #define  RA_FLAG    0X55        //上位机读本机地址时,在地址位发送该标志。 
  52          
  53          #define    TIMING_5MS    0XEE00                 //TIMING 5MS @ 11.0592MHz
  54          #define    TIMING_10MS   0XDC00                 //TIMING 10MS @ 11.0592MHz
  55          #define    NUM_SEG              3                               //      数码管个数
C51 COMPILER V7.50   MAIN                                                                  09/30/2006 21:59:31 PAGE 2   

  56                                                  
  57          //*******************************************************************
  58          //------------uart------------------------------
  59          bit             bit_ut_start = 0;
  60          bit     bit_ut_over      = 0;
  61          
  62          //----------ds18b20-------------------------------
  63          bit     bit_tpsensor = 0;
  64          //-----------IAP---------------------------------------
  65          bit     bit_iap = 0;
  66          bit     bit_10ms     = 0;
  67          bit     bit_100ms    = 0;
  68          bit     bit_1s       = 0;
  69          bit     bit_400ms    = 0;
  70          
  71          bit             bit_10ms_over  = 0;
  72          bit             bit_400ms_over = 0;
  73          
  74          data UINT8  t0_10ms = 0;
  75          data UINT8  t0_400ms = 0;
  76          
  77          
  78          data UINT8      disbuff[3];      //显示缓冲,存放查找后的段码
  79          data UINT8      buffer[10];       //uart buffer
  80          data UINT8  seg_num = 0;                //数码管点亮顺序
  81          data UINT8  dabuff[10];                 //数据缓冲
  82          data UINT8  machine_addr;               //local address
  83          //---------------温度   ----------------
  84          data SINT16 tp; 
  85          data SINT8  t ;
  86          
  87          
  88          bit      bit_disp;                      //显示标志 
  89          bit     bit_relay;                                                 
  90          UINT8    ut_num=0;
  91          //code UINT8  table[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff};
  92          code UINT8  table[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff};
  93          
  94          
  95          void relay_os(bit bit_con);
  96          //********************************************************************
  97          void cpu_init()
  98          {
  99   1              relay_os(0);
 100   1              INT_GLOBAL(0);
 101   1              INT_T1(0); 
 102   1              INT_T0(0);
 103   1              INT_UART(0);
 104   1              
 105   1              P1 = 0xff;
 106   1              P3 = 0xff;
 107   1              setup_timer(T1_START_BY_TR | T1_TIMER | T1_MODE_2 | T0_START_BY_TR | T0_TIMER | T0_MODE_1);
 108   1          #ifdef STC_12X2052X          //定义使用STC12C2052单片机。
                      #ifdef EXT_1M                    //外部1MHz时钟
                      SET_T0_DIV_BY_1;            //timer0/timer1 定时器的时钟直接使用外部时钟。不做分频
                      SET_T1_DIV_BY_1;
                      set_timer1(0xF3F3);             //设置波特率4800
                      UART_RATE_MUL;                  //波特率翻倍
                      #endif
                  #endif
 116   1      
 117   1              #ifdef EXT_11M                  //使用STC89C51单片机。11059200晶振
C51 COMPILER V7.50   MAIN                                                                  09/30/2006 21:59:31 PAGE 3   

 118   1              //set_timer1(0xFDFD);           //9600
 119   1               set_timer1(0xFAFA);            //4800
 120   1              #endif
 121   1              T1_START;
 122   1              setup_uart(UART_MODE_1);        //UART工作于模式1
 123   1              ENABLE_UART_RCV;
 124   1      
 125   1      
 126   1              bit_iap = flsh_sector_rd(EEP_SECTOR1,2,dabuff);
 127   1              if(!bit_iap)
 128   1                      flsh_sector_rd(EEP_SECTOR1,2,dabuff);
 129   1              if(buffer[0] == SYS_ADDR)
 130   1              {
 131   2                      machine_addr = dabuff[1];
 132   2              }
 133   1              else
 134   1                      machine_addr = ADDR;
 135   1      
 136   1              set_timer0(TIMING_5MS);
 137   1              T0_START;
 138   1              INT_GLOBAL(1);
 139   1              INT_UART(1);
 140   1              INT_T0(1);
 141   1          WDT_DIV_BY_128;
 142   1              WDT_ENABLE;
 143   1              WDT_CLR;
 144   1      }
 145          
 146          /*********************************************************************
 147          /串口中断服务程序
 148          //处理串口接收中断,对于发送中断不作处理
 149          ***********************************************************************/
 150          void uart_service() interrupt 4 using 1
 151          {
 152   1      UINT8  tmp;
 153   1          if(RI)
 154   1                      UART_RIIF_CLR ;
 155   1              else
 156   1                      return;
 157   1              
 158   1              tmp = rd_uart();
 159   1              if(!bit_ut_start)
 160   1              {
 161   2                      if(tmp == HEAD)
 162   2                      {
 163   3                              bit_ut_start = 1;
 164   3                              bit_ut_over = 0;
 165   3                              ut_num = 0;
 166   3                      }
 167   2               }
 168   1               else
 169   1               {
 170   2                      buffer[ut_num] = rd_uart();
 171   2                      ut_num++;
 172   2                      /*
 173   2                      if(ut_num == 1)
 174   2                      {
 175   2                              if((buffer[0] != machine_addr) && (buffer[0] !=RA_FLAG))        //地址不符
 176   2                              {                                                         //且地址不等于RA_FLAG.退出。RA_FLAG是读本机地址标志
 177   2                                      ut_num = 0;             
 178   2                                      bit_ut_start = 0;
 179   2                                      return;
C51 COMPILER V7.50   MAIN                                                                  09/30/2006 21:59:31 PAGE 4   

 180   2                              }
 181   2                      } */
 182   2                      if(ut_num == 3)
 183   2                      {
 184   3                              bit_ut_over = 1 ;               //接收完毕一帧数据
 185   3                              bit_ut_start = 0;               //接着重新开始接收
 186   3                              ut_num = 0;
 187   3                      }
 188   2              }
 189   1      } 
 190          //----------------------------------------------------------------
 191          void relay_os(bit bit_con)
 192          {
 193   1              if(bit_con)
 194   1              {
 195   2                      con1=0;
 196   2                      con2=1;
 197   2                      bit_relay = 1;
 198   2              }
 199   1              else
 200   1              {
 201   2                      con1 = 1;
 202   2                      con2 = 0;
 203   2                      bit_relay = 0;
 204   2              }
 205   1                      delay_10clk(10000);     //30~40ms
 206   1                      con1=0;
 207   1                      con2=0;
 208   1      }
 209          /*********************************************************************
 210          使用ULN2003或者2803驱动,8位并口,输出反相。驱动电流200mA
 211          每个数码管用一个驱动器。驱动器的控制端使用p1口。p1口留上拉位置。
 212          扫描信号由p0口产生,使用上拉,驱动4953.
 213          
 214          *********************************************************************/
 215          
 216          void display() 
 217          {
 218   1              SEG_DRV =  0Xf8;                //SHUT LED
 219   1              seg_num++;
 220   1              if((seg_num>=3) )
 221   1              {
 222   2                      seg_num = 0;
 223   2                      SEG_DRV = 0xf9;
 224   2              }
 225   1              else
 226   1              {
 227   2                      SEG_DRV = 0XF8 + (seg_num<<1);
 228   2              }  
 229   1      
 230   1              SEG_PARA = disbuff[seg_num];
 231   1      }
 232          
 233          /*********************************************************************/
 234          void t0_service() interrupt 1 using 2
 235          {
 236   1              set_timer0(TIMING_5MS);
 237   1              if(bit_disp)
 238   1              {
 239   2                      display();
 240   2              }
 241   1              if(bit_10ms)
C51 COMPILER V7.50   MAIN                                                                  09/30/2006 21:59:31 PAGE 5   

 242   1              {
 243   2                      t0_10ms++;
 244   2                      if(t0_10ms >= 3)
 245   2                      {
 246   3                              bit_10ms_over = 1;
 247   3                              bit_10ms = 0;
 248   3                              t0_10ms = 0;
 249   3                      }
 250   2               }
 251   1               if(bit_400ms)
 252   1               {
 253   2                      t0_400ms++;
 254   2                      if(t0_400ms >= 80)
 255   2                      {
 256   3                              bit_400ms_over = 1;
 257   3                              bit_400ms = 0;
 258   3                              t0_400ms = 0;
 259   3                      }
 260   2                }
 261   1      }
 262          
 263          
 264          
 265          /**********************************************************************/
 266          
 267          /********************************************************************
 268          //
 269          //通过串口,输出一帧数据到pc机
 270          //参数:输出数据的缓冲地址,输出数据的长度,不包括校验和、帧头等。
 271          //发送数据的格式:帧头+本机地址+数据长度+数据包+校验和
 272          
 273          *********************************************************************/
 274          void mcu2pc(UINT8 *p,UINT8 l)
 275          {
 276   1      UINT8 i,tmp;
 277   1          en485 = 0;                          //485发送使能
 278   1              delay_7clk(2);
 279   1              uart_putc(HEAD);
 280   1              uart_putc(machine_addr);
 281   1              uart_putc(l);                   //数据长度。
 282   1              tmp = HEAD + machine_addr + l;
 283   1              for(i = 0;i<l ;i++)
 284   1              {
 285   2                      uart_putc(*p);                  //p指向要发送的数据
 286   2                      tmp = tmp + *p;
 287   2                      p++;
 288   2              }

⌨️ 快捷键说明

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