欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1855|回復: 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 單片機教程網

快速回復 返回頂部 返回列表