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

📄 main.lst

📁 从零开始学51单片机源代码
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V8.08   MAIN                                                                  04/06/2012 21:53:17 PAGE 1   


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

line level    source

   1          // Target : STC12C5A60S2 
   2          // Crystal: 11.0592Mhz  
   3          #include <reg52.h> 
   4          #include "fun.h" 
   5          
   6          //声明 
   7          void init_devices(void);
   8          
   9          void port_init(void)
  10          {
  11   1       //设置P3.2~P3.4为输入,P3.5~P3.7为开漏输出              
  12   1       P3M1 = 0xfc;   //1111 1100
  13   1       P3M0 = 0xe0;   //1110 0000
  14   1       //设置P2.0为开漏输出 
  15   1       P2M1=0X01;
  16   1       P2M0=0X01;
  17   1      
  18   1       d_vote = 1;    //关闭投票指示灯 
  19   1       //关闭d1 d2 d3 ,按键s1 s2 s3为高电平 
  20   1       P3 = 0xff;
  21   1       
  22   1       //设置P1.4为推挽输出,P1.0、P1.7为高阻输入(AD转换用) 
  23   1       P1M1 = 0x81;   //1000 0001
  24   1       P1M0 = 0x10;   //0001 0000
  25   1      
  26   1      
  27   1       m_power = 0; //打开无线模块电源 
  28   1      }
  29          
  30          //Watchdog initialize
  31          //约568.8ms
  32          void watchdog_init(void)
  33          {
  34   1       WDT_CONTR = 0x33;//启动定时器,11.0592MHz晶振下,溢出时间568.8ms
  35   1      }
  36          
  37          
  38          //外部中断0
  39          void  INT0_interrupt() interrupt 0
  40          {
  41   1       //external interupt on INT0
  42   1       //关外部中断0、外部中断1
  43   1       IE &= 0xfa;  //1111 1010
  44   1      
  45   1       m_power = 0; //打开无线模块电源  
  46   1       d_vote = 1;    //关闭投票指示灯  
  47   1       P3 |= 0xe0;   //关闭d1 d2 d3 
  48   1       
  49   1       d3 = 0;  //点亮d3
  50   1       msdelay(500);
  51   1       WDR(); //喂狗 
  52   1       d2 = 0;  //点亮d2
  53   1       msdelay(500);
  54   1       WDR(); 
  55   1       d1 = 0;  //点亮d1
C51 COMPILER V8.08   MAIN                                                                  04/06/2012 21:53:17 PAGE 2   

  56   1       msdelay(500);
  57   1       WDR();
  58   1       d_vote = 0;  //点亮 d_vote
  59   1       msdelay(500);
  60   1       WDR(); 
  61   1      
  62   1       init_devices();
  63   1      
  64   1       m_power = 0; //打开无线模块电源  
  65   1       d_vote = 1;    //关闭投票指示灯  
  66   1       P3 |= 0xe0;   //关闭d1 d2 d3
  67   1      }
  68          
  69          //外部中断1
  70          void  INT1_interrupt() interrupt 2
  71          {
  72   1       //external interupt on INT1
  73   1       //关外部中断0、外部中断1
  74   1       IE &= 0xfa;  //111 1010
  75   1      
  76   1       m_power = 0; //打开无线模块电源 
  77   1       
  78   1       //LED从下到上依次点亮  
  79   1       d_vote = 1;    //关闭投票指示灯  
  80   1       P3 |= 0xe0;   //关闭d1 d2 d3 
  81   1       
  82   1       d3 = 0;  //点亮d3
  83   1       msdelay(500);
  84   1       WDR(); //喂狗 
  85   1       d2 = 0;  //点亮d2
  86   1       msdelay(500);
  87   1       WDR(); 
  88   1       d1 = 0;  //点亮d1
  89   1       msdelay(500);
  90   1       WDR();
  91   1       d_vote = 0;  //点亮 d_vote
  92   1       msdelay(500);
  93   1       WDR(); 
  94   1      
  95   1       init_devices();
  96   1      
  97   1       m_power = 0; //打开无线模块电源  
  98   1       d_vote = 1;    //关闭投票指示灯  
  99   1       P3 |= 0xe0;   //关闭d1 d2 d3
 100   1      }
 101          
 102          //TIMER0 initialize 
 103          // desired value: 16mSec
 104          // actual value: 16mSec 
 105          void timer0_init()
 106          {
 107   1              AUXR &=0x7F; //T0x12 = 0,定时器0使用12分频 
 108   1      
 109   1              TMOD |= 0X01;
 110   1              TH0 = T0_16ms >> 8;
 111   1              TL0 = T0_16ms,
 112   1              ET0 = 1; //允许T0中断 
 113   1      }
 114          
 115          //定时器0中断 ,16ms一次 
 116          void Timer0_interrupt() interrupt 1
 117          {
C51 COMPILER V8.08   MAIN                                                                  04/06/2012 21:53:17 PAGE 3   

 118   1              //重装初值 
 119   1              TH0 = T0_16ms >> 8;        //TH0 = T0_16ms / 256 = 0xc6
 120   1              TL0 = T0_16ms;                  //TL0 = T0_16ms % 256 = 0x66    
 121   1        
 122   1        cnt++;
 123   1        if (cnt==me) //轮到自己发 
 124   1        {  
 125   2          if  (addr!=0)//地址没有问题,可以发送  
 126   2              {    
 127   3              TR0 = 0; //关定时器 
 128   3              REN = 0; //禁止接收数据          
 129   3              putchar(sent[0]);
 130   3              putchar(sent[1]);
 131   3              putchar(sent[2]);        
 132   3              REN = 1; //允许接收数据  
 133   3              }
 134   2              else
 135   2              {
 136   3               TR0 = 0; //关定时器 
 137   3               REN = 1; //允许接收数据 
 138   3              }                                                                           
 139   2        }
 140   1      }
 141          
 142          //TIMER2 initialize 
 143          // desired value: 50mSec
 144          // actual value: 50.000mSec (0.0%)
 145          void timer1_init()
 146          {
 147   1              AUXR &=0xbF; //T1x12 = 0,定时器1使用12分频 
 148   1      
 149   1              TMOD |= 0X10;   //定时器1模式1,16bit
 150   1              TH1 = T1_50ms >> 8;       
 151   1              TL1 = T1_50ms;                          
 152   1              ET1 = 1; //允许T1中断 
 153   1      }
 154          
 155          //定时器1中断 ,50ms一次 
 156          void Timer1_interrupt() interrupt 3
 157          {
 158   1       //重装初值 
 159   1       TH1 = T1_50ms >> 8;
 160   1       TL1 = T1_50ms;
 161   1       time++;   //按键计时 
 162   1       time_f++;      //空闲计时 
 163   1       if (time==10) //按键之后500ms
 164   1       {
 165   2         //关按键灯 
 166   2         P3 |= 0xe0; //关d1 d2 d3
 167   2       }
 168   1       
 169   1       if (time==40)//按键之后2S
 170   1       {
 171   2         key1=0; //进入工厂模式步骤清零 
 172   2       }
 173   1       
 174   1       if (time_f==10) //500ms未接收到数据 
 175   1       {
 176   2         recnum=0; //接收数据清零 
 177   2       }
 178   1       
 179   1       if (time_f==1200) //1分钟未接收到数据 没有按键 
C51 COMPILER V8.08   MAIN                                                                  04/06/2012 21:53:17 PAGE 4   

 180   1       {
 181   2         sleep(); //休眠 power down
 182   2       }
 183   1      }
 184          
 185          //UART0 initialize
 186          // desired baud rate: 9600
 187          // char size: 8 bit
 188          // parity: Disabled
 189          void uart0_init(void)
 190          {
 191   1              //BRTR=1允许BRT  BRTx12=1   S1BRS = 1使用BRT
 192   1              AUXR |=0x15; //0001 0101 
 193   1              //方式1,8 N 1,允许接收 
 194   1              SCON = 0x50; //SM0 = 0,SM1=1,REN=1; 
 195   1      
 196   1              //11.0592MHz,9600
 197   1              BRT =  256 - (fosc/32/9600); //BRT = 0xdc       
 198   1              ES = 1; //允许串口中断 
 199   1      }
 200          
 201          //串口中断 
 202          void  USART_interrupt() interrupt 4
 203          {
 204   1       //uart has received a character in SBUF  
 205   1       unsigned int i;
 206   1      
 207   1      //如果是接收中断 
 208   1      if (RI)
 209   1      {
 210   2       RI=0; //清接收中断 
 211   2       time_f=0;  //空闲时间计数器清零
 212   2      
 213   2        disable(); //关闭定时器0、定时器1、ADC转换
 214   2      
 215   2       //防止缓冲区数组溢出错误 
 216   2       if (recnum < 5)
 217   2       { 
 218   3        rec[recnum]=SBUF;
 219   3        recnum++;       //接收计数指针+1
 220   3      
 221   3              loop:   //开始处理流程 
 222   3              if (recnum>2)    //至少收了3个数据 
 223   3              {
 224   4                      if ((rec[0]&0x0c)==0x00 && ((rec[0]&0x80)==0x00))  //包头正确  上位机下发的 
 225   4                      {
 226   5                      //计算校验 
 227   5                      checkXOR=rec[0] ^ rec[1];
 228   5                                      
 229   5                              if ((checkXOR==rec[2])) //校验正确 
 230   5                              {
 231   6                                      recieve();  //当作协议处理 
 232   6                                      recnum=0;       //接收清零 
 233   6      
 234   6                                      goto loop1;     //跳走 
 235   6                              }
 236   5                              else  //校验不正确 
 237   5                              {
 238   6                                      //缓冲区整体前移 
 239   6                                      for (i=1;i<recnum;i++)
 240   6                              {
 241   7                                              rec[i-1]=rec[i];
C51 COMPILER V8.08   MAIN                                                                  04/06/2012 21:53:17 PAGE 5   

 242   7                                      }
 243   6                                      recnum--;
 244   6      
 245   6                                      if (recnum<=0) //接收缓冲区没有数据了 
 246   6                                      {
 247   7                                              //计数器清零,开中断返回
 248   7                                      recnum=0;
 249   7                                              goto loop1;
 250   7                                      }
 251   6                                      else    //接收缓冲区还有数据
 252   6                                      {
 253   7                                              goto loop; //跳回去再检查 
 254   7                                      }
 255   6                              }
 256   5                      }
 257   4                      else  //不是包头 
 258   4                      {
 259   5                              //缓冲区整体前移 
 260   5                              for (i=1;i<recnum;i++)
 261   5                      {
 262   6                                      rec[i-1]=rec[i];
 263   6                              }
 264   5                              recnum--;
 265   5      
 266   5                              if (recnum<=0) //接收缓冲区没有数据了 
 267   5                              {
 268   6                                      //计数器清零,开中断返回
 269   6                               recnum=0;
 270   6                                       goto loop1;  //跳走 
 271   6                              }
 272   5                              else  //接收缓冲区还有数据 
 273   5                              {
 274   6                                      goto loop;  //跳回去再检查 
 275   6                              }
 276   5                      }
 277   4              }
 278   3              else  //<=2
 279   3              {
 280   4                      //什么也不做,开中断返回主程序,等待接收下一个数据 
 281   4              }
 282   3        }
 283   2        else //如果recnum >=5,缓冲区溢出 

⌨️ 快捷键说明

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