51单片机C语言定时器定时2小时灯亮2小时灯灭,如此循环!

51单片机C语言定时器定时2小时灯亮2小时灯灭,如此循环!
一定要用C语言
一定要简单明了!
晶振分别是:11.0592 M和12M

如果想实现无限循环那就采用死循环方式,可以无限的循环如while(1){};然后设定定时器定时时间为1s(此值需要根据单片机确定是否可以设定这么大),其次,设定一个变量对时间进行计数,根据计数情况做出相应的改变,程序可以这样设定:
unsigned char gucLEDStatus = 0x00; //全局变量,表示灯当前的状态 0为灭,1为亮
volatile unsigned int gusTimeCnt; //全局变量对时间计数
int main()
{
//增加定时器初始化并开放中断
while(1)
{
if(gucLEDStatus == 0x01) //当前为亮状态
{
if(gusTimeCnt >= 7200) //两个小时时间到
{
gusTimeCnt = 0x00; //清零
gucLEDStatus = 0x00; //灯为灭状态
//此处加程序代码,控制灯为灭的状态
}
else
{
//此处加程序代码,控制灯为亮的状态,此处会重复执行,可以进行控制
}
}
else if(gucLEDStatus == 0x00) //灯为灭的状态
{
if(gusTimeCnt >= 3600) //1个小时
{
gusTimeCnt = 0x00;
gucLEDStatus = 0x01; //亮状态
//增加程序代码,控制灯亮
}
else
{
//增加程序代码,控制灯灭,此处会重复执行,可以进行控制
}
}
}
return 0;
}

在中断函数中,对gusTimeCnt进行递增即可!
温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-07-21
#include <reg52.h>
#include <delay.h>
#define uchar unsigned char
#define uint unsigned int
sbit led =P1^0; //LED pin
uchar num=0,second=0,minute=0,hour=0;

void delay(unsigned int t)
{
unsigned int i,j;
for(i=t;i>0;i--)
for(j=110;j>0;j--);
}

void main()
{
TMOD =0x01; //设置定时器0为工作方式1
TH0=(65536-45872)/256; //装初值
TL0=(65536-45872)%256;
EA=1; //开总中断
ET0=1; //开定时器0中断
TR0 =1; //启动定时器0

while(1)
{
// led=0;
}
}

void LED() interrupt 1
{
TH0=(65536-45872)/256; //重装初值
TL0=(65536-45872)%256;
num++;
if(num == 20)
{
num=0; //1s 时间
second++;
if(second==60) //1分钟
{
second=0;
minute++;
if(minute==60) //1小时
{
minute=0;
hour++;
if(hour==2) //2小时
led=~led;
}
}
}
}追问

能解读一下吗?你这个程序有一部分感觉读不懂!

追答

由于字数限制,只好添加文档了,注释在文档里面。

这下应该能读懂了吧?

本回答被提问者和网友采纳
第2个回答  2014-07-21
设一个全局变量的值,定时器每1秒加一次,2小时就是7200秒。到7200你在将变量清零,就OK了追答

那个灯每次变量到7200清零的时候取反,就行了

这个用无符号int就行,

第3个回答  2015-01-11
我有成品模块1,可以实现你这个功能,比这个要强大
第4个回答  2014-07-21
用定时器么。。。不能直接定时2小时对吧