main.lst

来自「很实用的单片机例程」· LST 代码 · 共 246 行

LST
246
字号
C51 COMPILER V8.06   MAIN                                                                  12/02/2011 19:20:44 PAGE 1   


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

line level    source

   1          /**********************HL-1实验开发板例程************************
   2          *  平台:HL-1 V6.2 + Keil U3 + STC89C52RD
   3          *  名称:步进电机
   4          *  公司:慧净电子科技有限公司
   5          *  淘宝:http://shop37031453.taobao.com       
   6          *  网站:www.hlmcu.com
   7          *  编写:慧净
   8          *  日期:2008-8-08
   9          *   QQ : 121350852 398115088
  10          *  晶振:11.0592MHZ
  11          *  说明:免费开源,不提供源代码分析,有问题直接到慧净论坛交流
  12          *  论坛:http://hjdz.5d6d.com
  13          ******************************************************************/
  14          //本实验需要购买步进电机模块
  15          /*-----------------------------------------------
  16            名称:步进电机
  17            内容:本程序用于测试4相步进电机常规驱动 4个按键分别控制加速、减速、开启、停止
  18                  
  19                          数码管显示 01-18速度等级,数字越大,速度越大
  20           ------------------------------------------------*/
  21          
  22          #include <reg52.h>
  23          
  24          #define KeyPort P3
  25          #define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换
  26          sbit LATCH1=P2^6;//定义锁存使能端口 段锁存
  27          sbit LATCH2=P2^7;//                 位锁存
  28          
  29          unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9
  30          unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位
             -码
  31          unsigned char TempData[8]; //存储显示值的全局变量
  32          
  33          sbit A1=P1^0; //定义步进电机连接端口
  34          sbit B1=P1^1;
  35          sbit C1=P1^2;
  36          sbit D1=P1^3;
  37          
  38          
  39          #define Coil_AB1 {A1=1;B1=1;C1=0;D1=0;}//AB相通电,其他相断电
  40          #define Coil_BC1 {A1=0;B1=1;C1=1;D1=0;}//BC相通电,其他相断电
  41          #define Coil_CD1 {A1=0;B1=0;C1=1;D1=1;}//CD相通电,其他相断电
  42          #define Coil_DA1 {A1=1;B1=0;C1=0;D1=1;}//D相通电,其他相断电
  43          #define Coil_A1 {A1=1;B1=0;C1=0;D1=0;}//A相通电,其他相断电
  44          #define Coil_B1 {A1=0;B1=1;C1=0;D1=0;}//B相通电,其他相断电
  45          #define Coil_C1 {A1=0;B1=0;C1=1;D1=0;}//C相通电,其他相断电
  46          #define Coil_D1 {A1=0;B1=0;C1=0;D1=1;}//D相通电,其他相断电
  47          #define Coil_OFF {A1=0;B1=0;C1=0;D1=0;}//全部断电
  48          
  49          unsigned char Speed=1;
  50          bit StopFlag;
  51          void Display(unsigned char FirstBit,unsigned char Num);
  52          void Init_Timer0(void);
  53          unsigned char KeyScan(void);
  54          /*------------------------------------------------
C51 COMPILER V8.06   MAIN                                                                  12/02/2011 19:20:44 PAGE 2   

  55           uS延时函数,含有输入参数 unsigned char t,无返回值
  56           unsigned char 是定义无符号字符变量,其值的范围是
  57           0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
  58           长度如下 T=tx2+5 uS 
  59          ------------------------------------------------*/
  60          void DelayUs2x(unsigned char t)
  61          {   
  62   1       while(--t);
  63   1      }
  64          /*------------------------------------------------
  65           mS延时函数,含有输入参数 unsigned char t,无返回值
  66           unsigned char 是定义无符号字符变量,其值的范围是
  67           0~255 这里使用晶振12M,精确延时请使用汇编
  68          ------------------------------------------------*/
  69          void DelayMs(unsigned char t)
  70          {
  71   1           
  72   1       while(t--)
  73   1       {
  74   2           //大致延时1mS
  75   2           DelayUs2x(245);
  76   2               DelayUs2x(245);
  77   2       }
  78   1      }
  79          /*------------------------------------------------
  80                              主函数
  81          ------------------------------------------------*/
  82          main()
  83          {
  84   1       unsigned int i=512;//旋转一周时间
  85   1       unsigned char num;
  86   1       Init_Timer0();
  87   1       Coil_OFF
  88   1       while(1)  //正向
  89   1        { 
  90   2         num=KeyScan();    //循环调用按键扫描
  91   2         if(num==1)//第一个按键,速度等级增加
  92   2            {
  93   3                 if(Speed<18)
  94   3                 Speed++;
  95   3                }     
  96   2         else if(num==2)//第二个按键,速度等级减小
  97   2            {
  98   3                 if(Speed>1)
  99   3                 Speed--;
 100   3                }     
 101   2         else if(num==3)
 102   2           {
 103   3            Coil_OFF
 104   3                StopFlag=1;
 105   3                }
 106   2         else if(num==4)
 107   2           {
 108   3                StopFlag=0;
 109   3                }
 110   2        TempData[0]=dofly_DuanMa[Speed/10];//分解显示信息,如要显示68,则68/10=6  68%10=8  
 111   2        TempData[1]=dofly_DuanMa[Speed%10];
 112   2        }
 113   1      }
 114          
 115          /*------------------------------------------------
 116           显示函数,用于动态扫描数码管
C51 COMPILER V8.06   MAIN                                                                  12/02/2011 19:20:44 PAGE 3   

 117           输入参数 FirstBit 表示需要显示的第一位,如赋值2表示从第三个数码管开始显示
 118           如输入0表示从第一个显示。
 119           Num表示需要显示的位数,如需要显示99两位数值则该值输入2
 120          ------------------------------------------------*/
 121          void Display(unsigned char FirstBit,unsigned char Num)
 122          {
 123   1            static unsigned char i=0;
 124   1                
 125   1      
 126   1                 DataPort=0;   //清空数据,防止有交替重影
 127   1             LATCH1=1;     //段锁存
 128   1             LATCH1=0;
 129   1      
 130   1             DataPort=dofly_WeiMa[i+FirstBit]; //取位码 
 131   1             LATCH2=1;     //位锁存
 132   1             LATCH2=0;
 133   1      
 134   1             DataPort=TempData[i]; //取显示数据,段码
 135   1             LATCH1=1;     //段锁存
 136   1             LATCH1=0;
 137   1             
 138   1                 i++;
 139   1             if(i==Num)
 140   1                    i=0;
 141   1      
 142   1      
 143   1      }
 144          /*------------------------------------------------
 145                              定时器初始化子程序
 146          ------------------------------------------------*/
 147          void Init_Timer0(void)
 148          {
 149   1       TMOD |= 0x01;    //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响                 
 150   1       //TH0=0x00;          //给定初值
 151   1       //TL0=0x00;
 152   1       EA=1;            //总中断打开
 153   1       ET0=1;           //定时器中断打开
 154   1       TR0=1;           //定时器开关打开
 155   1       PT0=1;           //优先级打开
 156   1      }
 157          /*------------------------------------------------
 158                           定时器中断子程序
 159          ------------------------------------------------*/
 160          void Timer0_isr(void) interrupt 1 
 161          {
 162   1       static unsigned char times,i;
 163   1       TH0=(65536-1000)/256;            //重新赋值 1ms
 164   1       TL0=(65536-1000)%256;
 165   1       
 166   1       Display(0,8);
 167   1       if(!StopFlag)
 168   1         {
 169   2        if(times==(20-Speed))//最大值18,所以最小间隔值20-18=2
 170   2         {
 171   3         times=0;
 172   3         switch(i)
 173   3             {
 174   4                  case 0:Coil_A1;i++;break;
 175   4                      case 1:Coil_B1;i++;break;
 176   4                      case 2:Coil_C1;i++;break;
 177   4                      case 3:Coil_D1;i++;break;
 178   4                      case 4:i=0;break;
C51 COMPILER V8.06   MAIN                                                                  12/02/2011 19:20:44 PAGE 4   

 179   4                  default:break;
 180   4                 }
 181   3          }
 182   2       times++;
 183   2        }
 184   1      }
 185          
 186          /*------------------------------------------------
 187          按键扫描函数,返回扫描键值
 188          ------------------------------------------------*/
 189          unsigned char KeyScan(void)
 190          {
 191   1       unsigned char keyvalue;
 192   1       if(KeyPort!=0xff)
 193   1         {
 194   2          DelayMs(10);
 195   2          if(KeyPort!=0xff)
 196   2                 {
 197   3                  keyvalue=KeyPort;
 198   3                  while(KeyPort!=0xff);
 199   3                      switch(keyvalue)
 200   3                      {
 201   4                       case 0xfe:return 1;break;
 202   4                       case 0xfd:return 2;break;
 203   4                       case 0xfb:return 3;break;
 204   4                       case 0xf7:return 4;break;
 205   4                       case 0xef:return 5;break;
 206   4                       case 0xdf:return 6;break;
 207   4                       case 0xbf:return 7;break;
 208   4                       case 0x7f:return 8;break;
 209   4                       default:return 0;break;
 210   4                      }
 211   3                }
 212   2         }
 213   1         return 0;
 214   1      }
 215          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    376    ----
   CONSTANT SIZE    =     18    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     12       2
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      1    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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