隨便寫的,下載到板子上試了試沒問題,1分鐘 5分鐘時間太長,我改成5秒 25秒,你只要改下數字就行.
#include <reg52.h>
sbit relay = P1^0; //繼電器,0線圈吸合,1線圈斷開
sbit key = P1^1; //按鍵,0為按下,1為松開
unsigned char key_timer_cnt; //檢測按鍵計時變量
unsigned int relay_timer_cnt; //繼電器吸合斷開計時變量
unsigned char relay_timer_cnt_min; //繼電器延遲斷開計數器分鐘,因為5分鐘,1ms為單位將超過65535
unsigned char relay_state; //記錄繼電器狀態 0=未觸發 1=待吸合 2=待斷開
void Init_T0(void) //定時器中斷初始化,設置為1ms
{
TMOD = 0x01;
TH0 = 0xfc;
TL0 = 0x18;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void main(void)
{
Init_T0();
relay = 1; //斷開繼電器
relay_state = 0; //繼電器處于未觸發狀態
while(1)
{
//想實現其他功能,再這里添加代碼
}
}
void T0_ISR() interrupt 1 //1毫秒
{
TH0 = 0xfc;
TL0 = 0x18;
//***************************待觸發狀態,需要做的只是判斷按鍵有沒有按下*******************
if(relay_state == 0) //當繼電器處于待觸發狀態
{
if(key == 0) //按鍵按下,并且繼電器處于未觸發狀態
{
key_timer_cnt++; //按鍵計時器自加,用于消抖
if(key_timer_cnt>=5) //按鍵超過5毫秒
{
key_timer_cnt = 0;
relay_state = 1; //將繼電器設成待吸合狀態
}
}else
{
key_timer_cnt = 0;
}
}
//********************待吸合狀態,等計數器加滿就行*****************************
if(relay_state == 1)
{
relay_timer_cnt++;
if(relay_timer_cnt>=5000) //將5000改為60000 即為1分鐘
{
relay = 0; //繼電器吸合
relay_state = 2; //吸合后將狀態轉成待斷開
relay_timer_cnt = 0;
}
}
//******************待斷開狀態,跟待吸合一樣加滿就行*******************************
if(relay_state == 2)
{
relay_timer_cnt++;
if(relay_timer_cnt>=5000) //將5000改為60000即為1分鐘
{
relay_timer_cnt = 0;
relay_timer_cnt_min++; //每60秒加1
if(relay_timer_cnt_min>=5) //當分鐘數等于5
{
relay = 1; //斷開繼電器
relay_timer_cnt_min = 0;
relay_timer_cnt = 0;
relay_state = 0; //斷開后將繼電器狀態轉換成未觸發
}
}
}
} |