找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1183|回复: 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 单片机教程网

快速回复 返回顶部 返回列表