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

📄 步进电机的控制.c

📁 该程序为基于51单片机的步进电机控制程序
💻 C
字号:
CESHI:
DO;
$NOLIST
$INCLUDE(REG51.DCL)
$LIST
DECLARE	DC LITERALLY 'DECLARE';
DC  RAM(6) BYTE AT(30H) ;
DC  RECEIVE_NUM       BYTE;/****已经接收数据的个数***************/
DC  FFH_NUM           BYTE;/****收到ffh的个数*****/
DC  RECEIVE_ING       BYTE;/****=0FFH表示没有接收,=00h表示正在接收*******/
DC  ACK_NACK          BYTE;
DC  SEND_NUM          BYTE;
DC  MILI_SECOND       BYTE;/*****每5毫秒计一次*****/
DC  COM8279	      BYTE AT(4000H) AUXILIARY;
DC  DAT8279	      BYTE AT(0000H) AUXILIARY;
DC  I                 BYTE;
/***************************************************/
/******************显示的数据转换*******/
LED:	 PROCEDURE (X) BYTE PUBLIC;
	 DC X BYTE;
	 DC Y BYTE;
	 DO CASE X;
	   Y=3FH;
           Y=06H;
           Y=5BH;
           Y=4FH;
           Y=66H;
           Y=6DH;
           Y=7DH;
           Y=07H;
           Y=7FH;
           Y=6FH;
         END;
         RETURN (Y);
END LED;
/***********************DISPLAY**********/
DISPLAY: PROCEDURE;
         COM8279=90H;
         DO I=0 TO 5;
          DAT8279=LED(RAM(I));
         END;
RETURN;
END DISPLAY;
/***********************************************************************/
TIME_OPERATION: PROCEDURE;
IF MILI_SECOND>=2 THEN
  DO;
    MILI_SECOND=0;
    CALL DISPLAY;
    IF RAM(5)=0 THEN /*********一个数代表10毫秒位************/
     DO;
     
       IF RAM(0)=0 AND RAM(1)=0 AND RAM(2)=0 AND RAM(3)=0 AND RAM(4)=0 THEN
        DO;
          IE=10H;/***关闭定时器中断**调试时没有关掉**/
          /*IP=10H; */
          ENABLE;
          TI=0;
          ACK_NACK=0FH;/**计时开始******/
          SEND_NUM=1;
          SBUF=ACK_NACK;
          GOTO RETURNNN;
        END;

       RAM(5)=9;
       IF RAM(4)=0 THEN /******一个数代表100毫秒位*******/
        DO;
          RAM(4)=9;
          IF RAM(3)=0 THEN /***秒的个位*/
           DO;
             RAM(3)=9;
             IF RAM(2)=0 THEN /*秒的十位*****/
              DO;
                RAM(2)=5;
                IF RAM(1)=0 THEN
                 DO;
                   RAM(1)=9;
                   RAM(0)=RAM(0)-1;

                 END;
                ELSE
                 DO;
                   RAM(1)=RAM(1)-1;
                 END;
              END;
             ELSE
              DO;
                RAM(2)=RAM(2)-1;
              END;
           END;
          ELSE
           DO;
             RAM(3)=RAM(3)-1;
           END;
        END;
       ELSE
        DO;
          RAM(4)=RAM(4)-1;
        END;
     END;
    ELSE
     DO;
       RAM(5)=RAM(5)-1;
     END;

  END;
RETURNNN: RETURN;
END TIME_OPERATION;
/*********end time_operation************/
INTER_T0: PROCEDURE INTERRUPT 1;
TH0=0EEH;
TL0=00H;
MILI_SECOND=MILI_SECOND+1;
CALL TIME_OPERATION;/********调处理程序********/
RETURN;
END INTER_T0;
/***********************************************************************/
INTER0:PROCEDURE INTERRUPT  0; /******外部中断**********/
        IE=12H;    /*****关外部中断,开定时器T0中断*************/
        TCON=51H;  /***打开定时器T0******/
        TMOD=21H;  /***定时器T0设为方式1,16位计数方式**********/
        TH0=0EEH;
        TL0=00H; /********/
        IP=12H;
        /*IE=92H; */   /*****关外部中断,开定时器T0中断*************/
        /*TCON=50H;*/  /***打开定时器T0******/
        /*TMOD=21H;*/  /***定时器T0设为方式1,16位计数方式**********/
        /*IP=12H;
        SCON=50H;*/
        /*IE=0FFH;*/
         TI=0;
         ACK_NACK=0FAH;/**计时完毕******/
         SEND_NUM=1;
         SBUF=ACK_NACK;

ENABLE;
RETURN;
END INTER0;
/**************************************************/
INTER: PROCEDURE INTERRUPT 4;
        DC    X        BYTE;
        DC    CS       BYTE;
        IF RI=1 THEN
         DO;
           RI=0;
           X=SBUF;
           IF RECEIVE_ING=0FFH THEN
             DO;
               IF X=0FFH THEN FFH_NUM=FFH_NUM+1;
               ELSE IF X<> 78H THEN
                 DO;
                   FFH_NUM=0;
                 END;
               ELSE IF X=78H AND FFH_NUM>=2 THEN
                 DO;
                   RECEIVE_NUM=0;/******开始接收清零**********/
                   RECEIVE_ING=0;/******正在接收中***************/
                   FFH_NUM=0;
                 END;
             END;
           ELSE /***********************/
             DO;
               RAM(RECEIVE_NUM)=X;
               RECEIVE_NUM=RECEIVE_NUM+1;
               IF RECEIVE_NUM>=7 THEN
                 DO;
                   CS=RAM(0) xor RAM(1) xor RAM(2) xor RAM(3) xor RAM(4) xor RAM(5);
                   RECEIVE_ING=0FFH; /***结束接收*************/
                   IF CS=RAM(6) THEN
                     DO;
                       TI=0;
                       SBUF=0FFH;/*****接收正确返回0ffh***********/
                       ACK_NACK=0FFH;
                       SEND_NUM=1;
                       /*********************实际要用这些************************/
                       IE=91H; /********外部中断打开******/
                       TCON=41H; /******设为负边沿触发方式**/
                       IP=11H;
                       /*************调试用程序*************************/

                       TH0=0EEH;
                       TL0=00H; /****X=65536-(110592OO/12)*5/1000 每5毫秒中断一次****/

                       MILI_SECOND=0;
                       /* ENABLE; */
                       /**************调试用程序*******************/
                     END;
                   ELSE
                     DO;
                       TI=0;
                       SBUF=0F0H; /****接收不正确返回0f0h**********/
                       ACK_NACK=0F0H;
                       SEND_NUM=1;
                     END;
                 END;
             END;


         END;/******end RI**********************/
         IF TI=1 AND SEND_NUM <> 0 THEN
           DO;
             IF SEND_NUM<=2 THEN
               DO;
                 CALL DISPLAY;
                 TI=0;

                 SBUF=ACK_NACK;
                 SEND_NUM=SEND_NUM+1;
                 IF SEND_NUM>=3 THEN SEND_NUM=0 ;
               END;
           END;
    RETURN;
END INTER;

/****************************MAIN PROGRAM********************************/
START:  SP=60H;
        COM8279=2AH;/****FEN PIN****/
        COM8279=00H; /****8BIT DISPLAY**/
        DO I=0 TO 10;
         COM8279=0D1H;/****QING 0*****/
         CALL TIME(255);
         CALL TIME(255);
        END;
        COM8279=90H;
	DAT8279=0FFH;
        DAT8279=0FFH;
        DAT8279=0FFH;
        DAT8279=0FFH;
        DAT8279=0FFH;
        DAT8279=0FFH;
        DISABLE;
	TMOD=20H; /*定时器T1 设定为方式2**/
     	TCON=40H;  /*允许T1计数***/
        PCON=80H; /* SMOD=1**/
        TH1=0FFH; /*****/
        TL1=0FFH;
        IP=10H;
        SCON=50H;
        IE=10H; /****OPEN ES**/
        RECEIVE_NUM=0;/****接收数据的个数***/
        RECEIVE_ING=0FFH;/*=0FFH,表示没有接收*****************/
        FFH_NUM=0;
        SEND_NUM=0;
        ACK_NACK=0;
        /**************/
        RAM(0)=0;
        RAM(1)=0;
        RAM(2)=0;
        RAM(3)=0;
        RAM(4)=0;
        RAM(5)=0;
ENABLE;
        /*SBUF=0F0H;*/

LOOP:
    CALL DISPLAY;
    CALL DISPLAY;
    GOTO LOOP;
END CESHI;

⌨️ 快捷键说明

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