51单片机数码管电子时钟C程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//**单片机stc89c52,8位共阴数码管 12M晶振**//
//*******P0位选,P2段选*******//
#include "reg52.h"
#define uchar unsigned char
#define uint unsigned int
uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f, 0x40,0xff};
uchar n;
uchar hh,mm,ss;
uchar nhh,nmm,nss;
uint year;
uchar day,mon,week;
uchar hhs,hhg,mms,mmg,sss,ssg;
uchar days,dayg,mons,mong;
uchar nhhs,nhhg,nmms,nmmg,nsss,nssg;
uchar set1=1,set2=1;
sbit dula=P3^3;
sbit fm=P3^2;
sbit k1=P3^4;
sbit k2=P3^5;
sbit k3=P3^6;
sbit k4=P3^7;
uchar table1[]={31,31,29,31,30,31,30,31,31,30,31,30,31}; //闰年
uchar table2[]={31,31,28,31,30,31,30,31,31,30,31,30,31}; //非闰年
void jishi();
void baoshi();
void alarm();
void set_time();
void set_alarm();
void set_mdw();
void key_change();
void key_set();
void delay(int m) //延时程序,延时m*0.5ms
{
uint i;
uint j;
for (i=0;i { for(j=0;j<500;j++){} } } void timer0() interrupt 1 { TMOD=0x01; TH0=0x3c; TL0=0xb1; n++; jishi(); } main() { TMOD=0x01; TH0=0x3c; TL0=0xb1; TR0=1; EA=1; ET0=1; hh=12;mm=00;ss=00; nhh=7;nmm=30;nss=0; year=2012;mon=01;day=01;week=7; while(1) { hhs=hh/10%10;//时分秒 hhg=hh%10; mms=mm/10%10; mmg=mm%10; sss=ss/10%10; ssg=ss%10; nhhs=nhh/10%10;//闹钟 nhhg=nhh%10; nmms=nmm/10%10; nmmg=nmm%10; nsss=nss/10%10; nssg=nss%10; days=day/10%10;//月日 dayg=day%10; mons=mon/10%10; mong=mon%10; key_change(); //k1按键扫描 key_set(); //k2按键扫描 set_time(); //设置时间 set_mdw(); //设置月日星期 set_alarm(); //设置闹钟 if(set1==1) //正常走时显示 { dula=1;P2=tab[hhs];dula=0;P2=0xff;P0=0xef;delay(1);P0=0xff;//时十位dula=1;P2=tab[hhg]; dula=0;P2=0xff;P0=0xdf;delay(1); P0=0xff;//时个位 dula=1;P2=tab[10];dula=0;P2=0xff; P0=0xbf;delay(1); P0=0xff;//"-" dula=1;P2=tab[mms];dula=0; P2=0xff;P0=0x7f;delay(1);P0=0xff; //分十位dula=1;P2=tab[mmg];dula=0;P2=0xff; P0=0xfe;delay(1); P0=0xff;//分个位dula=1;P2=tab[10]; dula=0;P2=0xff;P0=0xfd;delay(1); P0=0xff;//"-" dula=1;P2=tab[sss]; dula=0;P2=0xff;P0=0xfb;delay(1); P0=0xff;//秒十位dula=1;P2=tab[ssg]; dula=0;P2=0xff;P0=0xf7;delay(1);P0=0xff;//秒个位} if(set1==2) //设置时间 { dula=1;P2=tab[hhs];dula=0;P2=0xff;P0=0xef;delay(1);P0=0xff;//时十位dula=1;P2=tab[hhg]; dula=0;P2=0xff;P0=0xdf;delay(1); P0=0xff;//时个位dula=1;P2=tab[10];dula=0;P2=0xff; P0=0xbf;delay(1); P0=0xff;//"-" dula=1;P2=tab[mms];dula=0; P2=0xff;P0=0x7f;delay(1);P0=0xff; //分十位dula=1;P2=tab[mmg];dula=0;P2=0xff; P0=0xfe;delay(1); P0=0xff;//分个位dula=1;P2=tab[10]; dula=0;P2=0xff;P0=0xfd;delay(1); P0=0xff;//"-" dula=1;P2=tab[sss]; dula=0;P2=0xff;P0=0xfb;delay(1); P0=0xff;//秒十位dula=1;P2=tab[ssg]; dula=0;P2=0xff;P0=0xf7;delay(1);P0=0xff;//秒个位 } if(set1==3) //正常显示月日-星期 { dula=1;P2=tab[mons];dula=0;P2=0xff;P0=0xef;delay(1);P0=0xff;//时十位dula=1;P2=tab[mong]; dula=0;P2=0xff;P0=0xdf;delay(1); P0=0xff;//时个位dula=1;P2=tab[10]; dula=0; P2=0xff; P0=0xbf;delay(1); P0=0xff;//"-" dula=1;P2=tab[days]; dula=0; P2=0xff;P0=0x7f;delay(1);P0=0xff;//分十位dula=1;P2=tab[dayg]; dula=0; P2=0xff; P0=0xfe;delay(1); P0=0xff;//分个位 dula=1;P2=tab[10];dula=0;P2=0xff;P0=0xfd;delay(1); P0=0xff;//"-" dula=1;P2=tab[10]; dula=0;P2=0xff;P0=0xfb;delay(1); P0=0xff;//秒十位dula=1;P2=tab[week]; dula=0;P2=0xff;P0=0xf7;delay(1);P0=0xff;//秒个位 } if(set1==4) //设置月日-星期 { dula=1;P2=tab[mons];dula=0;P2=0xff;P0=0xef;delay(1);P0=0xff;//时十位dula=1;P2=tab[mong]; dula=0;P2=0xff;P0=0xdf;delay(1); P0=0xff;//时个位dula=1;P2=tab[10]; dula=0; P2=0xff; P0=0xbf;delay(1); P0=0xff;//"-" dula=1;P2=tab[days]; dula=0; P2=0xff;P0=0x7f;delay(1);P0=0xff;//分十位dula=1;P2=tab[dayg]; dula=0; P2=0xff; P0=0xfe;delay(1); P0=0xff;//分个位 dula=1;P2=tab[10];dula=0;P2=0xff;P0=0xfd;delay(1); P0=0xff;//"-" dula=1;P2=tab[10]; dula=0;P2=0xff;P0=0xfb;delay(1); P0=0xff;//秒十位dula=1;P2=tab[week]; dula=0;P2=0xff;P0=0xf7;delay(1);P0=0xff;//秒个位}