|
#include<reg51.h>
#define YC 10 //閉合延遲時(shí)間
#define QDTIME 60 //工作時(shí)間
#define u8 unsigned char
#define u16 unsigned int
sbit K1a=P1^0; //開關(guān)引腳a
sbit K1b=P1^1; //開關(guān)引腳b
sbit OUT=P2^0; //輸出引腳
u8 Tm=0; //狀態(tài)檢測(cè),0位初始狀態(tài),1為延遲狀態(tài),2為輸出狀態(tài),3為待復(fù)位狀態(tài)
u16 i=0,j=0; //計(jì)時(shí)變量
void Tim_init() //定時(shí)器0初始化函數(shù)
{
TMOD = 0x01; //定時(shí)器0設(shè)置16位計(jì)時(shí)器
TH0 = 0x0FC; //高值1ms
TL0 = 0x18; //低值1ms
EA = 1; //開總中斷
ET0 = 1; //開定時(shí)器中斷
}
void Tim() interrupt 1//計(jì)時(shí)器中斷
{
TH0 = 0x0FC; //重裝初始值
TL0 = 0x18;
i++; //ms計(jì)時(shí)累加
}
void S1()
{
if(K1b==0&&Tm==0)//啟動(dòng)狀態(tài)判斷,必須是復(fù)位狀態(tài),且開關(guān)閉合。
{
TR0=1; //定時(shí)器開始工作
Tm=1; //進(jìn)入狀態(tài)1開始延遲
}
if(K1b==1&&Tm==3)//復(fù)位狀態(tài)判斷,條件必須打開開關(guān),且一次任務(wù)完成。
{
Tm=0; //復(fù)位狀態(tài)值
}
}
void main()
{
K1a=0; //開關(guān)一端低電平
OUT=0; //輸出低電平,電機(jī)停止
Tim_init(); //定時(shí)器初始化
while(1) //主循環(huán)
{
S1(); //按鍵檢測(cè)
if(i==1000)//1S計(jì)時(shí)
{
j++; //秒計(jì)時(shí)累加
i=0;
}
if(j>YC&&Tm==1) //如果檢測(cè)到j(luò)大于10則進(jìn)入輸出狀態(tài)
{
OUT=1; //進(jìn)入輸出狀態(tài)
Tm=2; //設(shè)置輸出狀態(tài)為2,即輸出狀態(tài)
j=0; //秒計(jì)時(shí)清零
}
if(j>QDTIME&&Tm==2)//如果檢測(cè)到j(luò)大于60則且在輸出狀態(tài),則停止輸出進(jìn)入待復(fù)位狀態(tài)
{
OUT=0; //停止輸出
Tm=3; //進(jìn)入待復(fù)位狀態(tài)
j=0; //秒計(jì)時(shí)清零
i=0; //ms計(jì)時(shí)清零
TR0=0; //關(guān)閉計(jì)時(shí)器
}
}
}
程序如上,仿真圖如下。
20200302221515.jpg (38.64 KB, 下載次數(shù): 13)
下載附件
2020-3-2 22:17 上傳
|
|