找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2095|回復(fù): 8
收起左側(cè)

51單片機(jī)定時器內(nèi)無法調(diào)用數(shù)碼管子程序嗎?

[復(fù)制鏈接]
ID:1055885 發(fā)表于 2023-2-16 22:00 來自觸屏版 | 顯示全部樓層 |閱讀模式
數(shù)碼管延時我用的定時器1,程序是每隔一秒數(shù)碼管加一,LED亮滅一次,如果在主程序內(nèi)調(diào)用數(shù)碼管就能正常工作,放到任意一個定時器內(nèi)調(diào)用都不行,有沒有大神能解解惑,或者我想讓數(shù)碼管全程顯示,后期主程序內(nèi)會有其他循環(huán)程序,如果一次次調(diào)用太麻煩,有沒有什么別的辦法讓數(shù)碼管全程顯示而不影響主程序的方法?(文化水平不高,代碼編的有點菜,望見諒)

#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit wei=P2^7;//位選,第幾個數(shù)碼管亮
sbit duan=P2^6;
sbit D1=P1^1;
uint xianshu,shi,ge,bai,qian,wan;
uint aa,s,bb;
uchar y;
uchar code smb[]={  //數(shù)碼表
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void xshu(uint ge,uint shi,uint bai,uint qian,uint wan);
void delay(uint);//延時子程序聲明
void chushi();//初始化子程序聲明
void main()
{
        chushi();
delay(10);
        while(1)
        {
//                xshu(ge,shi,bai,qian,wan);//調(diào)用顯示子程序

                if(aa>=10)//定時器進(jìn)入10次中斷
                {
                        D1=1;
                        if(aa>=19)//定時器進(jìn)入19次中斷
                        {
                                D1=0;//點亮LED
                                aa=0;//定時器進(jìn)入中斷數(shù)清零
                                s++;//數(shù)碼管顯示的數(shù)字
                        }

                }
        }
}

void chushi()//初始化子程序
{
        xianshu=0;
        TMOD=0x01;
        EA=1;//全局中斷總開關(guān)
        TH0=(65536-46072)/256;//裝入初值
        TL0=(65536-46072)%256;
        TR0=1;//打開定時器0
        ET0=1;//定時器0允許中斷開關(guān)
        TH1=(65536-5072)/256;//裝入初值
        TL1=(65536-5072)%256;
        TR1=1;//打開定時器1
        ET1=1;//定時器0允許中斷開關(guān)

}

void timer0() interrupt 1 //定時器0中斷服務(wù)程序
{
        TH0=(65536-46072)/256;//進(jìn)入定時器服務(wù)函數(shù)后,需要重新裝入初值
        TL0=(65536-46072)%256;
        aa++;

                xshu(ge,shi,bai,qian,wan);//調(diào)用數(shù)碼管子程序
}

void timer1() interrupt 3 //定時器1中斷服務(wù)程序
{
        TH1=(65536-5072)/256;//進(jìn)入定時器服務(wù)函數(shù)后,需要重新裝入初值
        TL1=(65536-5072)%256;
        y++;

}

void Delay(uint z)
{
        uint x,y;
        for(x=z;x>0;x--)
        for(y=110;y>0;y--);
}

void xshu(uint ge,uint shi,uint bai,uint qian,uint wan)//數(shù)碼管顯示子程序
{
        if(s==65000)//最大65535
        {
                s=0;//數(shù)碼管顯示清零
        }
        xianshu=s;//讓數(shù)碼管顯示脈沖s的數(shù)量

        wan=xianshu/10000;
        qian=xianshu%10000/1000;
        bai=xianshu%10000%1000/100;
        shi=xianshu%10000%1000%100/10;
        ge=xianshu%10;

        if(s>=10000)
                {
                        wei=1;
                        P0=0xfd;
                        wei=0;
               
                        duan=1;
                        P0=smb[wan];
                        duan=0;       
                        y=0;//進(jìn)中斷數(shù)清零
                        while(y<=10);//延時
                        P0=0xff;   //消影

                }       
        if(s>=1000)
                {
                        wei=1;
                        P0=0xfb;
                        wei=0;
               
               
                        duan=1;
                        P0=smb[qian];
                        duan=0;               
                        y=0;//進(jìn)中斷數(shù)清零
                        while(y<=10);//延時
                        P0=0xff;   //消影
                }
       
        if(s>=100)
                {
                        wei=1;
                        P0=0xf7;
                        wei=0;
               
                        duan=1;
                        P0=smb[bai];
                        duan=0;               
                        y=0;//進(jìn)
回復(fù)

使用道具 舉報

ID:1034262 發(fā)表于 2023-2-17 16:20 | 顯示全部樓層
先在中斷里取反一個IO確定中斷已正常。
回復(fù)

使用道具 舉報

ID:1055885 發(fā)表于 2023-2-17 10:13 來自觸屏版 | 顯示全部樓層
wulin 發(fā)表于 2023-2-17 09:05
只要掌握時間和邏輯關(guān)系,顯示函數(shù)放在那里都可以。給你改了你試試。

感謝,晚上回去試試
回復(fù)

使用道具 舉報

ID:1055885 發(fā)表于 2023-2-17 10:13 來自觸屏版 | 顯示全部樓層
藍(lán)魄 發(fā)表于 2023-2-17 08:15
注意定時器優(yōu)先級問題,y在T1,顯示在T0,T0內(nèi)while循環(huán)y,T1不能中斷T0,所以y一直是0跑不下去了

如果都放在T1,可行嗎,因為T0要放其他更優(yōu)先的程序
回復(fù)

使用道具 舉報

ID:1055885 發(fā)表于 2023-2-17 10:10 來自觸屏版 | 顯示全部樓層
nj周宏達(dá) 發(fā)表于 2023-2-17 08:30
TMOD=0x01;    ???

這個本來是單定時器的,臨時改成雙定時器,忘了改,不過改了也還是不顯示
回復(fù)

使用道具 舉報

ID:213173 發(fā)表于 2023-2-17 09:05 | 顯示全部樓層

只要掌握時間和邏輯關(guān)系,顯示函數(shù)放在那里都可以。給你改了你試試。

  1. #include <reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. sbit wei=P2^7;//位選,第幾個數(shù)碼管亮
  5. sbit duan=P2^6;
  6. sbit D1=P1^1;
  7. //uint xianshu,shi,ge,bai,qian,wan;
  8. uint aa,s,bb;
  9. uchar y;
  10. uchar code smb[]={  //數(shù)碼表
  11. 0x3f,0x06,0x5b,0x4f,
  12. 0x66,0x6d,0x7d,0x07,
  13. 0x7f,0x6f,0x77,0x7c,
  14. 0x39,0x5e,0x79,0x71};
  15. uchar data buf[5];

  16. void xshu();
  17. void delay(uint);//延時子程序聲明
  18. void chushi();//初始化子程序聲明
  19. void main()
  20. {
  21.         chushi();
  22.         delay(10);
  23.         while(1)
  24.         {
  25.                 //xshu(ge,shi,bai,qian,wan);//調(diào)用顯示子程序
  26.                 if(aa<125)//定時器進(jìn)入125次中斷
  27.                 {
  28.                         D1=0;
  29.                 }
  30.                 else D1=1;

  31.                 if(aa>=250)//定時器進(jìn)入250次中斷
  32.                 {
  33.                         aa=0;
  34.                         s++;//數(shù)碼管顯示的數(shù)字
  35.                 }
  36.                 if(s==65000)//最大65535
  37.                 {
  38.                         s=0;//數(shù)碼管顯示清零
  39.                 }
  40. //                xianshu=s;//讓數(shù)碼管顯示脈沖s的數(shù)量       
  41.                 buf[0]=smb[s/10000%10];//按10進(jìn)制數(shù)位分解
  42.                 buf[1]=smb[s/1000%10];
  43.                 buf[2]=smb[s/100%10];
  44.                 buf[3]=smb[s/10%10];
  45.                 buf[4]=smb[s%10];       
  46.         }
  47. }

  48. void chushi()//初始化子程序
  49. {
  50. //        xianshu=0;
  51.         TMOD=0x01;
  52.         EA=1;//全局中斷總開關(guān)
  53. //        TH0=(65536-46072)/256;//裝入初值
  54. //        TL0=(65536-46072)%256;
  55.         TH0=(65536-3686)/256;//裝入初值4ms
  56.         TL0=(65536-3686)%256;
  57.         TR0=1;//打開定時器0
  58.         ET0=1;//定時器0允許中斷開關(guān)
  59. //        TH1=(65536-5072)/256;//裝入初值
  60. //        TL1=(65536-5072)%256;
  61. //        TR1=1;//打開定時器1
  62. //        ET1=1;//定時器0允許中斷開關(guān)
  63. }

  64. void timer0() interrupt 1 //定時器0中斷服務(wù)程序
  65. {
  66.         TH0=(65536-3686)/256;//裝入初值4ms
  67.         TL0=(65536-3686)%256;
  68.         xshu();//調(diào)用數(shù)碼管子程序
  69.         aa++;
  70. }
  71. /*
  72. void timer1() interrupt 3 //定時器1中斷服務(wù)程序
  73. {
  74.         TH1=(65536-5072)/256;//進(jìn)入定時器服務(wù)函數(shù)后,需要重新裝入初值
  75.         TL1=(65536-5072)%256;
  76.         y++;
  77. }
  78. */
  79. void Delay(uint z)
  80. {
  81.         uint x,y;
  82.         for(x=z;x>0;x--)
  83.         for(y=110;y>0;y--);
  84. }

  85. void xshu()//數(shù)碼管顯示子程序
  86. {
  87.         duan=1;
  88.         P0=0x00;//段消隱
  89.         duan=0;      
  90.        
  91.         wei=1;
  92.         P0=~(0x01<<y);//傳送位碼
  93.         wei=0;
  94.        
  95.         duan=1;
  96.         P0=buf[y];//傳送段碼
  97.         duan=0;      
  98.             
  99.         y++;
  100.         if(y==5)//5次中斷循環(huán)計數(shù)
  101.                 y=0;
  102. }
復(fù)制代碼
回復(fù)

使用道具 舉報

ID:459275 發(fā)表于 2023-2-17 08:30 | 顯示全部樓層
TMOD=0x01;    ???
回復(fù)

使用道具 舉報

ID:86926 發(fā)表于 2023-2-17 08:15 | 顯示全部樓層
注意定時器優(yōu)先級問題,y在T1,顯示在T0,T0內(nèi)while循環(huán)y,T1不能中斷T0,所以y一直是0跑不下去了
回復(fù)

使用道具 舉報

ID:1055885 發(fā)表于 2023-2-16 22:14 來自觸屏版 | 顯示全部樓層
用的單片機(jī)為89c52rc
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表