求助坛里的各位高手,我想在一块四路输出的
单片机上实现当在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();
}
}
/********************************************************************
结束
*********************************************************************/
第二:你在定时器1里面又调用了延时2s的延时函数,那在中断的时候不能再进入中断了,那么sec0得值是不准确的。
程序架构有问题,应当尽量减少中断函数的运行时间,特别是不能再中断里面使用时间延时
一周热门 更多>