原理图附:源程序/***************************************************************************标题:定时器中断24小时时钟程序效果:数码管显示24小时制时钟(具有调时功能)说明:使用12M晶振,key1=P3^7;key2=P3^6;key3=P3^5;key4=P3^4;数码管位选P1.0~P1.3,段选P0,共阳数码管******************************************************************************/#includereg52.h#defineucharunsignedchar;#defineuintunsignedint;ucharposition;uchartt;ucharsecond;ucharminute;ucharhour;ucharcodetable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//0--9sbitsmg_q=P1^0;//数码管千位引脚sbitsmg_b=P1^1;sbitsmg_s=P1^2;sbitsmg_g=P1^3;sbitkey1=P3^7;//按键定义sbitkey2=P3^6;sbitkey3=P3^5;sbitkey4=P3^4;voidkeyscan();//函数声明voiddisplay(unsignedcharhour,unsignedcharminute);voiddelay(unsignedinttimer);voidinit();/***********************************************************主函数***********************************************************/voidmain(){init();while(1){if(tt==20){tt=0;second++;if(second==60){second=0;minute++;if(minute==60){minute=0;hour++;if(hour==24)hour=0;}}}keyscan();display(hour,minute);delay(1);}}/***********************************************************调时***********************************************************/voidkeyscan(){if(key1==0)//小时加1{TR0=0;hour++;if(hour==24)hour=0;delay(200);TR0=1;}if(key2==0)//小时减{TR0=0;hour--;if(hour0)hour=23;delay(200);TR0=1;}if(key3==0)//分钟加{TR0=0;minute++;if(minute==60)minute=0;delay(200);TR0=1;}if(key4==0)//分钟减{TR0=0;minute--;if(minute0)minute=59;delay(200);TR0=1;}}/***********************************************************初始化***********************************************************/voidinit(){tt=0;position=0;second=0;minute=0;hour=0;smg_q=1;smg_b=1;smg_s=1;smg_g=1;key1=1;key2=1;TMOD=0X01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;}/***********************************************************定时器TO中断***********************************************************/voidt0()interrupt1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;tt++;}/***********************************************************显示***********************************************************/voiddisplay(unsignedcharhour,unsignedcharminute){P0=0XFF;switch(position){case0:smg_g=1;smg_q=0;P0=table[hour/10];break;case1:smg_q=1;smg_b=0;P0=table[hour%10];if(tt=10)P0&=0x7f;//小数点以半秒的时间闪烁break;case2:smg_b=1;smg_s=0;P0=table[minute/10];break;case3:smg_s=1;smg_g=0;P0=table[minute%10];break;}position++;if(position3)position=0;}/***********************************************************延时***********************************************************/voiddelay(unsignedinttime){unsignedintx,y;for(x=time;x0;x--)for(y=110;y0;y--);}