原创 C51计算时间差

2010-7-16 18:07 2064 7 7 分类: MCU/ 嵌入式

用2个BCD码数组存储进场时间和出场时间:


unsigned char idata in[5] = {0x10,0x07,0x14,0x20,0x15};//2010年7月14日20时15分


unsigned char idata out[5] = {0x10,0x07,0x15,0x08,0x14};//2010年7月15日8时14分


unsigned char idata in_time[5];//存进场时间的16进制数


unsigned char idata out_time[5];//存出场时间的16进制数


 


首先把这两个数组的BCD码转成HEX码


转换算法:比如把BCD码12h转换成16进制,用12h-6,得到0ch,就是对应的16进制数。十位为n,就用BCD码-n*6,如23h,23h-2*6=17h,17h就是BCD码23


/*


把一个BCD码数组转换成16进制数组


*/


void Bcd_to_Hex(unsigned char *bcd_array,unsigned char *hex_array,unsigned char n)


{


       unsigned char i = 0;


       unsigned char temp;


       for(i = 0;i < n;i++)


       {


              temp = (bcd_array & 0xf0) >> 4;


              hex_array = bcd_array;


    while(temp--)


    {


           hex_array = hex_array - 0x06;


    }


  }


}    


然后调用函数difftime(unsigned char *in_time,unsigned char *out_time)得到进出时间相隔多少分钟


 


/*


计算车在场内停留的时间,单位分钟


能计算的最长停留时间是65535/(24*60)=45.5天


*/


unsigned int difftime(unsigned char *in_time,unsigned char *out_time)


{


       int days,months,years,result;


       char leap,temp_year,temp,temp_hour;


       int code monthday[2][12] = {


              {31,28,31,30,31,30,31,31,30,31,30,31},//平年每月天数


              {31,29,31,30,31,30,31,31,30,31,30,31} //闰年每月天数


       };


      


       leap = leapyear(out_time[0]);


      


       years = out_time[0] - in_time[0];


       months = out_time[1] - in_time[1];


       days = out_time[2] - in_time[2];


       temp_year = in_time[0];


   


    if((years > 0) && (in_time[1] > 2))


       {


              if(leapyear(temp_year))


                     days--;                         //如果进场时间是闰年,且月份大于2,那么要减1天,因为2月29日没算进去


       }    


       while(years > 0)


       {


              if(leapyear(temp_year))


                     days += 366;


              else


                     days += 365;


              temp_year++;


              years--;


       }


      


       temp = in_time[1];  //暂存进场时间月份


       if(months > 0)


       {


              while(months > 0)


              {


                     days += monthday[leap][temp++ - 1];// temp先减1,然后再自加1,减1是因为monthday[][]下标是从零开始


                     months --;


              }


       }


       else


       {


              while(months < 0)


              {


                     temp--;


                     days -= monthday[leap][temp - 1];


                     months++;


              }


       }


        


       temp = out_time[4];       //暂存出场时间的分钟


       temp_hour = out_time[3];  //暂存出场时间的小时


       if(temp < in_time[4])


       {


              temp += 60;  //如果出场时间的分钟小于进场时间的分钟,那么出场时间分钟加60


              temp_hour -= 1;//出场时间小时减1


       }


      


       result = days * 24 * 60 + (temp_hour - in_time[3]) *60 + temp - in_time[4];


      


       return result;


}    


 


 


判断年是否闰年的函数如下:


算法:先判断年是否可以被4整除,如果不可以,不是闰年,如果可以,继续判断,看是否可以被100整除,如果不可以,则是闰年,如1996,如果可以被100整除,继续判断,看是否可以被400整除,如果可以则是闰年,如果不可以,则不是。如1900可以被4整除,继续判断,可以被100整除,继续判断,不可以被400整除,则不是闰年。2000则是闰年。


/*


判断是否是闰年 闰年返回1,平年返回0


*/


char leapyear(unsigned char year)


{


       unsigned int y;


       y = year + 2000;


       if ((y % 400 == 0) || ((y %100 != 0) && (y %4 == 0)))


              return 1;


       else


              return 0;


}


 


写成c文件如下:


unsigned char idata in[5] = {0x10,0x07,0x14,0x20,0x15};//2010年7月14日20时15分


unsigned char idata out[5] = {0x10,0x07,0x15,0x08,0x14};//2010年7月15日8时14分


unsigned char idata in_time[5];//存进场时间的16进制数


unsigned char idata out_time[5];//存出场时间的16进制数


 


void main()


{


  Unsigned int i = 0;


  Bcd_to_Hex(in,in_time,5);


  i = difftime(in_time,out_time);


}


运行得i = 0x2cf 即719分钟,与实际时间差相符。

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
7
关闭 站长推荐上一条 /3 下一条