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

📄 text1.lst

📁 c8051f系列单片机电机控制C语言源代码
💻 LST
字号:
C51 COMPILER V7.50   TEXT1                                                                 01/17/2009 12:52:54 PAGE 1   


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

line level    source

   1          #include "c8051F040.h"
   2          #define uchar unsigned char
   3          #define uint unsigned int
   4          
   5          #define Motor_start     0x10     // 电机开启命令
   6          #define Motor_stop      0x20     // 电机停止命令
   7          #define Motor_control   0x30     // 接收数据的包头信号
   8          #define Motor_turn      0x01     // 电机正转
   9          #define Motor_Anti_turn 0x02     // 电机反转
  10          
  11          bit Motor_Flag_turn=0;           // 电机转动与停止转动的标志位
  12          
  13          sbit Motor_CP        =P4^1;
  14          sbit Motor_DIR       =P4^0;
  15          
  16          sbit LED=P1^6;  // 对LED操作的时候要先 SFRPAGE = CONFIG_PAGE;  
  17          
  18          xdata uchar uart0_data[5]={0xfe,0xcc,0x02,0x00,0x00};
  19          uint pulse_num=0x0000;  // 从串口接收到的脉冲数,脉冲数16进制高8位和低8位合并一个16位
  20          uint Time0_num_LED=0;     // 定时器中断次数,定时器每定时累积到1秒LED取反一次
  21          
  22          // uart0_data[0]= TH0
  23          // uart0_data[1]= TL0
  24          // uart0_data[2]= 0x01正转 / 0x00反转
  25          // uart0_data[3]= 脉冲数16进制高8位
  26          // uart0_data[4]= 脉冲数16进制低8位
  27          
  28          void port_init(); // 端口初始化函数
  29          void os_init();   // 系统时钟初始化,选择外部晶体振荡器
  30          void uart_init(); // 串口初始化,选择UART0
  31          void time01_init(); // 定时器1初始化,作为UART0的波特率发生器,定时器0初始化
  32          
  33          
  34          void delay(int tim)
  35          { 
  36   1        int i,j;
  37   1        for(i=0;i<tim;i++)
  38   1          {
  39   2            for(j=0;j<i;j++);
  40   2              }
  41   1      }
  42          
  43          /*************************************************************************
  44          *主函数
  45          **************************************************************************/
  46          void main()
  47          {
  48   1              WDTCN = 0xDE;                                   // 关闭看门狗
  49   1              WDTCN = 0xAD;
  50   1      
  51   1              os_init();                                      // 晶振初始化
  52   1              port_init();                                                                    // 端口初始化
  53   1              uart_init();                                    // 串口初始化,选择UART0
  54   1              time01_init();                                  // 定时器初始化,作为UART0的波特率发生器
  55   1              SFRPAGE   = CONFIG_PAGE;  
C51 COMPILER V7.50   TEXT1                                                                 01/17/2009 12:52:54 PAGE 2   

  56   1      
  57   1              IE  = 0x92;             // 开中断 bit7=EA 全局总中断
  58   1        
  59   1              while(1)
  60   1              {
  61   2            if(Motor_Flag_turn==1) 
  62   2                  {
  63   3                        SFRPAGE   = TIMER01_PAGE;
  64   3                        TR0=1; 
  65   3                      }
  66   2            if(Motor_Flag_turn==0) 
  67   2                  {
  68   3                        SFRPAGE   = TIMER01_PAGE;
  69   3                        TR0=0;
  70   3      
  71   3                        SFRPAGE   = CONFIG_PAGE;  
  72   3                        LED=1;
  73   3                      }
  74   2            if(pulse_num==0)  
  75   2                  {
  76   3                SFRPAGE = UART0_PAGE;
  77   3                    SBUF0=0x20;
  78   3                        Motor_Flag_turn=0;
  79   3                  }
  80   2            if(pulse_num!=0)  
  81   2                  {
  82   3                        Motor_Flag_turn=1;
  83   3                        SFRPAGE = UART0_PAGE;
  84   3                        SBUF0=uart0_data[2];
  85   3                  }
  86   2                delay(1000);
  87   2              }
  88   1      
  89   1      }
  90          
  91          // uart0_data[0]= TH0
  92          // uart0_data[1]= TL0
  93          // uart0_data[2]= 0x01正转 / 0x00反转
  94          // uart0_data[3]= 脉冲数16进制高8位
  95          // uart0_data[4]= 脉冲数16进制低8位
  96          void time0 (void) interrupt 1
  97          {
  98   1         char i;
  99   1      
 100   1      //   TR0=0; // 先停止计数,来赋值   
 101   1         TH0=uart0_data[0];
 102   1         TL0=uart0_data[1];  // 赋脉冲频率值
 103   1      //   TR0=1;
 104   1      
 105   1         if(Time0_num_LED==0x07d0)  // 2000*0.0005=1秒
 106   1           {
 107   2                SFRPAGE   = CONFIG_PAGE;  
 108   2                Time0_num_LED=0;
 109   2                LED=~LED;
 110   2               }
 111   1         else  Time0_num_LED++;
 112   1      
 113   1         SFRPAGE   = TIMER01_PAGE;
 114   1      
 115   1      
 116   1      
 117   1      if(pulse_num !=0)
C51 COMPILER V7.50   TEXT1                                                                 01/17/2009 12:52:54 PAGE 3   

 118   1       {
 119   2        i=uart0_data[2];
 120   2        SFRPAGE   = CONFIG_PAGE;
 121   2        if(i==Motor_turn)  // 电机正转
 122   2          {
 123   3                 SFRPAGE   = CONFIG_PAGE;
 124   3             pulse_num--;       
 125   3             Motor_DIR=1;     
 126   3             Motor_CP=~Motor_CP ;
 127   3          }
 128   2        if(i==Motor_Anti_turn) // 电机反转
 129   2          {
 130   3                 SFRPAGE   = CONFIG_PAGE;
 131   3             pulse_num--;
 132   3             Motor_DIR=0;
 133   3             Motor_CP=~Motor_CP ;
 134   3          }
 135   2       }
 136   1      }
 137          
 138          
 139          void UART0 (void) interrupt 4
 140          {
 141   1          uchar i,j;
 142   1              uint temp=0x0000;
 143   1          SFRPAGE = UART0_PAGE;
 144   1         if(TI0==1) TI0=0;    
 145   1         if(RI0==1)
 146   1              {                       
 147   2                  ET0=0; // 关定时器0中断  要置串口中断的优先级高于定时器中断         
 148   2              RI0=0;
 149   2                      i=SBUF0;
 150   2                      if(i==Motor_start) Motor_Flag_turn=1;
 151   2              if(i==Motor_stop)  Motor_Flag_turn=0;
 152   2                      if(i==Motor_control)
 153   2                        {
 154   3                          ES0=0;
 155   3                  SFRPAGE = UART0_PAGE;
 156   3                          for(j=0;j<5;j++)
 157   3                               {                          
 158   4                                  while(RI0==0);
 159   4                              RI0=0;
 160   4                      uart0_data[j]=SBUF0;
 161   4                               }
 162   3      
 163   3                   ES0=1;
 164   3                      
 165   3                               pulse_num=0x0000;      // 从串口接收到的脉冲数,脉冲数16进制高8位和低8位合并一个16位
 166   3                       temp=uart0_data[3];  // 脉冲数16进制高8位
 167   3                               temp=temp<<8;;
 168   3                       pulse_num=temp;
 169   3                               temp=0x0000;
 170   3                               temp=uart0_data[4];  // 脉冲数16进制低8位
 171   3                       pulse_num=pulse_num|temp;  
 172   3                        }
 173   2                       ET0=1; // 开定时器0中断
 174   2          }
 175   1      }
 176          
 177          /*************************************************************************
 178          *
 179          *端口初始化函数
C51 COMPILER V7.50   TEXT1                                                                 01/17/2009 12:52:54 PAGE 4   

 180          **************************************************************************/
 181          void port_init()
 182          {
 183   1          SFRPAGE   = CONFIG_PAGE;
 184   1      // XBR0,XBR1,XBR2,XBR3为I/O端口寄存器
 185   1          XBR0      = 0x04;  //bit2=1,UART0 TX0配置到P0.0,RX0配置到P0.1
 186   1          XBR2      = 0x40;  
 187   1      //bit6=1,Crossbar开启,用法:交叉开关配置时,为了防止配置过程中功能引脚
 188   1      //产生干扰,在引脚配置过程中,将XBARE清0,配置结束后,再将其置1,使交叉开关生效
 189   1      
 190   1              P0MDOUT=0X10;//P0口输出模式控制, 1:相应口为推挽输出模式
 191   1              P1MDOUT=0xff;
 192   1              P1MDIN=0xff;
 193   1              P4MDOUT=0xff;
 194   1      
 195   1        
 196   1      }
 197          /*************************************************************************
 198          *系统时钟初始化,选择外部晶体振荡器  外部22.1184M晶振
 199          **************************************************************************/
 200          void os_init()
 201          {
 202   1          int i = 0;
 203   1          SFRPAGE   = CONFIG_PAGE;
 204   1          OSCXCN    = 0x67;                                                                   //外部22.1184M晶振
 205   1      // 0110 0111,bit6-4:110为外部石英晶振模式,bit2-0:111为设置外部晶振驱动电流配置表,书150页
 206   1      
 207   1          for (i = 0; i < 3000; i++);                         //等待外部晶振稳定 
 208   1          while ((OSCXCN & 0x80) == 0); //OSCXCN的bit7位为只读,外部晶振稳定运行时为1
 209   1          CLKSEL    = 0x01; //bit7-1保留,bit0为1时SYSCLK采用外部时钟
 210   1      
 211   1      }
 212          /*************************************************************************
 213          *串口初始化,选择UART0
 214          **************************************************************************/
 215          void uart_init()
 216          {
 217   1          SFRPAGE   = UART0_PAGE;
 218   1          SCON0     = 0x50;                                           //允许uart0接收
 219   1      // 0101 0000,bit4=1为UART0接收开启,bit7-6:01为模式1,8位UART可变波特率异部传输
 220   1      }
 221          
 222          /*************************************************************************
 223          *定时器初始化,作为UART0的波特率发生器
 224          *************************************************************************/
 225          void time01_init()
 226          {
 227   1          SFRPAGE   = TIMER01_PAGE;
 228   1          TMOD=TMOD&0x0F;   
 229   1          TMOD=TMOD|0x20;     //bit5-4=T1M1-T1M0=10为T1模式为2,8位自动重载定时/计数器
 230   1          CKCON=CKCON&0XEF; //先将bit4清0,然后再赋值
 231   1          CKCON=CKCON|0X10; //bit4=1,T1时钟为系统时钟
 232   1          TH1=0xb8;   //0xb8=184: 22.1184 M /(256-184) * 1/32=9600
 233   1          ET1=0;              // 不允许T0中断
 234   1      
 235   1      //  TR1=1; 这里不能用这句,因为开了TR1,下面的定时器0的初始化对TMOD等操作无效了
 236   1      //  所以要等定时器1和定时器0都初始化完了,再开TR1和TR0置为1
 237   1      
 238   1          SFRPAGE   = TIMER01_PAGE;
 239   1          TMOD=TMOD&0xF0;
 240   1          TMOD=TMOD|0x01;  // 模式1(16位定时/计数器),仅受TR0控制
 241   1          CKCON=CKCON&0xF7;  // 先将bit3清0,然后再赋值
C51 COMPILER V7.50   TEXT1                                                                 01/17/2009 12:52:54 PAGE 5   

 242   1          CKCON=CKCON|0x00;  // bit3=0,T0时钟为系统时钟由SCA1~SCA0决定

⌨️ 快捷键说明

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