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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

請問一下有關單片機定時器中斷的程序問題

[復制鏈接]
跳轉到指定樓層
樓主
設計想法是用數碼管來顯示計時,然后時間到了15s則改變流水燈的顯示方式,但是現在兩個定時中斷寫下去,數碼管一直在閃爍,不能穩定顯示,似乎是跟隨這led的頻率閃爍的,有設置中斷優先級但沒作用,是哪個地方的程序問題?望指點,謝謝
單片機源程序如下:
  1. #include<stc.h>
  2. #define unc unsigned char
  3. bit ldelay=0;
  4. bit lldelay=0;
  5. sbit key1=P1^3;
  6. sbit key2=P1^4;
  7. unc t=0,j=0;
  8. unc i=0;

  9. unsigned int count=0;
  10. unsigned char time[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};/*0,1,2,3,4,5,6,7,8,9*/
  11. unsigned char led[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

  12. void delay(unsigned int time)
  13. {
  14.     unsigned char hs=0;
  15.     for(;time>0;time--)
  16.         for(;hs<120;hs++);
  17.         }

  18. void main()
  19. {

  20.     TMOD=0x11;
  21.     TH0=0X3C;
  22.     TL0=0XB0;
  23.     TH1=0X3D;
  24.     TL1=0XB1;
  25.     EA=1;
  26.     ET0=1;
  27.     ET1=1;
  28.     PT0=1;
  29.     TR1=1;   
  30.     TR0=1;
  31.    
  32.     while(1) {
  33.         if(ldelay==1)
  34.         {


  35.         P0=time[count/10];
  36.         key1=0;
  37.         delay(10);
  38.         key1=1;
  39.         P0=time[count%10];
  40.         key2=0;
  41.         delay(10);
  42.         key2=1;
  43.         }
  44.           }      }
  45. time_fuck() interrupt 1
  46. {//    TR0=0;
  47.     t++;
  48.     if(t==20){
  49.         t=0;
  50.         ldelay=1;
  51.         count++;

  52.         if(count==16)
  53.         {
  54.             count=0;
  55.         }
  56.     }
  57.     TH0=0X3c;
  58.     TL0=0Xb0;
  59.     TR0=1;
  60. }
  61. time_Q() interrupt 3 {
  62.     TR1=0;
  63.     j++;
  64.     while(1){
  65.     j++;
  66.     i++;
  67.     P2=led[i];
  68.     delay(500);
  69.     if(i==10)i=0;
  70.     if(j==250){
  71.         j=0;
  72.         break;
  73.         
  74.     }    }
  75.     TH1=0X3D;
  76.     TL1=0Xb1;
  77.     TR1=1;
  78. }
復制代碼

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:608920 發表于 2019-10-11 19:55 | 只看該作者
代碼已修改,已經能做到led和數碼管同時顯示,但是數碼管極其不穩定,跟隨led 1s/次的頻率閃爍


#include<stc.h>
#define unc unsigned char
bit ldelay=0;
bit lldelay=0;
sbit key1=P1^3;
sbit key2=P1^4;
unc t=0,j=0;
unc i=0;

unsigned int count=0;
unsigned char time[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};/*0,1,2,3,4,5,6,7,8,9*/
unsigned char led[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

void delay(unsigned int time)
{
        unsigned char hs=0;
        for(;time>0;time--)
                for(;hs<120;hs++);
                }

void main()
{

        TMOD=0x11;
        TH0=0X3C;
        TL0=0XB0;
        TH1=0X3D;
        TL1=0XB1;
        EA=1;
        ET0=1;
        ET1=1;
        PT0=1;
        TR1=1;       
        TR0=1;
       
        while(1) {
                if(ldelay==1)
                {


                P0=time[count/10];
                key1=0;
                delay(10);
                key1=1;
                P0=time[count%10];
                key2=0;
                delay(10);
                key2=1;
                }
                  }          }
time_fuck() interrupt 1
{//        TR0=0;
        t++;
        if(t==20){
                t=0;
                ldelay=1;
                count++;

                if(count==16)
                {
                        count=0;
                }
        }
        TH0=0X3c;
        TL0=0Xb0;
        TR0=1;
}
time_Q() interrupt 3 {
        TR1=0;
        j++;
        while(1){
        j++;
        i++;
        P2=led[i];
        delay(500);
        if(i==10)i=0;
        if(j==250){
                j=0;
                break;
               
        }        }
        TH1=0X3D;
        TL1=0Xb1;
        TR1=1;
}
回復

使用道具 舉報

板凳
ID:235200 發表于 2019-10-12 01:52 | 只看該作者
是幾位數碼管?如何連接的電路?
回復

使用道具 舉報

地板
ID:325223 發表于 2019-10-12 07:54 來自觸屏版 | 只看該作者
有定時器可以不用延時吧?設定一個全局變量a,假設0.5ms進一次中斷,對a進行計數,滿足時間則執行一段代碼。
回復

使用道具 舉報

5#
ID:622801 發表于 2019-10-12 11:53 | 只看該作者
1、中斷源 IE0/1 外部中斷0/1請求標志 IT0/1 外部中斷源0/1觸發方式控制 TF0/1 定時器T0/1溢出中斷標志 RI 串口的接收中斷 TI 串口的發送中斷 2、中斷時能控制 EA CPU中斷開放標志 ET0/1/2 定時器T0/1/2中斷允許位 ES 串口中斷允許位 EX0/1 外部中斷0/1允許位 3、中斷優先級控制 PT0/1/2 定時器T0/1/2中斷優先級控制 PS 串口中斷優先級控制 PX0/1 外部中斷0/1優先級控制
回復

使用道具 舉報

6#
ID:213173 發表于 2019-10-12 14:47 | 只看該作者
樓主犯了定時器中斷的幾乎所有的大忌:
1.一個定時器能解決的問題不用兩個。
2.中斷是打一槍留個標記就跑,絕不停留,任務放在主循環運行。
3.中斷中絕不可以使用超過中斷周期的延時和循環。
給你把程序修改了一下,花樣流水燈自己補充擴展。


  1. #include <AT89X51.H>
  2. //#include<stc.h>
  3. #define unc unsigned char
  4. bit ldelay=0;
  5. bit lldelay=0;
  6. sbit key1=P1^3;
  7. sbit key2=P1^4;
  8. unc t=0,j=0,k;
  9. unc i=0;

  10. unsigned int  count=0;
  11. unsigned char time[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};/*0,1,2,3,4,5,6,7,8,9*/
  12. unsigned char led0[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
  13. unsigned char led1[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
  14. unsigned char led2[]={0x81,0x42,0x24,0x18,0x81,0x42,0x24,0x18};
  15. unsigned char led3[]={0x18,0x24,0x42,0x81,0x18,0x24,0x42,0x81};
  16. /*
  17. void delay(unsigned int time)
  18. {
  19.         unsigned char hs=0;
  20.         for(;time>0;time--)
  21.                 for(;hs<120;hs++);
  22. }*/
  23. void Timer0Init(void)//5毫秒@12.000MHz
  24. {
  25.         TMOD |= 0x01;                //設置定時器模式
  26.         TL0 = 0x78;                //設置定時初值
  27.         TH0 = 0xEC;                //設置定時初值
  28.         TF0 = 0;                //清除TF0標志
  29.         TR0 = 1;                //定時器0開始計時
  30.         EA=1;
  31.         ET0=1;
  32. }


  33. void main()
  34. {
  35.         Timer0Init();

  36.         while(1)
  37.         {
  38.                 if(t%2==0)
  39.                 {
  40.                         key1=0;
  41.                         P0=time[count/10];
  42.                         key2=1;
  43.                 }
  44.                 else
  45.                 {
  46.                         key2=0;
  47.                         P0=time[count%10];
  48.                         key1=1;
  49.                 }
  50.                 if(ldelay==1)
  51.                 {
  52.                         ldelay=0;       
  53.                         k++;
  54.                         if(k>=2)
  55.                         {
  56.                                 k=0;
  57.                                 count++;
  58.                                 if(count==16)
  59.                                 {
  60.                                         count=0;                               
  61.                                         j++;
  62.                                         if(j>=4)
  63.                                                 j=0;
  64.                                 }
  65.                         }
  66.                         if(j==0)
  67.                                 P2=led0[i];
  68.                         if(j==1)
  69.                                 P2=led1[i];
  70.                         if(j==2)
  71.                                 P2=led2[i];
  72.                         if(j==3)
  73.                                 P2=led3[i];
  74.                         i++;
  75.                         if(i>=8)
  76.                                 i=0;
  77.                 }
  78.         }      
  79. }
  80. time_fuck() interrupt 1
  81. {
  82.         TL0 = 0x78;                //設置定時初值
  83.         TH0 = 0xEC;                //設置定時初值
  84.         t++;
  85.         if(t>=100)                //0.5s
  86.         {
  87.                 t=0;
  88.                 ldelay=1;
  89.         }
  90. }
  91. /*
  92. time_Q() interrupt 3
  93. {
  94. //        TR1=0;
  95.         j++;
  96.         while(1)
  97.         {
  98.                 j++;
  99.                 i++;
  100.                 P2=led[i];
  101.                 delay(500);
  102.                 if(i==10)
  103.                         i=0;
  104.                 if(j==250)
  105.                 {
  106.                         j=0;
  107.                         break;
  108.                 }   
  109.         }
  110.         TH1=0X3D;
  111.         TL1=0Xb1;
  112. //        TR1=1;
  113. }*/
復制代碼




回復

使用道具 舉報

7#
ID:608920 發表于 2019-10-12 16:48 | 只看該作者
wulin 發表于 2019-10-12 14:47
樓主犯了定時器中斷的幾乎所有的大忌:
1.一個定時器能解決的問題不用兩個。
2.中斷是打一槍留個標記就跑 ...

用的是學校的書,里面只說明了原理,并沒有對層主所說的大忌進行過說明,謝謝!
然后我還有想問的,在層主所說的留個標記就跑,可以理解成閃爍燈一樣,瞬間作用然后結束作用這樣嗎?
回復

使用道具 舉報

8#
ID:608920 發表于 2019-10-12 18:42 | 只看該作者
wulin 發表于 2019-10-12 14:47
樓主犯了定時器中斷的幾乎所有的大忌:
1.一個定時器能解決的問題不用兩個。
2.中斷是打一槍留個標記就跑 ...

你好,我想再問一下,什么情況下才需要使用到多個中斷同時使用?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产一级片一区二区三区 | 久久精品二区亚洲w码 | 精品视频免费 | 91精品国产麻豆 | 日韩伦理一区二区 | 日韩一区二区三区四区五区 | 久久美女视频 | 亚洲欧美日韩精品久久亚洲区 | 精品国产一区二区三区久久久蜜月 | 亚洲欧美日韩精品久久亚洲区 | 国产线视频精品免费观看视频 | 国产精品视频免费看 | 欧美久久电影 | 婷婷成人在线 | 中文字幕欧美一区 | 亚洲成人精品一区二区 | 日韩精品一区在线观看 | 国产精品视频免费播放 | 在线观看中文字幕视频 | 亚洲国产日韩一区 | 精品精品 | 国产激情一区二区三区 | 九九精品在线 | 国产一区精品 | 日本精品视频一区二区 | 中文字幕在线三区 | 视频一区二区三区在线观看 | 免费一级片| 成人福利网站 | 亚洲黄色一区二区三区 | 91在线电影| 97福利在线 | 久久欧美精品 | 九九九视频 | 美女天堂在线 | 自拍偷拍亚洲一区 | 日本三级电影在线看 | 欧美性一区二区三区 | 日韩精品久久久久 | 中文字幕成人av | 国产成人高清 |