找回密码
 立即注册

QQ登录

只需一步,快速开始

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

搞不懂单片机外部中断 也查了资料 感觉还是找不到错误

[复制链接]
跳转到指定楼层
楼主
#include<reg52.h>
#include<intrins.h>
#define uchar  unsigned char
#define uint unsigned int
sbit flag=P3^2;//外部中断信号产生脚
sbit key=P3^0;//控制flag产生下降沿
sbit led=P2^0;

void delay(int a){
int x,y;
for(x=0;x<=a;x++)
for(y=110;y>=0.;y--);
}
/*  void le(void)
{          int a        ;
          while(1){
         P1=0x01;
for(a=0;a<8;a++){
   P1=_cror_(P1,1);
   delay(20);}} //led循环
} */



//外部中断0初始化
void intlInit(void)
{


IT0=1; //  外部中断0下降沿触发
IE=0;  //清除标志位
EX0=1; // 开外部中断
EA=1;  //开总中断
}


//主函数
void main(){
        void  intlInit(void);         
           
        if(key==0)
        {                delay(1);
                 if(key==0)//P3^0脚         
             {
                  flag=1;           //P3^2脚
                   flag=0;//外部产生下降沿
                }
           } else flag=1;
                        
}
        // 外部中断0中服务程序
void int1(void) interrupt 0
{
         led=~led;
        P1=0x00;
                  delay(20);
}

51hei图片20200528203854.png (41.64 KB, 下载次数: 22)

51hei图片20200528203854.png

51hei图片20200528203858.png (41.09 KB, 下载次数: 15)

51hei图片20200528203858.png
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:753266 发表于 2020-5-29 00:33 | 只看该作者
在main()函数结尾加个while(1);
把中断函数名改成void exint0() interrupt 0  
试一下。
回复

使用道具 举报

板凳
ID:235200 发表于 2020-5-29 00:43 | 只看该作者
问题未描述清楚,flag与KEY在程序中定义引脚P32和P30,不知为何要这么定义
回复

使用道具 举报

地板
ID:213173 发表于 2020-5-29 06:05 | 只看该作者
楼主犯了两个错误。1.程序结构错误:main函数初始化后必须限制在主循环while(1)中运行,哪怕没有如何任务也得在while(1)中死循环。2.外部中断理解错误:所谓外部中断必须是单片机外部信号作用于IN0(IN1),由软件置flag=1; flag=0;不会触发IN0中断。
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #define uchar  unsigned char
  4. #define uint unsigned int
  5. sbit flag=P3^2;//外部中断信号产生脚
  6. sbit key=P3^0;//控制flag产生下降沿
  7. sbit led=P2^0;

  8. //外部中断0初始化
  9. void intlInit(void)
  10. {
  11.         IT0=1; //  外部中断0下降沿触发
  12.         IE=0;  //清除标志位
  13.         EX0=1; // 开外部中断
  14.         EA=1;  //开总中断
  15. }
  16. //主函数
  17. void main()
  18. {
  19.         intlInit();         
  20.         while(1)
  21.         {

  22.         }
  23. }
  24. // 外部中断0中服务程序
  25. void int1(void) interrupt 0
  26. {
  27.         led=~led;
  28. }
复制代码
回复

使用道具 举报

5#
ID:341098 发表于 2020-5-29 12:44 | 只看该作者
wulin 发表于 2020-5-29 06:05
楼主犯了两个错误。1.程序结构错误:main函数初始化后必须限制在主循环while(1)中运行,哪怕没有如何任务也 ...

赞同楼上
回复

使用道具 举报

6#
ID:737694 发表于 2020-5-29 13:12 | 只看该作者
csmyldl 发表于 2020-5-29 00:43
问题未描述清楚,flag与KEY在程序中定义引脚P32和P30,不知为何要这么定义

想通过按键来控制中断
回复

使用道具 举报

7#
ID:737694 发表于 2020-5-29 13:16 | 只看该作者
wulin 发表于 2020-5-29 06:05
楼主犯了两个错误。1.程序结构错误:main函数初始化后必须限制在主循环while(1)中运行,哪怕没有如何任务也 ...

加过while后 还是不行 我先通过按P3^0按键发现没用 然后我又直接按P3^2想产生跳变沿 还是没反应 懵逼了
回复

使用道具 举报

8#
ID:737694 发表于 2020-5-29 13:17 | 只看该作者
273431377 发表于 2020-5-29 00:33
在main()函数结尾加个while(1);
把中断函数名改成void exint0() interrupt 0  
试一下。

应该加个while 不过这和名字没啥关系吧
回复

使用道具 举报

9#
ID:213173 发表于 2020-5-29 16:11 | 只看该作者
雪峰1259 发表于 2020-5-29 13:16
加过while后 还是不行 我先通过按P3^0按键发现没用 然后我又直接按P3^2想产生跳变沿 还是没反应 懵逼了[e ...

程序都给你改好了你还玩不转,无语了。
回复

使用道具 举报

10#
ID:737694 发表于 2020-5-29 21:43 | 只看该作者
wulin 发表于 2020-5-29 16:11
程序都给你改好了你还玩不转,无语了。

额 我是想通过P3^0按键来产生这个中断
回复

使用道具 举报

11#
ID:67199 发表于 2020-5-29 22:55 | 只看该作者
雪峰1259 发表于 2020-5-29 21:43
额 我是想通过P3^0按键来产生这个中断

外部中断INT0与INT1,在 P3.2 P3.3口上,按P3.0不能产生外中断。
回复

使用道具 举报

12#
ID:737694 发表于 2020-5-30 17:29 | 只看该作者
lyxing 发表于 2020-5-29 22:55
外部中断INT0与INT1,在 P3.2 P3.3口上,按P3.0不能产生外中断。

我知道那两个脚 我网上查的也可以通过别的i/o口来控制P3^2 P3^3的高低电位 触发不就是有下降沿么 别的可以控制他的高低电位  咋就不可以等效那两个脚呢
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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