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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1762|回復: 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;
就這樣循環



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
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語句,做個狀態機延時
回復

使用道具 舉報

5#
ID:1104510 發表于 2024-3-29 17:47 | 只看該作者
kk17328 發表于 2024-3-29 17:43
可以用switch語句,做個狀態機延時

麻煩幫我寫一下   我初學
回復

使用道具 舉報

6#
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狀態就同步了
回復

使用道具 舉報

7#
ID:1109793 發表于 2024-3-29 18:44 | 只看該作者
鄭效桂 發表于 2024-3-29 17:51
if(IN3==0)                //IN3為前啟停信號
                                {                                                                                                                       
                                        delay(500);

D(30);是啥意思
回復

使用道具 舉報

8#
ID:857072 發表于 2024-3-29 20:09 來自手機 | 只看該作者
學到這里說明你需要學點新的東西了,開始嘗試用定時器加狀態機來控制時間,后面延時函數必須拋棄掉。因為你放延時的時候單片機就直接停擺了,你程序越來越大延時的負面影響就越來越大。就算必須要延時也要盡量控制在微秒級,毫秒級的延時都盡量不要使用了
回復

使用道具 舉報

9#
ID:1104510 發表于 2024-3-30 07:29 | 只看該作者

是毫秒級延時
回復

使用道具 舉報

10#
ID:1104510 發表于 2024-3-30 07:29 | 只看該作者
a185980800 發表于 2024-3-29 20:09
學到這里說明你需要學點新的東西了,開始嘗試用定時器加狀態機來控制時間,后面延時函數必須拋棄掉。因為你 ...

可以教教我嗎  大佬
回復

使用道具 舉報

11#
ID:310441 發表于 2024-3-30 08:42 來自手機 | 只看該作者
a185980800 發表于 2024-3-29 20:09
學到這里說明你需要學點新的東西了,開始嘗試用定時器加狀態機來控制時間,后面延時函數必須拋棄掉。因為你 ...

說的對!最簡單粗暴的就是定時器里計數,主流程里判斷。
回復

使用道具 舉報

12#
ID:1104510 發表于 2024-3-30 09:37 | 只看該作者
DoneDone 發表于 2024-3-30 08:42
說的對!最簡單粗暴的就是定時器里計數,主流程里判斷。

麻煩教我一下
回復

使用道具 舉報

13#
ID:866313 發表于 2024-3-30 16:54 | 只看該作者
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲视频一区在线观看 | 成人一区二区三区在线观看 | 天天久久| 久久久久国产精品 | 天天干天天爱天天操 | 在线观看黄色电影 | 国产精品久久久久久久久久久新郎 | 色综久久| 盗摄精品av一区二区三区 | 成人伊人 | 91免费电影 | 日韩高清国产一区在线 | 三级视频网站 | 日韩欧美网| 欧美综合自拍 | 国产91精品在线 | 一区二区三区在线观看视频 | 久久精品视频一区二区 | 国产精品18毛片一区二区 | 精品视频久久久 | 国产无套一区二区三区久久 | 在线a视频 | 国产免费一区二区三区 | 伊人精品 | 久久久免费毛片 | 欧美啪啪 | 在线观看免费高清av | 国产黄色大片在线免费观看 | 99热首页 | 成人在线不卡 | 精品视频一区二区三区四区 | 国产一二三区电影 | 精品视频一区在线 | 中文二区| 亚洲精品日韩欧美 | 久久99视频这里只有精品 | 日韩福利| 欧美色影院 | 精国产品一区二区三区四季综 | 精品综合久久久 | 91资源在线观看 |