標題: 求大咖們賜教,單片機1秒內連續(xù)兩次高電平觸發(fā)程序? [打印本頁]

作者: lyhot    時間: 2022-10-19 20:48
標題: 求大咖們賜教,單片機1秒內連續(xù)兩次高電平觸發(fā)程序?
小弟剛接觸單片機不久,求大咖們賜教,單片機某一個IO口1秒內連續(xù)兩次高電平觸發(fā),則執(zhí)行啟動繼電器,該怎么寫?謝謝

作者: lyhot    時間: 2022-10-19 21:00
程序在每1000ms內捕獲到p3.0 有2次高電平狀態(tài),則啟動繼電器
作者: lsgzq    時間: 2022-10-19 21:45
監(jiān)測單片機的IO腳,如果出現(xiàn)高電平就計數(shù)一次,當一秒鐘內的計數(shù)超過二次,就將IO口的電平變換去驅動繼電器動作(單片機不能直接驅動繼電器,必須外置驅動放大電路)
作者: lyhot    時間: 2022-10-19 22:17
lsgzq 發(fā)表于 2022-10-19 21:45
監(jiān)測單片機的IO腳,如果出現(xiàn)高電平就計數(shù)一次,當一秒鐘內的計數(shù)超過二次,就將IO口的電平變換去驅動繼電器 ...

原理是這樣的   大佬 能賜一段代碼不
作者: xia20    時間: 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;//接繼電器觸發(fā)口
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)
    {
        //沒有自己的想法
    }
}


作者: 溫xyz    時間: 2022-10-20 11:08
設一變量,初始值為0,然后檢測按鍵動作,變量加1,在1秒內檢測到兩次按鍵動作,執(zhí)行繼電器動作,然后對變量清0。
作者: cnos    時間: 2022-10-20 11:31
思路:在基準的中斷中,對一個變量定時+1.
每次檢測到上升沿,(這一次是1,上一次是0)先判斷這個變量累計的數(shù)是否小于1秒,如果是,執(zhí)行動作。
然后把這個變量清0
作者: cnos    時間: 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. }
復制代碼



作者: lyhot    時間: 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;
}
}
}


大神們  幫忙看看  
作者: lyhot    時間: 2022-10-20 13:50
溫xyz 發(fā)表于 2022-10-20 11:08
設一變量,初始值為0,然后檢測按鍵動作,變量加1,在1秒內檢測到兩次按鍵動作,執(zhí)行繼電器動作,然后對變 ...

難者不會 會者不難  ,感謝大神賜教
作者: yzwzfyz    時間: 2022-10-21 09:03
原始:高電平次數(shù)統(tǒng)計N=0,1S的計時器JS=0。
1、當收到一個高電平后,起動一個1S的計時器!緢(zhí)行:N=1,JS=1000ms】
2、如果1S的計時器計時未完時,又收到一個高電平,就啟動繼電器!緢(zhí)行:N=2,JS<>0】
3、如果1S的計時器計時計完了,再未測到高電平,就當是放屁了。歸于原始狀態(tài)。【N=0,JS=0】





歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1