/********************************************************************/
#include<reg52.h> //库文件
#define uchar unsigned char//宏定义无符号字符型
#define uint unsigned int //宏定义无符号整型
sfr P3M0 = 0xb2;
sfr P3M1 = 0Xb1;
/********************************************************************
初始定义
*********************************************************************/
uint sec = 0; //定义计数值,每过1/10 秒,sec 加一
uint tcnt = 0; //键值判断
uchar Start_Flag = 1;//定义一个全局变量,值初始化为1,用来判断首次上电的
/********************************************************************
I/O定义
*********************************************************************/
sbit OUT1=P3^3;//定义输出口为P3.3口 用以控制继电器
sbit IN1=P3^5; //定义输入口为P3.5口 用以输入信号
/********************************************************************
定时中断服务函数
*********************************************************************/
void t0(void) interrupt 1 using 0 //定时中断服务函数
{
tcnt++; //每过250ust tcnt 加一
if(tcnt==4000) //计满4000 次(1 秒)时
{
tcnt=0; //重新再计
sec++;
if(Start_Flag == 1)//判断为首次上电,进行11个小时的计数
{
if(sec==39596)
{
OUT1=1;
}
if(sec==39600) //单位为(1秒)
{
OUT1=0;
sec=0;
Start_Flag = 0;//11小时的时间到了,清0首次上电标志,进入24小时计数
}
}
else//进入24小时计数
{
if(sec==86396) //单位为(1 秒)?
{
OUT1=1;
}
if(sec==86400) //单位为(1秒)
{
OUT1=0;
sec=0;
}
}
}
}
/********************************************************************
主函数
*********************************************************************/
void main()
{
TMOD=0x02; //定时器工作在方式2
TH0=0x06; //对TH0 TL0 赋值
TL0=0x06;
TR0=1; //开始定时
ET0=1;
EA=1;
sec=0;
P3M0 = 0x08;
P3M1 = 0X00;
OUT1=0;//模块通电继电器吸合
while(1)
{
if(IN1==0){OUT1=1;while(!IN1);OUT1=0;}
}
}
/********************************************************************
结束
*********************************************************************/
说明下:
1.你的源程序的sec和tcnt并没有给出初始化值,会导致计数不准的
2.我不知道你的系统时钟是多少,没有办法帮你配置定时器的值,所以我就假设你的定时器溢出时间是250us
3.定时器时间是250us,但你源程序判断tcnt == 8000,也就是2秒,这个并不能够准确的计算5秒的接通时间,所以改成tcnt == 4000,就是1秒
4.下面判断sec的值也随之修改
试试吧
|