51单片机倒计时源程序

#include<reg52.h> //51头文件
//#include<472405468.h>//51头文件

#define uchar unsigned char //宏定义
#define uint unsigned int //宏定义

#define s0 P2^0 // 时加键
#define s1 P2^1 // 分加键
#define s2 P2^2 // 倒时加键 //0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6F
#define s3 P2^3 // 倒分加键
#define s4 P2^4 // 倒秒加键
#define s5 P2^5 // 开始倒计时键 总共6个按键


uint tt1,tt0;
uchar num=0;

uchar biaozhi=11;
uchar up;
uchar z,han,jun,qiang,cishu,count,num1; //函数变量声明
char shi,fen,miao,pao_miao; //定义有符号变量声明

char dao_shi=23,dao_miao=59,dao_fen=59,dao_paomiao=99;

sbit sky1=P1^0; //断控
sbit sky2=P1^1; //位控
sbit feng=P1^2; //控蜂鸣器

const uchar code TAB[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴极显示代码
//****************** 函数声明 *****************************
void feng_ming_qi(uchar); //报时函数
void init(); //定时器的初始化(T1)
void fenjie(); //函数声明
void delay(uchar); //延时函数声明
void dao_fenjie(); //倒计时显示函数
uchar key_scan(); //按键调试函数
//************************************************************


void delay(uchar z) //一毫秒延时函数
{
uchar x,y;
for(x=0;x<z;x++)
for(y=0;y<110;y++);
}


void init()//TR1初始化
{
TMOD=0x22; // TMOD=0x20; 开定时 1
TH1=0x06; //T1 250微妙
TL1=0x06; //装初值
EA=1; //打开总中断
TR1=1; ////初始化先打开定时器1
ET1=1;
feng=0;
///////////////////////////////////////////////
TH0=0x06; //T0 也是 250 微妙中断一次
TL0=0x06; //装初值
//EA=1; //打开总中断
TR0=0; //初始化先关闭定时器0
ET0=1; // IE

IP=0x20;
}


////////////////////////////////////////////////////////////////////////////////////////////
void dao_fenjie() //分解倒秒,倒分,倒时。控制8个数码管显示倒时间
{
uchar dao_gge2,dao_gge1,dao_ffen2,dao_ffen1,dao_sshi2,dao_sshi1,dao_pao1,dao_pao2;//局部变量

dao_pao1=dao_paomiao%10;
dao_pao2=dao_paomiao/10;

dao_gge1=dao_miao%10;
dao_gge2=dao_miao/10;
dao_ffen1=dao_fen%10;
dao_ffen2=dao_fen/10;
dao_sshi1=dao_shi%10;
dao_sshi2=dao_shi/10; //倒时 倒分 倒秒 的分解

if((dao_miao==0)&&(dao_fen==0)&&(dao_shi==0)) //蜂鸣器20秒的报时
{

TR0=0;
feng_ming_qi(3); //每次进行倒计时的时候都让 num 清零,这样就不会乱了。

biaozhi=11;

}

P0=0xff;
sky1=0; //断控
P0=TAB[dao_pao1]; //倒跑秒的个位
sky1=1;

sky2=0;
P0=0x7f;
sky2=1;
delay(5);

sky1=0 ;
P0=TAB[dao_pao2];
sky1=1;

sky2=0;
P0=0xbf;
sky2=1;
delay(5); //倒跑秒的十位

//****

*********************************************
sky1=0; //倒秒 的个位
P0=TAB[dao_gge1]+0x80;
sky1=1;


sky2=0;
P0=0xdf;
sky2=1;
delay(5);

sky1=0;
P0=TAB[dao_gge2];
sky1=1;

sky2=0;
P0=0xef;
sky2=1;
delay(5); //倒秒 的时位
//***************************************************
sky1=0; //倒分 的ge位
P0=TAB[dao_ffen1]+0x80;
sky1=1;

sky2=0;
P0=0xf7; //P0=0xfe;
sky2=1;
delay(5);

sky1=0;
P0=TAB[dao_ffen2];
sky1=1;

sky2=0;
P0=0xfb; //P0=0xfd;
sky2=1;
delay(5); //倒分和时中间一个间隔控制 分控制结束
//***************************************************
sky1=0; //倒时 的时位
P0=TAB[dao_sshi1]+0x80;
sky1=1;

sky2=0;
P0=0xfd; //P0=0xfb;
sky2=1;
delay(5);

sky1=0;
P0=TAB[dao_sshi2];
sky1=1;

sky2=0;
P0=0xfe; //P0=0xf7;
sky2=1;
delay(5); //倒时控制结束


}

////////////////////////////////分解秒,分,时。///////////////////////////////////////////

void fenjie() //控制8个数码管显示时间
{
uchar gge2,gge1,ffen2,ffen1,sshi2,sshi1,pao1,pao2; //局部变量

pao1=pao_miao%10;
pao2=pao_miao/10;
gge1=miao%10;
gge2=miao/10;
ffen1=fen%10;
ffen2=fen/10;
sshi1=shi%10;
sshi2=shi/10; //秒,分,时的分解


sky1=0; //断控
P0=TAB[pao1]; //秒的个位
sky1=1;

sky2=0;
P0=0x7f; //0x7f
sky2=1;
delay(5);

sky1=0 ;
P0=TAB[pao2]; //秒的十位
sky1=1;

sky2=0;
P0=0xbf;
sky2=1;
delay(5);
//////////////////////////////////
sky1=0;
P0=TAB[gge1]+0x80;
sky1=1;

sky2=0;
P0=0xdf;
sky2=1;
delay(5);

sky1=0;
P0=TAB[gge2];
sky1=1;

sky2=0;
P0=0xef;
sky2=1;
delay(5);
/////////////////////////////////
sky1=0;
P0=TAB[ffen1]+0x80;
sky1=1;

sky2=0;
P0=0xf7;
sky2=1;
delay(5); //分控制结束

sky1=0;
P0=TAB[ffen2];
sky1=1;

sky2=0;
P0=0xfb;
sky2=1;
delay(5); //分和时中间一个间隔控制
////////////////////////////////////
sky1=0;
P0=TAB[sshi1]+0x80;
sky1=1;

sky2=0;
P0=0xfd;
sky2=1;
delay(5);

sky1=0;
P0=TAB[sshi2];
sky1=1;

sky2=0;
P0=0xfe;
sky2=1;
delay(5); //时控制结束
//////////////////////////////////
if((shi==5)&&(fen==30)&&(0<miao)&&(miao<20)) //蜂鸣器20秒的报时
{
feng_ming_qi(1);
}
else feng=0; //否则让蜂鸣器停发

} //函数结束,电路图略

void feng_ming_qi(uchar num1) //间断发声
{
uchar didi_num;
for(didi_num=num1;didi_num>0;didi_num--)
{
feng=1;
delay(70);


}
}

uchar key_scan()
{
P2=0xff; //对P2口进行赋初值
if((P2&0x0f)!=0x0f) delay(100); //键扫描,幷延时消抖
if((P2&0xff)!=0xff) //在判断键值
{
count=P2; //把P2口二进制给变量count
switch(count)
{
case 0xfe: //时针加加
{

if(s0==0) //若S0键按下
{


delay(50); //延时1秒
shi++; //让时针不断加1
pao_miao=0;
miao=0; //让秒停止
}
if(shi==24) shi=0; //当时针为24时,清0
return biaozhi;
}
break; //跳出键盘函数

case 0xfd: //分针加加
{

if(s1==0)
{
delay(50);
fen++; //让时针不断加1
pao_miao=0;
miao=0; //让秒停止
}
if(fen==60) shi=0; //当时针为60时,清0
return biaozhi;
}
break; //同上
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
case 0xfb: //倒时减减
{

if(s2==0)
{ biaozhi=0;
delay(70);
delay(30);
dao_shi++;
if(dao_shi==24) dao_shi=0;
}

return biaozhi;
}
break; //同上

case 0xf7: //倒分减减
{

if(s3==0)
{ biaozhi=0;
delay(60);
dao_fen++;

}
if(dao_fen==60) dao_fen=0;
return biaozhi;
}

break; //同上

case 0xef: //倒秒减减
{

if(s4==0)
{
biaozhi=0;
delay(50);
delay(30);
dao_miao++;
if(dao_miao==60) dao_miao=0;
}

return biaozhi;
}
break;

case 0xdf:
{
delay(50);
biaozhi=0;
num=100;
TR0=1; // 打开定时器 0
return
biaozhi;



}
break;
}
return count;
}

return biaozhi; //
}


void main() //主函数
{

init(); //初始化

do //进入死循环函数
{

up=key_scan();
if(up==11) fenjie();
else dao_fenjie(); //在这个函数中把 num 清零了。
}
while(1); //死函数结束
}


void time1_int() interrupt 3 //定时器 1 中断函数
{
tt0++;
if(tt0==40)
{
tt0=0;
pao_miao++;
if(pao_miao==100) //秒表的100次循环
{
pao_miao=0;
miao++;
if(miao==60) //秒针
{
fen++;
miao=0;
if(fen==59) //分针
{
fen=0;
shi++;
if(shi>23) //时针
{
shi=0;

}

}
}

}
}


} //中断1函数结束



/////////////////倒计时的//////////////////////////////
void time0_int() interrupt 2 //定时器 中断函数
{
tt1++;
if(tt1==40)
{
tt1=0;
dao_paomiao--;
if(dao_paomiao<0)
{
dao_paomiao=99;
dao_miao--;
if(dao_miao<0)
{
dao_miao=59;
dao_fen--;
if(dao_fen<0)
{
dao_fen=59;
dao_shi--;
if(dao_shi<0) { biaozhi=11; num=0; } //{ dao_shi=23; }
}

}

}

}

}

//中断0函数结束 */








相关文档
最新文档