基于單片機(jī)的簡易定時報警器電路設(shè)計(jì)
//晶振:11.0592M T1-250微秒 按鍵P10 P11 P12 P13
/*變量的定義:
show_val: 顯示的值0-59
init_val: 初始值
state_val: 狀態(tài)值 0-計(jì)數(shù)狀態(tài);1-設(shè)置狀態(tài);2-閃爍狀態(tài)
shan_val:
key_val1: 四個按鍵的值 255-無鍵;1-設(shè)置鍵 2-增一鍵 3-減一鍵 4-確定鍵
T1_cnt: 定時器計(jì)數(shù)溢出數(shù)
cnt_val: 倒計(jì)時的數(shù)值
led_seg_code:數(shù)碼管7段碼
*/
#include "reg51.h" //包含文件
sbit P1_0=P1^0; //設(shè)置鍵
sbit P1_1=P1^1; //增一鍵
sbit P1_2=P1^2; //減一鍵
sbit P1_3=P1^3; //確定鍵
unsigned char data shan_val; //閃爍時LED的開/關(guān)狀態(tài)
unsigned char data cnt_val; //保存倒計(jì)數(shù)的當(dāng)前值
unsigned int data T1_cnt; //保存定時器溢出次數(shù)
unsigned char data key_val_new,key_val_old;//存放當(dāng)前掃描的鍵和前一次按下的鍵值
unsigned char data state_val; //狀態(tài)值
unsigned char data show_val; //存放需要在數(shù)碼管顯示的數(shù)字
unsigned char data init_val; //暫存倒計(jì)數(shù)的初始值
char code led_seg_code[10]={0x3f,0x06,0x05b,0x04f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//----------延時--------------
void delay(unsigned int i) //大約延時i*2個微秒
{ while(--i);}
//-----------按鍵掃描-------------
unsigned char scan_key()
{ unsigned char i;
i=P10x0f;
delay(100); //延時,去抖動
if (i==(P10x0f))
{ if (P1_0==0)
{ i=1; }
else
{ if (P1_1==0)
{ i=2;}
else
{ if (P1_2==0)
{ i=3;}
else
{ if (P1_3==0)
{ i=4;} }
} } }
else
{ i=255; }
return i;
}
//---------數(shù)碼管顯示---------------
void led_show(unsigned int v)
{
unsigned char i;
if (state_val!=2) //動態(tài)掃描
{i=v%10; //取要顯示的數(shù)的個位
P0=led_seg_code[i]; //轉(zhuǎn)換為7段碼
P2=0xfe; //顯示個位
delay(15); //延時
i=v%100/10; //取十位
P0=led_seg_code[i]; //轉(zhuǎn)換為7段碼
P2=0xfd; //顯示十位
delay(5); //延時
}
else
{ P0=led_seg_code[0]; //處于閃爍狀態(tài)
if (shan_val)
{ P2=0xff; } //將數(shù)碼管的關(guān)閉
else
{ P2=0xfc; } //將數(shù)碼管的打開
}
}
//----------定時器T1中斷服務(wù)程序---------------
void timer1() interrupt 3 //T1中斷,250us中斷一次
{ T1_cnt++;
switch (state_val)
{ case 0:
if(T1_cnt>3999) //如果計(jì)數(shù)>3999, 計(jì)時1s
{ T1_cnt=0;
if(cnt_val!=0)
{ cnt_val--;}
else
{state_val=2;} //定時計(jì)數(shù)到0時,切換狀態(tài)
show_val=cnt_val;
}
break;
case 2:
if(T1_cnt>1999) //如果計(jì)數(shù)>1999, 計(jì)時0.5s
{ T1_cnt=0; shan_val=!shan_val; } //閃爍狀態(tài)
break;
}
}
//---------主程序----------------
main()
{init_val=59; //初始化各變量
cnt_val=init_val;
show_val=cnt_val;
state_val=0;
key_val_old=255;
T1_cnt=0;
shan_val=0; //初始化51的寄存器
TMOD=0x20; //用T1計(jì)時 8位自動裝載定時模式
TH1=0x19; //250微秒溢出一次; 250=(256-x)*12/11.0592 -> x= 230.4
TL1=0x19;
EA=1; //打開總中斷允許
ET1=1; //開中斷允許
TR1=1; //開定時器T1
while(1)
{ key_val_new=scan_key(); // 255表示無鍵按下
if (key_val_new!=key_val_old)
{ // 只有當(dāng)前掃描的鍵值與上次掃描的不同,才判斷是有鍵按下
key_val_old=key_val_new;
switch (key_val_new)
{ case 1: //設(shè)置鍵
state_val=1; //處于設(shè)置狀態(tài)
TR1=1; //停止計(jì)時
show_val=init_val; //顯示原來的倒計(jì)數(shù)初始值
break;
case 2: if(state_val==1) //只有在設(shè)置狀態(tài),增1鍵才有用
{ if (init_val>0) //更改原來的倒計(jì)數(shù)初始值
{init_val--; }
else
{init_val=59;}
show_val=init_val;//顯示更改后的倒計(jì)數(shù)初始值
}
break;
case 3: if(state_val==1) //只有在設(shè)置狀態(tài),減1鍵才有用
{ if (init_val59) //更改原來的倒計(jì)數(shù)初始值
{init_val++; }
else
{init_val=0;}
show_val=init_val; //顯示更改后的計(jì)數(shù)初始值
}
break;
case 4: if(state_val!=0) //如果已處于計(jì)數(shù)模式,確認(rèn)鍵不起作用
{ cnt_val=init_val; //將初始值賦給計(jì)數(shù)變量
show_val=cnt_val; //將計(jì)數(shù)變量的數(shù)字顯示
TR1=1; //啟動定時器T1
state_val=0; //將狀態(tài)切換為計(jì)數(shù)模式
}
break;
}
}
led_show(show_val); //動態(tài)掃描
}
}
評論