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