wulin 发表于 2018-6-10 06:43 问题解决了,谢谢解答。 |
放在中断里试试,弄个标志位,应该可以 |
因为你使用delay处理两个程序,就会产生互相干扰。你把数码管动态显示放在中断里,中断时间改为1ms就不会互相干扰了。 #include<reg51.h> #include<absacc.h> #define uchar unsigned char #define uint unsigned int uchar code dispcode[ ]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00}; /*七段共阴管显示定义*/ uchar seconde=0; /*定义并初始化变量*/ uchar minite=0; uchar hour=0; uint mstcnt=0; /*函数声明*/ void delay(uchar k ); //延时子程序 void time_pro( ); //时间处理子程序 void display( ); //显示子程序 void keyscan( ); //键盘扫描子程序 void led_display( ); // led闪烁程序 /*****************************/ /*led灯闪烁程序*/ /****************************/ void led_display(void) { delay(50); //led灯闪烁三次后熄灭 P2=0x07; //赋初始值 delay(50); P2=0x00; delay(50); P2=0x07; delay(50); P2=0x00; delay(50); P2=0x07; delay(50); P2=0x00; } /*****************************/ /*延时子程序*/ /****************************/ void delay (uchar k) { uchar j; while((k--)!=0) { for(j=0;j<125;j++) {;} } } /**************************/ /*时间处理子程序*/ /**************************/ void time_pro( void) { if(seconde==60) //秒钟设为60进制 { seconde=0; minite++; if(minite==60) //分钟设为60进制 { minite=0; hour++; if(hour==24) //时钟设为24进制 { hour=0; } } } } /*****************************/ /* 显示子程序*/ /*****************************/ void display() { static uchar i=0; P0=0x00; //消隐 switch(i) { case 0: P1=0xfe; P0=dispcode[hour/10];//显示小时的十位 i++; break; case 1: P1=0xfd; P0=(dispcode[(hour%10)])|0X80;//显示小时的个位 i++; break; case 2: P1=0xfb; P0=dispcode[minite/10];//显示分的十位 i++; break; case 3: P1=0xf7; P0=(dispcode[minite%10])|0X80;//显示分的个位 i++; break; case 4: P1=0xef; P0=dispcode[seconde/10];//显示秒的十位 i++; break; case 5: P1=0xdf; P0=dispcode[seconde%10];//显示秒的个位 i=0; break; } } /**************************/ /*主函数*/ /**************************/ void main(void) { P1=0xff; //初始化p1口,全设为1 TMOD=0x01; //time0为定时器,方式1 TH0=0xfc; //预置计数初值1ms TL0=0x18; EA=1; ET0=1; TR0=1; while (1) { led_display( ); //led灯闪烁 time_pro( ); //时间处理 // display( ); //显示时间 } } void timer0(void) interrupt 1 using 0 //定时器0方式1,50ms中断一次 { TH0=0xfc; //重置计数初值1ms TL0=0x18; mstcnt++; if(mstcnt>=1000) { seconde++; mstcnt=0; } display( ); //显示时间 } ![]() |