久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標(biāo)題: 單片機(jī)計時和點亮燈的功能沒法同時發(fā)生 [打印本頁]

作者: 蔬木果    時間: 2018-6-10 00:03
標(biāo)題: 單片機(jī)計時和點亮燈的功能沒法同時發(fā)生
這是我自己設(shè)計的計時和點亮三個小燈的設(shè)計,現(xiàn)在發(fā)現(xiàn)計時和點亮小燈沒法同時實現(xiàn).
遇到的問題如下:
1.假如我把led_display程序發(fā)在while語句最后一行,會發(fā)生數(shù)碼管前五位會隨著小燈一起閃爍顯示。
2.假如我把led_display程序發(fā)在while語句第一行,會發(fā)生數(shù)碼管前五位不顯示。
所以我想請教這個led_display語句應(yīng)該發(fā)在哪里比較好。

下面附上程序+原理仿真圖:


單片機(jī)程序:
  1. #include<reg51.h>
  2. #include<absacc.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int

  5. uchar code dispcode[ ]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00};   /*七段共陰管顯示定義*/

  6. uchar seconde=0;   /*定義并初始化變量*/
  7. uchar minite=0;
  8. uchar hour=0;
  9. uchar mstcnt=0;

  10. /*函數(shù)聲明*/
  11. void delay(uchar k );             //延時子程序
  12. void time_pro( );          //時間處理子程序
  13. void display( );           //顯示子程序
  14. void keyscan( );           //鍵盤掃描子程序
  15. void led_display( );           // led閃爍程序

  16. /*****************************/
  17. /*led燈閃爍程序*/
  18. /****************************/
  19. void led_display(void)
  20. {
  21. delay(50);           //led燈閃爍三次后熄滅
  22. P2=0x07;       //賦初始值
  23. delay(50);
  24. P2=0x00;
  25. delay(50);
  26. P2=0x07;
  27. delay(50);
  28. P2=0x00;
  29. delay(50);
  30. P2=0x07;
  31. delay(50);
  32. P2=0x00;  
  33. }

  34. /*****************************/
  35. /*延時子程序*/
  36. /****************************/
  37. void delay (uchar k)
  38. {
  39. uchar j;
  40. while((k--)!=0)
  41.    {
  42.     for(j=0;j<125;j++)
  43.      {;}
  44.    }
  45. }

  46. /**************************/
  47. /*時間處理子程序*/
  48. /**************************/
  49. void time_pro( void)
  50. {
  51.         if(seconde==60)                  //秒鐘設(shè)為60進(jìn)制
  52.           { seconde=0;
  53.             minite++;
  54.            if( minite==60)              //分鐘設(shè)為60進(jìn)制
  55.               { minite=0;
  56.                 hour++;
  57.               if(hour==24)              //時鐘設(shè)為24進(jìn)制
  58.                  {hour=0; }
  59.               }
  60.           }
  61. }

  62. /*****************************/
  63. /* 顯示子程序*/
  64. /*****************************/
  65. void display(void)
  66. {
  67.         P1=0xfe;
  68.         P0=dispcode[hour/10];                 //顯示小時的十位
  69.         //delay(10);
  70.         P1=0xfd;
  71.         P0=(dispcode[(hour%10)])|0X80;        //顯示小時的個位
  72.         //delay(4);
  73.         P1=0xfb;
  74.         P0=dispcode[minite/10];               //顯示分的十位
  75.         //delay(4);
  76.         P1=0xf7;
  77.         P0=(dispcode[minite%10])|0X80;        //顯示分的個位
  78.        // delay(4);
  79.         P1=0xef;
  80.         P0=dispcode[seconde/10];             //顯示秒的十位
  81.        // delay(4);
  82.         P1=0xdf;
  83.         P0=dispcode[seconde%10];             //顯示秒的個位
  84.        // delay(4);
  85. }

  86. void timer0(void) interrupt 1 using 0     //定時器0方式1,50ms中斷一次
  87.     {
  88.      TH0=0x3c;
  89.      TMOD = 0x11;
  90.      mstcnt++;
  91.       if(mstcnt==20)
  92.         {
  93.             seconde++;
  94.             mstcnt=0;   
  95.         }               
  96. }
  97. /**************************/
  98. /*主函數(shù)*/
  99. /**************************/
  100. void main(void)
  101. {   

  102.     P1=0xff;                //初始化p1口,全設(shè)為1
  103.       
  104.     TMOD = 0x11;            //time0為定時器,方式1
  105.     TH0=0x3c;               //預(yù)置計數(shù)初值
  106.     TL0=0xb0;
  107.     EA=1;
  108.     ET0=1;
  109.     TR0=1;
  110.     while (1)
  111.       {      
  112.             led_display( );         //led燈閃爍
  113.         time_pro( );   //時間處理
  114.         display( );    //顯示時間
  115.                 }
  116. }
復(fù)制代碼



作者: wulin    時間: 2018-6-10 06:43
因為你使用delay處理兩個程序,就會產(chǎn)生互相干擾。你把數(shù)碼管動態(tài)顯示放在中斷里,中斷時間改為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;

/*函數(shù)聲明*/
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)                  //秒鐘設(shè)為60進(jìn)制
        {
                seconde=0;
                minite++;
                if(minite==60)              //分鐘設(shè)為60進(jìn)制
                {
                        minite=0;
                        hour++;
                        if(hour==24)              //時鐘設(shè)為24進(jìn)制       
                        {
                                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;
        }
}


/**************************/
/*主函數(shù)*/
/**************************/
void main(void)
{   
        P1=0xff;                //初始化p1口,全設(shè)為1  
        TMOD=0x01;            //time0為定時器,方式1
        TH0=0xfc;               //預(yù)置計數(shù)初值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;               //重置計數(shù)初值1ms
        TL0=0x18;
        mstcnt++;
        if(mstcnt>=1000)
        {
                seconde++;
                mstcnt=0;   
        }               
        display( );    //顯示時間
}




作者: 向日葵男人    時間: 2018-6-10 14:58
放在中斷里試試,弄個標(biāo)志位,應(yīng)該可以
作者: 蔬木果    時間: 2018-6-10 18:53
wulin 發(fā)表于 2018-6-10 06:43
因為你使用delay處理兩個程序,就會產(chǎn)生互相干擾。你把數(shù)碼管動態(tài)顯示放在中斷里,中斷時間改為1ms就不會互 ...

問題解決了,謝謝解答。




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 久久久久国产 | 久久精品中文字幕 | 国产精品视频久久 | 日本黄色不卡视频 | 精品视频免费 | 欧美精品一区二区三区在线播放 | 老司机午夜性大片 | 欧美综合久久 | 国产99热精品 | 精品99在线| 欧美激情国产精品 | 日韩欧美在线一区 | 国产女人叫床高潮大片免费 | 91精品国产乱码久久久久久久久 | 久久久国产网站 | 亚洲成人精品久久 | 99久久99| 一区二区三区视频在线观看 | 日韩不卡三区 | 韩日精品视频 | www.久久精品 | 欧美久久久 | 亚洲国产欧美国产综合一区 | 一区二区三区高清 | 午夜成人免费视频 | 国产人成精品一区二区三 | 天天操夜夜爽 | av网站在线看 | 日本在线免费观看 | 精品自拍视频 | 亚洲欧美中文日韩在线v日本 | 亚洲激情网站 | 国产精品自拍啪啪 | 成人av免费在线观看 | 欧美日韩高清一区 | 欧美激情在线观看一区二区三区 | 爱爱免费视频 | www.久草| 亚洲a视频| 成人教育av | www.国产精|