/*********************************************************************************************
程序名: 迷你定时器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
}
/*****************************************************************************/
/*****************************************************************************/
|