找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

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

查看数: 2944 | 评论数: 8 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2020-3-31 21:16

正文摘要:

按照郭天祥的单片机学习视频照着编了个程序,发现程序在执行中断时,主函数还在运行。程序所设计的就是当P3.2接地时产生中断,且中断程序使得p1.0所接的灯亮。但当我做的时候p3.2没接地时,没有发生中断,系统正常运 ...

回复

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

评分

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

查看全部评分

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 回帖助人的奖励!

查看全部评分

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

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

评分

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

查看全部评分

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

是 原理是这样 可我的程序执行时 没按这个原理运行 不知道哪里出现问题了
ID:718222 发表于 2020-4-3 11:36
man1234567 发表于 2020-3-31 22:53
把while(1)删除或拔电就可以不跑了

我也知道啊
ID:201555 发表于 2020-4-1 07:00
中断发生,执行中断程序,执行完返回到主程序,接着执行中断发生点后的程序。

评分

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

查看全部评分

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

评分

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

查看全部评分

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

Powered by 单片机教程网

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