用STC15F104E单片机,就是一个定时器,上电开始计时,LED每秒闪一次,9小时后继电器吸合3秒,然后释放,计时器重新计时。如此循环。
#include "reg51.h"
typedef unsigned char BYTE;
typedef unsigned int WORD;
#define SYSclk 6000000L
#define MODE1T //Timer clock mode, commendt this line is 12T mode, uncomment is 1T mode
#ifdef MODE1T
#define T1MS (65536-SYSclk/1000) //1ms timer calculation method in 1T mode, 1000=1000Hz
#else
#define T1MS (65526-SYSclk/12/1000) //1ms timer calculation method in 12T mode
#endif
sfr AUXR=0x8e; //Auxiliary register
sbit TEST_LED=P3^3;
sbit relay = P3^4;
WORD count; //1000 times counter
BYTE sec;
BYTE min;
BYTE hour;
BYTE S3cnt;
BYTE S3cnt_Stat;
void clock_cnt();
/*Timer0 interrupt routine */
void tm0_isr() interrupt 1 using 1
{
if (count--==0)
{
count=500; //500ms
TEST_LED=!TEST_LED;
if (TEST_LED) clock_cnt();
}
}
void main()
{
#ifdef MODE1T
AUXR=0x80; //timer0 work in 1T mode
#endif
TMOD=0x00; //set timer0 as mode0 (16-bit auto-reload)
TL0=T1MS; //initial timer0 low byte
TH0=T1MS>>8; //initial timer0 high byte
TR0=1; //timer0 start running
ET0=1; //enable timer0 interrupt
EA=1; //open global interrupt switch
sec = 0;
min = 0;
hour = 0;
S3cnt_Stat = 0;
while(1);
}
void clock_cnt()
{
if (S3cnt_Stat)
{
S3cnt--;
if (S3cnt==0)
{
S3cnt_Stat = 0;
relay = 0; //继电器释放
}
}
else
{
sec++;
if (sec>=60)
{
sec=0;
min++;
if (min>=60);
{
min=0;
hour++;
if (hour>=9) //到了9小时
{
relay = 1; //继电器吸合
sec = 0;
min = 0;
hour = 0;
S3cnt_Stat = 1;
S3cnt = 3; //计数3秒
}
}
}
}
}