現象:
1:我用stc-isp軟件給單片機下載程序后重啟開發板,
2:再次點stc-isp軟件上的下載/編程按鈕,這次我不重啟開發板,為了模擬通訊,一直循環給開發板發數據。
3:沒過多久,led1或者led2會點亮。
我的理解:
1:理論上TEnd=0或者1,但是這里TEnd還會等于256或者-255。不會再等于其他任何數據。
2:如果是定時器太短,導致主程序跑不動延時了,TEnd完全會不定期等于其他數據,但是沒有,他只會等于256或者-255這兩個特殊數據。
3:我懷疑是數據溢出 因為這兩個數據跟8bit,byte有關系。
#include<reg52.h>
#define uchar8 unsigned char //8
#define uint16 unsigned int //16
#define ulong32 unsigned long //32
sbit led0=P1^0;
sbit led1=P1^1;
sbit led2=P1^2;
ulong32 TStar=0;//記錄時間
ulong32 TEnd=0;
ulong32 sys1ms=0;//1ms累加,可以一直累加到49.7天
void main()
{
//1ms@12.000MHz
TMOD &= 0xF0; //設置定時器模式
TMOD |= 0x01; //設置定時器模式
TL0 = 0x18; //設置定時初值
TH0 = 0xFC; //設置定時初值
TF0 = 0; //清除TF0標志
TR0 = 1; //定時器0開始計時
//4800bps@12.000MHz
PCON |= 0x80; //使能波特率倍速位SMOD
SCON = 0x50; //8位數據,可變波特率
TMOD &= 0x0F; //清除定時器1模式位
TMOD |= 0x20; //設定定時器1為8位自動重裝方式
TL1 = 0xF3; //設定定時初值
TH1 = 0xF3; //設定定時器重裝值
ET1 = 0; //禁止定時器1中斷
TR1 = 1; //啟動定時器1
EA=1;//開啟總中斷
ES=1;//開串口中斷
ET0=1;//開定時器0中斷
while(1)
{
ulong32 temp;
TStar=sys1ms;//掃描周期記錄初始值
//todo_something1();
//todo_something2 ();
temp=sys1ms-TStar;
if(TEnd<=temp)TEnd=temp;//掃描周期計時
if(TEnd!=256 && TEnd!=-255)led0=0;
if(TEnd==256)led1=0;
if(TEnd==-255)led2=0;
}
}
void Timer0_Interrupt() interrupt 1//定時器0 1ms 中斷程序
{
TL0 = 0x18; //設置定時初值
TH0 = 0xFC; //設置定時初值
sys1ms++; //1ms累加,可以一直累加到49.7天
}
void Comm_Interrupt() interrupt 4//串行中斷程序
{
if(TI)
{
TI = 0;
}
if(RI)
{
char value;
value=SBUF;
RI=0;
}
} |