找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2145|回复: 3
收起左侧

51单片机关于外部中断0的一个程序

[复制链接]
ID:683345 发表于 2020-1-17 23:57 | 显示全部楼层 |阅读模式
一个很简单的中断程序,就是数码管0-7循环动态显示,利用外部中断0使小灯点亮,但是接线之后小灯不亮是什么原因(已经排除接线原因),不知道程序哪里出了问题..
#include<reg52.h>

typedef unsigned char u8;
typedef unsigned int u16;

sbit LED=P1^0;

sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;

u16 k;

u8 table[]={0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
            0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};

void delay(u16 i)
{
   while(i--);
}   

void main()
{
   EA=1;
   EX0=1;
   IT0=0;
      for(k=0;k<8;k++)
      {
         switch(k)
         {
            case 0:LSA=0;LSB=0;LSC=0;break;
            case 1:LSA=1;LSB=0;LSC=0;break;
            case 2:LSA=0;LSB=1;LSC=0;break;
            case 3:LSA=1;LSB=1;LSC=0;break;
            case 4:LSA=0;LSB=0;LSC=1;break;
            case 5:LSA=1;LSB=0;LSC=1;break;
            case 6:LSA=0;LSB=1;LSC=1;break;
            case 7:LSA=1;LSB=1;LSC=1;break;
         }
         P0=table[k];              //动态数码管是共阴的
         delay(1000000);
         P0=0x00;         //对P0进行清零,否则第二个数码管会有第一个数码管的重影
      }
}

void Init0() interrupt 0
{
   LED=0;
}

回复

使用道具 举报

ID:97023 发表于 2020-1-18 01:23 | 显示全部楼层
电路图都没有怎么分析呢?
不知道你的LED接法,文字上也没说明LED哪端接地,无法分析。
回复

使用道具 举报

ID:213173 发表于 2020-1-18 07:16 | 显示全部楼层
1.楼主程序没有约束在主循环中运行,加while(1)。
2.外部中断要采用IT0=1;//下降沿触发。
3.错误使用延时函数:delay(1000000);
修改如下:
  1. #include<reg52.h>

  2. typedef unsigned char u8;
  3. typedef unsigned int u16;

  4. sbit LED=P1^0;

  5. sbit LSA=P2^2;
  6. sbit LSB=P2^3;
  7. sbit LSC=P2^4;

  8. u8 k;
  9. u8 table[]={0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
  10.             0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};

  11. void delay(u16 i)
  12. {
  13.    while(i--);
  14. }   

  15. void main()
  16. {
  17.         EA=1;
  18.         EX0=1;
  19.         IT0=1;//下降沿触发
  20.         while(1)
  21.         {
  22.                 P0=0x00;         //消隐
  23.                 switch(k)
  24.                 {
  25.                         case 0:LSA=0;LSB=0;LSC=0;break;
  26.                         case 1:LSA=1;LSB=0;LSC=0;break;
  27.                         case 2:LSA=0;LSB=1;LSC=0;break;
  28.                         case 3:LSA=1;LSB=1;LSC=0;break;
  29.                         case 4:LSA=0;LSB=0;LSC=1;break;
  30.                         case 5:LSA=1;LSB=0;LSC=1;break;
  31.                         case 6:LSA=0;LSB=1;LSC=1;break;
  32.                         case 7:LSA=1;LSB=1;LSC=1;break;
  33.                 }
  34.                 P0=table[k];//动态数码管是共阴的
  35.                 k++;
  36.                 k%=8;
  37.                 delay(110);//延时1ms
  38.         }
  39. }

  40. void Init0() interrupt 0
  41. {
  42.    LED=~LED;//取反
  43. }
复制代码
回复

使用道具 举报

ID:680894 发表于 2020-1-18 09:32 | 显示全部楼层
建议初学者敲代码前一定看懂别人的代码,不要一上手就想着自己就来敲,然后敲不出不就跑来问,这种学习方式是不妥的。一个新的东西肯定有他的知识点,不去了解掌握你怎么凭空想的出来?学东西开始都是先模仿别人,再熟练,到融会惯通......
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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