这场雨好安静 发表于 2014-1-8 22:33:39

请问一个单片机延时问题

#include<reg51.h>

#define SHOW P0

sbit btnStart = P1^0;
sbit btnStop = P1^7;
sbit btnP = P1^1;
sbit btnR = P1^2;
sbit btnN = P1^3;
sbit btnD = P1^4;
sbit lwP = P2^0;
sbit lwN = P3^4;
sbit rwP = P2^1;
sbit rwN = P3^5;

int fStart = 0;
int fP = 0;
int fR = 0;
int fN = 0;
int fD = 0;

int segP = 0x8c;
int segR = 0x88;
int segN = 0xc8;
int segD = 0xa1;

void gearP();
void gearR();
void gearN();
void gearD();
void initial();
void delay(int time);

void main()
{
        initial();
        while(1)
        {
                if(btnStart == 0)
                {
                        while(btnStart == 0)
                        {
                                ;
                        }

                        fStart = 1;
                }

                if(btnStop == 0)
                {
                        while(btnStop == 0)
                        {
                                ;
                        }

                        fStart = 0;
                }


                if(fStart == 1)
                {
                        if(btnP == 0)
                        {
                                while(btnP == 0)
                                {
                                        ;
                                }

                                fP = 1;
                                fR = 0;
                                fN = 0;
                                fD = 0;
                        }

                        if(btnR == 0)
                        {
                                while(btnR == 0)
                                {
                                        ;
                                }

                                fP = 0;
                                fR = 1;
                                fN = 0;
                                fD = 0;
                        }

                        if(btnN == 0)
                        {
                                while(btnN == 0)
                                {
                                        ;
                                }

                                fP = 0;
                                fR = 0;
                                fN = 1;
                                fD = 0;
                        }

                        if(btnD == 0)
                        {
                                while(btnD == 0)
                                {
                                        ;
                                }
                               
                                fP = 0;
                                fR = 0;
                                fN = 0;
                                fD = 1;
                        }


                        if(fP == 1)
                        {
                                gearP();
                        }

                        if(fR == 1)
                        {
                                gearR();
                        }

                        if(fN == 1)
                        {
                                gearN();
                        }

                        if(fD == 1)
                        {
                                gearD();
                        }
                }
                else
                {
                        initial();
                }
        }
}

void gearP()
{
        SHOW = segP;

        lwP = 1;
        lwN = 1;
        rwP = 1;
        rwN = 1;
}

void gearR()
{
        SHOW = segR;
       
        lwP = 0;
        lwN = 1;
        rwP = 0;
        rwN = 1;

        delay(20);

      lwP = 0;
        lwN = 0;
        rwP = 0;
        rwN = 0;

        delay(20);


}

void gearN()
{
        SHOW = segN;

        lwP = 0;
        lwN = 0;
        rwP = 0;
        rwN = 0;
}

void gearD()
{
        SHOW = segD;

        lwP = 1;
        lwN = 0;
        rwP = 1;
        rwN = 0;
}

void initial()
{
        fStart = 0;
        fP = 0;
        fR = 0;
        fN = 0;
        fD = 0;

        P0 = 0xff;
        P1 = 0xff;
        P2 = 0xff;
        P3 = 0xff;
}

void delay(int time)
{
        int i,j;
        for(i=0;i<time;i++)
        {
                for(j=0;j<120;j++)
                {
                        ;
                }
        }
}



SHOW = segR;
       
        lwP = 0;
        lwN = 1;
        rwP = 0;
        rwN = 1;

        delay(20);

      lwP = 0;
        lwN = 0;
        rwP = 0;
        rwN = 0;

        delay(20);这段    为什么后面延时一定要加
lwP = 0;
        lwN = 0;
        rwP = 0;
        rwN = 0;

        delay(20);不是有delay(20);了吗

liujiang9 发表于 2014-1-8 22:33:40

单片机,是硬软相结合的东西,必须知道你控制或驱动的是什么,
根据楼主代码,我大该说一下

#include<reg51.h>//头文件

#define SHOW P0   //宏定义,即替代名

sbit btnStart = P1^0;//位定义
sbit btnStop = P1^7;
sbit btnP = P1^1;
sbit btnR = P1^2;
sbit btnN = P1^3;
sbit btnD = P1^4;
sbit lwP = P2^0;   //位定义
sbit lwN = P3^4;
sbit rwP = P2^1;
sbit rwN = P3^5;

int fStart = 0;    //变量定义 并赋值
int fP = 0;      
int fR = 0;
int fN = 0;
int fD = 0;

int segP = 0x8c;   //变量定义 并赋值
int segR = 0x88;
int segN = 0xc8;
int segD = 0xa1;

void gearP();   //某功能函数声明
void gearR();   //某功能函数声明
void gearN();   //某功能函数声明
void gearD();   //某功能函数声明
void initial(); //初始化函数声明
void delay(int time); //延时函数,带参

void main()
{
      initial();   //初始化
      while(1)      //原地真循环
      {
                if(btnStart == 0)       //如果I/O P10脚为 低电平
                {
                        while(btnStart == 0)// 则等待 P10脚为 高电平
                        {
                              ;
                        }

                        fStart = 1;   //如果I/O P10脚为 高电平 ,则 fStart 变量 赋值为1
                }

                if(btnStop == 0)   //如果I/O P17脚为 低电平
                {
                        while(btnStop == 0)// 则等待 P17脚为 高电平
                        {
                              ;
                        }

                        fStart = 0;   //如果I/O P17脚为 高电平 ,则 fStart 变量清零
                }
               /*上面变量 fStart 应该是当作一个标号变量在使用 */

                if(fStart == 1)      //如果 fStart 变量 值为1 则说明I/O P10脚为 低电平 ;将执行以下内容(也说明I/O P10脚为低电平此步才能进入)
                {
                        if(btnP == 0)   //如果P11脚为低电平,
                        {
                              while(btnP == 0)//等待P11脚为高电平 (即低电平原地空循环,高电平跳出循环)
                              {
                                        ;
                              }
                                 //当P11脚变高电平后
                              fP = 1;   // fP变量赋值1
                              fR = 0;   // fR变量赋值0
                              fN = 0;   // fN变量赋值0
                              fD = 0;   // FD变量赋值0
                        }

                        if(btnR == 0)// 如果P12脚为低电平,
                        {
                              while(btnR == 0)// 同上
                              {
                                        ;
                              }

                              fP = 0;    //同上,仅值不一样
                              fR = 1;
                              fN = 0;
                              fD = 0;
                        }

                        if(btnN == 0)//如果P13脚为低电平,
                        {
                              while(btnN == 0) //同上
                              {
                                        ;
                              }

                              fP = 0;   
                              fR = 0;
                              fN = 1;
                              fD = 0;
                        }

                        if(btnD == 0)    //如果P14脚为低电平,
                        {
                              while(btnD == 0)//同上
                              {
                                        ;
                              }
                              
                              fP = 0;      //同上
                              fR = 0;
                              fN = 0;
                              fD = 1;
                        }

                      /* 上面目前表明经过P10脚的判断后,假如是接的按键-(P11,P12,P13,P14)为输入脚,判断后每个脚对应 修改内部变量*/
                                          
                                          /* 下面就应该判断相对按键按下的处理过程*/
                        if(fP == 1)//如果fP 为1
                        {
                              gearP();// 则调用这个函数
                        }

                        if(fR == 1)    // 如果fR 为1
                        {
                              gearR(); // 则调用这个函数
                        }

                        if(fN == 1)    //如果fN 为1
                        {
                              gearN();// 则调用这个函数
                        }

                        if(fD == 1)   //如果fD 为1
                        {
                              gearD(); //则调用这个函数
                        }
                }
                else               //否则 将执行初始化
                {
                        initial();
                }
      }
}

void gearP()         //子函数gearP
{
      SHOW = segP;// 将初始值赋给P0并口输出

      lwP = 1;    // 对P20口置高
      lwN = 1;    // 对P24口置高
      rwP = 1;    // 对P21口置高
      rwN = 1;    // 对P25口置高
                  
}

void gearR()   //同上
{
      SHOW = segR;
      
      lwP = 0;
      lwN = 1;
      rwP = 0;
      rwN = 1;

      delay(20);//延时子函数

      lwP = 0;
      lwN = 0;
      rwP = 0;
      rwN = 0;

      delay(20);


}

void gearN()
{
      SHOW = segN;

      lwP = 0;
      lwN = 0;
      rwP = 0;
      rwN = 0;
}

void gearD()
{
      SHOW = segD;

      lwP = 1;
      lwN = 0;
      rwP = 1;
      rwN = 0;
}

void initial()
{
      fStart = 0;
      fP = 0;
      fR = 0;
      fN = 0;
      fD = 0;

      P0 = 0xff;
      P1 = 0xff;
      P2 = 0xff;
      P3 = 0xff;
}

void delay(int time)
{
      int i,j;
      for(i=0;i<time;i++)
      {
                for(j=0;j<120;j++)
                {
                        ;
                }
      }
}


/*下面这段没在main函数里,也没在子函数里,格式有问题 ,这里是想初始化定义吗?还是复制代码的时候没完全,
    如果是在某个子函数中 {} */
SHOW = segR;
      
      lwP = 0;
      lwN = 1;
      rwP = 0;
      rwN = 1;

      delay(20);   

      lwP = 0;
      lwN = 0;
      rwP = 0;
      rwN = 0;
      
      delay(20);这段    为什么后面延时一定要加   //delay(20)20表示延时的周期当然没个都要赋形参
                              //如果你是指,变量赋值后为什么要加delay(20) 那是因为须等待其他模块的程序调用这几个变量的值
      lwP = 0;
      lwN = 0;
      rwP = 0;
      rwN = 0;

      delay(20);不是有delay(20);了吗

五号智能 发表于 2014-1-9 02:59:02

本帖最后由 五号智能 于 2014-1-9 03:00 编辑

SHOW = segR;
      
      lwP = 0;
      lwN = 1;
      rwP = 0;
      rwN = 1;

      delay(20);

      lwP = 0;
      lwN = 0;
      rwP = 0;
      rwN = 0;

      delay(20);         这段    两个合在一起你就明白了,如果没有这个你就少了一个
       SHOW = segR;
      
      lwP = 0;
      lwN = 1;
      rwP = 0;
      rwN = 1;

      delay(20);

      lwP = 0;
      lwN = 0;
      rwP = 0;
      rwN = 0;

      delay(20);这段    为什么后面延时一定要加

这场雨好安静 发表于 2014-1-9 13:47:58

五号智能 发表于 2014-1-9 02:59 static/image/common/back.gif


????不是还是和我的一样吗

chen654601304 发表于 2014-1-11 22:19:45

本帖最后由 chen654601304 于 2014-1-11 22:21 编辑

程序太乱了,而且最好吧要实现的功能写下,这样大家才能更好的去判断。
有时候程序在延时一段时间之后希望他清除原有的状态;

还是吧目的和变量的意义些下吧,光看一个没有注释的程序能说出来也不是件容易的事情

沉思的牛 发表于 2014-3-23 10:51:53

楼主发代码最好用代码编辑器;
把代码加上注释大家才好给你判断;

makefile 发表于 2014-5-2 10:30:08

make   你要实现什么功能啊!
页: [1]
查看完整版本: 请问一个单片机延时问题