找回密码
 立即注册

QQ登录

只需一步,快速开始

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

用按键控制LED按顺序循环点亮。按键用的是外部中断功能,触发方式为边沿触发

[复制链接]
跳转到指定楼层
楼主
ID:162360 发表于 2017-1-24 22:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<reg52.h>
void delay(unsigned int t) //0-65535
{
while(--t);
}
void main()
{
    unsigned char q;//0-255
    while(1)
        {
        P1=0xfe;//1111 1110    初始化   点亮第一个灯  该语句必须放在循环内部,否则只能让每个灯亮一次,不能循环,因为没有循环初始化
     for(q=0;q<8;q++)
         {
          delay(50000);
          P1<<=1;
          P1=P1|0X01; //0000 0001        这条语句用于使上一个LED灯熄灭
         }
        }
}


(proteus仿真:用按键控制LED按顺序循环点亮。按键用的是外部中断功能,触发方式为边沿触发)
请教一下这个程序应该如何补充。我只能做到循环点亮,做不到外部中断边沿触发这个功能。按键接的是P3.2口外部中断功能。


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:149988 发表于 2017-1-25 10:20 | 只看该作者

RE: 用按键控制LED按顺序循环点亮。按键用的是外部中断功能,触发方式为边沿触发

利用外部第一个中断启动,利用外部第二个中断停止。没有上机实验。
#include<reg52.h>
unsigned char i=0;
void delay(unsigned int t) //0-65535
{
while(--t);
}
void main()
{
  unsigned char q;
  IT0=1;       //下降沿触发
  EX0=1;       //INT0中断允许
  IT1=1;       //下降沿触发
  EX1=1;
  EA=1;        //总中断允许
  while(i==1)
  {
    P1=0xfe;//1111 1110,初始化点亮第一个灯,该语句必须放在循环内部,否则只能让每个灯亮一次,不能循环,因为没有循环初始化
    for(q=0;q<8;q++)
    {
      delay(50000);
      P1<<=1;
      P1=P1|0X01; //0000 0001,这条语句用于使上一个LED灯熄灭
    }
  }
}
/*INT0中断服务函数*/
void Interrupt1(void)interrupt 0 using 1
{  
  EX0=0;   //进入外部INT0中断关闭,防止误操作
  i=1;
  delay(20);
  EX0=1;   //中断函数结束,外部INT0中断打开,中断生效   
}
/*INT1中断服务函数*/
void Interrupt2(void)interrupt 2 using 2
{  
  EX1=0;   //进入外部INT0中断关闭,防止误操作
  i=0;
  delay(20);
  EX1=1;   //中断函数结束,外部INT0中断打开,中断生效   
}
回复

使用道具 举报

板凳
ID:162360 发表于 2017-1-25 14:53 | 只看该作者
不倒翁.WZT 发表于 2017-1-25 10:20
利用外部第一个中断启动,利用外部第二个中断停止。没有上机实验。
#include
unsigned char i=0;

好的   我试试    谢谢
回复

使用道具 举报

地板
ID:162360 发表于 2017-1-25 14:59 | 只看该作者
不倒翁.WZT 发表于 2017-1-25 10:20
利用外部第一个中断启动,利用外部第二个中断停止。没有上机实验。
#include
unsigned char i=0;

所有的LED都没有亮起来
回复

使用道具 举报

5#
ID:149988 发表于 2017-1-26 08:53 | 只看该作者

RE: 用按键控制LED按顺序循环点亮。按键用的是外部中断功能,触发方式为边沿触发

天才鱼yhx 发表于 2017-1-25 14:59
所有的LED都没有亮起来

看来用负边沿触发是不行的,只能用低电平触发。请看修改后的程序,以上机调试过。
#include<reg52.h>
unsigned char i=0;
void delay(unsigned int t) //0-65535
{
  while(--t);
}
void main()
{
  unsigned char q;
  IT0=0;       //低电平触发
  EX0=1;       //INT0中断允许
  IT1=0;       //低电平触发
  EX1=1;
  EA=1;        //总中断允许
  while(i==1)
  {
    P1=0xfe;//1111 1110,初始化点亮第一个灯,该语句必须放在循环内部,否则只能让每个灯亮一次,不能循环,因为没有循环初始化
    for(q=0;q<8;q++)
    {
      delay(50000);
      P1<<=1;
      P1=P1|0X01; //0000 0001,这条语句用于使上一个LED灯熄灭
    }
  }
}
/*INT0中断服务函数*/
void Zong1(void)interrupt 0 using 1
{  
  EX0=0;   //进入外部INT0中断关闭,防止误操作
  i=1;
  delay(20);
  EX0=1;   //中断函数结束,外部INT0中断打开,中断生效   
}
/*INT1中断服务函数*/
void Zong2(void)interrupt 2 using 2
{  
  EX1=0;   //进入外部INT0中断关闭,防止误操作
  i=0;
  delay(20);
  EX1=1;   //中断函数结束,外部INT0中断打开,中断生效   
}
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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