我要做这个是让P10口输出6小时高电平后输出30S低电平,然后循环。
芯片是AT89S52,晶振是12M,我测试6小时后,发现不会变成低电平;但是设置成20分钟就能成功,求大神指点
附程序:
#include <reg52.h>
sbit led=P1^0; //定义继电器
unsigned int i=0;
unsigned int j=0;
void zhongduan() interrupt 1 using 1 //声明定时器中断处理函数
{
if(i==20) //因为是50ms发生一次中断,每次中断i的值就加1,当i=20时,50ms*20=1秒时间到了
{
j++; // j的值+1
i=0; // i的值清零
}
if(j>=2400)
{
led=0; //当6小时到了以后,打开继电器
if(j>=2430)
{
led=1; //当30S到了以后,关闭继电器
j=0; //i的值清零
}
}
i++; //每发生一次中断,i的值就加1
TH0=(65536-50000)/256; //重新给定时器TH0装初始值 50000微秒=50ms
TL0=(65536-50000)%256; //重新给定时器TL0装初始值 50000微秒=50ms
}
void main()
{
//P1=0x00;
EA=1; //允许有中断请求
ET0=1; //允许定时器0 请求中断
led = 1; //初值关闭继电器
TMOD=0x01; //设定时器0 为 工作模式1 ,16位计数器
TH0=(65536-50000)/256; //给定时器TH0装初始值 50000微秒=50ms
TL0=(65536-50000)%256; //给定时器TL0装初始值 50000微秒=50ms
TR0=1; //TR=1是定时器工作,0是停止工作
while(1); //CPU不断在这里死循环,中断产生后放下工作去响应中断,处理完后然后再返回
}
芯片是AT89S52,晶振是12M,我测试6小时后,发现不会变成低电平;但是设置成20分钟就能成功,求大神指点
附程序:
#include <reg52.h>
sbit led=P1^0; //定义继电器
unsigned int i=0;
unsigned int j=0;
void zhongduan() interrupt 1 using 1 //声明定时器中断处理函数
{
if(i==20) //因为是50ms发生一次中断,每次中断i的值就加1,当i=20时,50ms*20=1秒时间到了
{
j++; // j的值+1
i=0; // i的值清零
}
if(j>=2400)
{
led=0; //当6小时到了以后,打开继电器
if(j>=2430)
{
led=1; //当30S到了以后,关闭继电器
j=0; //i的值清零
}
}
i++; //每发生一次中断,i的值就加1
TH0=(65536-50000)/256; //重新给定时器TH0装初始值 50000微秒=50ms
TL0=(65536-50000)%256; //重新给定时器TL0装初始值 50000微秒=50ms
}
void main()
{
//P1=0x00;
EA=1; //允许有中断请求
ET0=1; //允许定时器0 请求中断
led = 1; //初值关闭继电器
TMOD=0x01; //设定时器0 为 工作模式1 ,16位计数器
TH0=(65536-50000)/256; //给定时器TH0装初始值 50000微秒=50ms
TL0=(65536-50000)%256; //给定时器TL0装初始值 50000微秒=50ms
TR0=1; //TR=1是定时器工作,0是停止工作
while(1); //CPU不断在这里死循环,中断产生后放下工作去响应中断,处理完后然后再返回
}


