c52,触发int0就让P1.0输出的值反转,这样程序对吗?

[复制链接]
3503|6
 楼主| cqlouis 发表于 2008-4-14 23:40 | 显示全部楼层 |阅读模式
89C52的单片机,想每给int0一个触发,就让P1.0的输出反转一下。

下面是我写的程序,不知道有没有错误,请前辈们指教:


SETB EA   ;开放所有的中断
SETB EX0  ;打开外部中断0
SETB PX0  ;设置INT0最高优先级
CLR  IT0  ;电平触发方式,低电平有效

LOOP: SJMP $
      ORG   0003H
      AJMP  BRT0

BRT0: CPL P1.0          ;让P1.0口取反
      RETI

由于还没有搭建硬件电路,所以先问问前辈们,这个程序对不对?
我有个疑惑就是:在这个程序中,是不是应该加上中断请求的撤除呢?如果是,又应该怎么加入相关语句呢?


谢谢各位大哥了!
xhtxzxw 发表于 2008-4-15 02:58 | 显示全部楼层

嘿嘿

应该这样写:
      ORG 0000H
      LJMP  MAIN

      ORG   0003H   ;这一行不写也行,不过不建议不写,建议写
      AJMP  BRT0

MAIN: SETB EA   ;开放所有的中断
      SETB EX0  ;打开外部中断0
      SETB PX0  ;设置INT0最高优先级
      CLR  IT0  ;电平触发方式,低电平有效
LOOP: SJMP $

BRT0: CPL P1.0          ;让P1.0口取反
      RETI
只要你给那个INT0引脚一个低电平,P1.0就会“飞快的”来回反相产生方波,只有用示波器才可以看清楚,51如果使用12MHz的晶体的话,P1.0引脚上的方波频率大概快有100KHz吧?你甭想着给低电平它变一次,再给一次它再变一次,不可能的,因为你幽雅美丽高贵的手没那么快,不管你幽雅美丽高贵的手的动作以你的观点看来是如何的快捷,你给一次低电平的持续时间对于51来说都是极端漫长的!足够51在那个死循环和中断响应代码之间来来回回、来来回回、来来回回... ...,折腾上很多很多次。
把CLR  IT0改成SETB  IT0,边沿触发,就差不多了。
 楼主| cqlouis 发表于 2008-4-15 09:20 | 显示全部楼层

是因为没有撤除中断吗?

"只要你给那个INT0引脚一个低电平,P1.0就会“飞快的”来回反相产生方波,只有用示波器才可以看清楚,"
造成这样的原因是不是因为在响应中断过后没有撤除中断呢?是不是说我只要加上了撤除中断的指令,就可以避免这个状况?
小弟刚入门,实在是有很多不懂,谢谢了!
awey 发表于 2008-4-15 14:20 | 显示全部楼层

既然是触发,应该是一次高低电平的变化

所以,中断应该设成边沿触发才行。
xhtxzxw 发表于 2008-4-17 01:20 | 显示全部楼层

嘿嘿

你无法撤除的,你能撤除的只能是中断标志,而中断源你撤除不了。所谓中断源就是你外面加的那个低电平。你啥时候撤除了这个低电平,中断就不会再发生了,除非你高贵幽雅美丽的手动作速度达到微秒级,否则,肯定还是要来来回回来来回回来来回回来来回回反复中断的。
bit06haozi 发表于 2008-4-22 17:17 | 显示全部楼层

进入中断,要CLR EXO,推出出时SETB EX0,有时需要压栈

gx_huang 发表于 2008-4-22 19:35 | 显示全部楼层

2楼的程序模板很好!

但是,电平中断无法实现你的功能。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

14

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部