/********************************************************************/
#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的值也隨之修改
試試吧
|