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

📄 tyj.lst

📁 单片机智能化产品-c语言实例详解,里面有很多程序,讲得很详细,绝对可以直接用,还有电路图pcb文件!详情请看这本书目录
💻 LST
字号:
C51 COMPILER V7.06   TYJ                                                                   11/18/2005 20:34:04 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE TYJ
OBJECT MODULE PLACED IN tyj.OBJ
COMPILER INVOKED BY: C:\KEIL\C51\BIN\C51.EXE tyj.c BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          #include <AT892051.H>//11.0592MHz晶振
   2          #define uchar unsigned char
   3          #define uint unsigned int
   4          /***************************************/
   5          bit on_off=0;//开/关机标志,"1"开,"0"关
   6          bit over30s=0;//30秒溢出标志,"1"溢出,"0"未溢出
   7          bit time30s=0;//30秒定时启动标志,"1"启动,"0"不启动
   8          bit over3m=0;//3分钟溢出标志,"1"溢出,"0"未溢出
   9          bit time3m=0;//3分钟定时启动标志,"1"启动,"0"不启动
  10          bit drv_flag=0;//驱动板启动标志,"1"已启动,"0"已关闭
  11          bit off_flag=0;//允许关机标志,"1"允许关机,"0"不允许关机
  12          bit rled_flashf=0;//红发光管快闪启动标志,"1"启动,"0"关闭
  13          bit rled_flashs=0;//红发光管慢闪启动标志,"1"启动,"0"关闭
  14          bit gled_flash=0;//绿发光管慢闪启动标志,"1"启动,"0"关闭
  15          bit off10s_flag=0;//关机时10秒计时标志,"1"启动计时10秒,"0"关闭计时
  16          uchar cnt=0;            // 30秒软件计数器
  17          uchar key_flag=0;//键按下计数器
  18          uint counter=0;// 3分钟软件计数器
  19          
  20          /***************以下为I/O端口定义*****************/
  21          sbit inc=P3^4;//焦距增加值按键
  22          sbit dec=P3^5;//焦距减少值按键
  23          sbit m0=P1^6;//焦距电机正转输出
  24          sbit m1=P1^5;//焦距电机反转输出
  25          sbit rled=P1^2;//输出至红发光管
  26          sbit gled=P1^3;//输出至绿发光管
  27          sbit out_drv=P1^4;//输出负脉冲至驱动板
  28          sbit out_light=P3^1;//输出控制220V光源继电器
  29          sbit out_fan=P3^0; //输出控制12V风扇继电器
  30          sbit check_tem=P3^6;//温度检测端
  31          sbit check_light=P3^7;//光源检测端
  32          
  33          /**********函数列表************/
  34          void start();
  35          void drv();
  36          void fun_light();
  37          void fun_tem();
  38          void fun1();
  39          void init();
  40          void init_timer1();
  41          void delay(uint k);
  42          void drv_mot(void);
  43          
  44          /***********主函数************/
  45          void main(void)
  46          {       init();//上电时初始化
  47   1          while(1)//无限循环
  48   1        {     
  49   2              if(on_off)//若启动标志为1
  50   2              {       
  51   3             if(!off_flag){start();off_flag=1;}// 若原来停机等待,则启动
  52   3                              check_tem=1;check_light=1;// 温度与光源检测端置为输入状态
  53   3                      if((!check_tem)&&(!check_light))//若光源与温度正常
  54   3                  {
  55   4                                      if(drv_flag)//若已启动驱动板
C51 COMPILER V7.06   TYJ                                                                   11/18/2005 20:34:04 PAGE 2   

  56   4                                      {drv_mot();//调用驱动焦距电机的子程序,进行调焦
  57   5                                      gled=0;rled=1;//正常工作过程,绿灯亮
  58   5                                      gled_flash=0;rled_flashf=0;rled_flashs=0;// 绿灯慢闪标志复位,
  59   5      //红灯快、慢闪标志复位
  60   5                                      out_light=0;// 投影光源亮
  61   5                                      out_fan=0;// 冷却风扇转
  62   5                                      }
  63   4                              }
  64   3              
  65   3                       if(check_tem)fun_tem();//若温度不正常,调用fun_tem()子程序处理
  66   3                      if(check_light)fun_light();//若光源不正常,调用fun_light()子程序处理
  67   3               }
  68   2              else//否则启动标志为0,进入关机或待机过程
  69   2              {       
  70   3                      if(off_flag)// 若关机标志有效
  71   3                      {if(drv_flag)fun1();}//若已启动驱动板,进入关机过程
  72   3              rled=0;gled=1;// 正常待机过程
  73   3              out_light=1;// 投影光源灭
  74   3              out_fan=1;// 冷却风扇停转
  75   3                      
  76   3              }
  77   2        }
  78   1      }
  79          
  80          /*******************初始化子函数**********************/
  81          void init()
  82          {inc=1;dec=1;m0=1;m1=1;//
  83   1      check_tem=1;
  84   1      check_light=1;
  85   1      P3_2=1;P3_3=1;
  86   1      init_timer1();
  87   1      IT0=1;IT1=1;
  88   1      /*====================*/
  89   1      on_off=0;off_flag=0;drv_flag=0;
  90   1      off10s_flag=0;
  91   1      }
  92          
  93          
  94          /********************定时器1初始化***********************/
  95          void init_timer1()
  96          {
  97   1      TMOD=0x11;
  98   1      TH0=-(48000/256);
  99   1      TL0=-(48000%256);
 100   1      IE=0x8f;
 101   1      TR1=1;
 102   1      }
 103          
 104          
 105          /*********************定时器1中断服务子函数***********************/
 106          void time1(void) interrupt 3 using 1 
 107          {
 108   1      TH0=-(48000/256);// 重装定时初值
 109   1      TL0=-(48000%256);
 110   1      /*--------------------*/
 111   1      if(gled_flash)// 若绿灯慢闪标志有效
 112   1      {cnt++;//开始计数
 113   2              if(cnt>=10){gled=!gled;cnt=0;}// 每0.5秒绿灯闪动一次
 114   2      }
 115   1      /*---------------------*/
 116   1      if(rled_flashs)// 若红灯慢闪标志有效
 117   1      {cnt++;
C51 COMPILER V7.06   TYJ                                                                   11/18/2005 20:34:04 PAGE 3   

 118   2              if(cnt>=10){rled=!rled;cnt=0;} // 每0.5秒红灯闪动一次
 119   2      }
 120   1      /*-------------------------*/
 121   1      if(rled_flashf)// 若红灯快闪标志有效
 122   1      {cnt++;
 123   2              if(cnt>=2){rled=!rled;cnt=0;} // 每0.1秒红灯闪动一次
 124   2      }
 125   1      /*-----------------------*/
 126   1      if(time3m) // 若3分启动标志有效
 127   1      {counter++;//开始计数
 128   2              if(counter>=2510){over3m=1;counter=0;}//3分到,则3分溢出标志置位
 129   2      }
 130   1      /*------------------------*/
 131   1      if(time30s) // 若30秒启动标志有效
 132   1      {counter++;//开始计数
 133   2              if(counter>=400){over30s=1;counter=0;} //30秒到,则30秒溢出标志置位
 134   2      }
 135   1      /*--------------------*/
 136   1      if(off10s_flag) // 若10秒关机标志有效
 137   1      {counter++;//开始计数
 138   2      if(counter>=130){off10s_flag=0;key_flag=1;counter=0;} 
 139   2      //若10秒内无第二次关机按键动作,则键计数器置1,继续保持开机工作
 140   2      }
 141   1      }
 142          
 143          /*******************外中断0服务子函数**********************/
 144          void zd_int0() interrupt 0 using 2//遥控控制开/关机
 145          {
 146   1      on_off=!on_off; //              开/关机标志取反,"1"开,"0"关
 147   1      }
 148          
 149          /*********************外中断1服务子函数********************/
 150          void zd_int1() interrupt 2 using 3//手动控制开/关机
 151          {
 152   1      delay(5);// 延时5mS再判
 153   1      if(P3_3==0)key_flag++;//若键依旧按下,键计数器递加
 154   1      if(key_flag==1){on_off=1;off10s_flag=0;}// 键计数器为1,则开机
 155   1      if(key_flag>=3)key_flag=0;// 键计数器的范围为0-2,即0-20秒有效
 156   1      if(key_flag==0){on_off=0;off10s_flag=0;} // 键计数器为0,则关机等待
 157   1      if(key_flag==2)off10s_flag=1;// 键计数器为2,进入关机状态
 158   1      /*机器已工作情况下,10秒内连按二次关机键,键计数器为2,进入关机。否则,10秒一到,键计数器又置1继续进入工作
             -。因为电脑认为可能有人不慎碰到关机键*/
 159   1              while(P3_3==0)// 等待释放键后退出中断子函数
 160   1              {delay(5);
 161   2              if(P3_3==1)break;}
 162   1      }
 163          
 164          /********************延时k*1mS子函数*********************/
 165          void delay(uint k)
 166          {
 167   1      uint i,j;
 168   1      for(i=0;i<k;i++){
 169   2      for(j=0;j<121;j++)
 170   2      {;}}
 171   1      }
 172          
 173          /**********************启动子函数**********************/
 174          void start()
 175          {   gled_flash=0;rled_flashf=0;rled_flashs=0;// 复位相关标志
 176   1              gled=0;rled=1;// 绿灯亮
 177   1          out_light=0;// 点亮投影灯光源
 178   1          out_fan=0;// 冷却风扇启动
C51 COMPILER V7.06   TYJ                                                                   11/18/2005 20:34:04 PAGE 4   

 179   1          time30s=1;//30秒标志置位
 180   1              EX0=0;EX1=0;// 开放INT0、INT1中断
 181   1          while(!over30s);// 等延时30秒
 182   1          time30s=0;// 相关标志复位
 183   1          over30s=0;
 184   1          if(!check_light)// 若光源检测端为低电平,即光源正常发光
 185   1              {
 186   2                      if(!drv_flag){drv();drv_flag=1;}// 若驱动板启动标志为"0" (尚未启动),
 187   2      //调用触发子函数
 188   2              }
 189   1              EX0=1;EX1=1;// 关闭外中断
 190   1      }
 191          
 192          /************************产生触发驱动板的负脉冲子函数*************************/
 193          void drv()// 产生1mS的负脉冲
 194          {
 195   1      out_drv=1; 
 196   1      out_drv=0;
 197   1      delay(1);
 198   1      out_drv=1;
 199   1      }
 200          
 201          /***********************光源不正常处理子函数**************************/
 202          void fun_light()
 203          {       if(drv_flag){drv();drv_flag=0;}
 204   1      out_fan=0;
 205   1      out_light=1;gled=1;     
 206   1      rled_flashf=0;
 207   1      rled_flashs=1;
 208   1              over3m=0;
 209   1              time3m=1;
 210   1              EX0=0;EX1=0;
 211   1              while(!over3m){out_light=1;out_fan=0;}
 212   1              EX0=1;EX1=1;
 213   1              time3m=0;
 214   1              over3m=0;
 215   1              on_off=0;
 216   1                      while(!on_off)
 217   1                      {out_fan=1;out_light=1;gled=1;off_flag=0;key_flag=0;
 218   2                      rled_flashf=0;rled_flashs=1;gled_flash=0;off10s_flag=0;
 219   2                      if(on_off){rled_flashs=0;break;}
 220   2                      }
 221   1      }
 222          
 223          /*************************温度不正常处理*****************************/
 224          void fun_tem()
 225          {       if(drv_flag){drv();drv_flag=0;}
 226   1      out_fan=0;
 227   1      out_light=1;gled=1;     
 228   1      rled_flashf=1;
 229   1      rled_flashs=0;
 230   1              over3m=0;
 231   1              time3m=1;
 232   1              EX0=0;EX1=0;
 233   1              while(!over3m){out_light=1;out_fan=0;}
 234   1              EX0=1;EX1=1;
 235   1              time3m=0;
 236   1              over3m=0;
 237   1              on_off=0;
 238   1                      while(!on_off)
 239   1                      {out_fan=1;out_light=1;gled=1;off_flag=0;key_flag=0;
 240   2                      rled_flashf=1;rled_flashs=0;gled_flash=0;off10s_flag=0;
C51 COMPILER V7.06   TYJ                                                                   11/18/2005 20:34:04 PAGE 5   

 241   2                      if(on_off){rled_flashf=0;break;}
 242   2                      }
 243   1      }
 244          
 245          /********************关机子函数*********************/ 
 246          void fun1()
 247          {       out_light=1;// 关闭光源
 248   1              if(drv_flag){drv();drv_flag=0;} // 若驱动板启动标志为"1"(已经启动工作),
 249   1      //调用触发子函数发一个脉冲令其关机
 250   1              over3m=0;// 清除3分溢出标志
 251   1              time3m=1;// 启动3分计时
 252   1              EX0=0;EX1=0;// 关闭外中断
 253   1              while(!over3m){gled_flash=1;rled_flashf=0;rled_flashs=0;rled=1;out_fan=0;} /*等待
 254   1      3分延时,同时打开风扇冷却*/
 255   1              EX0=1;EX1=1; // 3分过,打开外中断
 256   1              over3m=0; //清除标志
 257   1              time3m=0; 
 258   1              off_flag=0;
 259   1              out_light=1;
 260   1              out_fan=1;
 261   1              gled_flash=0;
 262   1              rled_flashf=0;rled_flashs=0;
 263   1              gled=1;
 264   1              rled=0;
 265   1      }
 266          
 267          /**********驱动焦距电机的子函数*************/
 268          void drv_mot(void)
 269          {       
 270   1              if((!inc)||(!dec))
 271   1              {delay(10);
 272   2                      if(!inc){m0=0;m1=1;}
 273   2                      else if(!dec) 
 274   2                              {m1=0;m0=1;}
 275   2                              else {m1=1;m0=1;}
 276   2              }
 277   1              if((inc)&&(dec)){m1=1;m0=1;}
 278   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    702    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      4    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =     11    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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