?? tyj.c
字號:
#include <AT892051.H>//11.0592MHz晶振
#define uchar unsigned char
#define uint unsigned int
/***************************************/
bit on_off=0;//開/關(guān)機標(biāo)志,"1"開,"0"關(guān)
bit over30s=0;//30秒溢出標(biāo)志,"1"溢出,"0"未溢出
bit time30s=0;//30秒定時啟動標(biāo)志,"1"啟動,"0"不啟動
bit over3m=0;//3分鐘溢出標(biāo)志,"1"溢出,"0"未溢出
bit time3m=0;//3分鐘定時啟動標(biāo)志,"1"啟動,"0"不啟動
bit drv_flag=0;//驅(qū)動板啟動標(biāo)志,"1"已啟動,"0"已關(guān)閉
bit off_flag=0;//允許關(guān)機標(biāo)志,"1"允許關(guān)機,"0"不允許關(guān)機
bit rled_flashf=0;//紅發(fā)光管快閃啟動標(biāo)志,"1"啟動,"0"關(guān)閉
bit rled_flashs=0;//紅發(fā)光管慢閃啟動標(biāo)志,"1"啟動,"0"關(guān)閉
bit gled_flash=0;//綠發(fā)光管慢閃啟動標(biāo)志,"1"啟動,"0"關(guān)閉
bit off10s_flag=0;//關(guān)機時10秒計時標(biāo)志,"1"啟動計時10秒,"0"關(guān)閉計時
uchar cnt=0; // 30秒軟件計數(shù)器
uchar key_flag=0;//鍵按下計數(shù)器
uint counter=0;// 3分鐘軟件計數(shù)器
/***************以下為I/O端口定義*****************/
sbit inc=P3^4;//焦距增加值按鍵
sbit dec=P3^5;//焦距減少值按鍵
sbit m0=P1^6;//焦距電機正轉(zhuǎn)輸出
sbit m1=P1^5;//焦距電機反轉(zhuǎn)輸出
sbit rled=P1^2;//輸出至紅發(fā)光管
sbit gled=P1^3;//輸出至綠發(fā)光管
sbit out_drv=P1^4;//輸出負(fù)脈沖至驅(qū)動板
sbit out_light=P3^1;//輸出控制220V光源繼電器
sbit out_fan=P3^0; //輸出控制12V風(fēng)扇繼電器
sbit check_tem=P3^6;//溫度檢測端
sbit check_light=P3^7;//光源檢測端
/**********函數(shù)列表************/
void start();
void drv();
void fun_light();
void fun_tem();
void fun1();
void init();
void init_timer1();
void delay(uint k);
void drv_mot(void);
/***********主函數(shù)************/
void main(void)
{ init();//上電時初始化
while(1)//無限循環(huán)
{
if(on_off)//若啟動標(biāo)志為1
{
if(!off_flag){start();off_flag=1;}// 若原來停機等待,則啟動
check_tem=1;check_light=1;// 溫度與光源檢測端置為輸入狀態(tài)
if((!check_tem)&&(!check_light))//若光源與溫度正常
{
if(drv_flag)//若已啟動驅(qū)動板
{drv_mot();//調(diào)用驅(qū)動焦距電機的子程序,進(jìn)行調(diào)焦
gled=0;rled=1;//正常工作過程,綠燈亮
gled_flash=0;rled_flashf=0;rled_flashs=0;// 綠燈慢閃標(biāo)志復(fù)位,
//紅燈快、慢閃標(biāo)志復(fù)位
out_light=0;// 投影光源亮
out_fan=0;// 冷卻風(fēng)扇轉(zhuǎn)
}
}
if(check_tem)fun_tem();//若溫度不正常,調(diào)用fun_tem()子程序處理
if(check_light)fun_light();//若光源不正常,調(diào)用fun_light()子程序處理
}
else//否則啟動標(biāo)志為0,進(jìn)入關(guān)機或待機過程
{
if(off_flag)// 若關(guān)機標(biāo)志有效
{if(drv_flag)fun1();}//若已啟動驅(qū)動板,進(jìn)入關(guān)機過程
rled=0;gled=1;// 正常待機過程
out_light=1;// 投影光源滅
out_fan=1;// 冷卻風(fēng)扇停轉(zhuǎn)
}
}
}
/*******************初始化子函數(shù)**********************/
void init()
{inc=1;dec=1;m0=1;m1=1;//
check_tem=1;
check_light=1;
P3_2=1;P3_3=1;
init_timer1();
IT0=1;IT1=1;
/*====================*/
on_off=0;off_flag=0;drv_flag=0;
off10s_flag=0;
}
/********************定時器1初始化***********************/
void init_timer1()
{
TMOD=0x11;
TH0=-(48000/256);
TL0=-(48000%256);
IE=0x8f;
TR1=1;
}
/*********************定時器1中斷服務(wù)子函數(shù)***********************/
void time1(void) interrupt 3 using 1
{
TH0=-(48000/256);// 重裝定時初值
TL0=-(48000%256);
/*--------------------*/
if(gled_flash)// 若綠燈慢閃標(biāo)志有效
{cnt++;//開始計數(shù)
if(cnt>=10){gled=!gled;cnt=0;}// 每0.5秒綠燈閃動一次
}
/*---------------------*/
if(rled_flashs)// 若紅燈慢閃標(biāo)志有效
{cnt++;
if(cnt>=10){rled=!rled;cnt=0;} // 每0.5秒紅燈閃動一次
}
/*-------------------------*/
if(rled_flashf)// 若紅燈快閃標(biāo)志有效
{cnt++;
if(cnt>=2){rled=!rled;cnt=0;} // 每0.1秒紅燈閃動一次
}
/*-----------------------*/
if(time3m) // 若3分啟動標(biāo)志有效
{counter++;//開始計數(shù)
if(counter>=2510){over3m=1;counter=0;}//3分到,則3分溢出標(biāo)志置位
}
/*------------------------*/
if(time30s) // 若30秒啟動標(biāo)志有效
{counter++;//開始計數(shù)
if(counter>=400){over30s=1;counter=0;} //30秒到,則30秒溢出標(biāo)志置位
}
/*--------------------*/
if(off10s_flag) // 若10秒關(guān)機標(biāo)志有效
{counter++;//開始計數(shù)
if(counter>=130){off10s_flag=0;key_flag=1;counter=0;}
//若10秒內(nèi)無第二次關(guān)機按鍵動作,則鍵計數(shù)器置1,繼續(xù)保持開機工作
}
}
/*******************外中斷0服務(wù)子函數(shù)**********************/
void zd_int0() interrupt 0 using 2//遙控控制開/關(guān)機
{
on_off=!on_off; // 開/關(guān)機標(biāo)志取反,"1"開,"0"關(guān)
}
/*********************外中斷1服務(wù)子函數(shù)********************/
void zd_int1() interrupt 2 using 3//手動控制開/關(guān)機
{
delay(5);// 延時5mS再判
if(P3_3==0)key_flag++;//若鍵依舊按下,鍵計數(shù)器遞加
if(key_flag==1){on_off=1;off10s_flag=0;}// 鍵計數(shù)器為1,則開機
if(key_flag>=3)key_flag=0;// 鍵計數(shù)器的范圍為0-2,即0-20秒有效
if(key_flag==0){on_off=0;off10s_flag=0;} // 鍵計數(shù)器為0,則關(guān)機等待
if(key_flag==2)off10s_flag=1;// 鍵計數(shù)器為2,進(jìn)入關(guān)機狀態(tài)
/*機器已工作情況下,10秒內(nèi)連按二次關(guān)機鍵,鍵計數(shù)器為2,進(jìn)入關(guān)機。否則,10秒一到,鍵計數(shù)器又置1繼續(xù)進(jìn)入工作。因為電腦認(rèn)為可能有人不慎碰到關(guān)機鍵*/
while(P3_3==0)// 等待釋放鍵后退出中斷子函數(shù)
{delay(5);
if(P3_3==1)break;}
}
/********************延時k*1mS子函數(shù)*********************/
void delay(uint k)
{
uint i,j;
for(i=0;i<k;i++){
for(j=0;j<121;j++)
{;}}
}
/**********************啟動子函數(shù)**********************/
void start()
{ gled_flash=0;rled_flashf=0;rled_flashs=0;// 復(fù)位相關(guān)標(biāo)志
gled=0;rled=1;// 綠燈亮
out_light=0;// 點亮投影燈光源
out_fan=0;// 冷卻風(fēng)扇啟動
time30s=1;//30秒標(biāo)志置位
EX0=0;EX1=0;// 開放INT0、INT1中斷
while(!over30s);// 等延時30秒
time30s=0;// 相關(guān)標(biāo)志復(fù)位
over30s=0;
if(!check_light)// 若光源檢測端為低電平,即光源正常發(fā)光
{
if(!drv_flag){drv();drv_flag=1;}// 若驅(qū)動板啟動標(biāo)志為"0" (尚未啟動),
//調(diào)用觸發(fā)子函數(shù)
}
EX0=1;EX1=1;// 關(guān)閉外中斷
}
/************************產(chǎn)生觸發(fā)驅(qū)動板的負(fù)脈沖子函數(shù)*************************/
void drv()// 產(chǎn)生1mS的負(fù)脈沖
{
out_drv=1;
out_drv=0;
delay(1);
out_drv=1;
}
/***********************光源不正常處理子函數(shù)**************************/
void fun_light()
{ if(drv_flag){drv();drv_flag=0;}
out_fan=0;
out_light=1;gled=1;
rled_flashf=0;
rled_flashs=1;
over3m=0;
time3m=1;
EX0=0;EX1=0;
while(!over3m){out_light=1;out_fan=0;}
EX0=1;EX1=1;
time3m=0;
over3m=0;
on_off=0;
while(!on_off)
{out_fan=1;out_light=1;gled=1;off_flag=0;key_flag=0;
rled_flashf=0;rled_flashs=1;gled_flash=0;off10s_flag=0;
if(on_off){rled_flashs=0;break;}
}
}
/*************************溫度不正常處理*****************************/
void fun_tem()
{ if(drv_flag){drv();drv_flag=0;}
out_fan=0;
out_light=1;gled=1;
rled_flashf=1;
rled_flashs=0;
over3m=0;
time3m=1;
EX0=0;EX1=0;
while(!over3m){out_light=1;out_fan=0;}
EX0=1;EX1=1;
time3m=0;
over3m=0;
on_off=0;
while(!on_off)
{out_fan=1;out_light=1;gled=1;off_flag=0;key_flag=0;
rled_flashf=1;rled_flashs=0;gled_flash=0;off10s_flag=0;
if(on_off){rled_flashf=0;break;}
}
}
/********************關(guān)機子函數(shù)*********************/
void fun1()
{ out_light=1;// 關(guān)閉光源
if(drv_flag){drv();drv_flag=0;} // 若驅(qū)動板啟動標(biāo)志為"1"(已經(jīng)啟動工作),
//調(diào)用觸發(fā)子函數(shù)發(fā)一個脈沖令其關(guān)機
over3m=0;// 清除3分溢出標(biāo)志
time3m=1;// 啟動3分計時
EX0=0;EX1=0;// 關(guān)閉外中斷
while(!over3m){gled_flash=1;rled_flashf=0;rled_flashs=0;rled=1;out_fan=0;} /*等待
3分延時,同時打開風(fēng)扇冷卻*/
EX0=1;EX1=1; // 3分過,打開外中斷
over3m=0; //清除標(biāo)志
time3m=0;
off_flag=0;
out_light=1;
out_fan=1;
gled_flash=0;
rled_flashf=0;rled_flashs=0;
gled=1;
rled=0;
}
/**********驅(qū)動焦距電機的子函數(shù)*************/
void drv_mot(void)
{
if((!inc)||(!dec))
{delay(10);
if(!inc){m0=0;m1=1;}
else if(!dec)
{m1=0;m0=1;}
else {m1=1;m0=1;}
}
if((inc)&&(dec)){m1=1;m0=1;}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -