找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1589|回复: 1
收起左侧

单片机主函数里的变量值为什么传送不到终端服务函数中

[复制链接]
ID:210474 发表于 2017-6-14 10:10 | 显示全部楼层 |阅读模式

当while(1)中的TT或者t改变时,中断函数1中的T(TT仍然为255)T和中断5中的t(t仍然为10)都不会发生相应的变化。请问有什么办法可以解决这个问题。谢谢了!!!
  1. /**********************************************************/

  2. #include<reg52.h>

  3. unsigned char PWM=0x7f ; //赋初值

  4. char code reserve [3] _at_ 0x3b; //保留0x3b开始的3个字节
  5. unsigned char t;
  6. unsigned char TT;
  7. unsigned char count=0;
  8. unsigned char flag;

  9. sbit BEEP =P3^7 ; //蜂鸣器
  10. /*********************************************************

  11. 延时子程序

  12. *********************************************************/
  13. void delayms(unsigned char ms)

  14. {
  15. unsigned char i ;
  16. while(ms--)
  17. {
  18. for(i=0 ; i<114 ; i++) ;
  19. }
  20. }
  21. /*************T1定时器的初始化程序***********************/
  22. void init2_main()
  23. {
  24. SCON = 0x50; //设定串口工作方式1,接收使能
  25. PCON = 0x00; //波特率不倍增

  26. TMOD = 0x20; //定时器1工作于8位自动重载模式, 用于产生波特率
  27. EA = 1;
  28. TL1 = 0xfd;
  29. TH1 = 0xfd; //波特率9600
  30. TR1 = 1;

  31. }
  32. /****T2定时器初始化程序********************************/
  33. void init_main()
  34. {
  35. RCAP2H=0XFF;
  36. RCAP2L=0x66;
  37. TH2=RCAP2H;
  38. TL2=RCAP2L;
  39. T2CON=0;
  40. IE=0xb0;
  41. EA=1;
  42. ET2=1;

  43. }
  44. /*********************************************************/
  45. void main()
  46. { t=10;
  47. TT=255;

  48. BEEP = 1;

  49. ES = 1;
  50. init_main();
  51. TMOD=0x01 ;
  52. TH0=0xff ;
  53. TL0=0x66 ;
  54. EA=1;
  55. ET0=1;

  56. init2_main();
  57. delayms(100);

  58. while(1)
  59. {

  60. if(t>TT) {BEEP=!BEEP;P0=0xff;}
  61. if(flag==1){t=PWM;}
  62. if(flag==2){TT=PWM;}
  63. }
  64. }
  65. /*********************************************************

  66. 定时器0中断服务程序

  67. *********************************************************/
  68. void timer0() interrupt 1
  69. {
  70. if(PWM!=0x02)
  71. {t=PWM;
  72. flag=1;}
  73. TT=TT;
  74. TH0=0xff ;
  75. TL0=0x66 ;
  76. count++;
  77. if(count<=t){P0=0x00;}
  78. if(count>t) {P0=0xFF;}
  79. if(count>TT){count=0;}
  80. }

  81. /*********************************************************

  82. 定时器2中断服务程序

  83. *********************************************************/
  84. void timer1() interrupt 5
  85. { TF2=0;
  86. if(PWM!=0X01){TT=PWM;flag=2;}

  87. RCAP2H=0xff;
  88. RCAP2L=0x66 ;
  89. t=t;
  90. count++;
  91. if(count<=t){P0=0x00;}
  92. if(count>t) {P0=0Xff;}
  93. if(count>=TT){count=0;}
  94. /*********************串口中断服务程序************************************/

  95. void mm() interrupt 4
  96. {
  97. RI=0;
  98. PWM=SBUF;
  99. if(PWM==0x01)
  100. {
  101. TR2=0;
  102. TR0=1;
  103. flag=0;
  104. }
  105. if(PWM==0x02)
  106. {
  107. TR0=0;
  108. TR2=1;
  109. TT=PWM;
  110. flag=0;
  111. }
  112. }
复制代码


回复

使用道具 举报

ID:123289 发表于 2017-6-15 00:27 | 显示全部楼层
这取决于哪个先被执行。
如果参数X在主程序中先被改动为A,而后产生中断,则中断中所用的X就是A了。
你能弄清谁先动了X吗?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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