//52单片机程序
/************************************************************/
/* 数码管时钟89c52 */
/************************************************************/
/*程序可调时间,可设闹钟,数码管共阳驱动。*/
/*功能键K1 K2 K3 K4 功能如下*/
/*K1按一下:(显示)显示正常走时间*/
/*K1按两下:(调时)K2按一下再按K3K4调时间时位,K2按两下再按*/ /* K3K4调时间分位,K2按三下再按K3K4调时间秒位*/ /*K1按三下:(显示)显示设置的闹钟时间*/
/*K1按四下:(设闹钟)K2按一下再按K3K4设闹钟时间时位,K2按两*/ /* 下再按K3K4设闹钟时间分位K2按三下再按K3K4设闹钟时间秒位*/ /*K3加键*/
/*K4减键*/
/************************************************************/
/*作者:陈朝宝*/
/*学校:寿宁职业技术学校*/
/*日期:2010年12月22日星期三*/
/************************************************************/
#include
#define uchar unsigned char
#define uint unsigned int
uchar code table[10]={
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90};
char hh,mm,ss;
char nhh,nmm,nss;
uchar n,q;
uchar hhs,hhg,mms,mmg,sss,ssg;
uchar nhhs,nhhg,nmms,nmmg,nsss,nssg;
uchar set,set1=1,set2=0;
sbit fm=P2^4;
sbit wr=P2^5;
sbit dula=P2^6;
sbit wela=P2^7;
sbit k1=P3^4;
sbit k2=P3^5;
sbit k3=P3^6;
sbit k4=P3^7;
void jishi();
void baoshi();
void alarm();
void set_alarm(); //设置闹钟
void k_change(); //K1按键扫描
void set_time(); //设置时间
void k_set(); //K2按键扫描
/************************************************************/ //延时函数
void delay(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
/************************************************************/ //位选通
void wx()
{
wr=0;
wela=0;
wr=1;
wela=1;
}
/************************************************************/ //段选通
void dx()
{
wr=0;
dula=0;
wr=1;
dula=1;
}
/************************************************************/ //显示函数
void display( )
{
if(set1==1)//正常走时显示
{
P0=0x7f;wx();P0=table[hhs];dx();delay(1);P0=0xff;dx();
P0=0xbf;wx();P0=table[hhg];dx();delay(1);P0=0xff;dx();
P0=0xdf;wx();P0=0xbf;dx();delay(1);P0=0xff;dx();//显示“-”
P0=0xef;wx();P0=table[mms];dx();delay(1);P0=0xff;dx();
P0=0xf7;wx();P0=table[mmg];dx();delay(1);P0=0xff;dx();
P0=0xfb;wx();P0=0xbf;dx();delay(1);P0=0xff;dx();
P0=0xfd;wx();P0=table[sss];dx();delay(1);P0=0xff;dx();
P0=0xfe;wx();P0=table[ssg];dx();delay(1);P0=0xff;dx();
}
if(set1==2)//设置时间
{
P0=0x7f;wx();P0=table[hhs];dx();delay(1);P0=0xff;dx();
P0=0xbf;wx();P0=table[hhg];dx();delay(1);P0=0xff;dx();
P0=0xdf;wx();P0=0xbf;dx();delay(1);P0=0xff;dx();
P0=0xef;wx();P0=table[mms];dx();delay(1);P0=0xff;dx();
P0=0xf7;wx();P0=table[mmg];dx();delay(1);P0=0xff;dx();
P0=0xfb;wx();P0=0xbf;dx();delay(1);P0=0xff;dx();
P0=0xfd;wx();P0=table[sss];dx();delay(1);P0=0xff;dx();
P0=0xfe;wx();P0=table[ssg];dx();delay(1);P0=0xff;dx();
}
if(set1==3)//显示闹钟定时
{
P0=0x7f;wx();P0=table[nhhs];dx();delay(1);P0=0xff;dx();
P0=0xbf;wx();P0=table[nhhg];dx();delay(1);P0=0xff;dx();
P0=0xdf;wx();P0=0xbf;dx();delay(1);P0=0xff;dx();
P0=0xef;wx();P0=table[nmms];dx();delay(1);P0=0xff;dx();
P0=0xf7;wx();P0=table[nmmg];dx();delay(1);P0=0xff;dx();
P0=0xfb;wx();P0=0xbf;dx();delay(1);P0=0xff;dx();
P0=0xfd;wx();P0=table[nsss];dx();delay(1);P0=0xff;dx();
P0=0xfe;wx();P0=table[nssg];dx();delay(1);P0=0xff;dx();
}
if(set1==4)//设置闹钟
{
P0=0x7f;wx();P0=table[nhhs];dx();delay(1);P0=0xff;dx();
P0=0xbf;wx();P0=table[nhhg];dx();delay(1);P0=0xff;dx();
P0=0xdf;wx();P0=0xbf;dx();delay(1);P0=0xff;dx();
P0=0xef;wx();P0=table[nmms];dx();delay(1);P0=0xff;dx();
P0=0xf7;wx();P0=table[nmmg];dx();delay(1);P0=0xff;dx();
P0=0xfb;wx();P0=0xbf;dx();delay(1);P0=0xff;dx();
P0=0xfd;wx();P0=table[nsss];dx();delay(1);P0=0xff;dx();
P0=0xfe;wx();P0=table[nssg];dx();delay(1);P0=0xff;dx();
}
{
baoshi();
alarm();
}
}
/************************************************************/ //时间中断函数50ms
void T0_time()interrupt 1
{
TMOD=0x01;
TH0=0x3c;
TL0=0xb0;
n++;
}
/************************************************************/ //计时函数
void jishi()
{
if(n==20)
{
n=0;ss++;
if(ss==60)
{
ss=0;mm++;
if(mm==60)
{
mm=0;hh++;
if(hh==24)
{hh=0;}
}
}
}
}
/************************************************************/ //初始化函数
void init()
{
TMOD=0x01;
TH0=0x3c;
TL0=0xb0;
EA=1;
ET0=1;
TR0=1;
}
/************************************************************/ //k1按键扫描
void k_change()
{
if(k1==0)
{
delay(20);
if(k1==0)
{
set1++;
while(!k1);
if(set1==5)
{set1=1;}
}
}
}
/************************************************************/ //k2按键扫描
void k_set()
{
if(k2==0)
{
delay(20);
if(k2==0)
{
set2++;
while(!k2);
if(set2==4)
{set2=1;}
}
}
}
/************************************************************/ //加一函数
uchar incone(uchar n)
{
if(k3==0)
{
delay(20);
if(k3==0)
{
n++;
while(!k3);
}
}
return(n);
}
/************************************************************/ //减一函数
uchar decone(uchar q)
{
if(k4==0)
{
delay(20);
if(k4==0)
{
q--;
while(!k4);
if(q<0)
{
q=0;
}
}
}
return(q);
}
/************************************************************/ //设置时间函数
void set_time()
{
if(set1==2)
{
if(set2==1)
{
hh=incone(hh);
if(hh==24)
{hh=0;}
if(hh==-1)
{hh=23;}
hh=decone(hh);
}
if(set2==2)
{
mm=incone(mm);
if(mm==60)
{mm=0;}
if(mm==-1)
{mm=59;}
mm=decone(mm);
}
if(set2==3)
{
ss=incone(ss);
if(ss==60)
{ss=0;}
if(ss==-1)
{ss=59;}
ss=decone(ss);
}
}
}
/************************************************************/ //整点报时函数
void baoshi()
{
if(hh>>0&&mm==00&&ss==00)
{fm=1;}
else
{fm=0;}
}
/************************************************************/ //闹钟函数
void alarm()
{
uchar x;
if(nhh==0&&nmm==0&&nss==0)
{goto end;}
if(nhh==hh&&nmm==mm&&nss==ss)
{
for(x=0;x<6;x++)
{
fm=1;delay(15);fm=0;delay(10);
fm=1;delay(15);fm=0;delay(10);
fm=1;delay(15);fm=0;delay(10);
fm=1;delay(15);fm=0;delay(90);
}
}
end:;
}
/************************************************************/ //设置闹钟函数
void set_alarm()
{
if(set1==4)
{
if(set2==1)
{
nhh=incone(nhh);
if(nhh==24)
{nhh=0;}
nhh=decone(nhh);
if(nhh==-1)
{nhh=23;}
}
if(set2==2)
{
nmm=incone(nmm);
if(nmm==60)
{nmm=0;}
nmm=decone(nmm);
if(nmm==-1)
{nmm=59;}
}
if(set2==3)
{
nss=incone(nss);
if(nss==60)
{nss=0;}
nss=decone(nss);
if(nss==-1)
{nss=59;}
}
}
}
/************************************************************/ //主函数
void main()
{
init();
hh=00;mm=59;ss=55;
nhh=01;nmm=00;nss=5;
while(1)
{
hhs=hh/10;
hhg=hh%10;
mms=mm/10;
mmg=mm%10;
sss=ss/10;
ssg=ss%10;
nhhs=nhh/10;
nhhg=nhh%10;
nmms=nmm/10;
nmmg=nmm%10;
nsss=nss/10;
nssg=nss%10;
k_change();
k_set();
set_time();
set_alarm();
display();
jishi();
}
}
/************************************************************/
本文档为【51_52单片机(89c52)数码管时钟程序】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。