输入:“jq1”,输出:“jq1kg”“dcf1”。
要求:(1) jq1按下后,jq1kg=0延时1ms后dcf1=0。
(2) jq1松开后,jq1kg=1延时6.53s后dcf1=1。
(3) 如果jq1松开后还不到6.53s又按下,则回到第一步的状态。
(4) jq1在任何时候按下都回到第一步状态。
下面是我写的程序,虽然可以做到jq1在任何时候按下都回到第一步状态,但是jq1松开后有的时候还不到6.53s,dcf1就=1了,希望能帮我把程序改一下。或者重新写一个也行。谢谢了。
/***************************************************************************************************/
#include "at89x51.h"
//IN
#define jq1 P1_0
//OUT
#define jq1kg P0_0
#define dcf1 P2_0
bit t_flag,t1_flag;
int m,n,nut;
unsigned char num;
/*****************延***时***程****序*************************************************/
void delay(int x)//1MS延时程序
{
unsigned char a,b,c;
for(c=x;c>0;c--)
for(b=38;b>0;b--)
for(a=130;a>0;a--);
}
/****************定**时**器**初**始**化********************************************/
void T0init() // 定时器中断计数 初始化
{
TMOD=0X01;
TH0=(65536-65535)/256;
TL0=(65536-65535)%256;
ET0=1;
EA=1;
}
/*****************自***动***程****序*************************************************/
void auto_sub()
{
T0init();
if(jq1==0)
{
t1_flag=0;
jq1kg=0;
delay(1);
dcf1=0;
while(jq1==1&&t1_flag==0)
{ jq1kg=1; TR0=1;
if(t_flag==1&&jq1==1)
{
dcf1=1;
TR0=0;
t_flag=0;
t1_flag=1;
}
}
}
}
/*************主***程***序**********************************************/
void main()
{
while(1)
{
if(jq1==0)
auto_sub();
}
}
/*************定***时***器***中***断***计***数*********************/
void T0server() interrupt 1 //定时器中断计数
{
TH0=(65536-65535)/256; //定时65.3ms给高八位
TL0=(65536-65535)%256; //定时65.3ms给低八位
num++;
if(num==100) //65.3ms*100=6.53s
{
num=0;
t_flag=1; //时间到了的标志位
}
}