找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4818|回復: 5
收起左側

51單片機如何用定時中斷代替延時

[復制鏈接]
ID:765181 發(fā)表于 2020-5-30 17:30 | 顯示全部樓層 |閱讀模式
//用計數器統(tǒng)計的數量,用定時器在數碼管上顯示數量,用外部中斷清空
//師傅的意思是想讓我們把顯示函數丟到中斷里邊好從delay中解脫出來,可樓主太菜了,悟不到555
#include<reg51.h>
#include<stdio.h>
unsigned char dis;
//sbit relay = P1^0;
unsigned char code nondis[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//0-9
//延時
void delay(unsigned int n)
{
        unsigned int i=0,j=0;
for(i=0;i<n;i++)
        {
        for(j=0;j<120;j++);
        }
}
//顯示函數
        void display()
        {
        unsigned char gewei,shiwei,baiwei;
//        num1=256-TL0;
//        num=9-num1;
        baiwei=TL0/100;
        gewei=TL0%10;
        shiwei=(TL0/10)%10;
        P2=nondis[gewei];//個位
        P0=0x80;
        delay(10);
        P2=0xff;
        P2=nondis[shiwei];//十位
        P0=0x40;
        delay(10);
        P2=0xff;
        P2=nondis[baiwei];//百位
        P0=0x20;
        delay(10);
        P2=0xff;
        }
                       
                        void main(void)
                        {
                                        P0=0x80;
                                        EA = 1;
                                        ET0 = 1;
                                        EX0 = 1;
                                        IT0 = 1;
                                        ET0 = 0;
                                        TMOD = 0x06;
                                        TH0 = 0;//9
                                        TL0 = 0;//9
                                        TR0 = 1;
                                while(1)
                                {
                        display();//顯示函數
                                }
                        }

void int0() interrupt 0        // 清空
                        {
                        TL0 = 0 ;
                        }

//void counter1() interrupt 1
//{
//        relay = ~relay;
//}

回復

使用道具 舉報

ID:765181 發(fā)表于 2020-5-30 17:33 | 顯示全部樓層
這是仿真的圖哥哥們

圖是這樣一個開關按一下加一,一個清空

圖是這樣一個開關按一下加一,一個清空
回復

使用道具 舉報

ID:765181 發(fā)表于 2020-5-30 18:41 | 顯示全部樓層
//按普中的視頻改了改不知道行不行
#include<reg51.h>
#include<stdio.h>
unsigned char dis;
//sbit relay = P1^0;
unsigned char code nondis[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//0-9

                //定時器1初始化
                void timerinit()
                {
                TMOD|=0X10;
                TH1=0xFC;
                TL1=0x18;
                ET1=1;
                EA=1;
                TR1=1;
                }
                       
                        void main(void)
                        {
                                        P0=0x80;
                                        EA = 1;
                                        ET0 = 1;
                                        EX0 = 1;
                                        IT0 = 1;
                                        ET0 = 0;
                                        TMOD = 0x06;
                                        TH0 = 0;//9
                                        TL0 = 0;//9
                                        TR0 = 1;
                        timerinit();
                                while(1);
                       
                        }

void int0() interrupt 0        // 清空
                        {
                        TL0 = 0 ;
                        }

//void counter1() interrupt 1
//{
//        relay = ~relay;
//}
void Time1() interrupt 3        // 清空
                        {
                        static unsigned short i;
                        unsigned char gewei,shiwei,baiwei;
                          
                                baiwei=TL0/100;
                                gewei=TL0%10;
                                shiwei=(TL0/10)%10;
                       
                        TH1=0xFC;
                        TL1=0x18;
                        i++;
                        if(i==10)
                        {
                          
                                  P2=0xff;       
                          P2=nondis[gewei];//個位
                          P0=0x80;

                        }
                                                if(i==20)
                        {
                          
                                  P2=0xff;
                          P2=nondis[shiwei];//十位
                                P0=0x40;

                        }
                                                if(i==30)
                        {         i=0;
                                P2=0xff;
                                  P2=nondis[baiwei];//百位
                                P0=0x20;

                        }
                        }

回復

使用道具 舉報

ID:162664 發(fā)表于 2020-5-30 22:07 | 顯示全部樓層
很久項目不用io口掃數碼管了。有點不知道怎么說。
簡單說:
1:io口掃描數碼管要注意是掃描的時間間隔。
滿足掃描間隔的前提下,如果主循環(huán)里有ALU占用時間過長的函數,那么數碼管掃描的程序放到中斷里掃描來滿足掃描時間的間隔。(假設在突發(fā)情況下,一個模擬iic的流程可能會占用5ms時間,那么,有可能就會因為這個導致數碼管亮度異常或者閃爍)
2:看了一眼程序,改進的程序中放在中斷中的程序已經把每一位的掃描分時出來了。如果時序沒問題是可以的。修改意見:定時器的時間注釋出來;if 改成 siwtch 語句(我覺得相對直觀);電路有問題,一般不這么設計,至于為什么自己去看看三極管一般怎么用。
回復

使用道具 舉報

ID:213173 發(fā)表于 2020-5-30 22:43 | 顯示全部樓層

沒有必要把顯示程序放在中斷,稍微改一下即可不用delay。 無標題.jpg

  1. #include<reg51.h>
  2. #include<stdio.h>
  3. unsigned char i;
  4. //sbit relay = P1^0;
  5. unsigned char code nondis[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//0-9
  6. //延時
  7. /*
  8. void delay(unsigned int n)
  9. {
  10.         unsigned int i=0,j=0;
  11.         for(i=0;i<n;i++)
  12.                 for(j=0;j<120;j++);
  13. }*/
  14. //顯示函數
  15. void display()
  16. {
  17.         P2=0xff;//消隱
  18.         if(i==0)
  19.         {
  20.                 P0=0x20;
  21.                 P2=nondis[TL0/100%10];//百位
  22.         }
  23.         if(i==1)
  24.         {
  25.                 P0=0x40;
  26.                 P2=nondis[TL0/10%10];//十位
  27.         }
  28.         if(i==2)
  29.         {
  30.                 P2=nondis[TL0%10];//個位
  31.                 P0=0x80;
  32.         }
  33.         i++;
  34.         i%=3;
  35. }

  36. void main(void)
  37. {
  38. //        P0=0x80;
  39.         TMOD = 0x06;
  40.         TH0 = 0;//9
  41.         TL0 = 0;//9
  42.         TR0 = 1;
  43.         EA = 1;
  44. //        ET0 = 1;
  45.         EX0 = 1;
  46.         IT0 = 1;
  47.         ET0 = 0;
  48.         while(1)
  49.         {
  50.                 display();//顯示函數
  51.         }
  52. }

  53. void int0() interrupt 0 // 清空
  54. {
  55.         TL0=0;
  56. }

  57. //void counter1() interrupt 1
  58. //{
  59. //        relay = ~relay;
  60. //}

復制代碼



回復

使用道具 舉報

ID:765181 發(fā)表于 2020-5-31 19:06 | 顯示全部樓層
gxslxxm 發(fā)表于 2020-5-30 22:07
很久項目不用io口掃數碼管了。有點不知道怎么說。
簡單說:
1:io口掃描數碼管要注意是掃描的時間間隔。
...

謝謝您的回復,我另一個pwm可調占空比的程序數碼管確實有閃爍。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表