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

📄 main.lst

📁 小车跷跷板源程序
💻 LST
字号:
C51 COMPILER V8.02   MAIN                                                                  08/12/2009 11:15:29 PAGE 1   


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

line level    source

   1          #include<reg51.h>
   2          sbit p1_0=P1^0;//电机旋转控制
   3          sbit p1_1=P1^1;//电机旋转控制
   4          sbit p1_2=P1^2;//电机使能控制
   5          sbit p1_3=P1^3;//电机旋转控制
   6          sbit p1_4=P1^4;//电机旋转控制
   7          sbit p1_5=P1^5;//电机使能控制
   8          sbit E_CLK=P1^6;//LCD显示。时钟输入
   9          sbit RW_SID=P1^7;//LCD显示。数据输入
  10          sbit p2_0=P2^0;//前进循迹方向信号
  11          sbit p2_1=P2^1;//前进循迹方向信号
  12          sbit p2_2=P2^2;//前进循迹方向信号
  13          sbit p2_3=P2^3;//跷跷板平衡信号
  14          sbit p2_4=P2^4;//跷跷板平衡信号
  15          sbit p2_5=P2^5;//跷跷板平衡信号
  16          sbit p2_6=P2^6;//后退循迹方向信号
  17          sbit p2_7=P2^7;//避障传感器信号
  18          sbit p3_2=P3^2;//温度传感器信号
  19          sbit p3_4=P3^4;//蜂鸣器信号控制
  20          sbit p3_6=P3^6;//状态切换键信号
  21          sbit p3_7=P3^7;//暂停/开始键信号
  22          
  23          
  24          /****************************************显示用变量*******************************************************
             -******/
  25          char sec1=48/*显示,秒十分位*/,sec2=48/*显示,秒个位*/,sec3=48/*显示,秒十位*/,sec4=48/*显示,秒百位*/;
  26          char sd1=48/*显示,速度十分位*/,sd2=48/*显示,速度个位*/,sd3=48/*显示,速度十位*/,sd4=48/*显示,速度百位*/
             -;
  27          char lc1=48/*显示,路程百分位*/,lc2=48/*显示,路程十分位*/,lc3=48/*显示,路程个位*/,lc4=48/*显示,路程十位
             -*/;
  28          int xszt1=0xD1/*显示,状态*/,xszt2=0xAD/*显示,状态*/,xszt3=0xBC/*显示,状态*/,xszt4=0xA3/*显示,状态*/;
  29          
  30          /****************************************跷跷板平衡用变量*************************************************
             -******/
  31          long qj=10/*前进参数*/,ht=1/*后退参数*/,tz=0/*平衡状态参数*/,bf=600/*步进*/;
  32          int cs=0/*跷跷板翻的次数*/,fdd=6/*防抖动系数*/,fx=0/*前一次运动方向,标志*/,ph=0/*平衡的持久度*/;
  33          int fy=0/*反应时间*/,cf=1/*冲锋标志*/,bc=0/*是否补偿,标志*/,phzt=0/*平衡状态*/,dd=0/*等待时间*/;
  34          
  35          /****************************************通用变量*********************************************************
             -*******/
  36          int a/**/,b/**/,l/**/,r/**/,i/**/,j,m=0/**/,k/**/,zt=1/*循迹、避障、平衡状态标志*/;
  37          int setnumber=8/*PWM占空比调整*/,n/*一秒种转了几圈*/,t/*计时用,每0.1秒判断标志,及时间传递显示的过度量*/;
  38          int tk/*时间计数*/,vt/*速度传递显示的过渡量*/,st/*路程传递显示的过渡量*/,yx/*小车运行标志*/,TC=1/*停车标志
             -*/;
  39          float s/*路程计算量*/,c=0.9742647/*轮子1/4圈的长度(cm)*/;
  40          double v/*速度计算量*/;
  41          
  42          #define uchar unsigned char
  43          #include<delay1ms.c>
  44          #include<xianshi.c>
  45          #include<xunji.c>
  46          #include<htxunji.c>
  47          #include<pheng.c>
  48          #include<bizhang1.c>
  49          #include<lcd3.c>
C51 COMPILER V8.02   MAIN                                                                  08/12/2009 11:15:29 PAGE 2   

  50          
  51          timer0() interrupt 1 using 1
  52          {       TH0=0xFc;
  53   1              TL0=0x18;
  54   1              r++;
  55   1              t++;
  56   1      if(TC==1)
  57   1      {       if(b==1)
  58   2              {
  59   3                      if(m<setnumber)
  60   3                      {       p1_2=0;
  61   4                              p1_5=0;
  62   4                      }
  63   3              else
  64   3                      {       p1_2=1;
  65   4                              p1_5=1;
  66   4                      }
  67   3              if (m>=10)
  68   3                      m=0;
  69   3                      m++;
  70   3              }
  71   2              else if(b==0)
  72   2              {               if(l<setnumber+1)
  73   3                      {       p1_2=0;
  74   4                              p1_5=0;
  75   4                      }
  76   3                      else
  77   3                      {       p1_2=1;
  78   4      
  79   4                      }
  80   3                      if (l>setnumber+2)
  81   3                      p1_5=1;
  82   3      
  83   3              if (l>10)
  84   3              l=0;
  85   3          l++;
  86   3              }
  87   2              }
  88   1                      if(t==100)
  89   1                      {               if(phzt!=1&&phzt!=3||zt!=3)
  90   2                                              tk++;
  91   2                                      else                     //若在状态3(跷跷板平衡状态)的平衡停表情况
  92   2                                              dd++;            //
  93   2                                      if(dd==50)               //
  94   2                                      {       if(phzt==1)      //
  95   3                                                      phzt=2;  //
  96   3                                              if(phzt==3)      //
  97   3                                                      phzt=4;  //打破平衡,准备下跷跷板
  98   3                                              tk=0;            //重新计时
  99   3                                              dd=0;
 100   3                                      }
 101   2      
 102   2                      if (tk>=10000)          //每
 103   2                              tk=0;                   //0.1
 104   2                      t=tk;                           //秒
 105   2                      sec4=(t/1000)+0x30;     //累
 106   2                      t=t%1000;                       //加
 107   2                      sec3=(t/100)+0x30;      //时
 108   2                      t=t%100;                        //间
 109   2                      sec2=(t/10)+0x30;       //一
 110   2                      t=t%10;                         //次
 111   2                      sec1=t+0x30;            //
C51 COMPILER V8.02   MAIN                                                                  08/12/2009 11:15:29 PAGE 3   

 112   2                      t=0;                            //
 113   2                      }
 114   1              if(r==1000)
 115   1                      {               r=0;                            //每
 116   2                                      v=n*c;                          //一
 117   2                                      v=v*10;                         //秒
 118   2                      vt=v;                           //计
 119   2                                      if(vt>=10000)           //算
 120   2                                      vt=9999;                        //速
 121   2                      sd4=(vt/1000)+0x30;     //度
 122   2                      vt=vt%1000;                     //一
 123   2                      sd3=(vt/100)+0x30;      //次
 124   2                      vt=vt%100;                      //
 125   2                      sd2=(vt/10)+0x30;       //
 126   2                      vt=vt%10;                       //
 127   2                      sd1=vt+0x30;            //
 128   2                                  n=0;                                //
 129   2                      }
 130   1      
 131   1      }
 132          
 133          
 134          timer1() interrupt 3 using 2
 135           {      if(a==3)                                        //在前进的时候。轮子每1/4周累加路程一次
 136   1                      {        n++;                           //在后退的时候。轮子每1/4周减少路程一次
 137   2                                      s=s+c;                          //
 138   2                       }                                                      //
 139   1                       else if(a==4)                          //
 140   1                                      s=s-c;                          //
 141   1                                      if(s>=10000||s<=0)      //
 142   1                                      s=0;                            //
 143   1                      st=s;                           //
 144   1                      lc4=(st/1000)+0x30;     //
 145   1                              st=st%1000;                     //
 146   1                      lc3=(st/100)+0x30;      //
 147   1                      st=st%100;                      //
 148   1                      lc2=(st/10)+0x30;       //
 149   1                      st=st%10;                       //
 150   1                      lc1=st+0x30;            //
 151   1                       
 152   1      }
 153          
 154          main()
 155          {       yx=0;/*是否运行,标志位*/
 156   1              kaiji();
 157   1              TMOD=0x61;       /**************************/
 158   1              TH0=0xFC;        /*                                            */
 159   1              TL0=0x18;        /*                        */
 160   1              TL1=-1;          /*定时计数器,装初值,打开*/
 161   1              TH1=-1;          /*                        */
 162   1              IP=0x08;         /*                        */
 163   1              EA=0;ET0=1;ET1=1;/*                        */
 164   1              TR0=1;TR1=1;     /**************************/ 
 165   1              initlcm();/*显示初始化*/   
 166   1              for(;;)
 167   1              {       xianshi();
 168   2                  if(p3_7==0)//暂停(启动)?
 169   2                         {
 170   3                                      yx++;     /*******************/
 171   3                                      yx=(yx%2);/*                 */
 172   3                                      EA=yx;    /*                 */
 173   3                                      TC=yx;    /*切换暂停/启动状态*/
C51 COMPILER V8.02   MAIN                                                                  08/12/2009 11:15:29 PAGE 4   

 174   3                                      p1_2=!yx; /*                 */
 175   3                                      p1_5=!yx; /*******************/
 176   3                                      delay1ms(50,1000);/*延时防抖动*/
 177   3                         }
 178   2                       if(p3_6==0)//切换状态?
 179   2                       {              yx=0;  //停
 180   3                                      EA=0;  //止
 181   3                                      TC=0;  //运
 182   3                                      p1_2=1;//行
 183   3                                      p1_5=1;//
 184   3                                      if(zt<3)  /**********/
 185   3                                              zt++; /*切换状态*/
 186   3                                      else zt=1;/**********/
 187   3                                      if(zt==1)
 188   3                                      {       xszt1=0xD1;//
 189   4                                              xszt2=0xAD;//切
 190   4                                              xszt3=0xBC;//换
 191   4                                              xszt4=0xA3;//显
 192   4                                      }                          //示
 193   3                                      if(zt==2)          //状
 194   3                                      {       xszt1=0xB1;//态
 195   4                                              xszt2=0xDC;//
 196   4                                              xszt3=0xD5;//
 197   4                                              xszt4=0xCF;//
 198   4                                      }                          //
 199   3                                      if(zt==3)          //
 200   3                                      {       xszt1=0xC6;//
 201   4                                              xszt2=0xBD;//
 202   4                                              xszt3=0xBA;//
 203   4                                              xszt4=0xE2;//
 204   4                                      }
 205   3                                      delay1ms(50,1000);/*延时防抖动*/
 206   3                       }
 207   2                       if(yx==1)//运行
 208   2                       {              if(zt==1)
 209   3                                              xunji();//状态1,则循迹
 210   3                                      else if(zt==2)
 211   3                                              bizhang();//状态2,则避障
 212   3                                      else if(zt==3)
 213   3                                              pheng();//状态3,则跷跷板平衡
 214   3                       }
 215   2              }
 216   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   4065    ----
   CONSTANT SIZE    =    195    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =    100       6
   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 + -