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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 13117|回復(fù): 46
收起左側(cè)

求一個(gè)按鍵閉合后,繼電器延時(shí)1分鐘吸合,再延時(shí)5分鐘斷開(kāi)的單片機(jī)程序

  [復(fù)制鏈接]
ID:272609 發(fā)表于 2018-10-13 10:19 | 顯示全部樓層 |閱讀模式
學(xué)習(xí)單片機(jī)有一陣子了,老實(shí)說(shuō)斷斷續(xù)續(xù)有幾年了,資料也看了一大堆,感覺(jué)始終在門口徘徊,現(xiàn)在要寫一個(gè)程序,早上花了兩個(gè)小時(shí)還沒(méi)有寫成,程序要求是這樣,K1按鍵按下后,繼電器延時(shí)1分鐘后再吸合,吸合后延時(shí)5分鐘再斷開(kāi),等待下一次K1的按鍵按下。
使用89C52,不用數(shù)碼管,也不用24C01等EEPROM,論壇里搜索了很多,要么不能用,要么太復(fù)雜,看不懂也用不了那么多功能。
求論壇的大神寫個(gè)源程序,讓入門的菜鳥(niǎo)也能活學(xué)活用定時(shí)器和中斷。
回復(fù)

使用道具 舉報(bào)

ID:388197 發(fā)表于 2018-10-13 14:33 | 顯示全部樓層
隨便寫的,下載到板子上試了試沒(méi)問(wèn)題,1分鐘 5分鐘時(shí)間太長(zhǎng),我改成5秒 25秒,你只要改下數(shù)字就行.
#include <reg52.h>
sbit relay = P1^0;              //繼電器,0線圈吸合,1線圈斷開(kāi)
sbit key = P1^1;                //按鍵,0為按下,1為松開(kāi)
unsigned char key_timer_cnt;    //檢測(cè)按鍵計(jì)時(shí)變量
unsigned int relay_timer_cnt;    //繼電器吸合斷開(kāi)計(jì)時(shí)變量
unsigned char relay_timer_cnt_min;    //繼電器延遲斷開(kāi)計(jì)數(shù)器分鐘,因?yàn)?分鐘,1ms為單位將超過(guò)65535
unsigned char relay_state;       //記錄繼電器狀態(tài) 0=未觸發(fā) 1=待吸合 2=待斷開(kāi)
       
void Init_T0(void)                  //定時(shí)器中斷初始化,設(shè)置為1ms
{
    TMOD = 0x01;
    TH0 = 0xfc;
    TL0 = 0x18;
    EA = 1;
    ET0 = 1;
    TR0 = 1;
}
void main(void)
{
        Init_T0();
        relay = 1;                         //斷開(kāi)繼電器
        relay_state = 0;               //繼電器處于未觸發(fā)狀態(tài)
        while(1)
        {
             //想實(shí)現(xiàn)其他功能,再這里添加代碼
        }
}
void T0_ISR() interrupt 1              //1毫秒
{
        TH0 = 0xfc;
        TL0 = 0x18;
//***************************待觸發(fā)狀態(tài),需要做的只是判斷按鍵有沒(méi)有按下*******************
        if(relay_state == 0)                //當(dāng)繼電器處于待觸發(fā)狀態(tài)
        {
                if(key == 0)                      //按鍵按下,并且繼電器處于未觸發(fā)狀態(tài)
                {
                        key_timer_cnt++;                                  //按鍵計(jì)時(shí)器自加,用于消抖
                        if(key_timer_cnt>=5)                              //按鍵超過(guò)5毫秒
                        {
                                key_timer_cnt = 0;                          
                                relay_state = 1;                               //將繼電器設(shè)成待吸合狀態(tài)
                        }
                }else
                {
                        key_timer_cnt = 0;
                }
        }
        //********************待吸合狀態(tài),等計(jì)數(shù)器加滿就行*****************************
        if(relay_state == 1)
        {
                relay_timer_cnt++;
                if(relay_timer_cnt>=5000)                      //將5000改為60000 即為1分鐘                  
                {
                        relay = 0;                                   //繼電器吸合
                        relay_state = 2;                             //吸合后將狀態(tài)轉(zhuǎn)成待斷開(kāi)
                        relay_timer_cnt = 0;
                }
        }
        //******************待斷開(kāi)狀態(tài),跟待吸合一樣加滿就行*******************************
        if(relay_state == 2)
        {
                relay_timer_cnt++;
                if(relay_timer_cnt>=5000)                     //將5000改為60000即為1分鐘
                {
                        relay_timer_cnt = 0;
                        relay_timer_cnt_min++;                      //每60秒加1
                        if(relay_timer_cnt_min>=5)                  //當(dāng)分鐘數(shù)等于5
                        {
                                relay = 1;                                //斷開(kāi)繼電器
                                relay_timer_cnt_min = 0;
                                relay_timer_cnt = 0;
                                relay_state = 0;                          //斷開(kāi)后將繼電器狀態(tài)轉(zhuǎn)換成未觸發(fā)
                        }
                }
        }
}

評(píng)分

參與人數(shù) 4黑幣 +80 收起 理由
yong761228 + 10
admin + 50 回帖助人的獎(jiǎng)勵(lì)!
飛線 + 8 回帖助人的獎(jiǎng)勵(lì)!
YJGG + 12 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:155507 發(fā)表于 2018-10-13 16:18 | 顯示全部樓層
我給你來(lái)個(gè)程序試試


  1. #include "reg52.h"                         //此文件中定義了單片機(jī)的一些特殊功能寄存器

  2. typedef unsigned int u16;          //對(duì)數(shù)據(jù)類型進(jìn)行聲明定義
  3. typedef unsigned char u8;

  4. sbit k1=P3^1;         //定義P31口是k1
  5. sbit led=P2^0;         //定義P20口是led
  6. sbit Relay=P2^1; //定義P21口是繼電器 //繼電器,1線圈吸合,0線圈斷開(kāi)

  7. u16 Sec=0; //秒鐘
  8. u16 StartSec, StopSec;  //
  9. u8 KeyHit=0, StartRelay=0; //標(biāo)志位
  10. u16 Relay_on_Interval = 60;    //繼電器延時(shí)1分鐘后再吸合
  11. u16 Relay_off_Interval = 300;  //繼電器吸合后延時(shí)5分鐘再斷開(kāi)
  12. /*******************************************************************************
  13. * 函 數(shù) 名         : Timer0Init
  14. * 函數(shù)功能                   : 定時(shí)器0初始化
  15. * 輸    入         : 無(wú)
  16. * 輸    出         : 無(wú)
  17. *******************************************************************************/
  18. void Timer0Init()
  19. {
  20.         TMOD|=0X01;//選擇為定時(shí)器0模式,工作方式1,僅用TR0打開(kāi)啟動(dòng)。

  21.         TH0=0X3C;        //給定時(shí)器賦初值,定時(shí)50ms
  22.         TL0=0XB0;       
  23.         ET0=1;//打開(kāi)定時(shí)器0中斷允許
  24.         EA=1;//打開(kāi)總中斷
  25.         TR0=1;//打開(kāi)定時(shí)器                       
  26. }

  27. /*******************************************************************************
  28. * 函 數(shù) 名         : delay
  29. * 函數(shù)功能                   : 延時(shí)函數(shù),i=1時(shí),大約延時(shí)10us
  30. *******************************************************************************/
  31. void delay(u16 i)
  32. {
  33.         while(i--);       
  34. }

  35. /*******************************************************************************
  36. * 函 數(shù) 名         : keypros
  37. * 函數(shù)功能                   : 按鍵處理函數(shù),判斷按鍵K1是否按下
  38. *******************************************************************************/
  39. void keypros()
  40. {
  41.         if(k1==0)                  //檢測(cè)按鍵K1是否按下
  42.         {       
  43.                 delay(1000);   //消除抖動(dòng) 一般大約10ms
  44.                 if(k1==0)         //再次判斷按鍵是否按下
  45.                 {
  46.                         if(KeyHit==0)
  47.                         {
  48.                                 StartSec=Sec;
  49.                         }
  50.                         KeyHit=1; //按鍵K1按下
  51.                         led=~led;          //led狀態(tài)取反
  52.                 }
  53.                 while(!k1);         //檢測(cè)按鍵是否松開(kāi)
  54.         }               
  55. }

  56. /*******************************************************************************
  57. * 函 數(shù) 名       : main
  58. * 函數(shù)功能                 : 主函數(shù)
  59. * 輸    入       : 無(wú)
  60. * 輸    出             : 無(wú)
  61. *******************************************************************************/
  62. void main()
  63. {       
  64.         Timer0Init();  //定時(shí)器0初始化
  65.         Relay = 0;      //斷開(kāi)繼電器
  66.         while(1)
  67.         {       
  68.                 keypros();  //按鍵處理函數(shù)
  69.                 if(KeyHit==1)
  70.                 {
  71.                         if((StartRelay ==0) &&(Sec - StartSec >= Relay_on_Interval))
  72.                         {
  73.                                 Relay=1; //繼電器延時(shí)1分鐘后再吸合
  74.                                 StartRelay =1;
  75.                                 StopSec = Sec;
  76.                         }
  77.                         if((StartRelay ==1) &&(Sec - StopSec >= Relay_off_Interval))
  78.                         {
  79.                                 Relay=0; //繼電器吸合后延時(shí)5分鐘再斷開(kāi)
  80.                                 KeyHit=0; //清除標(biāo)志
  81.                                 StartRelay =0;
  82.                         }
  83.                        
  84.                 }
  85.         }               
  86. }

  87. /*******************************************************************************
  88. * 函 數(shù) 名         : void Timer0() interrupt 1
  89. * 函數(shù)功能                   : 定時(shí)器0中斷函數(shù)
  90. * 輸    入         : 無(wú)
  91. * 輸    出         : 無(wú)
  92. *******************************************************************************/
  93. void Timer0() interrupt 1
  94. {
  95.         static u16 i;
  96.         TH0=0X3C;        //給定時(shí)器賦初值,定時(shí)50ms
  97.         TL0=0XB0;
  98.         i++;
  99.         if(i==20)
  100.         {
  101.                 i=0;
  102.                 Sec++;
  103.                
  104.                 //led=~led;       
  105.         }       
  106. }
復(fù)制代碼

評(píng)分

參與人數(shù) 1黑幣 +8 收起 理由
飛線 + 8 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:401564 發(fā)表于 2018-10-13 19:31 | 顯示全部樓層
C我不會(huì),匯編的話可以教你一下,我也是從什么都不會(huì)開(kāi)始自學(xué)的,也是走了很多的彎路

評(píng)分

參與人數(shù) 1黑幣 +8 收起 理由
飛線 + 8 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:272609 發(fā)表于 2018-10-14 15:32 | 顯示全部樓層
Y_G_G 發(fā)表于 2018-10-13 19:31
C我不會(huì),匯編的話可以教你一下,我也是從什么都不會(huì)開(kāi)始自學(xué)的,也是走了很多的彎路

匯編我不懂,只會(huì)點(diǎn)C,謝謝你的分享,讓我們一起努力吧
回復(fù)

使用道具 舉報(bào)

ID:137736 發(fā)表于 2018-10-14 17:47 | 顯示全部樓層
Y_G_G 發(fā)表于 2018-10-13 19:31
C我不會(huì),匯編的話可以教你一下,我也是從什么都不會(huì)開(kāi)始自學(xué)的,也是走了很多的彎路

會(huì)匯編水平就比較高了,再學(xué)C很容易了。

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:123289 發(fā)表于 2018-10-14 21:14 | 顯示全部樓層
學(xué)了這么久,這么簡(jiǎn)單的問(wèn)題還搞不定,建議改行!改行不是壞事,找一個(gè)更合適自己的乃是不錯(cuò)的選擇。

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:280876 發(fā)表于 2018-10-15 17:14 | 顯示全部樓層
老哥,改行吧。都幾年了還是這樣

評(píng)分

參與人數(shù) 1黑幣 +8 收起 理由
飛線 + 8 很給力!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:405193 發(fā)表于 2018-10-15 20:00 | 顯示全部樓層
cjm82 發(fā)表于 2018-10-13 14:33
隨便寫的,下載到板子上試了試沒(méi)問(wèn)題,1分鐘 5分鐘時(shí)間太長(zhǎng),我改成5秒 25秒,你只要改下數(shù)字就行.
#include
...

非常感謝這位師傅,我雖然年級(jí)比較大了,可是最近才開(kāi)始學(xué)單片機(jī)編程,我利用您的程序,成功改寫1分鐘吸合5秒斷開(kāi)循環(huán)程序。
#include <reg52.h>
sbit relay = P3^6;              //繼電器,0線圈吸合,1線圈斷開(kāi)
sbit key = P3^2;                //按鍵,0為按下,1為松開(kāi)
unsigned char key_timer_cnt;    //檢測(cè)按鍵計(jì)時(shí)變量
unsigned int relay_timer_cnt;    //繼電器吸合斷開(kāi)計(jì)時(shí)變量
unsigned char relay_timer_cnt_min;    //繼電器延遲斷開(kāi)計(jì)數(shù)器分鐘,因?yàn)?分鐘,1ms為單位將超過(guò)65535
unsigned char relay_state;       //記錄繼電器狀態(tài) 0=未觸發(fā) 1=吸合 2=斷開(kāi)
        
void Init_T0(void)                  //定時(shí)器中斷初始化,設(shè)置為1ms
{
    TMOD = 0x01;
    TH0 = 0xfc;
    TL0 = 0x18;
    EA = 1;
    ET0 = 1;
    TR0 = 1;
}
void main(void)
{
        Init_T0();
        relay = 1;                         //斷開(kāi)繼電器
        relay_state = 0;               //繼電器處于未觸發(fā)狀態(tài)
        while(1)
        {
             //想實(shí)現(xiàn)其他功能,再這里添加代碼
        }
}
void T0_ISR() interrupt 1              //1毫秒
{
        TH0 = 0xfc;
        TL0 = 0x18;
//***************************待觸發(fā)狀態(tài),需要做的只是判斷按鍵有沒(méi)有按下*******************
        if(relay_state == 0)                //當(dāng)繼電器處于待觸發(fā)狀態(tài)
        {
                if(key == 0)                      //按鍵按下,并且繼電器處于未觸發(fā)狀態(tài)
                {
                                         relay = 0;
                        key_timer_cnt++;                                  //按鍵計(jì)時(shí)器自加,用于消抖
                        if(key_timer_cnt>=5)                              //按鍵超過(guò)5毫秒
                        {
                                key_timer_cnt = 0;                          
                                relay_state = 2;                               //將繼電器設(shè)成待吸合狀態(tài)
                        }
                }else
                {
                        key_timer_cnt = 0;
                }
        }
        //********************繼電器斷開(kāi)的時(shí)間,等計(jì)數(shù)器加滿就行*****************************
        if(relay_state == 1)
        {
                relay_timer_cnt++;
                if(relay_timer_cnt>=5000)                      //將5000改為60000 即為1分鐘                  
                {
                        relay = 0;                                   //繼電器將吸合
                        relay_state = 2;                             //吸合后將狀態(tài)轉(zhuǎn)成斷開(kāi)
                        relay_timer_cnt = 0;
                }
        }
        //******************繼電器吸合的時(shí)間,跟待吸合一樣加滿就行*******************************
        if(relay_state == 2)
        {
                relay_timer_cnt++;
                if(relay_timer_cnt>=60000)                     //將5000改為60000即為1分鐘
                {
                                relay = 1;                                //繼電器將斷開(kāi)
                                relay_timer_cnt = 0;
                                relay_state = 1;                          //斷開(kāi)后將繼電器狀態(tài)轉(zhuǎn)換成吸合
                        }
                }
        }

評(píng)分

參與人數(shù) 3黑幣 +143 收起 理由
飛線 + 8 很給力!
admin + 100 回帖助人的獎(jiǎng)勵(lì)!
angmall + 35 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:405193 發(fā)表于 2018-10-15 20:07 | 顯示全部樓層
樓主努力,我也是最近才開(kāi)始學(xué)單片機(jī)編程,我都40多歲了,我都不怕,加油!

評(píng)分

參與人數(shù) 2黑幣 +28 收起 理由
飛線 + 8 很給力!
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:405193 發(fā)表于 2018-10-15 21:03 | 顯示全部樓層
angmall 發(fā)表于 2018-10-13 16:18
我給你來(lái)個(gè)程序試試

師傅,您好,您的程序我用STC15W404as 單片機(jī),改了端口sbit relay = P3^6;   sbit key = P3^2;  就是不成功,可能您里面用了特殊寄存器,我這單片機(jī)程序可能不對(duì),請(qǐng)指點(diǎn)一下,非常感謝。

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:388197 發(fā)表于 2018-10-16 10:15 | 顯示全部樓層
yong761228 發(fā)表于 2018-10-15 21:03
師傅,您好,您的程序我用STC15W404as 單片機(jī),改了端口sbit relay = P3^6;   sbit key = P3^2;  就是不 ...

IO口配置有沒(méi)有設(shè)置成浮空?
另外單片機(jī)IO口不要直接去接繼電器,接個(gè)三極管,用三極管去驅(qū)動(dòng)繼電器.如果接的是NPN型的,那么IO口為1時(shí)是吸合,為0則斷開(kāi).

評(píng)分

參與人數(shù) 2黑幣 +28 收起 理由
飛線 + 8 很給力!
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:272609 發(fā)表于 2018-10-16 14:15 | 顯示全部樓層
本帖最后由 飛線 于 2018-10-16 21:59 編輯
cjm82 發(fā)表于 2018-10-13 14:33
隨便寫的,下載到板子上試了試沒(méi)問(wèn)題,1分鐘 5分鐘時(shí)間太長(zhǎng),我改成5秒 25秒,你只要改下數(shù)字就行.
#include
...

cjm82你好,你寫的程序我都記下了,我不是簡(jiǎn)單的復(fù)制粘貼,而是每一行都認(rèn)真的讀了一遍,大概理解后,然后自己寫到Keil里面。
我感覺(jué)你寫的程序簡(jiǎn)單易懂,條理清晰,嗯,讓我印象比較深刻的是按鍵的延時(shí)消抖,原來(lái)不光是只有一種消抖的辦法,還有其他的辦法進(jìn)行消抖。
然后就是按鍵按下去以后的幾個(gè)狀態(tài),你這里面聲明了幾個(gè)變量,以前我看別人寫的時(shí)候,這一部分我是看不懂的,他們這邊寫了一個(gè)標(biāo)志位flag,我感覺(jué)你聲明的幾個(gè)狀態(tài)變量,和這個(gè)標(biāo)志位的意思是相同的,在這里我感覺(jué)我是看懂的,再次謝謝你
另外,我把這個(gè)程序修改、編譯,然后下載到郭天祥的開(kāi)發(fā)版中,目前是不能正常運(yùn)行的,估計(jì)后續(xù)是需要進(jìn)一步修改,因?yàn)樗鈬泻芏嗤卣沟挠布x謝啦,你讓我們這些菜鳥(niǎo)又學(xué)到了東西

評(píng)分

參與人數(shù) 1黑幣 +80 收起 理由
admin + 80 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:272609 發(fā)表于 2018-10-16 14:16 | 顯示全部樓層
angmall 發(fā)表于 2018-10-13 16:18
我給你來(lái)個(gè)程序試試

謝謝你的分享,前面一位老師已經(jīng)分享了程序,我這里面正在研究他這個(gè)每一行的意思,后續(xù)等研究明白了,我再看看你這個(gè)程序
回復(fù)

使用道具 舉報(bào)

ID:272609 發(fā)表于 2018-10-16 14:19 | 顯示全部樓層
yzwzfyz 發(fā)表于 2018-10-14 21:14
學(xué)了這么久,這么簡(jiǎn)單的問(wèn)題還搞不定,建議改行!改行不是壞事,找一個(gè)更合適自己的乃是不錯(cuò)的選擇。

與其批評(píng)別人有多菜,不如寫幾行代碼試試,讓別人看看你的水平有多高。
不是干這一行的,完全的業(yè)余愛(ài)好,再牛的人不也是從菜鳥(niǎo)成長(zhǎng)起來(lái)的嗎
回復(fù)

使用道具 舉報(bào)

ID:245473 發(fā)表于 2018-10-16 15:55 | 顯示全部樓層
學(xué)了這么久,這么簡(jiǎn)單的問(wèn)題還搞不定
回復(fù)

使用道具 舉報(bào)

ID:47286 發(fā)表于 2018-10-16 17:05 | 顯示全部樓層
飛線 發(fā)表于 2018-10-16 14:19
與其批評(píng)別人有多菜,不如寫幾行代碼試試,讓別人看看你的水平有多高。
不是干這一行的,完全的業(yè)余愛(ài)好 ...

這人水平不低 雖然我沒(méi)見(jiàn)過(guò)也不認(rèn)這人 僅聊過(guò)天 反正比我強(qiáng)很多

我開(kāi)始學(xué)單片機(jī)比你還晚 我也比你歲數(shù)大 能理解學(xué)習(xí)的艱難 但人確實(shí)各有所長(zhǎng) 學(xué)不會(huì)不一定是笨 也許就是不適合搞這方面而已 不管原因是什么 在技術(shù)領(lǐng)域 我們不如別人就不能因?yàn)閯e說(shuō)說(shuō)了什么而較勁

看你前面回復(fù)都很客氣 專門抽時(shí)間給你寫了完整的程序 但沒(méi)編譯也沒(méi)測(cè)試 不知道會(huì)有什么問(wèn)題 你試試吧

#include <stc15w.h>                                //包括 stc15w系列頭文件(起動(dòng)1T模式)

#define uchar unsigned char                //字符型宏
#define uint unsigned int                //整型宏

sbit relay = P?^?;              //定義你所用的端口
                                                                //--!!注意驅(qū)動(dòng)方式 是高有效還是低有效 是否需要置成推挽 硬件電路不同程序會(huì)不同!!--
                                                                //--!!所以 有可能你的繼電器不工作!!--
sbit key = P?^?;                //定義你所用的端口 置成準(zhǔn)雙向即可 或不設(shè)置 復(fù)位后默認(rèn)即準(zhǔn)雙向模式

bit flag_on1=0;                                        //聲明 1分鐘延時(shí)開(kāi)始標(biāo)記
bit flag_on5=0;                                        //聲明 5分鐘延時(shí)開(kāi)始標(biāo)記
bit flag_key=0;                                        //聲明 按鍵檢測(cè)標(biāo)記

uint numrelay=0;                                //聲明 臨時(shí)變量 繼電器延時(shí)計(jì)數(shù)器
uchar numshark=0;                                //聲明 臨時(shí)變量 按鍵防抖計(jì)數(shù)器

void Init_T0(void)                                //定時(shí)器中斷初始化 1T/5ms
{
        AUXR |= 0x80;                                //定時(shí)器時(shí)鐘1T模式        (1000 0000)
        TMOD |= 0x01;                                //設(shè)置 定時(shí)器模式        (0000 0001)
        TL0 = 0x00;                                        //設(shè)置 定時(shí)初值                5ms初值
        TH0 = 0x28;                                        //設(shè)置 定時(shí)初值                5ms初值
        TF0 = 0;                                        //清除 TF0標(biāo)志
        TR0 = 1;                                        //打開(kāi) 定時(shí)器0計(jì)時(shí)
        ET0 = 1;                                        //打開(kāi) 計(jì)時(shí)器0中斷
        EA  = 1;                                        //打開(kāi) 總中斷控制
}

void Server_Time0() interrupt 1        //中斷1服務(wù) 1T時(shí)鐘
{
        static uchar numt01;                //5ms到1s

        TL0 = 0x00;                                        //賦值 T0低位初值
        TH0 = 0x28;                                        //賦值 T0高位初值

        numt01++;                                        //自加 臨時(shí)計(jì)數(shù)器01
        numshark++;                                        //自加 計(jì)數(shù)器shark

        if(numt01==200)                                //如果 臨時(shí)計(jì)數(shù)器01達(dá)到設(shè)定值(5ms轉(zhuǎn)1s)
        {
                numt01=0;                                        //清零 臨時(shí)計(jì)數(shù)器01
                numrelay++;                                        //自加 計(jì)數(shù)器relay
        }
}

void Delay(uchar x)                //延時(shí)函數(shù) 按鍵防抖用 1x=1ms 在中斷服務(wù)里加個(gè)計(jì)數(shù)器即可
{
        numshark=0;
        while(numshark<x);
}

void main(void)
{
    Init_T0();                                //初始化 定時(shí)器中斷
   
        relay = ?;              //繼電器端口是置位還是清零取決于你所用的驅(qū)動(dòng)方式 比如P管是低有效就置位 N管是高有效就應(yīng)該清零

    while(1)
    {
         if(key==?                        //如果 按鍵按下(不知道你的按鍵是高觸發(fā)還是低觸發(fā) 高觸發(fā)=1 低觸發(fā)=0)
                 &&flag_key==0)                //并且 按鍵標(biāo)記=0
                 {
                         Delay(4);                        //延時(shí)20ms
                        if(key==?)                        //如果 按鍵依舊按下(即 防抖)
                        {
                                flag_on1=1;                        //置位 1分鐘延時(shí)開(kāi)始標(biāo)記
                                flag_key=1;                        //置位 按鍵標(biāo)記(不再進(jìn)入按鍵檢測(cè) 防止反復(fù)按鍵檢測(cè))
                                numrelay=0;                        //清零 計(jì)數(shù)器relay
                        }
                 }

                 if(flag_on1==1                        //如果 1分鐘延時(shí)標(biāo)記=1
                 &&numrelay>=60)                //并且 計(jì)數(shù)器relay達(dá)到設(shè)定值 60s
                 {
                        flag_on1=0;                                //清零 1分鐘延時(shí)開(kāi)始標(biāo)記 防止再進(jìn)入
                        flag_on5=1;                                //置位 5分鐘延時(shí)開(kāi)始標(biāo)記
                        relay=?;                                //打開(kāi) 繼電器
                        numrelay=0;                                //清零 計(jì)數(shù)器relay
                 }

                 if(flag_on5==1                        //如果 5分鐘延時(shí)標(biāo)記=1
                 &&numrelay>=300)                //如果 計(jì)數(shù)器relay達(dá)到設(shè)定值 300s
                 {
                        relay=~relay;                        //關(guān)閉 繼電器
                        flag_on5=0;                                //清零 5分鐘延時(shí)開(kāi)始標(biāo)記
                        flag_key=0;                                //清零 按鍵檢測(cè)標(biāo)記(可以再次檢測(cè)按鍵)
                 }
    }
}

評(píng)分

參與人數(shù) 3黑幣 +48 收起 理由
yong761228 + 10 很給力!
admin + 30 回帖助人的獎(jiǎng)勵(lì)!
飛線 + 8 很給力!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:405193 發(fā)表于 2018-10-17 07:23 | 顯示全部樓層
dzbj 發(fā)表于 2018-10-16 17:05
這人水平不低 雖然我沒(méi)見(jiàn)過(guò)也不認(rèn)這人 僅聊過(guò)天 反正比我強(qiáng)很多

我開(kāi)始學(xué)單片機(jī)比你還晚 我也比你歲數(shù) ...

非常感謝師傅
回復(fù)

使用道具 舉報(bào)

ID:405193 發(fā)表于 2018-10-17 07:37 | 顯示全部樓層
cjm82 發(fā)表于 2018-10-16 10:15
IO口配置有沒(méi)有設(shè)置成浮空?
另外單片機(jī)IO口不要直接去接繼電器,接個(gè)三極管,用三極管去驅(qū)動(dòng)繼電器.如果接 ...

非常謝謝師傅,您的程序沒(méi)有任何問(wèn)題,我還會(huì)改寫功能,硬件電路我懂。我只是對(duì) “angmall ” 師傅的程序沒(méi)有看懂,實(shí)驗(yàn)沒(méi)有成功。
回復(fù)

使用道具 舉報(bào)

ID:65956 發(fā)表于 2018-10-17 08:33 | 顯示全部樓層
這個(gè)不是很簡(jiǎn)單嗎,用1個(gè)定時(shí)器就可以搞定了,或不用定時(shí)器也可以搞定
回復(fù)

使用道具 舉報(bào)

ID:405193 發(fā)表于 2018-10-17 21:28 | 顯示全部樓層
各位師傅,我這個(gè)自鎖程序有問(wèn)題,遙控器ABCD 按每個(gè)按鈕都出現(xiàn)對(duì)應(yīng)的按鍵碼Key-d(相當(dāng)于波形,短時(shí)間里有許多相同的波形),D3 D2 D1 D0 是四個(gè)繼電器,按住或者按一下遙控器按鈕A,D3一直吸合,松開(kāi)遙控器按鈕A,再次按遙控器按鈕A,D3斷開(kāi);同理其它BCD也一樣。我現(xiàn)在這樣寫程序出現(xiàn)按住遙控器按鈕A, D3繼電器不停的吸合 斷開(kāi)。看看哪位師傅幫我修改一下程序,謝謝。

if(key_d == 0x08){D3=~D3;} //當(dāng)按鍵碼是0x08的時(shí)候,D3繼電器取反,問(wèn)題出現(xiàn)在短時(shí)間里有許多個(gè)0x08 出現(xiàn),就出現(xiàn)了不停的吸合 斷開(kāi)。我用了延時(shí)程序,問(wèn)題是延時(shí)程序過(guò)了還是出現(xiàn)這問(wèn)題,因?yàn)榭梢砸恢卑催b控器按鈕,超過(guò)延時(shí)的時(shí)間有出現(xiàn)同樣的問(wèn)題。
if(key_d == 0x04){D2=~D2;}
if(key_d == 0x02){D1=~D1;}
if(key_d == 0x01){D0=~D0;}       

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:280876 發(fā)表于 2018-10-18 09:18 | 顯示全部樓層
yong761228 發(fā)表于 2018-10-17 21:28
各位師傅,我這個(gè)自鎖程序有問(wèn)題,遙控器ABCD 按每個(gè)按鈕都出現(xiàn)對(duì)應(yīng)的按鍵碼Key-d(相當(dāng)于波形,短時(shí)間里有 ...

你按鍵掃描是怎么樣的,發(fā)上來(lái)看看
回復(fù)

使用道具 舉報(bào)

ID:405193 發(fā)表于 2018-10-18 18:57 | 顯示全部樓層
wushiye54 發(fā)表于 2018-10-18 09:18
你按鍵掃描是怎么樣的,發(fā)上來(lái)看看

師傅,您好,已經(jīng)有人幫我改好了,謝謝。
回復(fù)

使用道具 舉報(bào)

ID:272609 發(fā)表于 2018-10-19 17:43 | 顯示全部樓層
angmall 發(fā)表于 2018-10-13 16:18
我給你來(lái)個(gè)程序試試

老大,看了你的代碼,感覺(jué)你是計(jì)算機(jī)專業(yè)的科班出身,程序?qū)懙暮芫殻獙?shí)現(xiàn)的功能也能達(dá)到,但是對(duì)我們這些初學(xué)者來(lái)說(shuō),還是有一些難度,就比如這一句“if((StartRelay ==0) &&(Sec - StartSec >= Relay_on_Interval))”,我是看了兩分鐘才明白,要不是沒(méi)看C語(yǔ)言的書籍,我估計(jì)我還看不懂的。
最后感謝你的回復(fù)和代碼,我再仔細(xì)看看,還是能學(xué)到東西的。
回復(fù)

使用道具 舉報(bào)

ID:272609 發(fā)表于 2018-10-19 17:44 | 顯示全部樓層
Y_G_G 發(fā)表于 2018-10-13 19:31
C我不會(huì),匯編的話可以教你一下,我也是從什么都不會(huì)開(kāi)始自學(xué)的,也是走了很多的彎路

你都會(huì)匯編了,那C語(yǔ)言對(duì)你來(lái)說(shuō)就是小兒課了
回復(fù)

使用道具 舉報(bào)

ID:272609 發(fā)表于 2018-10-19 17:45 | 顯示全部樓層
本帖最后由 飛線 于 2018-10-19 20:38 編輯
wushiye54 發(fā)表于 2018-10-15 17:14
老哥,改行吧。都幾年了還是這樣

弟,哥純屬業(yè)余愛(ài)好,一邊工作一邊學(xué)習(xí)單片機(jī)。
回復(fù)

使用道具 舉報(bào)

ID:272609 發(fā)表于 2018-10-19 17:54 | 顯示全部樓層
yong761228 發(fā)表于 2018-10-15 20:07
樓主努力,我也是最近才開(kāi)始學(xué)單片機(jī)編程,我都40多歲了,我都不怕,加油!

加油,我感覺(jué)我都快入門了
回復(fù)

使用道具 舉報(bào)

ID:272609 發(fā)表于 2018-10-19 17:57 | 顯示全部樓層
hong19851024 發(fā)表于 2018-10-16 15:55
學(xué)了這么久,這么簡(jiǎn)單的問(wèn)題還搞不定

哈哈,讓你見(jiàn)笑了
回復(fù)

使用道具 舉報(bào)

ID:272609 發(fā)表于 2018-10-19 18:12 | 顯示全部樓層
dzbj 發(fā)表于 2018-10-16 17:05
這人水平不低 雖然我沒(méi)見(jiàn)過(guò)也不認(rèn)這人 僅聊過(guò)天 反正比我強(qiáng)很多

我開(kāi)始學(xué)單片機(jī)比你還晚 我也比你歲數(shù) ...

謝謝你的代碼,寫了這么多行,一定占用了你不少的時(shí)間,再次謝謝你。我是初學(xué)者,學(xué)習(xí)的是51的單片機(jī),買的是郭天祥的開(kāi)發(fā)板,從頭到尾看了你的程序,感覺(jué)是可行的。
因?yàn)槲也皇荢TC15系統(tǒng)的開(kāi)發(fā)板,再加上我想加入一些擴(kuò)展功能,所以沒(méi)有下載進(jìn)去。
if(flag_on1==1  &&numrelay>=60)//如果 1分鐘延時(shí)標(biāo)記=1,這個(gè)是也在學(xué)了C語(yǔ)言的書后,看到了,另外對(duì)標(biāo)志位flag的用法,也有了一些概念。
                  
回復(fù)

使用道具 舉報(bào)

ID:47286 發(fā)表于 2018-10-20 11:33 | 顯示全部樓層
飛線 發(fā)表于 2018-10-19 18:12
謝謝你的代碼,寫了這么多行,一定占用了你不少的時(shí)間,再次謝謝你。我是初學(xué)者,學(xué)習(xí)的是51的單片機(jī),買 ...

不用客氣

各人有自己的情況 所以別人寫的東西細(xì)節(jié)上肯定滿足不了 我提供的也只是個(gè)思路 能幫到你就好
回復(fù)

使用道具 舉報(bào)

ID:405193 發(fā)表于 2018-10-21 23:37 | 顯示全部樓層
各位師傅,幫我看看下面的程序怎么寫,我剛學(xué),水平有限,非常感謝。
   //  電機(jī)正反轉(zhuǎn)互鎖的,就是通電一秒電機(jī)正轉(zhuǎn)relay1吸合,到了行程終點(diǎn)或限位開(kāi)關(guān)K2停止,
                   //再通電一秒電機(jī)反轉(zhuǎn)relay2吸合,到了另一邊限位開(kāi)關(guān)K3停止
#include <reg52.h>
sbit relay1 = P1^3;              //繼電器,0線圈吸合,1線圈斷開(kāi)
sbit relay2 = P1^4;  
sbit key1 = P3^7;                //按鍵,0為按下,1為松開(kāi)
sbit k2 = P3^1;                                           //relay1 停止;K2=0時(shí),relay1 是斷開(kāi)的,K2=1時(shí),relay1才能吸合
sbit k3 = P3^0;                                           // relay2 停止;K3=0時(shí),relay2 是斷開(kāi)的,K3=1時(shí),relay2才能吸合
unsigned char key_timer_cnt;    //檢測(cè)按鍵計(jì)時(shí)變量
unsigned char relay_state;       //記錄繼電器狀態(tài) 0=未觸發(fā) 1=待吸合 2=待斷開(kāi)

        

void main(void)
{
        P1=0xFF;
                P3=0xFF;
        Init_T0();
        relay1 = 1;                         //斷開(kāi)繼電器
        relay2 = 1;   
                relay_state = 0;               //繼電器處于未觸發(fā)狀態(tài)
        while(1)
        {
                                   //想實(shí)現(xiàn)其他功能,再這里添加代碼
        }
}
void T0_ISR() interrupt 1              //1毫秒
{
        TH0 = 0xfc;
        TL0 = 0x18;
//***************************待觸發(fā)狀態(tài),需要做的只是判斷按鍵有沒(méi)有按下*******************
        if(relay_state == 0)                //當(dāng)繼電器處于待觸發(fā)狀態(tài)
        {
                if(key1 == 0)                      //按鍵按下,并且繼電器處于未觸發(fā)狀態(tài)
                {
                                         key_timer_cnt++;                                  //按鍵計(jì)時(shí)器自加,用于消抖
                        if(key_timer_cnt>=5)                              //按鍵超過(guò)5毫秒
                        {
                            key_timer_cnt = 0;                          
                                 
                        }else
                {
                        key_timer_cnt = 0;
                }
                        }
            }
        //****請(qǐng)教是否下面程序怎么寫,謝謝!*********************************************
               //三種狀態(tài):
                //第一種:  K2=1并且K3=1        (相當(dāng)于電機(jī)不在兩邊,在中間任何位置)
                //    觸發(fā)Key1=0    relay1=0,relay2=1,到達(dá)限位后停止  K2=0, relay1=1,
            //第二種: K2=0并且K3=1        (相當(dāng)于電機(jī)在一邊限位上)
                //          觸發(fā)Key1=0         relay1=1,relay2=0,到達(dá)限位后停止  K3=0, relay2=1,
                // 第三種: K2=1并且K3=0        (相當(dāng)于電機(jī)在另外一邊限位上)
                //          觸發(fā)Key1=0         relay1=0,relay2=1,到達(dá)限位后停止  K2=0, relay1=1,

}      
回復(fù)

使用道具 舉報(bào)

ID:405193 發(fā)表于 2018-10-22 08:16 | 顯示全部樓層
                   //  電機(jī)正反轉(zhuǎn)互鎖的,就是通電一秒電機(jī)正轉(zhuǎn)relay1吸合,到了行程終點(diǎn)或限位開(kāi)關(guān)K2停止,
                   //再通電一秒電機(jī)反轉(zhuǎn)relay2吸合,到了另一邊限位開(kāi)關(guān)K3停止
#include <reg52.h>
sbit relay1 = P1^3;              //繼電器,0線圈吸合,1線圈斷開(kāi)
sbit relay2 = P1^4;  
sbit key1 = P3^7;                //按鍵,0為按下,1為松開(kāi)
sbit k2 = P3^1;                                           //relay1 停止;K2=0時(shí),relay1 是斷開(kāi)的,K2=1時(shí),relay1才能吸合
sbit k3 = P3^0;                                           // relay2 停止;K3=0時(shí),relay2 是斷開(kāi)的,K3=1時(shí),relay2才能吸合
unsigned char key_timer_cnt;    //檢測(cè)按鍵計(jì)時(shí)變量
unsigned char relay_state;       //記錄繼電器狀態(tài) 0=未觸發(fā) 1=觸發(fā)
void Init_T0(void)                  //定時(shí)器中斷初始化,設(shè)置為1ms
{
    TMOD = 0x01;
    TH0 = 0xfc;
    TL0 = 0x18;
    EA = 1;
    ET0 = 1;
    TR0 = 1;
}

void main(void)
{
        P1=0xFF;
                P3=0xFF;
        Init_T0();
        relay1 = 1;                         //斷開(kāi)繼電器
        relay2 = 1;   
                relay_state = 0;               //繼電器處于未觸發(fā)狀態(tài)
        while(1)
        {
                                   //想實(shí)現(xiàn)其他功能,再這里添加代碼
        }
}
void T0_ISR() interrupt 1              //1毫秒
{
        TH0 = 0xfc;
        TL0 = 0x18;
//***************************待觸發(fā)狀態(tài),需要做的只是判斷按鍵有沒(méi)有按下*******************
        if(relay_state == 0)                //當(dāng)繼電器處于待觸發(fā)狀態(tài)
        {
                if(key1 == 0)                      //按鍵按下,并且繼電器處于未觸發(fā)狀態(tài)
                {
                                                  relay1 = 1;                         //斷開(kāi)繼電器
                          relay2 = 1;   
                                                  key_timer_cnt++;                    //按鍵計(jì)時(shí)器自加,用于消抖
                        if(key_timer_cnt>=10)                    //按鍵超過(guò)10毫秒
                        {
                            key_timer_cnt = 0;                          
                            relay_state = 1;      
                        }
                                               
                                }                else
                {
                        key_timer_cnt = 0;
                }
                         
            }
        //******各位師傅,幫我看看下面程序錯(cuò)在什么地方,三種情況選擇:
                //狀態(tài)1:         K2= 1并且K3=1 ,relay1 = 0;  直到K2=0,relay1 = 1; 并且返回 relay_state = 0;
                //狀態(tài)2:          K2= 0并且K3=1 ,relay2 = 0;  直到K3=0,relay2 = 1; 并且返回 relay_state = 0;
                //狀態(tài)3:          K2= 1并且K3=0 ,relay1 = 0;  直到K2=0,relay1 = 1; 并且返回 relay_state = 0;
                //*******************************************
      
                   if(         relay_state == 1)
                   {
                  
                       if((k2==1)&& (k3==1))
                                    {  relay1 = 0;  
                           if  (k2==0)
                                  {relay1 = 1; relay_state = 0; }
                                 }
                   else if((k2==0)&& (k3==1))
                                 {  relay2 = 0;   
                           if  (k3==0)
                                    {relay2 = 1; relay_state = 0; }
                          }
                   else if((k2==1)&& (k3==0))
                                 {  relay1 = 0;
                            if  (k2==0)
                                {relay1 = 1; relay_state = 0; }
                         }                                                 
                }
          
         
}      
回復(fù)

使用道具 舉報(bào)

ID:47286 發(fā)表于 2018-10-22 10:11 | 顯示全部樓層
yong761228 發(fā)表于 2018-10-22 08:16
//  電機(jī)正反轉(zhuǎn)互鎖的,就是通電一秒電機(jī)正轉(zhuǎn)relay1吸合,到了行程終點(diǎn)或限位開(kāi)關(guān)K2停止,
                   //再 ...

你直接描述要干嘛吧 看別人程序想明白別人思路再給人家改 對(duì)我來(lái)說(shuō)太難了 我懶 不如你說(shuō)明白要干嘛直接重新寫

你后邊這邏輯貌似有問(wèn)題 所有狀態(tài)都返回相同結(jié)果 但不管什么時(shí)候都會(huì)滿足其中一組條件 那就是說(shuō)任何時(shí)候返回的都是相同結(jié)果
回復(fù)

使用道具 舉報(bào)

ID:216962 發(fā)表于 2018-10-22 11:21 | 顯示全部樓層
飛線 發(fā)表于 2018-10-19 17:45
弟,哥純屬業(yè)余愛(ài)好,一邊工作一邊學(xué)習(xí)單片機(jī)。

說(shuō)真的,我也是業(yè)余學(xué)習(xí)的。好多謝你們的分享,論壇有你們會(huì)更精彩!
回復(fù)

使用道具 舉報(bào)

ID:405193 發(fā)表于 2018-10-22 11:35 | 顯示全部樓層
dzbj 發(fā)表于 2018-10-22 10:11
你直接描述要干嘛吧 看別人程序想明白別人思路再給人家改 對(duì)我來(lái)說(shuō)太難了 我懶 不如你說(shuō)明白要干嘛直接重 ...

師傅,您好,要實(shí)現(xiàn)的是這樣的狀態(tài)

//狀態(tài)1:         K2= 1并且K3=1 ,relay1 = 0;  直到K2=0,relay1 = 1; 并且返回 relay_state = 0;
                //狀態(tài)2:          K2= 0并且K3=1 ,relay2 = 0;  直到K3=0,relay2 = 1; 并且返回 relay_state = 0;
                //狀態(tài)3:          K2= 1并且K3=0 ,relay1 = 0;  直到K2=0,relay1 = 1; 并且返回 relay_state = 0;
                //*******************************************
      
            
回復(fù)

使用道具 舉報(bào)

ID:405193 發(fā)表于 2018-10-22 11:41 | 顯示全部樓層
dzbj 發(fā)表于 2018-10-22 10:11
你直接描述要干嘛吧 看別人程序想明白別人思路再給人家改 對(duì)我來(lái)說(shuō)太難了 我懶 不如你說(shuō)明白要干嘛直接重 ...

謝謝師傅: 電機(jī)正反轉(zhuǎn)互鎖的,就是通電一秒(key=0)電機(jī)正轉(zhuǎn)(relay1=0)吸合,到了行程終點(diǎn)或限位開(kāi)關(guān)(K2=0)停止,再通電一秒(key=0)電機(jī)反轉(zhuǎn)(relay2=0)吸合,到了另一邊限位開(kāi)關(guān)(K3=0)停止
K2 K3 有三種狀態(tài):
//狀態(tài)1:          K2= 1并且K3=1 ,relay1 = 0;  直到K2=0,relay1 = 1;
//狀態(tài)2:          K2= 0并且K3=1 ,relay2 = 0;  直到K3=0,relay2 = 1;               
//狀態(tài)3:          K2= 1并且K3=0 ,relay1 = 0;  直到K2=0,relay1 = 1;
回復(fù)

使用道具 舉報(bào)

ID:357520 發(fā)表于 2018-10-22 22:20 | 顯示全部樓層
Y_G_G 發(fā)表于 2018-10-13 19:31
C我不會(huì),匯編的話可以教你一下,我也是從什么都不會(huì)開(kāi)始自學(xué)的,也是走了很多的彎路

可以寫一下,最近也想學(xué)習(xí)一下匯編
回復(fù)

使用道具 舉報(bào)

ID:47286 發(fā)表于 2018-10-23 01:29 | 顯示全部樓層
yong761228 發(fā)表于 2018-10-22 11:41
謝謝師傅: 電機(jī)正反轉(zhuǎn)互鎖的,就是通電一秒(key=0)電機(jī)正轉(zhuǎn)(relay1=0)吸合,到了行程終點(diǎn)或限位開(kāi)關(guān)(K2=0 ...

//謝謝師傅: 電機(jī)正反轉(zhuǎn)互鎖的,就是通電一秒(key=0)電機(jī)正轉(zhuǎn)(relay1=0)吸合,
//到了行程終點(diǎn)或限位開(kāi)關(guān)(K2=0)停止,再通電一秒(key=0)電機(jī)反轉(zhuǎn)(relay2=0)吸合,到了另一邊限位開(kāi)關(guān)(K3=0)停止
//K2 K3 有三種狀態(tài):

uchar status=0;                //聲明 狀態(tài)變量
uchar bakup=0;                //聲明 備份變量

bit flag_key=0;                //聲明 按鍵標(biāo)記
bit flag_run=0;                //聲明 繼電器運(yùn)行標(biāo)記

void key_status()        //止點(diǎn)掃描
{
//狀態(tài)1:K2= 1并且K3=1 ,relay1 = 0;直到K2=0,relay1 = 1;
        if(key2==1                //如果 止點(diǎn)2=1
        &&key3==1)                //并且 止點(diǎn)3=1
        {
                status=1;                //賦值 狀態(tài)=1
        }
//狀態(tài)2:K2= 0并且K3=1 ,relay2 = 0;直到K3=0,relay2 = 1;
        if(k2==0                //如果 止點(diǎn)2=0
        &&k3==1)                //如果 止點(diǎn)3=1
        {
                status=2;                //賦值 狀態(tài)=2
        }
//狀態(tài)3:K2= 1并且K3=0 ,relay1 = 0;直到K2=0,relay1 = 1;
        if(k2==1                //如果 止點(diǎn)2=1
        &&k3==0)                //如果 止點(diǎn)3=0
        {
                status=3;                //賦值 狀態(tài)=3
        }
}

void key_down()                //按鍵檢測(cè)
{
        if(key==0                        //如果 按鍵按下
        &&flag_key==0)                //并且 按鍵標(biāo)記=0
        {
                Delay(200);                        //延時(shí)1s
                if(key==0)                        //如果 按鍵依舊按下
                {
                        flag_key=1;                        //置位 按鍵標(biāo)記
                        backup=status;                //賦值 備份變量=狀態(tài)變量
                        flag_run=1;                        //置位 繼電器運(yùn)行標(biāo)記
                }
        }
}

void  jk_run()                //繼電器工作
{
        if(backup==status                //如果 備份變量=狀態(tài)變量
        &&flag_run==1)                        //并且 繼電器運(yùn)行標(biāo)記=1
        {
                switch (status)                //選擇 狀態(tài)
                {
                        case 1:                //狀態(tài)1:正轉(zhuǎn)
                                relay1=0;                //繼電器1吸合
                                relay2=1;                //繼電器2釋放
                        break;
       
                        case 2:                //狀態(tài)2:反轉(zhuǎn)
                                relay1=1;                //繼電器1釋放
                                relay2=0;                //繼電器2吸合
                        break;
       
                        case 3:                //狀態(tài)3:正轉(zhuǎn)
                                relay1=0;                //繼電器1吸合
                                relay2=1;                //繼電器2釋放
                        break;
                }
        }
        else                                        //否則 即 備份變量!=狀態(tài)變量(狀態(tài)改變)
        {
                Delay(4);                                //延時(shí)20ms防抖
                if(backup!=status)                //如果 狀態(tài)依舊改變中
                {
                        backup=0;                                //清零 備份變量
                        relay1=1;                                //繼電器1釋放
                        relay2=1;                                //繼電器2釋放
                        flag_key=0;                                //清零 按鍵標(biāo)記
                        flag_run=0;                                //清零 繼電器運(yùn)行標(biāo)記
                }
        }
}

void main()
{
        //初始化T0計(jì)時(shí)器(應(yīng)該寫成每5ms一個(gè)中斷)

        while(1)
        {
                key_status();        //止點(diǎn)掃描
                key_down();                //按鍵檢測(cè)
                jk_run();                //繼電器工作
        }
}

評(píng)分

參與人數(shù) 1黑幣 +10 收起 理由
yong761228 + 10 贊一個(gè)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:405193 發(fā)表于 2018-10-23 08:51 | 顯示全部樓層
dzbj 發(fā)表于 2018-10-23 01:29
//謝謝師傅: 電機(jī)正反轉(zhuǎn)互鎖的,就是通電一秒(key=0)電機(jī)正轉(zhuǎn)(relay1=0)吸合,
//到了行程終點(diǎn)或限位開(kāi) ...

非常感謝師傅。
回復(fù)

使用道具 舉報(bào)

ID:405193 發(fā)表于 2018-10-23 20:23 | 顯示全部樓層
dzbj 發(fā)表于 2018-10-23 01:29
//謝謝師傅: 電機(jī)正反轉(zhuǎn)互鎖的,就是通電一秒(key=0)電機(jī)正轉(zhuǎn)(relay1=0)吸合,
//到了行程終點(diǎn)或限位開(kāi) ...

師傅您好,我測(cè)試了一下,K2=0或者K3=0的時(shí)候觸發(fā)key,繼電器應(yīng)該一直工作,到達(dá)對(duì)面開(kāi)關(guān),現(xiàn)在問(wèn)題是繼電器吸合離開(kāi)K2或者K3就斷開(kāi),沒(méi)有一直運(yùn)行到對(duì)面開(kāi)關(guān)才斷開(kāi),非常感謝您。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表