现象:
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;
}
}
呵呵 这我就不懂了 我也就这水平
照理说这程序非常简单 也很清楚 但就是不知道什么问题
if(TEnd!=256Ul && TEnd!=long_255)led0=0;
if(TEnd==256Ul)led1=0;
if(TEnd==long_255)led2=0;
把-255用long_255代替,
我也不知道为什么
你此时把sys1ms数值赋给TStar
然后紧接着发生定时器中断,sys1ms+1
//todo_something1();
//todo_something2 ();
temp=sys1ms-TStar;
temp=1
256 : 1,0000,0000,如果按8位算,忽略高位是0
-255: 1,0000,0001,如果按8位算是,忽略高位1
是不是编译器把他们当做8位算了
一周热门 更多>