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

📄 xin.lst

📁 动态车库最后版本20120311
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.06   XIN                                                                   03/11/2012 17:31:57 PAGE 1   


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

stmt level    source

   1          #include<reg51.h>    //包含单片机寄存器的头文件
   2          #include<intrins.h>  //包含_nop_()函数定义的头文件
   3          //x5045引脚定义
   4          sbit SCK=P2^2;       //将SCK位定义为P3.4引脚
   5          sbit SI=P2^3;        //将SI位定义为P3.5引脚
   6          sbit SO=P2^1;        //将SO位定义为P3.6引脚
   7          sbit CS=P2^0;        //将SCK位定义为P3.7引脚
   8          //功能变量定义
   9          #define WREN 0x06    //写使能锁存器允许
  10          #define WRDI 0x04    //写使能锁存器禁止
  11          #define WRSR 0x01    //写状态寄存器
  12          #define READ 0x03    //读出
  13          #define WRITE 0x02   //写入
  14          #define uchar unsigned char
  15          #define uint unsigned int
  16          /***************电动机控制定义*******************/
  17          sbit powder1L=P0^0;//普通电机1低电平正转
  18          sbit powder1R=P0^1;//普通电机1低电平反转
  19          sbit powder2L=P0^2;//步进电机2低电平正转
  20          sbit powder2R=P0^3;//步进电机2低电平反转
  21          sbit powder3L=P0^4;//步进电机3低电平正转
  22          sbit powder3R=P0^5;//步进电机3低电平反转
  23          sbit powder4L=P0^6;//步进电机4低电平正转
  24          sbit powder4R=P0^7;//步进电机4低电平反转
  25          sbit powder5L=P3^2;//步进电机5低电平正转
  26          sbit powder5R=P3^3;//步进电机5低电平反转
  27          /*****************步进电机脉冲信号**************/
  28          sbit P25=P2^5;
  29          sbit P26=P2^6;
  30          sbit P27=P2^7;
  31          /********************行程开关定义**************/
  32          sbit K1=P1^0;
  33          sbit K2=P1^1;
  34          sbit K3=P1^2;
  35          sbit K4=P1^3;
  36          sbit K5=P1^4;
  37          sbit K6=P1^5;
  38          sbit K7=P1^6;
  39          sbit K8=P1^7;
  40          sbit K9=P3^0;
  41          sbit K10=P3^1;
  42          sbit P24=P2^4;
  43          /******************LED定义*////
  44          sbit LED1=P3^4;
  45          sbit LED2=P3^5;
  46          /*****************************************************
  47          函数功能:延时1ms
  48          (3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒
  49          ***************************************************/
  50          void delay1ms()
  51          {
  52   1         unsigned char i,j;
  53   1       
  54   1        for(i=0;i<10;i++)
  55   1         for(j=0;j<33;j++);
C51 COMPILER V7.06   XIN                                                                   03/11/2012 17:31:57 PAGE 2   

  56   1            
  57   1       }
  58          /*****************************************************
  59          函数功能:延时若干毫秒
  60          入口参数:n
  61          ***************************************************/
  62           void delayms(unsigned char n)
  63           {
  64   1         unsigned char i;
  65   1       for(i=0;i<n;i++)
  66   1          delay1ms();
  67   1       }
  68           void delay4s()
  69          { 
  70   1        unsigned char h,i,j,k; 
  71   1      
  72   1      
  73   1        for(h=20;h>0;h--) 
  74   1      
  75   1        for(i=4;i>0;i--) 
  76   1      
  77   1        for(j=116;j>0;j--) 
  78   1      
  79   1        for(k=214;k>0;k--);
  80   1      
  81   1      
  82   1      }
  83          /*****************************************************
  84          函数功能:从X5045的当前地址读出数据
  85          出口参数:x
  86          ***************************************************/
  87          unsigned char ReadCurrent(void)
  88          {
  89   1         unsigned char i;
  90   1       unsigned char x=0x00;      //储存从X5045中读出的数据
  91   1       SCK=1;                     //将SCK置于已知的高电平状态
  92   1         for(i=0;i<8;i++)
  93   1       {
  94   2          SCK=1;                 //拉高SCK
  95   2          SCK=0;                 //在SCK的下降沿输出数据 
  96   2          x<<=1;  //将x中的各二进位向左移一位,因为首先读出的是字节的最高位数据    
  97   2        x|=(unsigned char)SO;  //将SO上的数据通过按位"或"运算存入 x      
  98   2       }
  99   1       return(x);   //将读取的数据返回
 100   1       }
 101          /*****************************************************
 102          函数功能:写数据到X5045的当前地址
 103          入口参数:dat
 104          ***************************************************/
 105          void WriteCurrent(unsigned char dat)
 106          {
 107   1         unsigned char i;
 108   1       SCK=0;                 //将SCK置于已知的低电平状态
 109   1        for(i=0;i<8;i++)  // 循环移入8个位
 110   1       {
 111   2        SI=(bit)(dat&0x80);   //通过按位"与"运算将最高位数据送到S
 112   2                            //因为传送时高位在前,低位在后
 113   2        SCK=0;
 114   2        SCK=1;               //在SCK上升沿写入数据
 115   2          dat<<=1;   //将y中的各二进位向左移一位,因为首先写入的是字节的最高位
 116   2        }
 117   1      }
C51 COMPILER V7.06   XIN                                                                   03/11/2012 17:31:57 PAGE 3   

 118          /*****************************************************
 119          函数功能:写状态寄存器 ,可以设置看门狗的溢出时间及数据保护
 120          入口参数:rs;  //储存寄存器状态值
 121          ***************************************************/
 122          void WriteSR(unsigned char rs)
 123          {
 124   1        CS=0;                 //拉低CS,选中X5045
 125   1        WriteCurrent(WREN);   //写使能锁存器允许
 126   1        CS=1;                 //拉高CS
 127   1        CS=0;                 //重新拉低CS,否则下面的写寄存器状态指令将被丢弃
 128   1        WriteCurrent(WRSR);   //写状态寄存器
 129   1        WriteCurrent(rs);     //写入新设定的寄存器状态值
 130   1        CS=1;                 //拉高CS
 131   1      }
 132          /*****************************************************
 133          函数功能:写数据到X5045的指定地址
 134          入口参数:addr
 135          ***************************************************/
 136          void WriteSet(unsigned char dat,unsigned char addr)
 137          {
 138   1         SCK=0;                 //将SCK置于已知状态
 139   1         CS=0;                  //拉低CS,选中X5045
 140   1       WriteCurrent(WREN);    //写使能锁存器允许
 141   1       CS=1;                  //拉高CS
 142   1         CS=0;                  //重新拉低CS,否则下面的写入指令将被丢弃
 143   1       WriteCurrent(WRITE);   //写入指令
 144   1       WriteCurrent(addr);    //写入指定地址
 145   1       WriteCurrent(dat);     //写入数据
 146   1       CS=1;                  //拉高CS
 147   1         SCK=0;                 //将SCK置于已知状态
 148   1      }
 149          /*****************************************************
 150          函数功能:从X5045的指定地址读出数据
 151          入口参数:addr
 152          出口参数:dat
 153          ***************************************************/
 154          unsigned char ReadSet(unsigned char addr)
 155          {
 156   1       unsigned char dat;
 157   1       SCK=0;                 //将SCK置于已知状态
 158   1       CS=0;                  //拉低CS,选中X5045
 159   1       WriteCurrent(READ);   //开始读
 160   1       WriteCurrent(addr);   //写入指定地址
 161   1       dat=ReadCurrent();    //读出数据
 162   1       CS=1;                 //拉高CS
 163   1       SCK=0;                //将SCK置于已知状态
 164   1       return dat;           //返回读出的数据
 165   1       }
 166          /*****************************************************
 167          函数功能:看门狗复位程序
 168          ***************************************************/
 169          void WatchDog(void)
 170          {
 171   1       CS=1;    //拉高CS
 172   1       CS=0;    //CS引脚的一个下降沿复位看门狗定时器
 173   1       CS=1;    //拉高CS
 174   1      }
 175          /*****************************************************
 176          函数功能:主程序
 177          ***************************************************/
 178          void main(void)
 179          { uchar V; 
C51 COMPILER V7.06   XIN                                                                   03/11/2012 17:31:57 PAGE 4   

 180   1      
 181   1        V=ReadSet(0x10);
 182   1         delayms(10);
 183   1         WriteSR(0x12);        //写状态寄存器
 184   1         delayms(10);
 185   1         TMOD=0x21 ; 
 186   1         TH0=0xfe ; 
 187   1         TL0=0xe8 ; //280微秒
 188   1         TH1=0x88 ; //120微秒
 189   1         TL1=0x88 ; 
 190   1          EA=1; 
 191   1          ET0=1; 
 192   1          ET1=1; 
 193   1          TR0=1 ;
 194   1      
 195   1      
 196   1        
 197   1        
 198   1                       
 199   1        if(V==1)
 200   1               { powder1L=0; 
 201   2                delay4s();
 202   2                }
 203   1        if(V==2) 
 204   1       
 205   1        {
 206   2         if(K1==1)
 207   2       { 
 208   3        powder1L=1;
 209   3        delayms(200);
 210   3        powder2L=0;//第2台电机正转
 211   3        delay4s();//未定的数值移动若干距离
 212   3        powder2L=1;
 213   3        delayms(200);
 214   3        powder3L=0;//步时电机3正转触发单片机板进行控制
 215   3        delayms(100);
 216   3        powder3L=1;
 217   3        delayms(200);
 218   3        powder4L=0;//旋转后开始上升
 219   3      }
 220   2      
 221   2      }
 222   1        if(V==3)
 223   1      { powder1L=1;
 224   2        delayms(200);
 225   2        powder2L=0;//第2台电机正转
 226   2        delay4s();//未定的数值移动若干距离
 227   2        powder2L=1;
 228   2        delayms(200);
 229   2        powder3L=0;//步时电机3正转触发单片机板进行控制
 230   2        delayms(100);
 231   2        powder3L=1;
 232   2        delayms(200);
 233   2        powder4L=0;//旋转后开始上升
 234   2      }
 235   1        if(V==4)
 236   1       { powder4L=1;
 237   2       delayms(200);
 238   2       powder2L=0;//电步进电机2开始工作
 239   2      }
 240   1        if(V==5)//遇行程开关K6电机2停止工作
 241   1       {  
C51 COMPILER V7.06   XIN                                                                   03/11/2012 17:31:57 PAGE 5   

 242   2        powder2L=1;
 243   2       delayms(200);
 244   2       powder5L=0;//电机1第二次正转
 245   2       }
 246   1      if(V==6)//遇行程开关K8,电机1停止工作
 247   1      { 
 248   2        powder5L=1;
 249   2        delay4s();//电机1延时4秒后反转
 250   2        powder5R=0;
 251   2      
 252   2      //遇K7电机1停止工作
 253   2       delay4s();
 254   2        powder5R=1;
 255   2         delayms(200);
 256   2         powder2L=0;//第2台电机反转
 257   2         powder2R=0;
 258   2        delay4s();//未知数值 
 259   2         powder2L=1;
 260   2         powder2R=1;
 261   2        delayms(200);
 262   2       powder4R=0;//第4台电机反转
 263   2       powder4L=0;
 264   2       }
 265   1      
 266   1        if(V==7)
 267   1      { powder4R=1;
 268   2       powder4L=1;
 269   2      delayms(200);
 270   2       powder3R=0;//第三台电动机反旋转
 271   2       powder3L=0;

⌨️ 快捷键说明

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