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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1915|回復: 10
打印 上一主題 下一主題
收起左側

求大咖們賜教,單片機1秒內連續兩次高電平觸發程序?

[復制鏈接]
跳轉到指定樓層
樓主
小弟剛接觸單片機不久,求大咖們賜教,單片機某一個IO口1秒內連續兩次高電平觸發,則執行啟動繼電器,該怎么寫?謝謝
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:51321 發表于 2022-10-19 21:00 | 只看該作者
程序在每1000ms內捕獲到p3.0 有2次高電平狀態,則啟動繼電器
回復

使用道具 舉報

板凳
ID:593706 發表于 2022-10-19 21:45 | 只看該作者
監測單片機的IO腳,如果出現高電平就計數一次,當一秒鐘內的計數超過二次,就將IO口的電平變換去驅動繼電器動作(單片機不能直接驅動繼電器,必須外置驅動放大電路)
回復

使用道具 舉報

地板
ID:51321 發表于 2022-10-19 22:17 | 只看該作者
lsgzq 發表于 2022-10-19 21:45
監測單片機的IO腳,如果出現高電平就計數一次,當一秒鐘內的計數超過二次,就將IO口的電平變換去驅動繼電器 ...

原理是這樣的   大佬 能賜一段代碼不
回復

使用道具 舉報

5#
ID:198189 發表于 2022-10-20 10:38 | 只看該作者
給你參考一下。
//STC8G系列
#include "reg51.h"
#include "intrins.h"
#define uchar unsigned char
unsigned char a=0,k=0;       
sbit k1=P3^3;//接繼電器觸發口
sbit int0=P3^2; //INT0 低電平中斷口
sfr     T2L         =   0xd7;
sfr     T2H         =   0xd6;
sfr     T3L         =   0xd5;
sfr     T3H         =   0xd4;
sfr     T4L         =   0xd3;
sfr     T4H         =   0xd2;
sfr     T4T3M       =   0xd1;
sfr     AUXR        =   0x8e;
sfr     IE2         =   0xaf;
#define ET2             0x04
#define ET3             0x20
#define ET4             0x40
sfr     AUXINTIF    =   0xef;
#define T2IF            0x01
#define T3IF            0x02
#define T4IF            0x04

sbit    P10         =   P1^0;
sbit    P11         =   P1^1;

sfr     P0M1        =   0x93;
sfr     P0M0        =   0x94;
sfr     P1M1        =   0x91;
sfr     P1M0        =   0x92;
sfr     P2M1        =   0x95;
sfr     P2M0        =   0x96;
sfr     P3M1        =   0xb1;
sfr     P3M0        =   0xb2;
sfr     P4M1        =   0xb3;
sfr     P4M0        =   0xb4;
sfr     P5M1        =   0xc9;
sfr     P5M0        =   0xca;

void TM0_Isr() interrupt 1
{
  TL0 = 0xCD;                //設置定時初始值
        TH0 = 0xD4;                //設置定時初始值  
        a++;
        if(a>=2000&&k>=2)
        {
                k1=1;//放入你想做的事情
                a=0;
                k=0;
        }
                           
}
void INT0_Isr() interrupt 0 //
{
k++;
}
void Timer0Init(void)                //1毫秒@11.0592MHz
{
        AUXR |= 0x80;                //定時器時鐘1T模式
        TMOD &= 0xF0;                //設置定時器模式
        TL0 = 0xCD;                //設置定時初始值
        TH0 = 0xD4;                //設置定時初始值
        TF0 = 0;                //清除TF0標志
        TR0 = 1;                //定時器0開始計時
}


void main()
{
    P0M0 = 0x00;
    P0M1 = 0x00;
    P1M0 = 0x00;
    P1M1 = 0x00;
    P2M0 = 0x00;
    P2M1 = 0x00;
    P3M0 = 0x00;
    P3M1 = 0x00;
    P4M0 = 0x00;
    P4M1 = 0x00;
    P5M0 = 0x00;
    P5M1 = 0x00;
          Timer0Init();
    IT0 = 1;                                    //使能INT0下降沿中斷 自己想辦法讓你的檢測端口高電平換成低電平
    EX0 = 1;                                    //使能INT0中斷
    EA = 1;
    k1=0;
    int0=1;

    while (1)
    {
        //沒有自己的想法
    }
}

回復

使用道具 舉報

6#
ID:8222 發表于 2022-10-20 11:08 | 只看該作者
設一變量,初始值為0,然后檢測按鍵動作,變量加1,在1秒內檢測到兩次按鍵動作,執行繼電器動作,然后對變量清0。
回復

使用道具 舉報

7#
ID:688692 發表于 2022-10-20 11:31 | 只看該作者
思路:在基準的中斷中,對一個變量定時+1.
每次檢測到上升沿,(這一次是1,上一次是0)先判斷這個變量累計的數是否小于1秒,如果是,執行動作。
然后把這個變量清0
回復

使用道具 舉報

8#
ID:688692 發表于 2022-10-20 12:44 | 只看該作者
  1. #include <reg52.h>

  2. sbit Button=P2^0;
  3. sbit LED=P1^1;

  4. unsigned char Time_Count;

  5. void Timer0Init(void)                //50毫秒@12.000MHz
  6. {
  7.         TMOD &= 0xF0;                //設置定時器模式
  8.         TMOD |= 0x01;                //設置定時器模式
  9.         TL0 = 0xB0;                //設置定時初始值
  10.         TH0 = 0x3C;                //設置定時初始值
  11.         TF0 = 0;                //清除TF0標志
  12.         TR0 = 1;                //定時器0開始計時
  13.         EA=1;
  14.         ET0=1;
  15. }

  16. void main()
  17. {
  18.         bit ButtonPrevVal,ButtonNowVal;
  19.         Timer0Init();
  20.         while(1)
  21.         {
  22.                 ButtonNowVal=Button;
  23.                 if(!ButtonPrevVal && ButtonNowVal)
  24.       {
  25.                           if(Time_Count<20){LED=!LED;}
  26.                                 Time_Count=0;
  27.                         }
  28.                 ButtonPrevVal=ButtonNowVal;
  29.         }
  30. }

  31. void timer0() interrupt 1
  32. {
  33.         TL0 = 0xB0;                //設置定時初始值
  34.         TH0 = 0x3C;                //設置定時初始值
  35.   Time_Count++;
  36. }
復制代碼


回復

使用道具 舉報

9#
ID:51321 發表于 2022-10-20 13:48 | 只看該作者
#include<reg51.h>
unsigned char flag,num,keyn;
sbit KEY=P1^0;
sbit LED=P1^1;
void delay(unsigned int a)
{
unsigned int i,j;
for(i=0;i<a;i++)
for(j=0;j<125;j++);
}
void t0isr() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
num++;
if(num>20)
{
num=0;
flag=0xff;
}
}
void keyscan()
{
if(P1.0==0)
{
delay(10);
TR0=1; //有效按鍵啟動定時器
if(P1.0==0)keyn++;
}
}
main()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
ET0=1;
num=0;
keyn=0;
while(1)
{
flag=0x00;
while(flag==0x00)//等待1秒定時結束
{
keyscan();
}
if(keyn>=2)
{
LED=0; //1秒內按兩次鍵,燈亮
keyn=0;
TR0=0;
}
}
}


大神們  幫忙看看  
回復

使用道具 舉報

10#
ID:51321 發表于 2022-10-20 13:50 | 只看該作者
溫xyz 發表于 2022-10-20 11:08
設一變量,初始值為0,然后檢測按鍵動作,變量加1,在1秒內檢測到兩次按鍵動作,執行繼電器動作,然后對變 ...

難者不會 會者不難  ,感謝大神賜教
回復

使用道具 舉報

11#
ID:123289 發表于 2022-10-21 09:03 | 只看該作者
原始:高電平次數統計N=0,1S的計時器JS=0。
1、當收到一個高電平后,起動一個1S的計時器。【執行:N=1,JS=1000ms】
2、如果1S的計時器計時未完時,又收到一個高電平,就啟動繼電器。【執行:N=2,JS<>0】
3、如果1S的計時器計時計完了,再未測到高電平,就當是放屁了。歸于原始狀態。【N=0,JS=0】
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 一区二区三区四区不卡 | 日韩欧美一区二区三区免费观看 | 亚洲国产一区视频 | 99精品欧美一区二区三区综合在线 | a级大毛片 | 久久国产成人 | 污片在线免费观看 | 国产美女精品视频 | 亚洲网在线 | 国产视频久 | 日韩精品在线观看免费 | av黄色在线播放 | 国产视频三区 | 91精品国产91久久久久久不卞 | av免费电影在线 | 国产91久久精品一区二区 | 91精品国产一区二区三区 | 999国产视频| 99精品国产一区二区青青牛奶 | 青青艹在线视频 | 91视频免费黄 | 国产免费一区 | 亚洲精品第一 | 国产成人综合网 | 91麻豆精品一区二区三区 | 91精品国产欧美一区二区成人 | 黄色骚片 | 国产婷婷 | 91网站在线观看视频 | 99在线资源 | 武道仙尊动漫在线观看 | 成人精品一区二区户外勾搭野战 | 国产四虎| 精品欧美一区二区三区 | 国产精品一区二区三区四区 | 日本高清aⅴ毛片免费 | 欧美精品久久久 | 色婷婷综合成人av | 亚洲视频www | 欧美精品91 | 成人午夜在线视频 |