标题: 关于单片机数值运算时的一点疑问 [打印本页]

作者: shendu0900    时间: 2023-4-20 11:23
标题: 关于单片机数值运算时的一点疑问
   最近在练习做一个51单片机的小程序,是一个以秒为单位的倒计时程序,时间是24H内(对应86400秒),其中计算部分代码如下:
   if(tim >= 3600)
         {
           h = tim/3600;
          t1 = tim - (h*3600);
                   if(t1 >= 60)
                         {
                                 s = t1/60;
                                 t2 = t1 - (s * 60);
                                 m = t2;
                         }
                          else
                                {
                                  s = 0;
                                        m = t1;
                                }
         }
         
          else if(tim >=60 && tim < 3600)
                {
                  h = 0;
                        s = tim/60;
                        m = tim - (60 * s);
                }
               
                else
                {
                  h = 0;
                        s = 0;
                        m = tim;
                }
H是小时,S是分,M是秒,T1与T2是过渡用的,测试时出现一个问题,如果设置成19小时(68400秒)内的任意数值这个倒计时程序不会有问题,只要大于等于20小时就会出现异常,后来检测发现问题出在这个T1,如果用  t1 = tim - (h*3600);会得到一个65536的溢出值,但写成
       t1 = h * 36;
          t1 = t1 * 100;
          t1 = tim - t1;
这样就不会有问题,我又用t1 =86400 - 1也能正常显示出T1值,只要用乘法运算取值大于65535就会得到溢出值,可是T1我设置的是LONG整型,为什么会是这个结果?这个问题我咨询了以前的一个大佬,不过由于很久没回论坛了,目前也没回信息,不知道大佬还在不在论坛,所以麻烦大家帮忙指点一二。

作者: rctty    时间: 2023-4-20 14:08
最好把数据类型一起贴出来,不然靠猜实在是。。。
一般m是分s是秒,你这倒好,反过来
这种计时这样写不更好:
hour = tim / 3600;
min = tim % 3600 / 60;
sec = tim % 60;
作者: Hephaestus    时间: 2023-4-20 15:51
你这个问题的关键点在于变量的定义,而你恰好没有把最关键的东西贴出来。
作者: coody_sz    时间: 2023-4-20 16:10
楼主想多了,其实就是如下即可:
unsigned long tim;
unsigned char hour, minute, second;

hour = (unsigned char)(tim / 3600);
min  = (unsigned char)((tim % 3600) / 60);
sec  = (unsigned char)(tim % 60);




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1