锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

单片机闹钟程序及PROTUES仿真文件

时间:2024-05-04 00:07:10

//提示:k1k2k3k4分别是:小时。分钟。秒钟的调节功能。定时时间的显示功能。k5k6分别是设定第二时间定为0:01:00,启用或者关闭闹钟,

下面是仿真图,芯片是用的51单片机:


PROTUES工程文件可以从 http://www.51hei.com/bbs/dpj-24552-1.html下载

下面是源程序:
#include"AT89X52.H"
#define uchar unsigned char
uchar code seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf}; //断码
uchar code pos[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //微码
sbit k1=P1^0;
sbit k2=P1^1;
sbit k3=P1^2;
sbit k4=P1^3;
sbit k5=P1^4;
sbit jidianqi1=P1^5;
sbit k6=P1^6;
sbit led=P1^7;
uchar k[8]={0,0,16,0,0,16,0,0}; //01234567

uchar code seg00[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf}; //断码
uchar code pos00[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //微码
uchar k00[8]={0,0,16,0,0,16,0,0}; //01234567
uchar second;
uchar minite;
uchar hour;
uchar num;
uchar naozhongqiyongFlag;

uchar second00;
uchar minite00;
uchar hour00;
uchar num00;
////////////////////////////////////////////////////////////////////////////////////
void TimeCompate(void)
{
if(naozhongqiyongFlag)
{
if((second00==0)&&(minite00==1)&&(hour00==0)) ///&&(minite00<=2),,,(naozhongqiyongFlag==1)&&,, led=1
{
jidianqi1=0;
}
else if((second00==5)&&(minite00==42)&&(hour00==0))
{
jidianqi1=1; naozhongqiyongFlag=~naozhongqiyongFlag; led=~led;
}
}
/*if(hour00!=0)
{ jidianqi1=1; naozhongqiyongFlag=0;
}
if(hour00==0)
{
if(minite00<1)
{ jidianqi1=1; naozhongqiyongFlag=0;
}
else if(minite00>2)
{ jidianqi1=1; naozhongqiyongFlag=0;
}
else
{
jidianqi1=0;
}
}

/*/
//////////////////////////////////////////


}


//////////////// //延时程序///////////////////////////////
void delay_5ms(void)
{
uchar i,j;
for(i=10;i>0;i--)
for(j=248;j>0;j--)
;
}

////////////显示程序,这个写法不错啊。//////////////////////////
void disp(uchar m,uchar n)
{
P2=pos[n]; //查表法 把对应的段码送P2?
P0=seg[m]; //查表法 把对应的未码送P0口
delay_5ms();
P2=0x00;
}


////////////显示程序,这个写法不错啊。//////222222222222222/////
void disp00(uchar x,uchar y)
{
P2=pos00[y]; //查表法 把对应的段码送P2?
P0=seg00[x]; //查表法 把对应的未码送P0口
delay_5ms();
P2=0x00;
}

////////////////////主程序//////////////////////////////
void main(void)
{

uchar j;
uchar p;
TMOD=0x01;
// TH0=-50000/256;
// TL0=-50000%256;
TR0=1;
ET0=1;
EA=1;
second=0;
minite=0;
hour=0;

second00=7;
minite00=8;
hour00=9;

jidianqi1=1;
naozhongqiyongFlag=0;
led=1;

while(1)
{

TimeCompate();
if(k1==0)
{
delay_5ms();
if(k1==0) //判断按键是否按下
{
second=0;
while(k1==0);
}
}
if(k2==0) //判断按键是否按下
{
delay_5ms();
if(k2==0)
{
minite++;
if(minite==60) minite=0;
while(k2==0);
}
}
if(k3==0) //判断按键是否按下
{
delay_5ms();
if(k3==0)
{
hour++;
if(hour==24) hour=0;
while(k3==0)
{for(j=0;j<8;j++) //扫描显示程序,循环有8次,01234567.
disp(k[j],j); //扫描显示程序
}
}
}

//////////////////////////////////////////////////////////////////////

if(k4==0) //判断按键是否按下
{
delay_5ms();
if(k4==0)
{
while(k4==0)
{
for(p=0;p<8;p++)
disp00(k00[p],p);
TimeCompate();
;
}
}
}

///////////////////////////////////////////////////////////////////////////////
if(k5==0) //判断按键是否按下
{
delay_5ms();
if(k5==0)
{
second00=57;
minite00=0;
hour00=0;


while(k5==0)
{
for(p=0;p<8;p++)
disp00(k00[p],p);
;
}
}
}
//////////////////////////////////////////////////////////////////////////////////////
if(k6==0) //判断按键是否按下
{
delay_5ms();
if(k6==0)
{
naozhongqiyongFlag=~naozhongqiyongFlag;
led=~led;

while(k6==0)
{
;
}
}
}

////////////////////////////////////////////////////////////////////////////////////
for(j=0;j<8;j++) //扫描显示程序,循环有8次,01234567.
disp(k[j],j); //扫描显示程序
////////////////////////////////////////////////////////////////////////////////////

TimeCompate();
////////////////////////////////////////////////////////////////////////////////////


}
}
////////////////*定时器工作方式*/ /////////////////////////////////
void t0(void) interrupt 1 /*定时器工作方式*/ using 0 //工作寄存器
{
num++;

if(num==20)
{
num=0;
second++;
if(second==60)
{
second=0;
minite++;
if(minite==60)
{
minite=0;
hour++;
if(hour==24)
{
hour=0;
}
}
}
k[0]=second%10; //各位
k[1]=second/10; //各十位
k[3]=minite%10; //各位
k[4]=minite/10; //各十位
k[6]=hour%10; //各位
k[7]=hour/10; //各十位

}
num00++;
if(num00==20)
{
num00=0;
second00++;
if(second00==60)
{
second00=0;
minite00++;
if(minite00==60)
{
minite00=0;
hour00++;
if(hour00==99)
{
hour00=0;
}
}
}
k00[0]=second00%10; //各位
k00[1]=second00/10; //各十位
k00[3]=minite00%10; //各位
k00[4]=minite00/10; //各十位
k00[6]=hour00%10; //各位
k00[7]=hour00/10; //各十位
}



TH0=-50000/256;
TL0=-50000%256;

}


-电子元器件采购网(www.ruidan.com)是本土元器件目录分销商,采用“小批量、现货、样品”销售模式,致力于满足客户多型号、高质量、快速交付的采购需求。 自建高效智能仓储,拥有自营库存超过50,000种,提供一站式正品现货采购、个性化解决方案、选型替代等多元化服务。
锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章