AT89C51

websmy 2010-03-17 12:06:45
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit LED = P0^0;

void mian()
{
LED = 1;
EA =1;
EX0 = 1;
TCON = 0x01; //高电平到低电平跳变
while(1);
}

void External_Interrupt_0() interrupt 0
{
LED = ~LED;
}

运行此程序后,LED 总是循环闪,是什么原因啊?有个开关连的INT0管脚,但我并有按下那个开关啊。
...全文
163 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
anchorite27 2010-03-21
  • 打赏
  • 举报
回复
楼上诸位已经讲了很多。从硬件角度,考察按键的质量或者周围环境的强干扰。从软件角度,先对中断作下降沿设置再打开中断,并在中断服务中开关中断或者使中断标志清零(外部中断0是硬件清零),以避免其他中断的嵌套。具体如下:
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit LED = P0^0;

void main()
{
LED = 1;
TCON = 0x01; //高电平到低电平跳变
EA =1;
EX0 = 1;
while(1);
}

void External_Interrupt_0() interrupt 0
{
EA=0;
LED = ~LED;
EA=1;
}
祝顺利~
pcvvv 2010-03-21
  • 打赏
  • 举报
回复
再来分析为什么会“LED 总是循环闪”。
如果楼主把程序下载到单片机了就会发现其实根本看不到闪的。
pcvvv 2010-03-21
  • 打赏
  • 举报
回复
暴汗
楼主你在编译连接程序时编译器没有提示你程序有错误吗???

引用
*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
SEGMENT: ?PR?MIAN?TEXT1

有警告怎么不仔细看看
你的main函数哪里去了----写成mian
空影 2010-03-20
  • 打赏
  • 举报
回复
同意楼上,必须在中断服务程序开头关闭中断,执行完在打开,避免错误的中断嵌套
用户 昵称 2010-03-20
  • 打赏
  • 举报
回复
void External_Interrupt_0() interrupt 0
{
EA = 0;
LED = ~LED;
// 再循环3000次
EA = 1;
}
宇帆 2010-03-20
  • 打赏
  • 举报
回复
一般写中断程序的时候 是先设置中断寄存器,最后在打开中断的


TCON = 0x01; //高电平到低电平跳变

EX0 = 1;

EA =1;
宇帆 2010-03-20
  • 打赏
  • 举报
回复
查一下INT0管脚的电平状态
tcdzyq 2010-03-19
  • 打赏
  • 举报
回复
同意5楼和6楼的说法,还有开关之后进INT0要做默认电平处理。
cy330206 2010-03-17
  • 打赏
  • 举报
回复
楼主直接用个万用表打打试试
kyzf 2010-03-17
  • 打赏
  • 举报
回复
楼主 有示波器吗?

测试下51单片机的复位管教是否在波动?

楼主用的是C51?不带看门狗?

另外你测试下INT0管脚对应的波形
kangyonghui 2010-03-17
  • 打赏
  • 举报
回复
看看,不懂
空影 2010-03-17
  • 打赏
  • 举报
回复
我觉得应该是int0被某些外部条件不断的触发了
空影 2010-03-17
  • 打赏
  • 举报
回复
楼主用手一直按下那个接int0的引脚的开关,看看是什么反应
embedwang 2010-03-17
  • 打赏
  • 举报
回复
是不是一直在重新启动啊~,写个while (1)看看,要不就是看门狗~
lbing7 2010-03-17
  • 打赏
  • 举报
回复
LZ你的程序写进芯片了吗?

确定?

27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧