51单片机主函数while(1)中的变量的值不会同步到中断函数中,该怎么办

/**********************************************************/

#include<reg52.h>

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

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

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

延时子程序

*********************************************************/
void delayms(unsigned char ms)

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

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

}
/****T2定时器初始化程序********************************/
void init_main()
{
RCAP2H=0XFF;
RCAP2L=0x66;
TH2=RCAP2H;
TL2=RCAP2L;
T2CON=0;
IE=0xb0;
EA=1;
ET2=1;

}
/*********************************************************/
void main()
{ t=10;
TT=255;

BEEP = 1;

ES = 1;
init_main();
TMOD=0x01 ;
TH0=0xff ;
TL0=0x66 ;
EA=1;
ET0=1;

init2_main();
delayms(100);

while(1)
{

if(t>TT) {BEEP=!BEEP;P0=0xff;}
if(flag==1){t=PWM;}
if(flag==2){TT=PWM;}
}
}
/*********************************************************

定时器0中断服务程序

*********************************************************/
void timer0() interrupt 1
{
if(PWM!=0x02)
{t=PWM;
flag=1;}
TT=TT;
TH0=0xff ;
TL0=0x66 ;
count++;
if(count<=t){P0=0x00;}
if(count>t) {P0=0xFF;}
if(count>TT){count=0;}
}

/*********************************************************

定时器2中断服务程序

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

RCAP2H=0xff;
RCAP2L=0x66 ;
t=t;
count++;
if(count<=t){P0=0x00;}
if(count>t) {P0=0Xff;}
if(count>=TT){count=0;}
/*********************串口中断服务程序************************************/

void mm() interrupt 4
{
RI=0;
PWM=SBUF;
if(PWM==0x01)
{
TR2=0;
TR0=1;
flag=0;
}
if(PWM==0x02)
{
TR0=0;
TR2=1;
TT=PWM;
flag=0;
}
}
当while(1)中的TT或者t改变时,中断函数1中的T(TT仍然为255)T和中断5中的t(t仍然为10)都不会发生相应的变化。请问有什么办法可以解决这个问题。谢谢了!!!

试试把TT 、t声明为 volatile 类型。
如volatile unsigned char TT;

volatile 的意思是“易失的,易改变的”。这个限定词的含义是向编译器指明变量的内容可能会由于其他程序的修改而变化。通常在程序中申明了一个变 量时,编译器会尽量把它存放在通用寄存器中,例如ebx。当CPU把其值放到ebx中后就不会再关心对应内存中的值。若此时其他程序(例如内核程序或一个 中断)修改了内存中它的值,ebx中的值并不会随之更新。为了解决这种情况就创建了volatile限定词,让代码在引用该变量时一定要从指定位置取得其 值。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-12-15
主函数的参数值是不会跳转到中断函数里面的,这是中断函数运行其中要注意到的。试下利用模块化编程设定一个子函数吧!
第2个回答  2013-12-15
使用全局变量!

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网