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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2062|回復: 8
打印 上一主題 下一主題
收起左側

51單片機定時器內無法調用數碼管子程序嗎?

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

#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit wei=P2^7;//位選,第幾個數碼管亮
sbit duan=P2^6;
sbit D1=P1^1;
uint xianshu,shi,ge,bai,qian,wan;
uint aa,s,bb;
uchar y;
uchar code smb[]={  //數碼表
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);//調用顯示子程序

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

                }
        }
}

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

}

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

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

void timer1() interrupt 3 //定時器1中斷服務程序
{
        TH1=(65536-5072)/256;//進入定時器服務函數后,需要重新裝入初值
        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)//數碼管顯示子程序
{
        if(s==65000)//最大65535
        {
                s=0;//數碼管顯示清零
        }
        xianshu=s;//讓數碼管顯示脈沖s的數量

        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;//進中斷數清零
                        while(y<=10);//延時
                        P0=0xff;   //消影

                }       
        if(s>=1000)
                {
                        wei=1;
                        P0=0xfb;
                        wei=0;
               
               
                        duan=1;
                        P0=smb[qian];
                        duan=0;               
                        y=0;//進中斷數清零
                        while(y<=10);//延時
                        P0=0xff;   //消影
                }
       
        if(s>=100)
                {
                        wei=1;
                        P0=0xf7;
                        wei=0;
               
                        duan=1;
                        P0=smb[bai];
                        duan=0;               
                        y=0;//進
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:1055885 發表于 2023-2-16 22:14 來自觸屏版 | 只看該作者
用的單片機為89c52rc
回復

使用道具 舉報

板凳
ID:86926 發表于 2023-2-17 08:15 | 只看該作者
注意定時器優先級問題,y在T1,顯示在T0,T0內while循環y,T1不能中斷T0,所以y一直是0跑不下去了
回復

使用道具 舉報

地板
ID:459275 發表于 2023-2-17 08:30 | 只看該作者
TMOD=0x01;    ???
回復

使用道具 舉報

5#
ID:213173 發表于 2023-2-17 09:05 | 只看該作者

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

  1. #include <reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. sbit wei=P2^7;//位選,第幾個數碼管亮
  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[]={  //數碼表
  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);//調用顯示子程序
  26.                 if(aa<125)//定時器進入125次中斷
  27.                 {
  28.                         D1=0;
  29.                 }
  30.                 else D1=1;

  31.                 if(aa>=250)//定時器進入250次中斷
  32.                 {
  33.                         aa=0;
  34.                         s++;//數碼管顯示的數字
  35.                 }
  36.                 if(s==65000)//最大65535
  37.                 {
  38.                         s=0;//數碼管顯示清零
  39.                 }
  40. //                xianshu=s;//讓數碼管顯示脈沖s的數量       
  41.                 buf[0]=smb[s/10000%10];//按10進制數位分解
  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;//全局中斷總開關
  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允許中斷開關
  59. //        TH1=(65536-5072)/256;//裝入初值
  60. //        TL1=(65536-5072)%256;
  61. //        TR1=1;//打開定時器1
  62. //        ET1=1;//定時器0允許中斷開關
  63. }

  64. void timer0() interrupt 1 //定時器0中斷服務程序
  65. {
  66.         TH0=(65536-3686)/256;//裝入初值4ms
  67.         TL0=(65536-3686)%256;
  68.         xshu();//調用數碼管子程序
  69.         aa++;
  70. }
  71. /*
  72. void timer1() interrupt 3 //定時器1中斷服務程序
  73. {
  74.         TH1=(65536-5072)/256;//進入定時器服務函數后,需要重新裝入初值
  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()//數碼管顯示子程序
  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次中斷循環計數
  101.                 y=0;
  102. }
復制代碼
回復

使用道具 舉報

6#
ID:1055885 發表于 2023-2-17 10:10 來自觸屏版 | 只看該作者
nj周宏達 發表于 2023-2-17 08:30
TMOD=0x01;    ???

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

使用道具 舉報

7#
ID:1055885 發表于 2023-2-17 10:13 來自觸屏版 | 只看該作者
藍魄 發表于 2023-2-17 08:15
注意定時器優先級問題,y在T1,顯示在T0,T0內while循環y,T1不能中斷T0,所以y一直是0跑不下去了

如果都放在T1,可行嗎,因為T0要放其他更優先的程序
回復

使用道具 舉報

8#
ID:1055885 發表于 2023-2-17 10:13 來自觸屏版 | 只看該作者
wulin 發表于 2023-2-17 09:05
只要掌握時間和邏輯關系,顯示函數放在那里都可以。給你改了你試試。

感謝,晚上回去試試
回復

使用道具 舉報

9#
ID:1034262 發表于 2023-2-17 16:20 | 只看該作者
先在中斷里取反一個IO確定中斷已正常。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久久精彩视频 | 国产精品国产三级国产aⅴ浪潮 | 欧美精品片| 五月激情婷婷在线 | 久久综合九色综合欧美狠狠 | 国产精品久久久久久亚洲调教 | 亚洲一区二区三区福利 | www.97zyz.com| 韩国精品一区二区三区 | 国产91在线 | 亚洲 | 欧美日韩精品久久久免费观看 | 国产精品久久久久久52avav | 国产视频1区 | 中文视频在线 | 欧美性一区二区三区 | 麻豆91av| 国产一区久久久 | 日韩视频专区 | 国产乱码精品1区2区3区 | 免费av播放 | 午夜一区 | 成人影院网站ww555久久精品 | 精品久久99 | 一区二区三区免费网站 | 日韩免费视频一区二区 | 免费a级毛片在线播放 | 国产1区在线 | 三级黄片毛片 | 在线四虎 | 久久久久久久久综合 | 黑人精品欧美一区二区蜜桃 | 一区二区三区高清不卡 | 正在播放国产精品 | 人人九九精| 成人免费视频网站在线看 | 欧美国产免费 | 国产免费拔擦拔擦8x高清 | 毛片网在线观看 | 精品亚洲一区二区 | 亚洲91精品| 巨大黑人极品videos精品 |