鱼C论坛

 找回密码
 立即注册
查看: 3761|回复: 6

请问一个单片机延时问题

[复制链接]
发表于 2014-1-8 22:33:39 | 显示全部楼层 |阅读模式
5鱼币
#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);了吗

最佳答案

查看完整内容

单片机,是硬软相结合的东西,必须知道你控制或驱动的是什么, 根据楼主代码,我大该说一下 #include //头文件 #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; //变量定义 并赋 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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);了吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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);这段    为什么后面延时一定要加
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-1-9 13:47:58 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-1-11 22:19:45 | 显示全部楼层
本帖最后由 chen654601304 于 2014-1-11 22:21 编辑

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

还是吧目的和变量的意义些下吧,光看一个没有注释的程序能说出来也不是件容易的事情
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-3-23 10:51:53 | 显示全部楼层
楼主发代码最好用代码编辑器;
把代码加上注释大家才好给你判断;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-5-2 10:30:08 | 显示全部楼层
make   你要实现什么功能啊!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 14:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表