两个数(每个数都是几个数相乘的积)比较大小出现异常

  • 指示灯
  • SingleYork
  • LV5工程师
  • |      2016-08-11 17:34:25
  • 浏览量 1484
  • 回复:11
本帖最后由 SingleYork 于 2016-8-12 18:44 编辑

如题,51单片机中,在程序中设置两个数SetTime、RunTime,比较这两个数的大小,均是unsigned long类型,其中:

SetTime = SetDay*24*60*60 + SetHour*60*60; 即:将设置的“天数”跟设置的“小时数”换算成“秒数”,再赋值给SetTime ,也就是SetTime 的单位为:秒;SetDay、SetHour均为unsigned char类型; RunTime = Day*24*60*60+Hour*60*60+Min*60+Sec; 原理同SetTime一样,也是全部换算成秒来做比较;其中Day、Hour、Min、Sec也均为unsigned char类型; RunTime是由定时器产生,具体方式如下(为了减少等待时间,数据做了处理,最终结果是:1小时相当于10秒钟): 换算完成之后,再将两个数做对比,若RunTime>SetTime,则输出一个信号: 那么问题来了: 当我设置SetDay=0;SetHour=1;时,也就是1个小时,RunTime大于10秒(之前有说明,为了缩短等待时间做的数据处理,1小时等于10秒)时就会给出一个信号; 当我设置SetDay=0;SetHour=2;时,也就是2个小时,RunTime大于20秒时就会给出一个信号; 当我设置SetDay=0;SetHour=3;时,也就是3个小时,RunTime还是大于20秒时就会给出一个信号; 当我设置SetDay=0;SetHour=4;时,也就是4个小时,RunTime还是大于20秒时就会给出一个信号; 后面的问题差不多,就不一一列出来了! 特在此求助大神! PS:经过各路大神的解答,初步判定是if(Hour>1)这个条件的问题,按照如下方式改,问题暂时解决,至于问题是否真是如此以及程序中其他的问题,还得多几天验证才能知道!感谢各路大神! 延续: 按照如上更改了之后,SetHour设置在18以下,输出等待时间是对的,设置SetHour=19或以上还是有问题,具体现象如下: 设置 19时 等待10秒输出设置 20 时 等待30秒输出设置 21时 等待50秒输出设置 22时 等待50秒输出设置 23时 等待50秒输出 而且等待的时长好像不是完全固定的,有时候10秒,有时候20秒……求解! 虽然最佳答案选择了“999”这个热心小伙伴的,也确实一开始是有这个问题,所以他的回答是正确的,至于后来我发现了另外一个问题,又不想重新发帖,于是在本帖的后面追加了问题点,其实问题的根本还是如“MOP”所说,是计算过程中数据溢出的问题:详见15楼 但是无奈啊,最佳答案只能选一个呀,所以只好委屈“MOP”同学了,按照你所说的,我试了,确实也能解决问题,不过我之前也是用的强制类型转换,如下: SetTime = (unsigned long)SetDay*24*60*60 + (unsigned long)SetHour*60*60

这样也确实解决了问题,所以最根本的问题,还是计算过程中数据溢出的问题,在此,也非常感谢MOP同学热心解答!

  • 0
  • 收藏
  • 举报
  • 分享
我来回复

登录后可评论,请 登录注册

所有回答 数量:7
999 2016-08-12
本帖最后由 999 于 2016-8-12 15:01 编辑 你不是已经做了强制转换吗?又改了帖子?。。囧
0   回复
举报
发布
SingleYork 回复 2016-08-12
恩,之前的强制类型转换应该是对的,错误的原因应该是如你所说,Hour>1这个条件,后面我把这个条件改成23了,然后还是出问题,后面我又用强制转换,貌似问题暂时得到了解决!哎!原来都是一时疏忽惹的祸呀……
0   回复
举报
灵澈 回复 2016-08-15
999与MOP都被楼主采纳,根据悬赏求助奖励办法,社区分别都奖励300IC币!
0   回复
举报
MOP 2016-08-12
如题,51单片机中,在程序中设置两个数SetTime、RunTime,比较这两个数的大小,均是unsigned long类型,其中: SetTime = SetDay*24*60*60 + SetHour*60*60; 即:将设置的“天数”跟设置的“小时数”换算成“秒数”,再赋值给SetTime ,也就是SetTime 的单位为:秒;SetDay、SetHour均为unsigned char类型; (unsigned char = int), 所以你assign時候,右邊已經Overflow了,因為右邊全部都是int 故:
SetTime = SetDay*24L*60L*60L + SetHour*60L*60L;
RunTime = Day*24*60*60+Hour*60*60+Min*60+Sec; 同理:
RunTime = Day*24L*60L*60L+Hour*60L*60L+Min*60L+Sec;
原理同SetTime一样,也是全部换算成秒来做比较;其中Day、Hour、Min、Sec也均为unsigned char类型; 以上試試吧!! 祝好運:)
0   回复
举报
发布
SingleYork 回复 2016-08-12
我听STC的技术说好像常数后面加L会好些,我没试过,但是我用另外一种方法,就是强制类型转换,貌似就没有问题了,至少暂时是没有问题了……非常感谢你的热心解答……
0   回复
举报
SingleYork 2016-08-12
恩,这个问题已经改了,解决了……出现另外一个问题……
0   回复
举报
发布
LiuYang 2016-08-12
那么在中断函数里就不要再操作CNT寄存器了
0   回复
举报
发布
SingleYork 回复 2016-08-12
CNT是个寄存器?我定义的是一个用来计数的变量:sleepy:
0   回复
举报
SingleYork 2016-08-12
恩,这确实是其中一个问题,这可能是我昨天修改后没改回去造成的,之前这个地方是23还是有同样的问题,现在改了貌似问题暂时得到解决,我还得多次验证一下,才知道是不是真的是这个问题,感谢热心解答……
0   回复
举报
发布
999 2016-08-11
你中断中: 小时>1后 天就++了
0   回复
举报
发布
Ipaddr 2016-08-11
为啥感觉你的定时器做的有点问题呢
0   回复
举报
发布
x
收藏成功!点击 我的收藏 查看收藏的全部帖子