找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2572|回复: 5
收起左侧

51单片机外部中断0和1控制流水灯的状态保存和进行

[复制链接]
回帖奖励 5 黑币 回复本帖可获得 5 黑币奖励! 每人限 1 次
ID:900875 发表于 2022-5-5 22:09 | 显示全部楼层 |阅读模式
  想法是使用两个外部中断嵌套,外部中断0使流水灯先向左滚动,当外部中断1触发的时候储存此时流水灯的状态,然后外部中断1向右滚动。
  但是对于状态的保存有些迷茫,在外部中断0保存的状态不能被外部中断1读取。

单片机源程序如下:
#include "reg52.h"               
#include <intrins.h>        
#define led P1

typedef unsigned int u16;        
typedef unsigned char u8;

void delayms(u8 ms)
  {
     u8 i;
     while(ms--)
     for(i=0;i<123;i++);
  }
        
void Int()
{            
  PX1 = 1;                                                     
}



void Int0() interrupt 0
{
         u16 i;
         u8 saveled;
          led=0xfe;
                for(i=0;i<16;i++)
        {        

                delayms(100);
                led=_cror_(led,1);
                saveled=led;
        }
        
}

void Int1()        interrupt 2               
{  
          u16 i;
          u8 saveled;
          led=saveled;
          for(i=0;i<16;i++)
          {
                 delayms(200);
           led=_crol_(led,1);
          }   
}

void main()
{
Int();        
Int0Init();
Int1Init();
while(1)
{
         led=0x00;
         delayms(200);
         led=~led;
         delayms(200);
}
}
回复

使用道具 举报

ID:99525 发表于 2022-5-6 01:32 | 显示全部楼层
saveled在主程序里定义
回复

使用道具 举报

ID:213173 发表于 2022-5-6 08:51 | 显示全部楼层
1.这个程序只能完成LED闪烁,不能左右流水,因为外部中断0、1都没有开启。
2.这种外部中断用法也不是嵌套。
3.LED当前状态无需另外保存,P1本身就是存储器。
4.Int0Init();Int1Init();缺少函数体。
5.中断优先等级设置在此无意义。
  1. #include "reg52.h"               
  2. #include <intrins.h>        
  3. #define led P1

  4. typedef unsigned int u16;        
  5. typedef unsigned char u8;

  6. u8 t=0;

  7. void delayms(u8 ms)
  8. {
  9.         u8 i;
  10.         while(ms--)
  11.         for(i=0;i<123;i++);
  12. }

  13. void main()
  14. {
  15.         IT0 = 1;
  16.         EX0 = 1;
  17.         IT1 = 1;
  18.         EX1 = 1;
  19.         EA = 1;
  20.         while(1)
  21.         {
  22.                 if(t==0)
  23.                         led=~led;
  24.                 if(t==1)
  25.                         led=_cror_(led,1);
  26.                 if(t==2)
  27.                         led=_crol_(led,1);
  28.                 delayms(200);
  29.         }
  30. }
  31. void Int0() interrupt 0
  32. {
  33.         if(led==0x00||led==0xff)
  34.                 led=0xfe;
  35.         t=1;
  36. }

  37. void Int1() interrupt 2               
  38. {  
  39.         if(led==0x00||led==0xff)
  40.                 led=0xfe;
  41.         t=2;   
  42. }
复制代码
回复

使用道具 举报

ID:525068 发表于 2022-5-6 16:51 | 显示全部楼层
看样子好像只调用了中断程序,但是没有开启中断
回复

使用道具 举报

ID:900875 发表于 2022-5-7 00:04 | 显示全部楼层
wulin 发表于 2022-5-6 08:51
1.这个程序只能完成LED闪烁,不能左右流水,因为外部中断0、1都没有开启。
2.这种外部中断用法也不是嵌套 ...

理解了! 谢谢
回复

使用道具 举报

ID:1040201 发表于 2022-8-17 10:34 | 显示全部楼层
要多看看寄存器的手册。要复用成别的外设,要自己设置,EX0  外部中断0的使能  ,IT0 外部中断0的触发方式
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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