找回密码
 立即注册

QQ登录

只需一步,快速开始

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

按郭天祥视频写的单片机程序,在执行中断时,主函数没有停止运行,数码管还在动

[复制链接]
跳转到指定楼层
楼主
按照郭天祥的单片机学习视频照着编了个程序,发现程序在执行中断时,主函数还在运行。程序所设计的就是当P3.2接地时产生中断,且中断程序使得p1.0所接的灯亮。但当我做的时候p3.2没接地时,没有发生中断,系统正常运行。用杜邦线将P3.2接地,使得EI0为1,发生中断,此时杜邦线没有拔下,发现p1.0所接的灯亮,但是数码管却还在循环变动,只是速度较中断发生前有所减慢。把杜邦线拔掉后,灯灭且数码光正常运行。按理说中断程序还在执行时,主函数不应该停止吗?数码光不应该停在某个数字不变吗?求大神解答疑惑,万分感激。具体代码如下。并附上相关图片。
1.插杜邦线前

2.插杜邦线后(p3.2接地)(问题就在这,为什么数码光还在移动,主程序还在运行)


3.拔杜邦线后



4.单片机代码如下

文本文档和uv2.rar (1.34 KB, 下载次数: 3)

#include<reg52.h>
sbit dula=P2^6;
sbit wela=P2^7;
sbit D0=P1^0;
#define uchar unsigned char
#define uint unsigned int
uchar num;
uchar code table[]=
{0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void Delay(uint);
void main(void)
{

        EA=1;
        EX0=1;
        wela=1;
        P0=0x00;
        wela=0;
        while(1)
                {        
                        for(num=0;num<16;++num)
                                {
               D0=1;
                                        dula=1;
                                        P0=table[num];
                                        dula=0;
                                        Delay(1000);
                                }               
                        
                }        

}
void Delay(uint i)
{
        uchar j;
        for(i;i>0;i--)
                {
                for(j=1000;j>0;j--)
                        {

                        }
      }
}
void exter0(void) interrupt 0
{
        D0=0;
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:584814 发表于 2020-3-31 22:53 | 只看该作者
把while(1)删除或拔电就可以不跑了

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

板凳
ID:201555 发表于 2020-4-1 07:00 | 只看该作者
中断发生,执行中断程序,执行完返回到主程序,接着执行中断发生点后的程序。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

地板
ID:718222 发表于 2020-4-3 11:36 | 只看该作者
man1234567 发表于 2020-3-31 22:53
把while(1)删除或拔电就可以不跑了

我也知道啊
回复

使用道具 举报

5#
ID:718222 发表于 2020-4-3 11:36 | 只看该作者
www12www 发表于 2020-4-1 07:00
中断发生,执行中断程序,执行完返回到主程序,接着执行中断发生点后的程序。

是 原理是这样 可我的程序执行时 没按这个原理运行 不知道哪里出现问题了
回复

使用道具 举报

6#
ID:704561 发表于 2020-4-3 22:09 | 只看该作者
但是数码管却还在循环变动,只是速度较中断发生前有所减慢.
应该是在反复的进出中断.你的中断函数里面就一条语句.执行完就退出了.
进入中断并不是你一直按下去就一直中断.一般只是下降沿触发中断.
另外,你可以在中断里加一个延时函数效果会明显一些.

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

7#
ID:718222 发表于 2020-4-5 13:19 | 只看该作者
silvanesw 发表于 2020-4-3 22:09
但是数码管却还在循环变动,只是速度较中断发生前有所减慢.
应该是在反复的进出中断.你的中断函数里面就一 ...

感谢 这样就解决了 厉害啊 我的大神
回复

使用道具 举报

8#
ID:798201 发表于 2021-1-10 13:13 | 只看该作者
本帖最后由 zwf33 于 2021-1-10 18:26 编辑

51外部中断有两种方式
低电平触发 IT0=0  (检测到引脚为低电平就触发 )  
下降沿触发IT0=1     (测到引脚从高到低下降时就触发)

你的程序是下降沿触发的,中断点亮d1又回到了断点位置执行主程序

增加IT0=0,中断程再加延时delay(200),P3.2一直保持低电平,数码管就不走了


#include <REGX52.H>
typedef unsigned char uchar;
typedef unsigned int  uint;
sbit wela=P2^7;
sbit dula=P2^6;
void delay(uint z);
sbit d1=P1^0;
uchar code table[]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                     0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
                    };       //数码管编码表

uchar num;                                      //定义num数据类型
void main()

{
//********************外部中断0,电平触发中断********************//
    EA=1;                                                                                                      //打开总中断
    EX0=1;                                                                                                        //开外部中断0
    IT0=0;                                                                                                        //电平触发
//********************外部中断0,电平触发中断********************//


//********************打开位选********************//
    wela=1;
    P0=0xc0;
    wela=0;
//********************打开位选********************//
    while(1)
    {
        d1=1;
        for(num=0; num<16; num++)                //unmp赋初值,判断自加
        {
            dula=1;                //打开段选
            P0=table[num];                        //table等于自加后的num值
            dula=0;
            delay(50);
        }
    }
}

void delay(uint z)         //延时子程序
{
    uint x,y;
    for(x=z; x>0; x--)
    {
        for(y=110; y>0; y--);
    }
}

//********************中断程序********************//
void  exter0() interrupt 0            //中断函数不用声明
{

        d1=0;
        delay(200);                                   
}
//********************中断程序********************//


评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

9#
ID:474802 发表于 2021-1-10 15:09 | 只看该作者
哈哈,还记得刚刚工作的时候,眼里总是盯着低电平高电平,看时序图只看高低,然而很多芯片使用的时候都是边沿触发的,整半天才明白。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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