求助解决信号触发次数

2019-07-15 20:43发布

求助坛里的各位高手,我想在一块四路输出的单片机上实现当在5秒的时间内,有三次触发信号后,输出口依次闭合2秒,这是我写的程序,这个程序有两个问题,一个是信号只有一次触发输出口就开始闭合了,而不是我要求的三次才开始闭合,二是这个程序在板一直处于待机状态时只能连续工作几次(次数不定,有可以10次,有时是3次,搞不明的),请各位指点指点。

#include<reg52.h>          //库文件
#define uchar unsigned char//宏定义无符号字符型
#define uint unsigned int  //宏定义无符号整型  ]
uchar sec; //定时器0计算秒数  
uint tcnt;  //定时器0中断 次数
uchar sec0; //定时器1计算秒数  
uint tcnt0;  //定时器1中断 次数
uchar temp; //触发信号次数  


/********************************************************************
                            初始定义
*********************************************************************/
/*定义八位输入为单片机P1口*/
sbit IN0=P1^0;
sbit IN1=P1^1;
//sbit IN2=P1^2;
//sbit IN3=P1^3;
/*定义八位输出为单片机P2口*/
sbit K1=P2^0;
sbit K2=P2^1;
sbit K3=P2^2;
sbit K4=P2^3;
/********************************************************************
                            延时函数
*********************************************************************/
void delay(uchar t)
{
  uchar i,j;
   for(i=150;i<t;i++)
   {
     for(j=130;j>0;j--);
  { ;
  }
   }
}

void key()
{

if((IN0==0)&&(temp==0))
{
   sec=0;
   tcnt=0;
   temp++;
   TR0=1;
   
}   
while((!IN0)&&(temp<3))temp++;
// if((IN0==0)&&(temp==1))
// {
  
//   while(!IN0);
// }
// if((IN0==0)&&(temp==2))
// {
//   temp++;
//   while(!IN0);
// }
  
}
/********************************************************************
                            定时中断服务函数
*********************************************************************/
void t0(void) interrupt 1 using 0 //定时中断服务函数
{
tcnt++; //每过250us tcnt 加一
if(tcnt==4000) //计满4000 次(1秒)时
{
  tcnt=0; //重新再计
  sec++;
  if((sec<=5)&&(temp==3)) //5秒内供电3次
  {
    sec=0;
    temp=0;
    K1=0; //K1闭合通电  
    TR0=0; //关定时0
    TR1=1;//开定时器1
  }
  if((temp==3)&&(sec>5))temp=0;

}
}
void t1(void) interrupt 3 using 0 //定时中断服务函数
{
tcnt0++; //每过250ust tcnt 加一
if(tcnt0==4000) //计满4000 次(1 秒)时
{
  tcnt0=0; //重新再计
  sec0++;
  if(sec0==2)   //K1通电2秒
  {
    K1=1;delay(50);  //K1打开不通电
    K2=0; //K2闭合通电
   
  }
   if(sec0==4)   //K1通电2秒
  {
    K2=1;delay(50);  //K2打开不通电
    K3=0; //K3闭合通电
   
  }
   if(sec0==6)   //K1通电2秒
  {
    K3=1;delay(50);  //K1打开不通电
    K4=0; //K2闭合通电
   
  }
  if(sec0==8)   //K2通电2秒
  {
   
    sec0=0;
    K4=1;    //K2打开不通电
    TR1=0;
  
  }
}
}
/********************************************************************
                            主函数
*********************************************************************/
void main()
{
TMOD=0x22; //定时器工作在方式2
TH0=0x06; //对TH0 TL0 赋值
TL0=0x06;
TH1=0x06; //对TH0 TL0 赋值
TL1=0x06;
ET0=1;
ET1=1;
EA=1;
sec=0;
while(1)
{
  key();
// key2();
  
}      
}

/********************************************************************
                              结束
*********************************************************************/


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
依然落叶飘零
1楼-- · 2019-07-15 22:23
个人愚见:第一:你是什么触发信号,如果是好像按键之类的肯定要去抖动,否则就出现你所说的,以此触发信号就会开始闭合了。
第二:你在定时器1里面又调用了延时2s的延时函数,那在中断的时候不能再进入中断了,那么sec0得值是不准确的。
z00
2楼-- · 2019-07-16 01:56
sec0的值在主函数、t0、t1函数中都会发生变化,值会不准确

程序架构有问题,应当尽量减少中断函数的运行时间,特别是不能再中断里面使用时间延时
hwh123
3楼-- · 2019-07-16 02:17
中断函数里面的处理时间是不是过长了点啊,进入中断里面处理时间尽可能的短
ntmusic
4楼-- · 2019-07-16 03:07
我没仔细看你的程序,但貌似发现你的按键居然没有延时消抖-这样你稍微触发一下基本上都识别到连续触发几次了。此外,对于你的简单要求,仅需一个定时器提供时间基准就足够了,完全没必要用两个定时器。

一周热门 更多>