/*********************************************************************************************
程序名: 迷你定時(shí)器V1.0
編寫人:
編寫時(shí)間:
硬件支持: STC11F02 外部12MHZ晶振
接口說明:
修改日志:
NO.1-201107061550 建立好精簡(jiǎn)電路,完成定時(shí)功能
NO.2-201107061655 優(yōu)化程序,加注解
NO.3-201107062042 加入2種定時(shí)模式,可任意選擇
/*********************************************************************************************
說明:
/*********************************************************************************************/
#include<STC11Fxx.H>//頭文件
#define uint unsigned int //宏定義
#define uchar unsigned char
sbit sw1=P3^0;//按鍵1
sbit sw2=P3^1;//按鍵2
sbit bep=P3^7;//有源蜂鳴器(接負(fù)極,正極接VCC)
#define DP P1 //四位共陽數(shù)碼管段選
//四位共陽數(shù)碼管位選
sbit wx1=P3^3;//四位共陽數(shù)碼管(千位)
sbit wx2=P3^4;//四位共陽數(shù)碼管(百位)
sbit wx3=P3^5;//四位共陽數(shù)碼管(十位)
sbit wx4=P3^6;//四位共陽數(shù)碼管(個(gè)位)
sbit JDQ=P3^2;//繼電器
#define xs 100 //定時(shí)99小時(shí)(設(shè)定為100)
char shi=xs,fen=60,miao=0;//定義時(shí)鐘變量 時(shí)、分、秒
uchar cou;//定義定時(shí)器計(jì)數(shù)變量
bit miao_di=1;//位定義秒點(diǎn)
uchar MEU=0;//定義菜單標(biāo)志位
uchar MODE=1;//定義定時(shí)模式標(biāo)志
bit bz=0;
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共陽數(shù)碼管編碼(不帶點(diǎn))
void ysms(uint z) //毫秒級(jí)延時(shí)函數(shù)
{
uint i;
while(--z !=0)
{
for(i=0;i<600;i++);
}
}
void display()//顯示定時(shí)函數(shù)
{
if(shi==xs)
{
DP=0xbf;wx1=wx2=1;ysms(2);wx1=wx2=0;
}
else
{
DP=table[shi/10];wx1=1;ysms(2);wx1=0;
DP=table[shi%10];wx2=1;ysms(2);wx2=0;
}
if(fen==60)
{
DP=0xbf;wx3=wx4=1;ysms(2);wx3=wx4=0;
}
else
{
DP=table[fen/10];wx3=1;ysms(2);wx3=0;
DP=table[fen%10];wx4=1;ysms(2);wx4=0;
}
DP=0x7f;wx3=wx4=miao_di;ysms(2);wx3=wx4=0;
}
void display2()//顯示定時(shí)函數(shù)(前兩位)
{
if(shi==xs)
{
DP=0xbf;wx1=wx2=1;ysms(2);wx1=wx2=0;
}
else
{
DP=table[shi/10];wx1=1;ysms(2);wx1=0;
DP=table[shi%10];wx2=1;ysms(2);wx2=0;
}
DP=0x7f;wx3=wx4=1;ysms(2);wx3=wx4=0;
}
void display3()//顯示定時(shí)函數(shù)(后兩位)
{
DP=0xff;wx1=wx2=1;ysms(2);wx1=wx2=0;
if(fen==60)
{
DP=0xbf;wx3=wx4=1;ysms(2);wx3=wx4=0;
}
else
{
DP=table[fen/10];wx3=1;ysms(2);wx3=0;
DP=table[fen%10];wx4=1;ysms(2);wx4=0;
}
DP=0x7f;wx3=wx4=1;ysms(2);wx3=wx4=0;
}
void display4()//顯示定時(shí)函數(shù)(最后一分鐘后兩位顯示秒)
{
DP=0xff;wx1=wx2=1;ysms(2);wx1=wx2=0;
DP=table[miao/10];wx3=1;ysms(2);wx3=0;
DP=table[miao%10];wx4=1;ysms(2);wx4=0;
DP=0x7f;wx3=wx4=1;ysms(2);wx3=wx4=0;
}
void display5()//顯示模式函數(shù)
{
DP=0xbf;wx1=wx2=1;ysms(2);wx1=wx2=0;
DP=table[MODE];wx3=1;ysms(2);wx3=0;
DP=0xbf;wx4=1;ysms(2);wx4=0;
DP=0x7f;wx3=wx4=0;
}
//以下是各顯示部分的延時(shí)函數(shù)
void yan(uint z)
{
uint i;
for(i=z;i>0;i--)display();
}
void yan2(uint z)
{
uint i;
for(i=z;i>0;i--)display2();
}
void yan3(uint z)
{
uint i;
for(i=z;i>0;i--)display3();
}
void yan4(uint z)
{
uint i;
for(i=z;i>0;i--)display4();
}
void yan5(uint z)
{
uint i;
for(i=z;i>0;i--)display5();
}
/*********************************************************************************************
函數(shù)名:定時(shí)/計(jì)數(shù)器初始化函數(shù)
調(diào) 用:T_C_init();
參 數(shù):無
返回值:無
結(jié) 果:設(shè)置SFR中T/C1和(或)T/C0相關(guān)參數(shù)
備 注:本函數(shù)控制T/C1和T/C0,不需要使用的部分可用//屏蔽
/**********************************************************************************************/
void T_C_init ( )
{
TMOD=0x01; //使用定時(shí)器T0的模式1 [ GATE,C/T,M1,M0,GATE,C/T,M1,M0 ]
EA = 1; //中斷總開關(guān)
TH0=(65536-50000)/256; //定時(shí)器T0的高8位賦初值
TL0=(65536-50000)%256; //定時(shí)器T0的低8位賦初值
ET0 = 1; //T/C0中斷開關(guān)
TR0 = 0; //T/C0啟動(dòng)開關(guān)
}
/**********************************************************************************************/
void main()
{
T_C_init();
P3M0=0x78;//0111 1000 P3.6 P3.5 P3.4 P3.3 設(shè)置為推挽
P3M1=0x00;//0000 0000
JDQ=1;//繼電器斷開
while(1)
{
uint ii=0;
if(MEU==0) //定時(shí)狀態(tài)
{
if((shi==0)&&(fen==0)&&(miao==59))
{
MEU=3;
}
display();
if(sw1==0)//進(jìn)入定時(shí)調(diào)整
{
yan(30);
JDQ=1;
if(sw1==0)
{
while(sw1==0)
{
ii++;
display();
}
}
if(ii<60)
{
bep=0;
yan(30);
bep=1;
TR0=0;
shi=xs;
fen=60;
miao=0;
miao_di=1;
bz=0;
}
if(ii>100)
{
bep=0;
yan(80);
bep=1;
MEU=1;
TR0=0;miao=0;
}
}
if(sw2==0) //定時(shí)狀態(tài)時(shí)的啟停
{
yan(30);
if(sw2==0)
{
while(sw2==0)
{
ii++;
display();
}
}
if(ii<60)
{
bep=0;
yan(30);
bep=1;
if(bz==1)TR0=~TR0;
}
if(ii>100)
{
bep=0;
yan(80);
bep=1;
TR0=0;
shi=xs;
fen=60;
miao=0;
miao_di=1;
JDQ=1;
MEU=4;
}
}
if((shi==0)&&(fen==0)&&(miao==0))//定時(shí)器時(shí)間到
{
TR0=0;
miao_di=1;
JDQ=1;
bep =0;
yan4(150);
bep =1;
shi=xs;
fen=60;
miao=0;
}
}
if(MEU==1)//調(diào)整定時(shí)的小時(shí)位
{
display2();
if(sw1==0)
{
yan2(30);
if(sw1==0)
{
while(sw1==0)
{
ii++;
display2();
}
}
if(ii<60)
{
bep=0;
yan2(30);
bep=1;
shi--;
if(shi < 0)shi = xs;
}
if(ii>100){MEU=2;}
}
if(sw2==0)
{
yan2(30);
if(sw2==0)
{
bep=0;
yan2(30);
bep=1;
shi++;
if(shi > xs)shi = 0;
}
}
}
if(MEU==2)//調(diào)整定時(shí)的分鐘位
{
display3();
if(sw1==0)
{
yan3(30);
if(sw1==0)
{
while(sw1==0)
{
ii++;
display3();
}
}
if(ii<60)
{
bep=0;
yan3(20);
bep=1;
fen--;
if(fen < 0)fen = 60;
}
if(ii>100)
{
bep=0;
yan3(80);
bep=1;
MEU=0;
if((shi==xs)||(fen==60))
{
TR0=0;
JDQ=1;
}
else
{
bz=1;
TR0=1;
JDQ=0;
}
}
}
if(sw2==0)
{
yan3(30);
if(sw2==0)
{
bep=0;
yan3(20);
bep=1;
fen++;
if(fen > 60)fen = 0;
}
}
}
if(MEU==3)//定時(shí)器時(shí)間到
{
display4();
if(sw2==0)//定時(shí)狀態(tài)時(shí)的啟停
{
yan4(30);
if(sw2==0)
{
while(sw2==0)
{
bep=0;
yan4(30);
bep=1;
TR0=~TR0;
}
}
}
if(sw1==0)//退出定時(shí)
{
yan4(30);
if(sw1==0)
{
bep=0;
yan4(30);
bep=1;
TR0=0;
shi=xs;
fen=60;
miao=0;
miao_di=1;
JDQ=1;
bz=0;
MEU=0;
}
}
if((shi==0)&&(fen==0)&&(miao==0))//定時(shí)器時(shí)間到
{
TR0=0;
miao_di=1;
JDQ=1;
if(MODE==1)
{
bep = ~bep;
yan(18);
if((sw1==0)||(sw2==0))
{
yan(30);
if((sw1==0)||(sw2==0))
{
bep=1;
shi=xs;
fen=60;
miao=0;
bz=0;
MEU=0;
}
}
}
if(MODE==2)
{
bep =0;
yan(150);
bep =1;
shi=xs;
fen=60;
miao=0;
bz=0;
MEU=0;
}
}
}
if(MEU==4)//定時(shí)模式設(shè)置
{
display5();
if(sw1==0)
{
yan5(30);
if(sw1==0)
{
bep=0;
yan5(30);
bep=1;
MODE++;
if(MODE==3)MODE=1;
}
}
if(sw2==0)
{
yan5(30);
if(sw2==0)
{
while(sw2==0)
{
ii++;
display5();
}
}
if(ii>60)
{
bep=0;
yan5(80);
bep=1;
MEU=0;
}
}
}
}
}
/**********************************************************************************************
//以下是定時(shí)處理
/**********************************************************************************************/
void tiem0( ) interrupt 1 // T/C0中斷服務(wù)程序(產(chǎn)生50ms時(shí)基信號(hào))
{
TH0=(65536-50000)/256; //定時(shí)器T0的高8位賦初值(重新寫入初值)
TL0=(65536-50000)%256; //定時(shí)器T0的低8位賦初值(重新寫入初值)
if(cou == 0) // 計(jì)數(shù)值到100(1s) (****時(shí)間為倒計(jì)時(shí)****)
{
cou = 20; // 軟計(jì)數(shù)器清零
if(miao == 0) // 秒計(jì)數(shù)值到60
{
miao = 60; // 秒計(jì)數(shù)器清零
if(fen ==0) // 分計(jì)數(shù)到60
{
fen = 60; // 分計(jì)數(shù)器清零
shi--; // 時(shí)計(jì)數(shù)器加1(進(jìn)位60m=1h)
}
fen--; // 分計(jì)數(shù)器加1(進(jìn)位60s=1m)
}
miao--; // 秒計(jì)數(shù)器加1(進(jìn)位10ms*100=1s)
miao_di=~miao_di; //秒點(diǎn)取反,閃爍功能
}
cou--; // 軟計(jì)數(shù)器加1
}
/*****************************************************************************/
/*****************************************************************************/
|