找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 184|回复: 5
打印 上一主题 下一主题
收起左侧

单片机延时的时候中断不起作用?

[复制链接]
跳转到指定楼层
楼主
ID:1076567 发表于 2024-5-20 15:11 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
单片机用的是stc15f104w,在主程序的时候中断可以起作用,能够控制led的亮灭,但是在延时的时候中断就不起作用,无法跳出延时,只能等延时结束才可以关闭led,但是不知道哪里错了,难道是在延时的时候不能执行中断吗,有没有大佬帮忙看看
#include <STC15.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char

        sbit s1 = P3^3;
        sbit k1 = P3^2;
        sbit k2 = P3^1;
        sbit k3 = P3^0;
        sbit led = P3^5;
        bit  seyFlag=0;

  void DELAY_s (unsigned int t)
         {
            unsigned int a,b,c,d;
            while ( --t != 0&&seyFlag == 0 )
                    {


                                for (a=0;a<=60000;a++);
                                for (b=0;b<=60000;b++);
                                for (c=0;c<=60000;c++);
                                for (d=0;d<=60000;d++);

                       }
       }


  void DELAY_MS (unsigned int t)
         {
             unsigned int a;
             while ( --t != 0 )   
                 {                                
                    for (a=0;a<=600;a++);
                 }
         }


        void Int1_Routine(void) interrupt 2
                        {
                          seyFlag=1; //s1按下执行中断
                        }

        void main()
        {
                        IT1 = 1;
                        EX1 = 1;
                        EA = 1;
           
                while(1)
                {
                  if(seyFlag        ==        1)
                        {        
                              DELAY_MS(10);
                              led= !led;
                               seyFlag = 0;
                                if (k1==0)
                           {
                                 if (k2==1)
                                        {
                                                if (k3==1)
                                                 {
                                                         DELAY_s(5);
                                                         led=!led;  //k1键拨下的时候
                                                        }
                                                
                                                else if(k3==0)
                                            {
                                                        DELAY_s(10);
                                                         led=!led;//k1、k3键拨下的时候
                                                        }
                                       
                                        }
                                }
                        }
                }
        }
后面给我们总工看了说是延时函数里的标志位没有置0,延时之后会重新进主函数里又取反一次,后面加了置0就可以了,但是用这个时间不太准确
            void DELAY_5s(int t)
                {
                        unsigned long int a,b,c,d;
                        a=60000*t;
                        b=60000*t;
                        c=60000*t;
                        d=60000*t;
                        while(1)
                        {
                                a--;
                                b--;
                                c--;
                                d--;
                                if(d==0)
                                {
                                led        = !led;
                                  return;
                                }
                                if(seyFlag==1)
                                {
                                        led        = !led;
                                        seyFlag        =        0;
                                        return;
                                }
                        }
                }



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1076567 发表于 2024-5-21 09:20 | 显示全部楼层
本帖最后由 Dokkis 于 2024-5-21 10:32 编辑
qq475878026 发表于 2024-5-20 18:30
你的while(1)循环一次就要15秒,进中断只控制变量seyFlag=1;那你在15秒内进中断后,只能等下一次循环才能 ...

但是它不是要判断按键按下才会进循环的吗,而且我把seyFlag置0了,它不会一直循环的。之前按网上的例程写过定时器,但是不起作用,因为不是很懂定时器的原理,就没改,这个又比较急,所以先用这个代替一下,之后会重新学习的,感谢
回复

使用道具 举报

板凳
ID:1076567 发表于 2024-5-21 09:26 | 显示全部楼层
xiaobendan001 发表于 2024-5-20 18:42
当进入delay_s时,即使你中断里面seyflag=1,也不能if(seyflag==1)啊。必须后面的delay都完成,主循环再次 ...

我后面也把那个延时改了一下,让它每次都判断seyFlag是否等于1,中断完了之后不是会返回还没结束的延时吗,然后延时循环一轮后就会判断seyFlag是否等于1,等于1就跳出来了,然后给我们工程师看了说是延时循环里的seyFlag没置0,改了之后就可以了,感谢
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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