找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1861|回复: 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 单片机教程网

快速回复 返回顶部 返回列表