?? dhbj.c
字號:
#include <AT89x051.H> //器件配置文件
#define uchar unsigned char //變量類型的宏定義
#define uint unsigned int
uchar code DATA_7SEG[10]={0xC0,0xF9,0xA4,0xB0,0x99,
0x92,0x82,0xF8,0x80,0x90,};/*0-9數碼管段碼*/
uchar DATA[20]; /* 存放電話號碼的數組*/
uchar X[3]; /*存放時間t1數組*/
uchar Y[3]; /*存放時間t2數組*/
uchar flag; /*RAM區防干擾標志*/
uchar data_flag=0; /*輸入電話號碼計數器(最長二十位)*/
uchar set=0; /*功能鍵值*/
uchar m=0; //全局變量
uchar n=0;
uint f;
uchar t1_flag=0; /*輸入時間1計數器(最長三位)*/
uchar t2_flag=0; /*輸入時間2計數器(最長三位)*/
uchar cnt_1=0; /*時間t1單元數學運算后暫存單元*/
uchar cnt_2=0; /*時間t2單元數學運算后暫存單元*/
/*****************************************************/
void delay(uint k); /*延時子函數聲明*/
void stop(); /*關機子函數聲明*/
void bh(); /*撥號子函數聲明*/
/***************************************************/
/*定時器T0初始化*/
void init_timer()
{
TMOD=0x01;
TH0=-(50000/256);
TL0=-(50000%256);
IE=0x82;
}
/***************************************************/
/*100mS定時中斷服務子函數*/
void zd0()interrupt 1
{
P3_0=!P3_0; //P3.0每100ms取反一次,送出脈沖
P1_7=!P1_7; //數碼管小數點同步閃爍
n++;
TH0=-(50000/256);
TL0=-(50000%256);
}
/***************************************************/
/*INT0中斷服務子函數*/
void zd_int0()interrupt 0
{
delay(10);
if(P3_2==0)set++; //功能鍵值遞增
if(set>=5)set=0; //鍵值的范圍0~4
if(set==1)flag=0x55; //向RAM區的標志flag寫入55H
PCON=0x00;f=8;
again:if(P3_2==0)goto again; //若按鍵未釋放,則等待
}
/******************************************************/
/*INT1中斷服務子函數*/
void zd_int1()interrupt 2
{uchar h;
f=0;
for(h=0;h<10;h++) /*檢查磁性開關(P3_3狀態)10次,共1秒*/
{
delay(100);
if(P3_3==0)f++;
}
}
/********************************************************/
/*---關機---*/
void stop()
{if(flag==0x55)P1=0xfb;
else P1=0x86; //數碼管右下角顯示"1"。
delay(1);
if(flag==0x55)PCON=0x01; /*進入節電待機狀態*/
delay(1);
}
/********************************************************/
/*延時1ms*K子函數*/
void delay(uint k)
{
uint i,j;
for(i=0;i<k;i++){
for(j=0;j<60;j++)
{;}}
}
/********************************************************/
/*----輸入時間t1----*/
void in_time1()
{
P1=0xf7;delay(1); /*數碼管顯示"一"*/
if(P3_5==0)
{
delay(10); /*按下OK鍵確認并點亮小數點*/
if(P3_5==0){P1=0x7f;m=0;t1_flag=0;delay(500);}
while(t1_flag<3)
{
if(P3_4==0)
{delay(10);if(P3_4==0) /*按下UP鍵數碼管作0-9遞增顯示*/
{m++;if(m==10)m=0;P1=DATA_7SEG[m];delay(300);}
}
P1=DATA_7SEG[m];delay(1); /*若不按下UP鍵數碼管也作0-9顯示*/
if(P3_5==0)
{delay(10);if(P3_5==0) /*按下OK鍵顯示的數據存入數組X中*/
{X[t1_flag]=m;t1_flag++;P1=0x7f;delay(500);}
}
}
}
if(t1_flag>=3)t1_flag=0; /*時間1計數器>=3時歸零*/
}
/***********************************************************************/
/*----輸入時間t2----*/
void in_time2()
{
P1=0xb7;delay(1); /*數碼管顯示"二"*/
if(P3_5==0)
{
delay(10); /*按下OK鍵確認并點亮小數點*/
if(P3_5==0){P1=0x7f;m=0;t2_flag=0;delay(500);}
while(t2_flag<3)
{
if(P3_4==0)
{delay(10);if(P3_4==0) /*按下UP鍵數碼管作0-9遞增顯示*/
{m++;if(m==10)m=0;P1=DATA_7SEG[m];delay(300);}
}
P1=DATA_7SEG[m];delay(1); /*若不按下UP鍵數碼管也作0-9顯示*/
if(P3_5==0)
{delay(10);if(P3_5==0) /*按下OK鍵顯示的數據存入數組Y中*/
{Y[t2_flag]=m;t2_flag++;P1=0x7f;delay(500);}
}
}
}
if(t2_flag>=3)t2_flag=0; /*時間2計數器>=3時歸零*/
}
/***********************************************************************/
/*----輸入電話號碼----*/
void in_data()
{uchar g;
P1=0xb6;delay(1); /*數碼管顯示"三"*/
if(P3_5==0)
{delay(10);if(P3_5==0)
{P1=0x7f;m=0;data_flag=0; /*按下OK鍵確認并點亮小數點*/
for(g=0;g<20;g++){DATA[g]=10;}
delay(500); /*同時DATA數組中全部寫入10*/
while(1)
{
if(P3_4==0){delay(10); /*按下UP鍵數碼管作0-9遞增顯示*/
if(P3_4==0){m++;if(m==10)m=0;P1=DATA_7SEG[m];delay(300);}
}
P1=DATA_7SEG[m];delay(1);/*若不按下UP鍵數碼管也作0-9顯示*/
if(P3_5==0)
{delay(10);
if(P3_5==0) /*按下OK鍵顯示的數據(號碼)存入數組DATA中*/
{DATA[data_flag]=m;data_flag++;P1=0x7f;delay(500);}
} /*按下OK鍵超過2秒則退出向數組DATA送入號碼*/
if(P3_5==0){delay(2000);if(P3_5==0)break;}
}
}
} /*數碼管顯示"三"*/
F1:if(P3_5==0){delay(10);if(P3_5==0){P1=0xb6;delay(1);goto F1;}}
}
/***********************************************************************/
/*---啟動報警器進入警戒工作---*/
void work()
{ uchar h;
P1=0xdf; /*數碼管左上角顯示"1"*/
delay(1);
if(set==1) /*進入時間1循環*/
{while(cnt_1<=X[0]*100+X[1]*10+X[2])
{
delay(1000);
cnt_1++; /*計數器cnt_1累加*/
if(set!=1){EX1=0;cnt_1=0;break;}
} /*如按下Set鍵,則退出此循環*/
}
else {EX1=0;PCON=0x00;}/*Set不為1,則關閉外中斷1,退出待機狀態*/
if(set==1)
{if(cnt_1>=X[0]*100+X[1]*10+X[2])
{EX1=1;cnt_1=0;} /*時間1到,打開外中斷1,計數器歸零*/
/*進入待機。若有1秒以上開關動作,退出待機*/
while(1)
{PCON=0x01;if(f>=5){PCON=0x00;break;}}
}
/*-----------------------------------------------------*/
EX1=0; /*關閉外中斷1*/
if(set==1) /*進入時間2循環*/
{while(cnt_2<=Y[0]*100+Y[1]*10+Y[2])
{
delay(1000);
cnt_2++; /*計數器cnt_2累加*/
if(set!=1){cnt_2=0;break;}
} /*如按下Set鍵,則退出此循環*/
}
if(set==1)
{
bh(); /*時間2到,調用撥號子程序*/
delay(3000);
P3_7=0;//控制輸出端為低
for(h=0;h<60;h++) /*發出60秒警音*/
{ for(f=0;f<500;f++)
{f++;
P3_1=!P3_1;P1=0x5f;
delay(1);
}
P3_1=0;P1=0x7f;delay(500);
}
P3_7=1;//控制輸出端恢復高
cnt_1=0;cnt_2=0; /*有關計數器、端口回到初始狀態*/
P3_0=0;P3_1=0;P1_7=1;
for(f=0;f<3;f++)delay(60000);/*關閉3分鐘,以便進行電話報警*/
}
}
/********************************************************************/
/*---撥號---*/
void bh()
{data_flag=0; /*電話號碼計數器(二十位)歸零*/
P3_0=1; /*接通線路*/
P1_7=0; /*數碼管小數點亮*/
delay(1000);
while(DATA[data_flag]<10) /*號碼小于10進入循環撥號狀態*/
{
if(DATA[data_flag]==0) /*若號碼為0*/
{TR0=1; /*啟動T0定時器*/
if(n==20){data_flag++; /*進行20次中斷,產生10個脈沖*/
n=0;TR0=0;
P3_0=1;P1_7=0;
delay(500);
}
}
if(DATA[data_flag]>0) /*若號碼>0*/
{TR0=1; /*啟動T0定時器*/
if(n==((DATA[data_flag])*2))/*進行號碼x2次中斷,產生號碼個脈沖*/
{data_flag++;
n=0;TR0=0;
P3_0=1;P1_7=0;
delay(500);
}
}
}
TR0=0;
}
/*********************************************************************/
/*--主函數--*/
void main()
{
init_timer(); /*定時器T0初始化*/
EA=1;EX0=1; /*開總中斷,開外中斷0*/
P3_0=0; /*關閉線路(掛機)*/
P3_1=0;
while(1) /*無限循環*/
{
switch(set) /*根據Set標志散轉*/
{
case 0:stop();break; /*關機*/
case 1:work();break; /*警戒工作*/
case 2:in_time1();break; /*輸入時間t1*/
case 3:in_time2();break; /*輸入時間t2*/
case 4:in_data();break; /*輸入電話號碼*/
default:break;
}
if(flag!=0x55) /*若flag標志變化,數碼管顯示E(錯誤)*/
{P1=0x86;delay(1);}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -