久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久久久久久久综合 | 国产精品视频一 | 97久久久久久| 亚洲免费影院 | 逼逼网| 欧美激情综合 | 久久国产精品99久久久久久丝袜 | 亚洲精彩视频在线观看 | 久久久久久国产精品 | 中文字幕二区 | 亚洲国产精品久久人人爱 | 欧美一区二区三区在线 | 99精品视频网 | 国产一级淫片免费视频 | 91精品久久久久久久久久小网站 | 老牛影视av一区二区在线观看 | 国产综合在线视频 | 做a网站 | 草久久| 免费在线观看av的网站 | 久久综合国产 | 日韩三级 | 亚洲 日本 欧美 中文幕 | 97超碰成人| 国产中文字幕网 | 国产高清视频一区 | 久久久久久久久久久久亚洲 | 黄色大片免费网站 | 黄网站涩免费蜜桃网站 | 天天操天天摸天天爽 | 久久久久久看片 | 亚洲视频一区在线播放 | 啪啪毛片| 精品视频在线免费观看 | h片在线看 | 超碰免费观看 | 欧美 日本 国产 | 天啪| 国产高清视频一区 | 亚洲视频在线观看一区二区三区 | 欧美一区二区三区在线视频 |