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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6058|回復(fù): 23
打印 上一主題 下一主題
收起左側(cè)

使用單片機(jī)定時器的方法,長按按鍵一分鐘后吸合,吸合后延時5分鐘后斷開

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:272609 發(fā)表于 2018-11-19 00:10 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  使用89C52的單片機(jī),用C語言編程,使用定時器的方法,長按按鍵一分鐘后吸合,吸合后延時5分鐘后斷開,如果按鍵按壓不足1分則不吸合。初步會用定時器,自己寫了一個使用定時器的程序,1秒吸合1斷開程序,編譯后可以運(yùn)行,又寫了一個按鍵按下后,繼電器吸合、斷開的程序,也成功了,可是寫上面這個程序的時候一片空白,求大神再幫忙寫一個程序,可能你認(rèn)為很簡單的一個程序,可能會讓我們這些小白能學(xué)到很多的東西。

下面是我寫的程序,大神可自由修改,或者自行編寫。
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
void delay1ms(uint z)
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
        
}
sbit key=P2^4;
sbit relay=P3^4;
uint count;
void init()
{
        TMOD=0x01;
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        EA=1;
        ET0=1;
        TR0=1;
}
void main()
{
        init();
        while(1)
        {
                if(count==20)
                {
                  count=0;
                  relay=~relay;
                                
                }
        }
}
void timer0() interrupt 1
{
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        count++;
        
}

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

使用道具 舉報

沙發(fā)
ID:310519 發(fā)表于 2018-11-19 09:23 | 只看該作者
檢測到按鍵按下,啟動定時器開始計時。

長按則一直計時,到設(shè)定時間繼電器吸合,計時繼續(xù),到設(shè)定時間繼電器放開。

如果長按中沒到設(shè)定時間松開,則關(guān)閉定時器并清零計時寄存器;

評分

參與人數(shù) 1黑幣 +10 收起 理由
飛線 + 10 是這個意思,可是寫不出來

查看全部評分

回復(fù)

使用道具 舉報

板凳
ID:64825 發(fā)表于 2018-11-19 09:44 | 只看該作者
關(guān)鍵是有人愿意按鍵按一分鐘嗎?一分鐘過程中如果有抖動,是不是重頭再來,感覺不現(xiàn)實(shí),超過5秒就不現(xiàn)實(shí)了,我們一般用按鍵就是長按和短按,你這個長按時間太長了

評分

參與人數(shù) 1黑幣 +10 收起 理由
飛線 + 10 按鍵按下一分,只是一個比喻,前端其實(shí)是一.

查看全部評分

回復(fù)

使用道具 舉報

地板
ID:379730 發(fā)表于 2018-11-19 10:39 | 只看該作者
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
void delay1ms(uint z)
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);

}
sbit key=P2^4;
sbit relay=P3^4;
uint16 count;
uint8  key_flag = 0,key_flag_num = 0;
void init()
{
        TMOD=0x01;
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        EA=1;
        ET0=1;

}
void main()
{
        init();
        while(1)
        {
                                        if((key_flag == 0) && (key_flag_num == 0))
                                        {
                        if(key == 0)
                        {
                                delay1ms(5);
                                if(key == 0)
                                        {
                                                key_flag = 1;
                                                TR0=1;
                                        }       
                         
                         
                                        
                        }
                }

        }
}
void timer0() interrupt 1
{
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        count++;

        if((key != 0) && (key_flag == 1))
                {
                        count = 0;
                        TR0=0;
                        key_flag = 0;
                }
        if((count >= 1200) && (key_flag == 1))  
                {
                        relay=~relay;
                        count = 0;
                        key_flag = 0;
                        key_flag_num = 1;
                }
        if(count >= 6000)
                {
                        relay=~relay;
                        TR0=0;
                        key_flag = 0;
                        count = 0;
                        key_flag_num = 0;
                }


}

評分

參與人數(shù) 1黑幣 +10 收起 理由
飛線 + 10 正在看你寫的程序,因為本人水平低,還不能.

查看全部評分

回復(fù)

使用道具 舉報

5#
ID:310519 發(fā)表于 2018-11-20 10:46 | 只看該作者
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit key =P1^0;//按鍵

sbit relay =P1^1;//繼電器控制 1關(guān)0開

uint count;//計時存儲器


void init()
{
       
        TMOD=0x01;
       
          TH0=(65536-50000)/256;
          TL0=(65536-50000)%256;

        ET0                =1;
        //TR0        =1;
        EA        =1;
}


void main()
{
        init();

       

        while (1)
        {
                if (key==0)//按鍵按下
                {
                       
                        TR0 =1;//啟動定時器
                       
                        while (!key);//長按
                }

               
        }
}

void timer0()interrupt 1
{
        TH0=(65536-50000)/256;
          TL0=(65536-50000)%256;

        count++;

        if (count ==100)//到達(dá)設(shè)定時間
        {
                relay =0;//繼電器吸合
        }

        if (count==200)//到達(dá)設(shè)定時間
        {
                relay =1;//繼電器放開

                count =0;//

                TR0 =0;

        }

        if (relay ==1 && key==1)//如果繼電器放開狀態(tài)并且按鍵松開
        {
                count =0;

                TR0 =0;

        }

}

評分

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

查看全部評分

回復(fù)

使用道具 舉報

6#
ID:272609 發(fā)表于 2018-11-21 09:39 | 只看該作者
diy1997 發(fā)表于 2018-11-20 10:46
#include
#define uchar unsigned char
#define uint unsigned int

利害,只用一個關(guān)系表達(dá)式,就把程序的整個意思表達(dá)出來了,程序?qū)懙那逦髁耍瑢ξ覀兂鯇W(xué)者來說比較易懂,稍后我下載到開發(fā)板上,進(jìn)行上機(jī)測試。
回復(fù)

使用道具 舉報

7#
ID:272609 發(fā)表于 2018-11-21 09:48 | 只看該作者
MMU_FS 發(fā)表于 2018-11-19 10:39
#include
#define uchar unsigned char
#define uint unsigned int

程序的寫有很條理,思路也很清晰,下載的單片機(jī)的開發(fā)板上,也可以正常運(yùn)行,并且多次按壓按鍵,只要達(dá)不到1分鐘,繼電器就不會吸合,寫的很棒,謝謝了。
另外,如果是按鍵按下1分鐘后,繼電器開始吸合,然后松開按鍵后,繼電器開始延時5分鐘再斷開,這個程序要怎么樣修改呢。
還有我今天會花一個小時,來仔細(xì)學(xué)習(xí)你寫的程序,然后達(dá)到活學(xué)活用定時器的目的。
回復(fù)

使用道具 舉報

8#
ID:310519 發(fā)表于 2018-11-21 19:09 | 只看該作者
if 繼電器吸合狀態(tài) && 按鍵松開

清除計數(shù)器重新計時
回復(fù)

使用道具 舉報

9#
ID:425206 發(fā)表于 2018-11-22 16:50 | 只看該作者
MMU_FS 發(fā)表于 2018-11-19 10:39
#include
#define uchar unsigned char
#define uint unsigned int

編譯錯誤,最后發(fā)現(xiàn)少了uint8和unit16的宏定義
回復(fù)

使用道具 舉報

10#
ID:272609 發(fā)表于 2018-11-24 10:32 | 只看該作者
林森 發(fā)表于 2018-11-22 16:50
編譯錯誤,最后發(fā)現(xiàn)少了uint8和unit16的宏定義

程序沒有問題,你把uint8和uint16都修改成uint就行了,我編輯完成后,下載到開發(fā)板上是可以的
回復(fù)

使用道具 舉報

11#
ID:272609 發(fā)表于 2018-11-24 11:28 | 只看該作者
diy1997 發(fā)表于 2018-11-21 19:09
if 繼電器吸合狀態(tài) && 按鍵松開

清除計數(shù)器重新計時

我按照你的思路,試著修改一下
回復(fù)

使用道具 舉報

12#
ID:272609 發(fā)表于 2018-12-7 10:44 | 只看該作者
MMU_FS 發(fā)表于 2018-11-19 10:39
#include
#define uchar unsigned char
#define uint unsigned int

MMU_FS 你好,你寫的程序下載的開發(fā)板上,可以實(shí)現(xiàn)上述功能,當(dāng)時要求是使用單片機(jī)定時器的方法,長按按鍵一分鐘后吸合,吸合后延時5分鐘后斷開 ,我想修改一下,變成按鍵按下1分鐘后,繼電器開始吸合,然后松開按鍵后,繼電器開始延時5分鐘再斷開。我是水平有限,修改了很長時間也不行,不過看了你的代碼,學(xué)會了軟件調(diào)試,還有關(guān)系表達(dá)式和邏輯表達(dá)式。我再試著修改一下,15號之前要是還是不行,我再請教你。
回復(fù)

使用道具 舉報

13#
ID:405193 發(fā)表于 2018-12-8 17:15 | 只看該作者
我學(xué)單片機(jī)3個月了,也寫了一個,樓主可以測試一下
#include <reg52.h>
sbit relay = P1^3;              //繼電器,0線圈吸合,1線圈斷開
sbit   key = P3^0;                //按鍵,0為按下,1為松開
bit flag=0;
#define uchar unsigned char
#define uint unsigned int
      

void Init_T0(void)             //50毫秒@11.0592MHz
{
    TMOD = 0x01;
     TL0 = 0x00;                           //設(shè)置定時初值
     TH0 = 0x4C;                           //設(shè)置定時初值
     TF0 = 0;                          //清除TF0標(biāo)志
     TR0 = 1;                          //定時器0開始計時
    ET0 = 1;
    EA = 1;
}
void main(void)
{
        
        Init_T0();
        relay = 1;                         //斷開繼電器
       while(1)
        {
             //想實(shí)現(xiàn)其他功能,再這里添加代碼
        }
}
void T0_ISR() interrupt 1              
{          
     static uint mm,nn;
        TL0 = 0x00;                             //設(shè)置定時初值          50毫秒
            TH0 = 0x4C;                            //設(shè)置定時初值

       if(key==0)                   //判斷按鍵是否被按下
         nn++;
           if((key==0)&&( nn>=1200))   // 按鍵按下并且到達(dá)1分鐘
         {   
            while(!key); nn=0;       //等待按鍵釋放
              relay=0;         flag=1;
                 }          
           if(flag==1)                  
                  mm++;
               {
              if( mm>=6000)                                   //吸合5分鐘斷開
                { mm=0; relay=1; flag=0;}
                }
}      
回復(fù)

使用道具 舉報

14#
ID:272609 發(fā)表于 2018-12-8 22:10 | 只看該作者
yong761228 發(fā)表于 2018-12-8 17:15
我學(xué)單片機(jī)3個月了,也寫了一個,樓主可以測試一下
#include
sbit relay = P1^3;              //繼電器 ...

好的,我在外地出差,回去了我試一下,謝謝你的分享
回復(fù)

使用道具 舉報

15#
ID:405193 發(fā)表于 2018-12-9 08:45 | 只看該作者
飛線 發(fā)表于 2018-12-8 22:10
好的,我在外地出差,回去了我試一下,謝謝你的分享

不客氣,我的定時器配置是根據(jù)STC配置的,你的51單片機(jī)如果時間不準(zhǔn), 可以修改一下。
回復(fù)

使用道具 舉報

16#
ID:272609 發(fā)表于 2018-12-16 20:02 | 只看該作者
MMU_FS 發(fā)表于 2018-11-19 10:39
#include
#define uchar unsigned char
#define uint unsigned int

苦思冥想了半個月,還是改不好,麻煩給說一下怎么改吧
回復(fù)

使用道具 舉報

17#
ID:275479 發(fā)表于 2018-12-16 20:50 | 只看該作者
好像看到了那年的自己,真的很高興,入門之后就好了,一切知識都變得很開朗
回復(fù)

使用道具 舉報

18#
ID:272609 發(fā)表于 2018-12-16 23:02 | 只看該作者
通天塔 發(fā)表于 2018-12-16 20:50
好像看到了那年的自己,真的很高興,入門之后就好了,一切知識都變得很開朗

還沒入門,不過我不會放棄的,前面很多人給我寫的程序,我把它打印下來,對照著在keil中抄2遍,理解他們寫的意思,寫的目的。
在學(xué)習(xí)的過程,學(xué)習(xí)了if語句、for語句、關(guān)系表達(dá)式,邏輯表達(dá)式,初步會使用了keil的軟件仿真調(diào)試。
回復(fù)

使用道具 舉報

19#
ID:405193 發(fā)表于 2018-12-20 21:51 | 只看該作者
  if((key==0)&&( nn>=1200))   // 按鍵按下并且到達(dá)1分鐘 繼電器吸合
         {   relay=0;
            while(!key); nn=0;       //按鍵釋放后開始延時計時
                      flag=1;
          }
   if(flag==1)                  
       mm++;
      {
         if( mm>=6000)                                   //延時5分鐘斷開
             { mm=0; relay=1; flag=0;}
       }   
你看看對不對,我也才學(xué)3個月。      
回復(fù)

使用道具 舉報

20#
ID:272609 發(fā)表于 2018-12-30 23:15 | 只看該作者
yong761228 發(fā)表于 2018-12-20 21:51
if((key==0)&&( nn>=1200))   // 按鍵按下并且到達(dá)1分鐘 繼電器吸合
         {   relay=0;
          ...

好的,我出差回去下載試試,不過看語句應(yīng)該是沒有問題的
回復(fù)

使用道具 舉報

21#
ID:272609 發(fā)表于 2018-12-30 23:33 | 只看該作者
yong761228 發(fā)表于 2018-12-20 21:51
if((key==0)&&( nn>=1200))   // 按鍵按下并且到達(dá)1分鐘 繼電器吸合
         {   relay=0;
          ...

學(xué)了三個月,真的很利害了,我把程序完整的寫了下來,你看是這個意思嗎,編譯的時候沒有錯誤
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
void delay1ms(uint z)
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);

}
sbit key=P2^4;
sbit relay=P3^4;
uint count,mm;
uint key_flag=0,key_flag_num=0;
void init()
{
         TMOD=0x01;
         TH0=(65536-50000)/256;
         TL0=(65536-50000)%256;
         EA=1;
         ET0=1;

}
void main()
{
         init();
         while(1)
         {
                 if((key_flag==0)&&(key_flag_num==0))
                  {
        if(key==0)
         {
                                         delay1ms(5);
                                         if(key==0)
                                         {
                                                 key_flag=1;
                                                 TR0=1;
                                         }        
         
                }
                        }

         }
}
void timer0() interrupt 1
{
         TH0=(65536-50000)/256;
         TL0=(65536-50000)%256;
         count++;
         mm++;

         if((key!=0) && (key_flag==1))
                                         {
                                                 count = 0;
                                                 TR0=0;
                                                 key_flag = 0;
                                         }
         if((count>=1200)&&(key_flag==1))  
                                         {
                                                 relay=0;
                                                 while(!key);
                                                 count=0;
                                                 key_flag_num=1;
                                         }
         if(key_flag_num=1)
                                         {
                                                 mm++;
                                                 {
                                                        if(mm>=6000)
                                                        {
                                                                mm=0;
                                                                relay=1;
                                                                key_flag_num=0;
                                                        }
                                                 }
                                                 
                                         }


}
回復(fù)

使用道具 舉報

22#
ID:272609 發(fā)表于 2019-1-3 06:46 | 只看該作者
MMU_FS 發(fā)表于 2018-11-19 10:39
#include
#define uchar unsigned char
#define uint unsigned int

改不好你的程序,把你寫的程序理解下來,然后憑著自己的理解又寫了一遍
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
void delay1ms (uint z)
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}
uint count;
uint key_num=0,key_nums=0;
sbit key=P2^1;
sbit relay=P3^4;
void init()
{       
        EA=1;
        ETO=1;
        TMOD=0x01;
        THO=(65536-50000)/256;
        TL0=(65536-50000)%256;
        TRO=0;
        relay=1;
}       
void main()
{
        init();
        while(1)
        {
                if((key_num==0)&&(key_nums==0))
                {
                        if(key==0)
                        {
                                delay1ms(5);
                                if(key==0);
                                        {
                                                key_num=1;
                                                TR0=1;
                                        }
                                               
                        }
               
                }
        }
       
}
void timer0() interrupt 1
{
        THO=(65536-50000)%256;
        TL0=(65536-50000)/256;
        count++;
        if((count>=1200)&&(key_num=1))
        {
                relay=~relay;
                count=0;
                key_num=0;
                key_nums=1;
        }
        if(count>=6000)
        {
                relay=~relay;
                count=0;
                key-num=0;
                key_nums=0;
                TR0=0;
               
        }
        if((key!=0&&key_nums==1))
        {
                key_num=0;
                TR0=0;
                count=0;
        }
}

回復(fù)

使用道具 舉報

23#
ID:405193 發(fā)表于 2019-1-3 09:25 | 只看該作者
飛線 發(fā)表于 2018-12-30 23:33
學(xué)了三個月,真的很利害了,我把程序完整的寫了下來,你看是這個意思嗎,編譯的時候沒有錯誤
#include
...

基本是這個意思。
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产一区二区三区在线 | 日韩精品一区二区三区久久 | 国产 日韩 欧美 在线 | 五月免费视频 | 一级黄色片在线看 | 国内精品视频在线观看 | 亚洲福利一区二区 | 欧美一区二区三区,视频 | 五月槐花香| 99精品久久久 | 日韩欧美中文 | 午夜在线视频 | 久久久久久国产一区二区三区 | 精品自拍视频在线观看 | 日本电影韩国电影免费观看 | 免费国产视频 | 国产精品久久久久久久久久免费 | 日韩久久久久久 | 色综合网站 | av免费网站在线观看 | 久久91| 日韩欧美一级精品久久 | 欧美日韩在线精品 | 天天影视色综合 | 欧美电影免费观看高清 | 国产乱人伦精品一区二区 | 欧美精品片 | 91久久国产综合久久91精品网站 | 国产中文字幕av | 91精品国产乱码麻豆白嫩 | 成人在线日韩 | 国产乱码高清区二区三区在线 | 久久久久久免费毛片精品 | 国产成人精品区一区二区不卡 | 欧美 中文字幕 | 国产1区2区3区 | 91精品国产91久久久久久吃药 | 国产露脸国语对白在线 | 精品国产欧美日韩不卡在线观看 | 亚洲高清视频在线 | 日韩电影中文字幕在线观看 |