请选择 进入手机版 | 继续访问电脑版

普中开源电子分享网

 找回密码
 立即注册
搜索
查看: 5004|回复: 7

中断干扰,请大家看看,求指导,到处放关总中断都不行。

 关闭 [复制链接]

13

主题

152

帖子

669

积分

高级会员

Rank: 4

积分
669
发表于 2017-2-16 18:23:16 | 显示全部楼层 |阅读模式
本帖最后由 NH6496 于 2017-2-17 08:01 编辑

普中2.0板,将8个数码管分2个倒计时器。
全部灯灭后片,p2,0有闪烁干扰,将中断调快闪烁也加快。

/**************************************************************************************
*                                                                                                                               *
实现现象:倒计时1不到0,P2,6亮        。 倒计时1到0,P2,6灭;
          倒计时2接着倒计时 ,P2,0亮。倒计时2到0 ,P2,0也灭   。                                                                                                                                                   
***************************************************************************************/

#include "reg52.h"                         //此文件中定义了单片机的一些特殊功能寄存器

typedef unsigned int uint;          //对数据类型进行声明定义
typedef unsigned char u8;
int s=5,m=0,sa=6,ma=0;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
sbit OUTa=P2^0;
sbit OUT=P2^6;
           uint a[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0到9



uint sg,ss,mg,ms,sga,ssa,mga,msa,flaga=0,flagb=0;

/*******************************************************************************
* 函 数 名         : delay
* 函数功能                   : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(uint i)
{
        while(i--);        
}

/***************************************************
动态置LEDCOM口低电平
**********************/
  void DigDisplay()

{
                u8 i;
                    sg=s%10;
                    ss=s/10;
                    mg=m%10;
                    ms=m/10;
                           sga=sa%10;
                    ssa=sa/10;
                    mga=ma%10;
                    msa=ma/10;
                         for(i=0;i<8;i++)
                         {        
               switch(i)         //位选,选择点亮的数码管,
                {
                        case(0):
                                LSA=0;LSB=0;LSC=0;   P0=a[sg]; break;//显示第0位
                        case(1):
                                LSA=1;LSB=0;LSC=0;  P0=a[ss]; break;//显示第1位
                        case(2):
                                LSA=0;LSB=1;LSC=0;   P0=a[mg]; break;//显示第2位
                        case(3):
                                LSA=1;LSB=1;LSC=0;   P0=a[ms];break;//显示第3位
                        case(4):
                                LSA=0;LSB=0;LSC=1;  P0=a[sga]; break;//显示第4位
                        case(5):
                                LSA=1;LSB=0;LSC=1;  P0=a[ssa];break;//显示第5位
                        case(6):
                                LSA=0;LSB=1;LSC=1;  P0=a[mga];; break;//显示第6位
                        case(7):
                                LSA=1;LSB=1;LSC=1;   P0=a[msa]; break;//显示第7位        
                }

                delay(11); //间隔一段时间扫描        
                P0=0x00;//消隐
        }
}

/*******************************************************************************
* 函 数 名         : Timer1Init
* 函数功能                   : 定时器1初始化
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void Timer1Init()
{        
        TMOD=0X10;//选择为定时器1模式,工作方式1,仅用TR1打开启动。
        ET1=1;//打开定时器1中断允许
        EA=1;//打开总中断
        TR1=1;//打开定时器                        
}
/*******************************************************************************
* 函 数 名         : void Timer1() interrupt 3
* 函数功能                   : 定时器1中断函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void Timer1() interrupt 3
{
        static uint i;
            TH1=0Xfc;        //给定时器赋初值,定时1ms
            TL1=0X00;
            i++;
   if((s||m)!=0)
        {
           if(i==1000)
        {
          {
                  i=0;
          s--;
                  }
         if(s<=-1&&(m!=0))
        {
          s=59;
          m--;
                }

              }


        }
  else
        {
          if(i==1000)
        {
          {
                  i=0;
          sa--;
                  }
         if(sa<=-1&&(ma!=0))
        {
          sa=59;
          ma--;
                }
        else{ ma-=0; if(ma<=-1) { ma=0; flagb=1; }}
              }
        else{ sa-=0; if(sa<=-1) { sa=0; flaga=1; }}
          if(flaga==1&&flagb==1) EA=0;

        }         
}
/*******************************************************************************
* 函 数 名       : main
* 函数功能                 : 主函数
* 输    入       : 无
* 输    出             : 无
*******************************************************************************/
void main()
{            
        while(1)

        {
               
        DigDisplay();
        Timer1Init();  //定时器1初始化
                if(flaga==1&&flagb==1) EA=0;
           OUTa=1;
                  if((s||m)==0)
           {
                        OUT=1;
                        if((sa||ma)!=0)
                    OUTa=0;
                   }
        else{OUT=0;OUTa=1;}
          if((sa||ma)==0)  
            {OUTa=1;}
         if((sa||ma)==0)
                  
          EA=0;//关总中断

            }        


1056128144@QQ.COM
回复

使用道具 举报

42

主题

563

帖子

1907

积分

金牌会员

Rank: 6Rank: 6

积分
1907
发表于 2017-2-17 07:55:49 | 显示全部楼层
你想实现什么功能?为什么要操作EA呢?不都是操作TR 吗
回复 支持 反对

使用道具 举报

13

主题

152

帖子

669

积分

高级会员

Rank: 4

积分
669
 楼主| 发表于 2017-2-17 08:06:35 | 显示全部楼层
本帖最后由 NH6496 于 2017-2-21 15:10 编辑
大瓶子凌凌漆 发表于 2017-2-17 07:55
你想实现什么功能?为什么要操作EA呢?不都是操作TR 吗

按时开关小灯,找到思路了。操作TR昨天有问题,今天再来。
1056128144@QQ.COM
回复 支持 反对

使用道具 举报

20

主题

1343

帖子

8339

积分

论坛元老

Rank: 8Rank: 8

积分
8339
发表于 2017-2-17 10:46:12 | 显示全部楼层

怎么解决问题的啊,交流一下嘛!
回复 支持 反对

使用道具 举报

42

主题

563

帖子

1907

积分

金牌会员

Rank: 6Rank: 6

积分
1907
发表于 2017-2-17 11:17:01 | 显示全部楼层

恭喜,搞定就好
回复 支持 反对

使用道具 举报

13

主题

152

帖子

669

积分

高级会员

Rank: 4

积分
669
 楼主| 发表于 2017-2-17 11:44:49 | 显示全部楼层
HC6800-ES-V2.0 发表于 2017-2-17 10:46
怎么解决问题的啊,交流一下嘛!

自个神经病,漏了1句。今天早上的思路是main里全为0不允许开中断,现在不用了。
1056128144@QQ.COM
回复 支持 反对

使用道具 举报

13

主题

152

帖子

669

积分

高级会员

Rank: 4

积分
669
 楼主| 发表于 2017-2-17 11:52:35 | 显示全部楼层
本帖最后由 NH6496 于 2017-2-17 14:26 编辑
大瓶子凌凌漆 发表于 2017-2-17 07:55
你想实现什么功能?为什么要操作EA呢?不都是操作TR 吗

也能操作TR,现关ET,不影响另一个定时器。
1056128144@QQ.COM
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

Archiver|手机版|小黑屋|普中开源电子分享网 粤ICP备16123577号-2

GMT+8, 2024-3-29 02:37 , Processed in 0.085707 second(s), 30 queries .

Powered by 论坛搭建 X3.4

Copyright © 2001-2021, Tencent Cloud.

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