数字时钟 89C52 单片机C语言程序STC89C52.docx
- 文档编号:7245956
- 上传时间:2023-01-22
- 格式:DOCX
- 页数:14
- 大小:17.15KB
数字时钟 89C52 单片机C语言程序STC89C52.docx
《数字时钟 89C52 单片机C语言程序STC89C52.docx》由会员分享,可在线阅读,更多相关《数字时钟 89C52 单片机C语言程序STC89C52.docx(14页珍藏版)》请在冰豆网上搜索。
数字时钟89C52单片机C语言程序STC89C52
数字时钟89C52单片机C语言程序STC89C522009-10-1321:
43:
33阅读499评论1字号:
大中小订阅.
/**************【数字时钟】****************/
/****【功能】1、时间显示2、秒表3、闹钟4、日期显示都可以设置****/
#include
#defineucharunsignedchar/*宏定义字符型数据整型数据*/
#defineuintunsignedint
ucharcodeH[]={0x0f,0x07,0x0b,0x0d,0x0e};/*按键【P3】端口断码用于按键*/
charCode[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,
0x7d,0x07,0x7f,0x6f};/*显示【0123456789】数字的数码管的段码*/
ucharcodeC[]={0x0,0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};
/*列扫描控制LED1位2位3位4位5位6位7位8位*/
ucharMON[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
ucharA;
ucharBIN=0;/*【BIN】作为倒计时开始的标志*/
ucharhour=0;/*定义[时][分][秒]*/
ucharmin=0;
ucharsec=0;
uintshi=12;
uintfen=30;
ucharMmin=0;
ucharMsec=30;
ucharM0=0;
ucharm=0;
ucharyear=9;
ucharmonth=7;
ucharmonth2;
ucharday=19;
ucharset1=1;/*set1=1是调节时分秒set1=2时时调节年月日set=3时事调节闹钟*/
ucharset2=1;/*set2=1时是调节【时】位set2=2时事调节【分】位*/
uintx=0;/*x每【0.01s】自加一*/
voidDelay(uintk);
voidTimer0()/*定时器T05mS初始化*/
{
TMOD=0x01;/*设置*定时器0**计数方式一*(每12个时钟脉冲计数一次)或IT0=1第二种计数方式*/
TH0=(65536-10000)/256;/*给定计时器高位赋予初值=15536/256*/
TL0=(65536-10000)%256;/*给定计时器低位赋予初值=15536%256*/
ET0=1;/*打开定时器外部终断0允许ET1是中断器1的开关*/
EA=1;/*打开总中断允许*/
TR0=1;
}
voidT0_srv(void)interrupt1/*5mS定时中断服务函数秒分时的值*/
{
TH0=(65536-10000)/256;/*给定计时器高位赋予初值=15536/256*/
TL0=(65536-10000)%256;/*给定计时器低位赋予初值=15536%256*/
x++;
if(x==100)
{
sec++;
x=0;/*没每一秒【sec】加一*/
if(sec==60)
{
min++;
sec=0;
if(min==60)/*每一分钟【min】加一*/
{
min=0;
hour++;
if(hour==24)
{
hour=0;/*每一小时【hour】加一*/
day++;
if(year%4==0)/*是否闰年的判断*/
MON[2]=29;
elseMON[2]=28;
if(day==MON[month])
{
day=0;
month++;
}
}
}
}
}
if(BIN==1)
{
if(Mmin!
=0||Msec!
=0)
{
M0=100-x;
if(M0==100)
{if(Mmin>0)
{
Msec--;
if(Msec==0)
{
Msec=60;
Mmin--;
}
if(Msec==0){Mmin=0;Msec=0;M0=0;}
}
if(Mmin==0)
{
if(Msec!
=0)
Msec--;
if(Msec==0){Msec=0;M0=0;}
}
}
}
if(Mmin==0&&Msec==0)
{M0=0;}
}/*秒表分秒M0的赋值*/
}
voidScan_key()/*按键扫描函数【Scan_key()】*/
{
P3=H[0];
if(P3!
=H[0])
{
Delay
(1);
if(P3==H[4])
{
set1++;
if(set1>4)set1=1;
er1:
if(P3==H[4])gotoer1;/*按下键后未释放,在此等候*/
}
Delay
(1);
if(P3==H[3])
{
set2++;
if(set2>3)set2=1;
er2:
if(P3==H[3])gotoer2;/*按下键后未释放,在此等候*/
}
Delay
(1);
if(P3==H[1])
{
BIN++;
if(BIN>1)BIN=0;
er3:
if(P3==H[1])gotoer3;/*按下键后未释放,在此等候*/
}
}
}
voidTime_show()/*时间的显示变量为【时】【分】【秒】*/
{
P0=Code[hour/10];/*第一位数字显示【时】的【十】位*/
P2=C[1];
Delay
(1);
P0=Code[hour%10];/*第二位数字显示【时】的【个】位*/
P2=C[2];
Delay
(1);
if(x/50==0)
P0=0x40;/*第三位符号【-】的显示*/
else
P0=0x00;
P2=C[3];
Delay
(1);
P0=Code[min/10];/*第四位的数字的显示【分】的【十】位*/
P2=C[4];
Delay
(1);
P0=Code[min%10];/*第五位的数字显示【分】的【个】位*/
P2=C[5];
Delay
(1);
Delay
(1);
if(x/50==0)
P0=0x40;
fc1
/*第六位符号【-】的显示*/
else
P0=0x00;
P2=C[6];
Delay
(1);
P0=Code[sec/10];/*第七位数字的显示【秒】的【十】位显示*/
P2=C[7];
Delay
(1);
P0=Code[sec%10];/*第八位数字的显示【秒】的【个】位显示*/
P2=C[8];
Delay
(1);
}
voidYear_show()
{
P0=Code[year/10];/*第一位数字显示【年】的【十】位*/
P2=C[1];
Delay
(1);
P0=Code[year%10];/*第二位数字显示【年】的【个】位*/
P2=C[2];
Delay
(1);
P0=0x40;/*第三位符号【-】的显示*/
P2=C[3];
Delay
(1);
P0=Code[month/10];/*第四位的数字的显示【月】的【十】位*/
P2=C[4];
Delay
(1);
P0=Code[month%10];/*第五位的数字显示【月】的【个】位*/
P2=C[5];
Delay
(1);
Delay
(1);
P0=0x40;/*第六位符号【-】的显示*/
P2=C[6];
Delay
(1);
P0=Code[day/10];/*第七位数字的显示【天】的【十】位显示*/
P2=C[7];
Delay
(1);
P0=Code[day%10];/*第八位数字的显示【天】的【个】位显示*/
P2=C[8];
Delay
(1);
}
voidClock_show()
{
P0=Code[shi/10];/*第一位数字显示【时】的【十】位*/
P2=C[4];
Delay
(1);
P0=Code[shi%10];/*第二位数字显示【时】的【个】位*/
P2=C[5];
Delay
(1);
P0=0x40;/*第三位符号【-】的显示*/
P2=C[6];
Delay
(1);
P0=Code[fen/10];/*第四位的数字的显示【分】的【十】位*/
P2=C[7];
Delay
(1);
P0=Code[fen%10];/*第五位的数字显示【分】的【个】位*/
P2=C[8];
Delay
(1);
}
voidMiao_show()/*时间的显示变量为【时】【分】【秒】*/
{
P0=Code[Mmin/10];/*第一位数字显示【时】的【十】位*/
P2=C[1];
Delay
(1);
P0=Code[Mmin%10];/*第二位数字显示【时】的【个】位*/
P2=C[2];
Delay
(1);
P0=0x40;/*第三位符号【-】的显示*/
P2=C[3];
Delay
(1);
P0=Code[Msec/10];/*第四位的数字的显示【分】的【十】位*/
P2=C[4];
Delay
(1);
P0=Code[Msec%10];/*第五位的数字显示【分】的【个】位*/
P2=C[5];
Delay
(1);
Delay
(1);
P0=0x40;/*第六位符号【-】的显示*/
P2=C[6];
Delay
(1);
P0=Code[M0/10];/*第七位数字的显示【秒】的【十】位显示*/
P2=C[7];
Delay
(1);
P0=Code[M0%10];/*第八位数字的显示【秒】的【个】位显示*/
P2=C[8];
Delay
(1);
}
voidTime_set()/*调整时间的函数time_set()*/
{
Scan_key();
if(set1==1)
{
if(set2==1)/*当set1=1set2=1时位时的设置*/
{
if(P3==H[2])hour++;/*按一下第三行的键hour就加一*/
Delay
(1);
if(hour>24)hour=0;
while(P3==H[2]);/*按键未释放,在此等候*/
}
if(set2==2)/*当set1=1set2=1时位时的设置*/
{
if(P3==H[2])min++;/*按一下第三行的键hour就加一*/
Delay
(1);
if(min>60){min=0;hour++;}
while(P3==H[2]);/*按键未释放,在此等候*/
}
}
}
voidYear_set()/*调整时间的函数time_set()*/
{
Scan_key();
if(set1==2)
{
if(set2==1)/*当set1=1set2=1时位时的设置*/
{
if(P3==H[2])year++;/*按一下第三行的键hour就加一*/
Delay
(1);
if(year>100)year=0;
while(P3==H[2]);
}
if(set2==2)/*当set1=1set2=1时位时的设置*/
{
if(P3==H[2])month++;/*按一下第三行的键hour就加一*/
Delay
(1);
if(month>12){month=0;year++;}
while(P3==H[2]);
}
if(set2==3)
{
if(P3==H[2])day++;/*按一下第三行的键hour就加一*/
Delay
(1);
if(day>MON[month]){day=0;month++;}
while(P3==H[2]);/*按键未释放,在此等候*/
}
}
}
Clock_set()
{
Scan_key();
if(set1==3)
{
if(set2==1)/*当set1=1set2=1时位时的设置*/
{
if(P3==H[2])shi++;/*按一下第三行的键hour就加一*/
Delay
(1);
if(shi>24)shi=0;
while(P3==H[2]);/*按键未释放,在此等候*/
}
if(set2==2)/*当set1=1set2=1时位时的设置*/
{
if(P3==H[2])fen++;/*按一下第三行的键hour就加一*/
Delay
(1);
if(fen>60){fen=0;shi++;}
while(P3==H[2]);/*按键未释放,在此等候*/
}
}
}
voidMiao_set()/*调整时间的函数time_set()*/
{
Scan_key();
if(set1==4)
{
if(set2=
4f5
=1)/*当set1=1set2=1时位时的设置*/
{
if(P3==H[2])Mmin++;/*按一下第三行的键hour就加一*/
Delay
(1);
if(Mmin>24)Mmin=0;
while(P3==H[2]);/*按键未释放,在此等候*/
}
if(set2==2)/*当set1=1set2=1时位时的设置*/
{
if(P3==H[2])Msec++;/*按一下第三行的键hour就加一*/
Delay
(1);
if(Msec>60){Msec=0;Mmin++;}
while(P3==H[2]);/*按键未释放,在此等候*/
}
}
}
voidClock()
{
if((hour==shi)&&(min==fen))
{
P1=0x00;
}
if(min>fen)
{
P1=0xff;
}
}
voidDelay(uintk)/*延时函数delay()的定义*/
{
uinti,j;
for(i=0;i { for(j=0;j<121;j++) {; } } } voidmain()/*主函数*/ { Timer0(); while (1) { if(set1==1) { Time_show(); Time_set(); } if(set1==2) { Year_show(); Year_set(); } if(set1==3) { Clock_show(); Clock_set(); } Clock(); if(set1==4) { Miao_show(); Miao_set(); if(Mmin==0&&Msec==0) { A=sec; P1=0x00; if(sec==A-1) P1=0xff; } } if(set1! =4) { P1=0xff; } } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数字时钟 89C52 单片机C语言程序STC89C52 数字 时钟 89 C52 单片机 语言 程序 STC89C52