完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
现象:
1:我用stc-isp软件给单片机下载程序后重启开发板, 2:再次点stc-isp软件上的下载/编程按钮,这次我不重启开发板,为了模拟通讯,一直循环给开发板发数据。 3:没过多久,led1或者led2会点亮。 我的理解: 1:理论上TEnd=0或者1,但是这里TEnd还会等于256或者-255。不会再等于其他任何数据。 2:如果是定时器太短,导致主程序跑不动延时了,TEnd完全会不定期等于其他数据,但是没有,他只会等于256或者-255这两个特殊数据。 3:我怀疑是数据溢出 因为这两个数据跟8bit,byte有关系。 #include #define uchar8 unsigned char //8 #define uint16 unsigned int //16 #define ulong32 unsigned long //32 ***it led0=P1^0; ***it led1=P1^1; ***it 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; } } |
|
相关推荐
19个回答
|
|
|
|
|
|
呵呵 我也希望它恒等于0 但是事实就是他不会恒等于0 有时会等于 256,或者-255 你要有开发板 下载程序试试 确实如此。。 |
|
|
|
ulong32 temp;这句话放到最前面,main的上面去试试
|
|
|
|
把你的所有ulong32 的数据改成uchar8试试看
|
|
|
|
呵呵 还是不行的 依旧会先等于256 过会再等于-255 我之前还做过这样处理: 当出现等于256 或者-255时,串口读取那两个要相减的值,他们相差确实只有0或者1。怎么就会出现256和-255,很郁闷。 换了好几块开发板和芯片stc89 stc12 at89c52 都是同样的问题 |
|
|
|
我如果把串行中断程序里的程序去掉 他就不会有这问题了 应该还是串行通讯这边问题 |
|
|
|
那会不会是堆栈溢出了呢?
|
|
|
|
|
|
|
|
long long_255=-255;
if(TEnd!=256Ul && TEnd!=long_255)led0=0; if(TEnd==256Ul)led1=0; if(TEnd==long_255)led2=0; 把-255用long_255代替, 我也不知道为什么 |
|
|
|
不会不是这样, TStar=sys1ms;//扫描周期记录初始值
你此时把sys1ms数值赋给TStar 然后紧接着发生定时器中断,sys1ms+1 //todo_something1(); //todo_something2 (); temp=sys1ms-TStar; temp=1 |
|
|
|
嗯 ,temp可能=0或者=1。但temp怎么会=256或者-255呢 这就不对了 |
|
|
|
256 : 1,0000,0000,如果按8位算,忽略高位是0 -255: 1,0000,0001,如果按8位算是,忽略高位1 是不是编译器把他们当做8位算了 |
|
|
|
额 那应该怎么做呢 不懂了 是不是重装下keil |
|
|
|
感谢分享!!!!加油!!!!
|
|
|
|
long long_255=-255; if(TEnd!=256Ul && TEnd!=long_255)led0=0; if(TEnd==256Ul)led1=0; if(TEnd==long_255)led2=0; 自己定义一下,不直接用,这样就能避免编译器把他转换了,(其实我也不知道是不是这样子,猜的) |
|
|
|
呵呵 这还是换汤不换药 其实我是要这个Tend值 后面几行关于led0 led1 led2程序我是临时加的,便于调试观察 |
|
|
|
|
|
|
|
明白 发表于 昨天 23:14
操作太过于频繁导致 有可能【TStar=sys1ms;】之后的数值TStar=0x*****1ff,sys1ms=0x******100, 意思就是说在移动最低字节的时候,TStar和ys1ms都是TStar=0x******ff,在没有来得及次低字节的时候, 定时器中断来了,中断响应处理之后sys1ms肯定变成0x******100,又回到移动次低字节, 这个时候次低字节不再是原来值,而是多1了, 所以出现,执行【TStar=sys1ms】之后,TStar=0x*****1ff,而sys1ms=0x******100, temp=(sys1ms-TStar);的结果就是: (0x******100)-(0x*****1ff)=FFFFFF01=-255 |
|
|
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
644 浏览 0 评论
求助一下关于51系列单片机的Timer0的计时问题,TH0、TL0+1的时间是怎么算的?
1819 浏览 1 评论
【RA-Eco-RA4E2-64PIN-V1.0开发板试用】开箱+Keil环境搭建+点灯+点亮OLED
1262 浏览 0 评论
【敏矽微ME32G070开发板免费体验】使用coremark测试敏矽微ME32G070 跑分
1136 浏览 0 评论
【敏矽微ME32G070开发板免费体验】开箱+点灯+点亮OLED
1357 浏览 2 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12031 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-24 19:48 , Processed in 0.995396 second(s), Total 105, Slave 89 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号