亚博智能论坛  
  
查看: 333|回复: 0

求高手举例说明一下51中断的using使用注意事项

  [复制链接]
  • TA的每日心情
    大哭
    2017-7-26 09:46
  • 29

    主题

    51

    帖子

    155

    积分

    菜鸟程序猿

    Rank: 2

    积分
    155
    发表于 2017-6-20 17:38:37 | 显示全部楼层 |阅读模式
    看了51的通用寄存器,不明白里面的工作原理,以下是我在网上看到的例子51单片机中断函数using问题  

    看郭天祥的第4课,一开始有个例子,就是发光二极管每1秒(循环加1消耗时间)亮一次,每二秒(定时器0中断)所有数码管转一次,从0转到F  我的源程序如下:

    1. #include<reg52.h>
    2. #include<intrins.h>

    3. unsigned int i;
    4. unsigned int icount;
    5. void delay(unsigned int ) ;
    6. unsigned char code  table[]={
    7. 0x3f,0x06,0x5b,0x4f,
    8. 0x66,0x6d,0x7d,0x07,
    9. 0x7f,0x6f,0x77,0x7c,
    10. 0x39,0x5e,0x79,0x71};

    11. sbit wei=P2^7;
    12. sbit duan=P2^6;
    13. sbit beep=P2^3;

    14. void main ()
    15. {  
    16. icount=0;
    17. i=0;
    18.   P1=0xfe;

    19. wei=1;
    20. P0=0xc0;
    21. wei=0;
    22.     duan=1;
    23. P0=0x00;
    24. duan=0;

    25.   //定时器1,方式1
    26. TMOD=0x01;
    27. EA=1;
    28. ET0=1;
    29. TH0=15536/256;
    30. TL0=15536%256;
    31. TR0=1;

    32.     while(1)
    33.     {
    34.     delay(1000);
    35.      P1=_cror_(P1,1);
    36.   beep=~beep;





    37.    }

    38.   
    39. }

    40. void t0() interrupt 1 using 2
    41. {
    42. TH0=15536/256;
    43. TL0=15536%256;
    44. icount++;
    45.   /*
    46. if(icount%20==0)
    47. {  beep=~beep;
    48.    P1=_cror_(P1,1);
    49. }
    50. */
    51. if(icount%40==0)
    52. {

    53. if(i==16) i=0;
    54. duan=1;
    55. P0=table[i];
    56. duan=0;
    57. i++;

    58. }


    59. }

    60. void delay(unsigned int z)
    61. {
    62. unsigned int x,y;
    63. for(x=z;x>0;x--)
    64.   for(y=110;y>0;y--);
    65. }
    复制代码

    以上程序经调试时,2秒的数码管是正常的,但是跑马灯去在不停的闪,而不是1秒,无意中将  中断函数 using 0  改为了using 1就正常了,去掉 using 0,也是正常的,之前的程序也有用过using 0,不知是否因为  RAM 段0中有什么指令有叠加,导致存入寄存器数据有误!!!


    如果我仍然用 using 0,但是把dealy 函数中的内容直接入到while(1)中去,也是正常的!

    回复

    使用道具 举报

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

    本版积分规则

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