[51单片机] 关于外部中断信号检测问题

[复制链接]
3367|13
 楼主| zjqlovelyy 发表于 2013-10-1 09:34 | 显示全部楼层 |阅读模式
本帖最后由 zjqlovelyy 于 2013-10-4 20:16 编辑


  1. void Int0() interrupt 0  //外部中断0的中断函数
  2. {
  3. Delay(1);  //延时消抖
  4. if(K3==0)   //K3定义为  sbit K3 = P3^2;
  5.   KeyValue=1;
  6. }
比如上面的一段代码,P3.2口没有接线,在P3.2口里面的电平信号的改变是怎么样的? 对于外部中断还是不太理解。又如定时/计数器中断这个比较好理解。

wangch_sh 发表于 2013-10-1 09:49 | 显示全部楼层
没接线应该不会改变。接了有电平变化或者上升沿或者下降沿才会改变。
 楼主| zjqlovelyy 发表于 2013-10-1 09:55 | 显示全部楼层
本帖最后由 zjqlovelyy 于 2013-10-1 16:00 编辑
wangch_sh 发表于 2013-10-1 09:49
没接线应该不会改变。接了有电平变化或者上升沿或者下降沿才会改变。

就好比如这个程序,执行结果是使Led闪烁,实际上,没接线,仍然可以闪烁
  1. /*********************************************************************************
  2. *实验名   :外部中断实验
  3. *注意                        :由于P3.2口跟红外线共用,所以做按键实验时为了不让红外线影响实验效果,最好把红外线先
  4. *取下来。
  5. *实验效果        :K3按下LED左循环,K4按下LED变右循环
  6. *
  7. *********************************************************************************/
  8. #include<reg51.h>
  9. #include<intrins.h>

  10. #define GPIO_LED        P2
  11. //外部中断的IO
  12. sbit K3=P3^2;
  13. sbit K4=P3^3;

  14. void IntConfiguration();
  15. void Delay(unsigned int n);
  16. unsigned char KeyValue=0;
  17. /*******************************************************************************
  18. * 函数名         : main
  19. * 函数功能                   : 主函数
  20. * 输入           : 无
  21. * 输出                  : 无
  22. *******************************************************************************/
  23. void main(void)
  24. {
  25.         GPIO_LED=0Xfe;
  26.         IntConfiguration();
  27.         while(1)
  28.         {
  29.                 if(KeyValue)
  30.                         GPIO_LED=_crol_(GPIO_LED,1);
  31.                 else
  32.                         GPIO_LED=_cror_(GPIO_LED,1);
  33.                 Delay(2000);               
  34.         }        
  35. }
  36. /*******************************************************************************
  37. * 函数名         : IntConfiguration()
  38. * 函数功能                   : 设置外部中断
  39. * 输入           : 无
  40. * 输出                  : 无
  41. *******************************************************************************/
  42. void IntConfiguration()
  43. {
  44.         //设置INT0
  45.         IT0=1;//跳变沿出发方式(下降沿)
  46.         EX0=1;//打开INT0的中断允许。
  47.         //设置INT1
  48.         IT1=1;
  49.         EX1=1;
  50.         
  51.         EA=1;//打开总中断        
  52. }
  53. /*******************************************************************************
  54. * 函数名         : Delay(unsigned int n)
  55. * 函数功能                   : 延时
  56. * 输入           : n
  57. * 输出                  : 无
  58. *******************************************************************************/

  59. void Delay(unsigned int n)   //延时50us误差 0us
  60. {
  61.     unsigned char a,b;
  62.                 for(;n>0;n--)
  63.                 {
  64.             for(b=1;b>0;b--)
  65.         for(a=22;a>0;a--);
  66.                 }
  67. }
  68. /*******************************************************************************
  69. * 函数名         : Int0()        interrupt 0
  70. * 函数功能                   : 外部中断0的中断函数
  71. * 输入           : 无
  72. * 输出                  : 无
  73. *******************************************************************************/

  74. void Int0()        interrupt 0                //外部中断0的中断函数
  75. {
  76.         Delay(1);         //延时消抖
  77.         if(K3==0)
  78.                 KeyValue=1;
  79. }
  80. /*******************************************************************************
  81. * 函数名         : Int1() interrupt 2
  82. * 函数功能                   : 外部中断1的中断函数
  83. * 输入           : 无
  84. * 输出                  : 无
  85. *******************************************************************************/

  86. void Int1() interrupt 2                //外部中断1的中断函数
  87. {
  88.         Delay(1);                //延时消抖
  89.         if(K4==0)
  90.                 KeyValue=0;        
  91. }
wangch_sh 发表于 2013-10-1 13:27 | 显示全部楼层
不接能闪烁吗/
 楼主| zjqlovelyy 发表于 2013-10-1 15:59 | 显示全部楼层
wangch_sh 发表于 2013-10-1 13:27
不接能闪烁吗/

没接线。可以闪烁
 楼主| zjqlovelyy 发表于 2013-10-2 11:57 | 显示全部楼层
没人了麽?   自己顶起吧
yirongfu 发表于 2013-10-2 13:08 | 显示全部楼层
仅从所贴代码来看,K3按下后,不按K4,KeyValue一直为1,那么main里头的
if(KeyValue)
  GPIO_LED=_crol_(GPIO_LED,1);
就会一直执行,而且是每Delay(2000)就移位一次,所以出现楼主所说的情况。

有仿真器的话,一跟踪就能发现问题
NE5532 发表于 2013-10-2 18:10 | 显示全部楼层
zjqlovelyy 发表于 2013-10-2 11:57
没人了麽?   自己顶起吧

楼主,你main里面的if判断,不是左移就是右移,没有既不左移,也不右移的状态啊,两个按钮,不是把KeyValue赋值为1,就是赋值为0,你说他能停下来么??楼主画下流程图就会发现自己的错误了。
生活的时尚 发表于 2013-10-3 15:05 | 显示全部楼层
路过看看啊
 楼主| zjqlovelyy 发表于 2013-10-4 20:08 | 显示全部楼层
本帖最后由 zjqlovelyy 于 2013-10-4 20:17 编辑
NE5532 发表于 2013-10-2 18:10
楼主,你main里面的if判断,不是左移就是右移,没有既不左移,也不右移的状态啊,两个按钮,不是把KeyVal ...

说错了,是一直左移,我想我明白了
 楼主| zjqlovelyy 发表于 2013-10-4 20:10 | 显示全部楼层
yirongfu 发表于 2013-10-2 13:08
仅从所贴代码来看,K3按下后,不按K4,KeyValue一直为1,那么main里头的
if(KeyValue)
  GPIO_LED=_crol_(G ...

不,我K3接的是P3的2口,K4接的是P3的3口,然后那两个口是没有接线的(即没接按键的)
 楼主| zjqlovelyy 发表于 2013-10-4 20:18 | 显示全部楼层
谢谢大家,我想我明白了。
yirongfu 发表于 2013-10-5 11:50 | 显示全部楼层
zjqlovelyy 发表于 2013-10-4 20:10
不,我K3接的是P3的2口,K4接的是P3的3口,然后那两个口是没有接线的(即没接按键的) ...

那一样,会执行
else
  GPIO_LED=_cror_(GPIO_LED,1);

两处易出问题的地方:
1。之前说的,按键动作只有一次,但会被执行无数次(除非未贴出代码的其它地方有处理)
2。if else语句对可能产生的状态组合欠考虑
中国电子考察员 发表于 2015-8-7 14:08 | 显示全部楼层
我来看看
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

10

帖子

0

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