这是我自己设计的计时和点亮三个小灯的设计,现在发现计时和点亮小灯没法同时实现.
遇到的问题如下:
1.假如我把led_display程序发在while语句最后一行,会发生数码管前五位会随着小灯一起闪烁显示。
2.假如我把led_display程序发在while语句第一行,会发生数码管前五位不显示。
所以我想请教这个led_display语句应该发在哪里比较好。
下面附上程序+原理仿真图:
单片机程序:
- #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;
- uchar 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(void)
- {
- P1=0xfe;
- P0=dispcode[hour/10]; //显示小时的十位
- //delay(10);
- P1=0xfd;
- P0=(dispcode[(hour%10)])|0X80; //显示小时的个位
- //delay(4);
- P1=0xfb;
- P0=dispcode[minite/10]; //显示分的十位
- //delay(4);
- P1=0xf7;
- P0=(dispcode[minite%10])|0X80; //显示分的个位
- // delay(4);
- P1=0xef;
- P0=dispcode[seconde/10]; //显示秒的十位
- // delay(4);
- P1=0xdf;
- P0=dispcode[seconde%10]; //显示秒的个位
- // delay(4);
- }
- void timer0(void) interrupt 1 using 0 //定时器0方式1,50ms中断一次
- {
- TH0=0x3c;
- TMOD = 0x11;
- mstcnt++;
- if(mstcnt==20)
- {
- seconde++;
- mstcnt=0;
- }
- }
- /**************************/
- /*主函数*/
- /**************************/
- void main(void)
- {
- P1=0xff; //初始化p1口,全设为1
-
- TMOD = 0x11; //time0为定时器,方式1
- TH0=0x3c; //预置计数初值
- TL0=0xb0;
- EA=1;
- ET0=1;
- TR0=1;
- while (1)
- {
- led_display( ); //led灯闪烁
- time_pro( ); //时间处理
- display( ); //显示时间
- }
- }
复制代码
|