数字电子时钟程序【闹铃(持续5s),整点报时(几点报几下,每两下之间隔间2s,每声持续2s)】程序:#include<reg51.h>#include<absacc.h>#define uchar unsigned char#define uint unsigned int//此表为LED 的字模, 共阴数码管0-9 -uchar code dispcode[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //段码控制/*定义并初始化变量*/sbit key1=P3^0;sbit key2=P3^1;sbit key3=P3^2;sbit key4=P3^3;sbit buzz=P1^3;uchar mstcnt=0;//定时器计数,定时50ms,mstcnt满20,秒加1uchar seconde1=0;uchar bjcs;uchar minite1=0;uchar hour1=7;uchar seconde2=0;uchar minite2=0;uchar hour2=8;uchar temp1=0;uchar temp2=0;uchar count1,flag,temp;/*函数声明*/void delay(uint z); //延时子程序void time_pro( ); //时间处理子程序void display(uchar hour,uchar minite,uchar seconde); //显示子程序void keyscan( ); //键盘扫描子程序void zhengdian();void dinshi();void delay(uint z){uint x,y;for(x=0;x<z;x++)for(y=0;y<110;y++);}void time_pro(void) /*时间处理子程序*/{if(seconde1==60){seconde1=0;minite1++;if(minite1==60){minite1=0;hour1++;if(hour1==24){hour1=0;}}}}void display(uchar hour,uchar minite,uchar seconde) /*显示子程序*/ {uchar h1,h2,m1,m2,s1,s2;s2=seconde/10;s1=seconde%10;m2=minite/10;m1=minite%10;h2=hour/10;h1=hour%10;P2=0XFE; //1111 1110if(temp1==1) //功能选项,通过点提醒来调节相应位的时间P0=dispcode[s1]|0x80; //点提醒elseP0=dispcode[s1];//秒个位delay(1);P2=0XFD;//1111 1101P0=dispcode[s2];//秒十位delay(1);P2=0XFB; //1111 1011P0=dispcode[10];//间隔符-delay(1);P2=0XF7; //1111 0111if(temp1==2)//P0=dispcode[m1]|0x80;elseP0=dispcode[m1];//分个位delay(1);P2=0XEF; //1110 1111P0=dispcode[m2];//分十位delay(1);P2=0XDF; //1101 1111P0=dispcode[10];//间隔符-delay(1);P2=0XBF; //1011 1111if(temp1==3)P0=dispcode[h1]|0x80;//时个位elseP0=dispcode[h1];delay(1);P2=0X7F; //0111 1111P0=dispcode[h2];//时十位delay(1);}void keyscan(void) /*键盘扫描子程序*/{if(key1==0){delay(10);if(key1==0){//TR0=0;temp1++;if(temp1==4){temp1=0;TR0=1;}while(!key1)switch(temp2){case 0:display(hour1,minite1,seconde1);break;case 1:display(hour2,minite2,seconde2);break;}}}if(key2==0){delay(10);if(key2==0){if(temp2==0) //闹钟选择键{//TR0=0;switch(temp1){case 1:seconde1++;if(seconde1==60)seconde1=0;break;case 2:minite1++;if(minite1==60)minite1=0;break;case 3:hour1++;if(hour1==24)hour1=0;break;}while(!key2)display(hour1,minite1,seconde1);}if(temp2==1){ TR0=1;switch(temp1){case 1:seconde2++;if(seconde2==60)seconde2=0;break;case 2:minite2++;if(minite2==60)minite2=0;break;case 3:hour2++;if(hour2==24)hour2=0;break;}while(!key2)display(hour2,minite2,seconde2);}}}if(key3==0){delay(10);if(key3==0){if(temp2==0){ //TR0=0;switch(temp1){case 1:if(seconde1==0)seconde1=60;seconde1--;break;case 2:if(minite1==0)minite1=60;minite1--;break;case 3:if(hour1==0)hour1=24;hour1--;break;}while(!key3)display(hour1,minite1,seconde1);}if(temp2==1){ TR0=1;switch(temp1){case 1:if(seconde2==0)seconde2=60;seconde2--;break;case 2:if(minite2==0)minite2=60;minite2--;break;case 3:if(hour2==0)hour2=24;hour2--;break;}while(!key3)display(hour2,minite2,seconde2);}}}if(key4==0){delay(10);if(key4==0){temp1=0;temp2++;if(temp2==2)temp2=0;while(!key4)switch(temp2){case 0:display(hour1,minite1,seconde1);break;case 1:display(hour2,minite2,seconde2);break;}}}switch(temp2){case 0:display(hour1,minite1,seconde1);break;case 1:display(hour2,minite2,seconde2);break;}}void dinshi() /*定时闹钟*/{uint i;if(hour1==hour2&&minite1==minite2&&(seconde1>=seconde2&&seconde1<seconde2 +5)){for(i=0;i<200;i++){buzz=1;buzz=0;}} /*整点报警*/ /*void zhengdian (void){ uint k;if((seconde1 == 0)&&(minite1 ==0)){for(bjcs = 0; bjcs<hour1; bjcs++){for(k=0;k<150;k++){buzz=0;delay(20);}buzz=1;delay(20);}}} */void zhengdian (void){if(seconde1==0&&minite1==0){ temp=hour1;flag=1; //标记buzz=1;}}/*主函数*/void main(void){TMOD=0x11; //time0为定时器,方式1TH0=0x3c; //预置计数初值,50msTL0=0xb0;TH1=(65535-50000)/256;TL1=(65535-50000)%256;EA=1; //总中断开ET0=1; //允许定时器0中断TR0=1;ET1=1;TR1=1;buzz=0; //开启定时器0{keyscan(); //按键扫描dinshi(); //定时闹钟// zhengdian(); //整点报时switch(temp2) //显示时间{case 0:display(hour1,minite1,seconde1);break;case 1:display(hour2,minite2,seconde2);break;}}}void timer0(void) interrupt 1 //定时器0方式1,50ms中断一次{TH0=0x3c; //手动加载计数脉冲次数TL0=0xb0;// TMOD=0x11;mstcnt++;zhengdian(); //用于计算时间,每隔50ms加1if(mstcnt==20) //mstcnt满20即为一秒{seconde1++; //秒+1time_pro( ); //时间处理mstcnt=0; //对计数单元的清零,重新开始计}}void timer1() interrupt 3{TH1=(65536-50000)/256;TL1=(65536-50000)%256;if(flag==1){count1++;if(count1<=40)buzz=1;if(40<count1&&count1<80)buzz=0;if(count1==80){count1=0;temp--; // 时间减一}if(temp==0)flag=0;}仿真图:。