找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 313|回复: 12
收起左侧

关于在单片机程序中加入延时

[复制链接]
ID:1104510 发表于 2024-3-29 16:09 | 显示全部楼层 |阅读模式
#include<reg52.h>             //库文件
#define uchar unsigned char//宏定义无符号字符型
#define uint unsigned int  //宏定义无符号整型
/********************************************************************
                            初始定义
*********************************************************************/

/*定义八位输入为单片机P1口*/
sbit IN1=P1^0;
sbit IN2=P1^1;
sbit IN3=P1^2;
sbit IN4=P1^3;
sbit IN5=P1^4;
sbit IN6=P1^5;
sbit IN7=P1^6;
sbit IN8=P1^7;

/*定义八位输出为单片机P2口*/
sbit K8=P2^0;
sbit K7=P2^1;
sbit K6=P2^2;
sbit K5=P2^3;
sbit K4=P2^4;
sbit K3=P2^5;
sbit K2=P2^6;
sbit K1=P2^7;


/********************************************************************
                            延时函数
*********************************************************************/
void delay(uchar t)
{
  uchar i,j;
   for(i=0;i<t;i++)
   {
        for(j=13;j>0;j--);
     { ;
     }
   }
}

/********************************************************************
                            主函数
*********************************************************************/
//急停  IN1
//手动  IN2 K1控制指示灯(前 IN3  K2控制指示灯  K3控制继电器)(后 IN4  K4控制指示灯   K5控制继电器)
//自动  IN5 K6控制指示灯
//自动启停信号(光电开关发出信号)IN6  K7控制指示灯(同时控制K2 K3 K4 K5启停)
void main()                                    //主程序
{   
    while(1)
    {        
        if(IN1==0)                    //急停按钮开启
        {
            if(IN2==0)            //手动按钮开启
            {               
                delay(500);
                K1=!K1;                    //K1控制手动按钮指示灯
                while(!IN2);                                                               
                delay(100);               
            }
            if(K1==0)      //手动模式开启
            {                        
                K6=1;
                K8=0;               
                if(IN3==0)        //IN3为前启停信号
                {                                                            
                    delay(500);
                    K2=!K2;        //K2控制前指示灯                    
                    K3=!K3;        //K3控制前继电器                                                               
                    while(!IN3);                    
                    delay(100);                    
                }               
                if(IN4==0)     //IN4为后启停信号
                {                    
                    delay(500);
                    K4=!K4;       //K4控制后指示灯
                    K5=!K5;         //K5控制后继电器
                    while(!IN4);
                    delay(100);                    
                }
            }               
            if(K1==1)//手动模式关闭
            {
                K2=1;
                K3=1;
                K4=1;
                K5=1;
                K7=1;
                K8=1;
            }
            if(IN5==0) //自动模式按钮
            {               
                delay(500);
                K6=!K6;
                while(!IN5);
                delay(100);               
            }
            if(K6==0)
            {
                K1=1;
                K2=1;
                K3=1;
                K4=1;
                K5=1;
                K8=0;
                if(IN6==0)//光电开关产生信号
                {                                                                                                                                                                                                                        
                    K2=0;
                    K3=0;
                    K4=0;
                    K5=0;                    
                }
                if(IN6==1)
                {
                    K2=1;
                    K3=1;
                    K4=1;
                    K5=1;
                    K8=1;
                }                                
            }
            if((IN6==0)&&(K6==0))
            {
                delay(1000);
                if(IN2==0)
                {
                    delay(1000);
                    K1=!K1;      //K1控制手动按钮指示灯
                    while(!IN2);
                    delay(1000);
                }
                if(K1==0)
                {
                    delay(1000);
                    K2=1;
                    K3=1;
                    K4=1;
                    K5=1;
                }
            }
        }                                                                        
        if(IN1==1)
        {                                
            K1=1;
            K2=1;
            K3=1;
            K4=1;
            K5=1;                                                                                
            K6=1;
            K7=1;
            K8=1;
        }
               
    }
}




代码如上,求教各位大神。
if(IN3==0)        //IN3为前启停信号
                {                                                            
                    delay(500);
                    K2=!K2;        //K2控制前指示灯                    
                    K3=!K3;        //K3控制前继电器                                                               
                    while(!IN3);                    
                    delay(100);                    
                }      
我想实现的功能是:当K2=0时,延时几秒后让K7=0;当K2=1时,K7=1;
就这样循环



回复

使用道具 举报

ID:1104510 发表于 2024-3-29 16:12 | 显示全部楼层
我自己写了好几种代码,都是刚开始上电时K2吸合几秒后,K7吸合,K2断开时,K7断开。然后再按下IN3时,K2跟K7状态就同步了,延时效果就没了
回复

使用道具 举报

ID:1104510 发表于 2024-3-29 16:13 | 显示全部楼层
求教各位大佬,帮忙看看应该怎么写
回复

使用道具 举报

ID:1074206 发表于 2024-3-29 17:43 | 显示全部楼层
可以用switch语句,做个状态机延时
回复

使用道具 举报

ID:1104510 发表于 2024-3-29 17:47 | 显示全部楼层
kk17328 发表于 2024-3-29 17:43
可以用switch语句,做个状态机延时

麻烦帮我写一下   我初学
回复

使用道具 举报

ID:1104510 发表于 2024-3-29 17:51 | 显示全部楼层
郑效桂 发表于 2024-3-29 17:47
麻烦帮我写一下   我初学

if(IN3==0)                //IN3为前启停信号
                                {                                                                                                                       
                                        delay(500);
                                        K2=!K2;                //K2控制前指示灯                                       
                                        K3=!K3;                //K3控制前继电器                                                                                                                               
                                        while(!IN3);                                       
                                        delay(100);
                                }                                               
                                if(K2==0)
                                        {
                                                D(30);
                                                K7=0;
                                        }
                                        if(K2==1)
                                        {
                                                K7=1;
                                        }
我是这样写的,就是只有每次刚上电的时候才有延时效果,完成一个开  关   回合后,再按IN3就没有延时效果了,K2  K7状态就同步了
回复

使用道具 举报

ID:1109793 发表于 2024-3-29 18:44 | 显示全部楼层
郑效桂 发表于 2024-3-29 17:51
if(IN3==0)                //IN3为前启停信号
                                {                                                                                                                       
                                        delay(500);

D(30);是啥意思
回复

使用道具 举报

ID:857072 发表于 2024-3-29 20:09 来自手机 | 显示全部楼层
学到这里说明你需要学点新的东西了,开始尝试用定时器加状态机来控制时间,后面延时函数必须抛弃掉。因为你放延时的时候单片机就直接停摆了,你程序越来越大延时的负面影响就越来越大。就算必须要延时也要尽量控制在微秒级,毫秒级的延时都尽量不要使用了
回复

使用道具 举报

ID:1104510 发表于 2024-3-30 07:29 | 显示全部楼层

是毫秒级延时
回复

使用道具 举报

ID:1104510 发表于 2024-3-30 07:29 | 显示全部楼层
a185980800 发表于 2024-3-29 20:09
学到这里说明你需要学点新的东西了,开始尝试用定时器加状态机来控制时间,后面延时函数必须抛弃掉。因为你 ...

可以教教我吗  大佬
回复

使用道具 举报

ID:310441 发表于 2024-3-30 08:42 来自手机 | 显示全部楼层
a185980800 发表于 2024-3-29 20:09
学到这里说明你需要学点新的东西了,开始尝试用定时器加状态机来控制时间,后面延时函数必须抛弃掉。因为你 ...

说的对!最简单粗暴的就是定时器里计数,主流程里判断。
回复

使用道具 举报

ID:1104510 发表于 2024-3-30 09:37 | 显示全部楼层
DoneDone 发表于 2024-3-30 08:42
说的对!最简单粗暴的就是定时器里计数,主流程里判断。

麻烦教我一下
回复

使用道具 举报

ID:866313 发表于 2024-3-30 16:54 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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