51数字时钟89C52单片机C语言程序.docx

上传人:b****4 文档编号:24331134 上传时间:2023-05-26 格式:DOCX 页数:12 大小:16.87KB
下载 相关 举报
51数字时钟89C52单片机C语言程序.docx_第1页
第1页 / 共12页
51数字时钟89C52单片机C语言程序.docx_第2页
第2页 / 共12页
51数字时钟89C52单片机C语言程序.docx_第3页
第3页 / 共12页
51数字时钟89C52单片机C语言程序.docx_第4页
第4页 / 共12页
51数字时钟89C52单片机C语言程序.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

51数字时钟89C52单片机C语言程序.docx

《51数字时钟89C52单片机C语言程序.docx》由会员分享,可在线阅读,更多相关《51数字时钟89C52单片机C语言程序.docx(12页珍藏版)》请在冰豆网上搜索。

51数字时钟89C52单片机C语言程序.docx

51数字时钟89C52单片机C语言程序

数字时钟89C52单片机C语言程序

STC89C52|

/**************【数字时钟】****************/

/****【功能】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;/*第六位符号【-】的显示*/

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==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;

}

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1