這是我自己設計的計時和點亮三個小燈的設計,現在發現計時和點亮小燈沒法同時實現.
遇到的問題如下:
1.假如我把led_display程序發在while語句最后一行,會發生數碼管前五位會隨著小燈一起閃爍顯示。
2.假如我把led_display程序發在while語句第一行,會發生數碼管前五位不顯示。
所以我想請教這個led_display語句應該發在哪里比較好。
下面附上程序+原理仿真圖:
12.jpg (244.3 KB, 下載次數: 35)
下載附件
仿真圖
2018-6-10 00:03 上傳
單片機程序:
- #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( ); //顯示時間
- }
- }
復制代碼
|