微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 我想用拨码开关输入时间,按输入时间进行延时

我想用拨码开关输入时间,按输入时间进行延时

时间:10-02 整理:3721RD 点击:

附图一张http://bbs.elecfans.com/jishu_481183_1_1.html原理图proteus
程序在此keil:http://bbs.elecfans.com/forum.ph ... ypeid%26typeid%3D93
void main(void)
{ UINT8 M,N,P;
  UINT16 hour,min,l;
  unsigned long m;
  M=P0;//拨码开关从P0口输入
  N=M&0xf0;//取P0口前四位作为定时时间的小时
  P=M&0x0f;//        取P0口后四位作为定时时间的分钟
                                
        switch(N)
                { case 0x00:hour=0;
                        case 0x10:hour=3600;//将小时化为秒
                        case 0x20:hour=7200;
                        case 0x30:hour=10800;
                        case 0x40:hour=14400;
                        case 0x50:hour=18000;
                        case 0x60:hour=21600;
                        case 0x70:hour=25200;
       }
                switch(P)
                { case 0x00:min=0;//降分钟化为秒
                        case 0x01:min=300;
                        case 0x02:min=600;
                        case 0x03:min=900;
                        case 0x04:min=1200;
                        case 0x05:min=1500;
                        case 0x06:min=1800;
                        case 0x07:min=2100;
                        case 0x08:min=2400;
                        case 0x09:min=2700;
                        case 0x0a:min=3000;
                        case 0x0b:min=3300;
       }
      m=hour+min;        //一共要掩饰的时间秒为单位        
                        delay1s(m);//延时设定的时间
                         led1=1;
                         led2=1;
                         led3=1;
                         led4=1;
                        
}
void delay1s(unsigned long MS)//延时1s的程序 {UINT8 h,i,j,k;
while(MS--)
{for(h=5;h>0;h--)
for(i=4;i>0;i--)
for(j=116;j>0;j--)
for(k=214;k>0;k--); } }                 

仿真!难道是proteus!

你的问题是什么啊?

此程序哪有错,为什么仿真的时候总是不成功,无法尽享延时,delay(m);这句总不成功

此程序哪有错,为什么仿真的时候总是不成功,无法尽享延时,delay(m);这句总不成功

本来就是拨码开关输入想要掩饰的时间,高4位是想要延时的小时数,低4位是想要延时的分钟数,再化成秒数进行延时,可是怎么都成功不了,

while(MS--)没有判断跳出?

怎样判断跳出?KEIL检错显示的是0error

可能是哪个地方的判断逻辑问题,你加个中断点,然后用固定值调试一下,应该可以看出问题在哪了

我用固定值了,例如delay1s(10);运行没问题;可是在这里不是后面说的都不运行,就是直接越过,不进行延时

delay1s(10)的时候整体都没有问题吗?是不是unsigned long MS数据结构定义的不合适?

#include"reg52.h"                                                                     /* μ÷ó?í·???t£?μ¥???ú?ú2???′??÷???¨ò??ú′?£?ó?μ?ê±oòDèòa?èμ÷ó? */
#include <intrins.h>
#define DataPort P0,P1
sbit led1=P1^4;
sbit led2=P1^5;
sbit led3=P1^6;
sbit led4=P1^7;
sbit A1 = P1^0;                                                                        /* ?¨ò?2???μ??ú???ú */
sbit B1 = P1^1;                                                                        /* ?¨ò?2???μ??ú???ú */
sbit C1 = P1^2;                                                                        /* ?¨ò?2???μ??ú???ú */
sbit D1 = P1^3;               
/**************************** ???àí¨μ??3Dò(?y×a) *******************************/
#define Coil_D1_CW() { A1 = 0; B1 = 0; C1 = 0; D1 = 1;} /* D?àí¨μ?,?????à??μ? */
#define Coil_C1_CW() { A1 = 0; B1 = 0; C1 = 1; D1 = 0;} /* C?àí¨μ?,?????à??μ? */
#define Coil_B1_CW() { A1 = 0; B1 = 1; C1 = 0; D1 = 0;} /* B?àí¨μ?,?????à??μ? */
#define Coil_A1_CW() { A1 = 1; B1 = 0; C1 = 0; D1 = 0;} /* A?àí¨μ?,?????à??μ? */
/**************************** ???àí¨μ??3Dò(·′×a) *******************************/
#define Coil_A1_CCW() { A1 = 1; B1 = 0; C1 = 0; D1 = 0;}/* A?àí¨μ?,?????à??μ? */
#define Coil_B1_CCW() { A1 = 0; B1 = 1; C1 = 0; D1 = 0;}/* B?àí¨μ?,?????à??μ? */
#define Coil_C1_CCW() { A1 = 0; B1 = 0; C1 = 1; D1 = 0;}/* C?àí¨μ?,?????à??μ? */
#define Coil_D1_CCW() { A1 = 0; B1 = 0; C1 = 0; D1 = 1;}/* D?àí¨μ?,?????à??μ? */
#define Coil_Off() { A1 = 0; B1 = 0; C1 = 0; D1 = 0;}   /* ?ùóD?à??μ? */
typedef        unsigned char UINT8;                            /* ??unsigned char??D??¨ò?ò???±e??UINT8£?ó?μ?ê±oò?±?óD′UINT8?í?éò? */
typedef unsigned int  UINT16;                                            /* ??unsigned int??D??¨ò?ò???±e??UINT16£?ó?μ?ê±oò?±?óD′UINT16?í?éò? */
                                                        /* ?¨ò?2???μ??ú???ú */

void delay1s(unsigned long MS);
/*******************************************************************************
* oˉ  êy  ??      : DelayMs
* ?è      ê?      : oá???óê±.
* ê?      è?      : UINT8 Ms£o
*                   òa?óê±μ?Msê±??. Ms?μ·??§?a0-65535£?êy?μ??′ó?óê±ê±????3¤
* ·μ      ??      : ?T.
*******************************************************************************/
void DelayMs( UINT16 Ms )
{
        UINT8 i;
        while (Ms--)
          {
            for ( i = 0; i < 114; i++ );                        /* ?-?·114′ó??ê?1MSê±?? */
          }
}
/*******************************************************************************
* oˉ  êy  ??      : main
* ?è      ê?      : ?÷oˉêy
* ê?      è?      : ?T.
* ·μ      ??      : ?T.
********************************************************************************/

void main(void)
{ UINT8 M,N,P;
  UINT16 hour,min,l;
  unsigned long m;
  M=P0;
  N=M&0xf0;
  P=M&0x0f;       
                               
        switch(N)
                { case 0x00:hour=0;
                        case 0x10:hour=3600;
                        case 0x20:hour=7200;
                        case 0x30:hour=10800;
                        case 0x40:hour=14400;
                        case 0x50:hour=18000;
                        case 0x60:hour=21600;
                        case 0x70:hour=25200;
       }
                switch(P)
                { case 0x00:min=0;
                        case 0x01:min=300;
                        case 0x02:min=600;
                        case 0x03:min=900;
                        case 0x04:min=1200;
                        case 0x05:min=1500;
                        case 0x06:min=1800;
                        case 0x07:min=2100;
                        case 0x08:min=2400;
                        case 0x09:min=2700;
                        case 0x0a:min=3000;
                        case 0x0b:min=3300;
       }
      m=hour+min;               
       led1=0;
                         led2=0;
                         led3=0;
                         led4=0;
                        delay1s(m);
                         led1=1;
                         led2=1;
                         led3=1;
                         led4=1;
         
                for( l = 0 ; l< 512; l++ )                          /* ?y′?ò?è|Dèòa360/(0.17578125*4) = 512 ′??-?·*/
    {
        Coil_D1_CW()                                    /* D?àí¨μ?,×a?ˉ(5.625/64)*2?è = 0.17578125?è*/
        DelayMs(100);                                    /* ?óê±,?éò?í¨1y??±??óê±??±??μ?ê */
        Coil_C1_CW()                                    /* C?àí¨μ? */
        DelayMs(100);                                 
        Coil_B1_CW()                                    /* B?àí¨μ? */
        DelayMs(100);
        Coil_A1_CW()                                    /* A?àí¨μ? */
        DelayMs(100);

      }
       
    Coil_Off();                                      /* μ??úí£?1??DD,×?o??óé?????,·??òμ??ú?áóDò??àí¨μ????TD??D???óá?1|o? */                                              /* ?÷?-?· */
    while(1);
                         
         
    }
      
       
void delay1s(unsigned long MS)
{UINT8 h,i,j,k;
        while(MS--)
        {for(h=5;h>0;h--)
        for(i=4;i>0;i--)
        for(j=116;j>0;j--)
        for(k=214;k>0;k--);
        }
}

这是完整程序,但是在PROTEUS中运行,结果总出错,不知道到底是哪里错了,实在是不知道怎么办了,

这是完整程序,但是在PROTEUS中运行,结果总出错,不知道到底是哪里错了,实在是不知道怎么办了,

恩,有问题吗?下面有我的程序,完整的,功能就是拨码开关输入时间,按输入时间进行延迟,时间到达后步进机转动,乱码部分是文字说明,没有什么关系

恩,有问题吗?下面有我的程序,完整的,功能就是拨码开关输入时间,按输入时间进行延迟,时间到达后步进机转动,乱码部分是文字说明,没有什么关系

我是proteus的小编!你把帖子发到了单片机板块,然后让我来看,考虑过我的感受吗?考虑过吗?考虑过吗?
呵呵。关键有时候看不到。

乱码可以改成国标。
这个程序咋回事呢?这个过程没看懂,是开机自检拨码开关吗?

你可以看问题中的程序,出于后来我写的程序主要部分,拨码开关还需要特定的程序进行说明吗?我只是用检测P0口的值来进行判定的,例如:UINT8 M,N,P;
M=P0;
  N=M&0xf0;
  P=M&0x0f;       
也就是直接对P0口进行处理(P0口外接拨码开关)

#include"reg52.h"                                                                
#include <intrins.h>
#define DataPort P0,P1
sbit led1=P1^4;
sbit led2=P1^5;
sbit led3=P1^6;
sbit led4=P1^7;
sbit A1 = P1^0;                                                                        /*步进机A */
sbit B1 = P1^1;                                                                        /* 步进机A  */
sbit C1 = P1^2;                                                                        /* 步进机A */
sbit D1 = P1^3;               
/**************************** 步进机各向分别通电 正转*******************************/
#define Coil_D1_CW() { A1 = 0; B1 = 0; C1 = 0; D1 = 1;}
#define Coil_C1_CW() { A1 = 0; B1 = 0; C1 = 1; D1 = 0;}
#define Coil_B1_CW() { A1 = 0; B1 = 1; C1 = 0; D1 = 0;}
#define Coil_A1_CW() { A1 = 1; B1 = 0; C1 = 0; D1 = 0;}
/**************************** 步进机反转*******************************/
#define Coil_A1_CCW() { A1 = 1; B1 = 0; C1 = 0; D1 = 0;}
#define Coil_B1_CCW() { A1 = 0; B1 = 1; C1 = 0; D1 = 0;}
#define Coil_C1_CCW() { A1 = 0; B1 = 0; C1 = 1; D1 = 0;}
#define Coil_D1_CCW() { A1 = 0; B1 = 0; C1 = 0; D1 = 1;}
#define Coil_Off() { A1 = 0; B1 = 0; C1 = 0; D1 = 0;}   /*各向均断电停止转动 */
typedef        unsigned char UINT8;                           
typedef unsigned int  UINT16;                                         
                                                     
void delay1s(unsigned long MS);
void DelayMs( UINT16 Ms )
{
        UINT8 i;
        while (Ms--)
          {
            for ( i = 0; i < 114; i++ );                     
          }
}
void main(void)
{ UINT8 M,N,P;
  UINT16 hour,min,l;
  unsigned long m;
  M=P0;
  N=M&0xf0;
  P=M&0x0f;       
                               
        switch(N)
                { case 0x00:hour=0;
                        case 0x10:hour=3600;
                        case 0x20:hour=7200;
                        case 0x30:hour=10800;
                        case 0x40:hour=14400;
                        case 0x50:hour=18000;
                        case 0x60:hour=21600;
                        case 0x70:hour=25200;
       }
                switch(P)
                { case 0x00:min=0;
                        case 0x01:min=300;
                        case 0x02:min=600;
                        case 0x03:min=900;
                        case 0x04:min=1200;
                        case 0x05:min=1500;
                        case 0x06:min=1800;
                        case 0x07:min=2100;
                        case 0x08:min=2400;
                        case 0x09:min=2700;
                        case 0x0a:min=3000;
                        case 0x0b:min=3300;
       }
      m=hour+min;               
       led1=0;
                         led2=0;
                         led3=0;
                         led4=0;
                        delay1s(m);//按输入时间延迟
                         led1=1;
                         led2=1;
                         led3=1;
                         led4=1;
         
                for( l = 0 ; l< 512; l++ )                        
    {
        Coil_D1_CW()                                    
        DelayMs(100);                                   
        Coil_C1_CW()                                 
        DelayMs(100);                                 
        Coil_B1_CW()                                 
        DelayMs(100);
        Coil_A1_CW()                                 
        DelayMs(100);

      }
       
    Coil_Off();                                                                             
    while(1);
                         
         
    }
      
       
void delay1s(unsigned long MS)//1S钟延迟
{UINT8 h,i,j,k;
        while(MS--)
        {for(h=5;h>0;h--)
        for(i=4;i>0;i--)
        for(j=116;j>0;j--)
        for(k=214;k>0;k--);
        }
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top