⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 thermo21.c

📁 sdcc是为51等小型嵌入式cpu设计的c语言编译器支持数种不同类型的cpu
💻 C
📖 第 1 页 / 共 3 页
字号:
     // mission start time   if (mstatus->start_delay == 0)   {      SecondsToDate(&td,mstatus->mission_start_time);            if (mstatus->mission_start_time == 0)         cnt += sprintf(&str[cnt],"Mission Start time: not started yet\n");      else         cnt += sprintf(&str[cnt],"Mission Start time: %02d/%02d/%04d  %02d:%02d:%02d\n",            td.month,td.day,td.year,td.hour,td.minute,td.second);   }   else      cnt += sprintf(&str[cnt],"Mission Start time: na\n");   // mission start delay   cnt += sprintf(&str[cnt],"Mission Start delay: %d minute(s)\n",mstatus->start_delay);      // mission samples   cnt += sprintf(&str[cnt],"Mission Samples: %d\n",mstatus->mission_samples);   // device total samples   cnt += sprintf(&str[cnt],"Device total samples: %d\n",mstatus->samples_total);   // temperature display mode   cnt += sprintf(&str[cnt],"Temperature displayed in: ");      if (ConvertToF)      cnt += sprintf(&str[cnt],"(Fahrenheit)\n");   else      cnt += sprintf(&str[cnt],"(Celsius)\n");   // thresholds   cnt += sprintf(&str[cnt],"High Threshold: %6.1f\n",          TempToFloat(mstatus->high_threshold,ConvertToF));      cnt += sprintf(&str[cnt],"Low Threshold: %6.1f\n",          TempToFloat(mstatus->low_threshold,ConvertToF));         // time from D1921   SecondsToDate(&td,mstatus->current_time);         cnt += sprintf(&str[cnt],"Current Real-Time Clock from DS1921: %02d/%02d/%04d  %02d:%02d:%02d\n",       td.month,td.day,td.year,td.hour,td.minute,td.second);   // current PC time   time(&tlong);   tstruct = localtime(&tlong);    cnt += sprintf(&str[cnt],"Current PC Time: %02d/%02d/%04d  %02d:%02d:%02d\n",       tstruct->tm_mon + 1,tstruct->tm_mday,tstruct->tm_year + 1900,       tstruct->tm_hour,tstruct->tm_min,tstruct->tm_sec);   // zero terminate string   str[cnt] = 0;}//----------------------------------------------------------------------//  Interpret the Histogram by looking at the 'raw' portion of the //  Histogram structure.  Store the temperature range values in Celsius.//void InterpretHistogram(Histogram *hist){   int i;   // loop through each bin value   for (i = 0; i < 126; i += 2) // (2.00)   {      // get the bin value      hist->bin_count[i / 2] = hist->hist_raw[i] | ((int)hist->hist_raw[i + 1] << 8);      // start value for this bin      hist->start_range[i / 2] = TempToFloat((uchar)((i / 2) << 2),FALSE);      // end value for this bin      hist->end_range[i / 2] = TempToFloat((uchar)(((i / 2) << 2) | 0x03),FALSE);   }}//--------------------------------------------------------------------------// Take the Histogram structure and convert to string format//void HistogramToString(Histogram *hist, int ConvertToF, char *str){   int cnt=0,i;   // title   cnt += sprintf(&str[cnt],"Temperature Histogram\n---------------------\n"                              "Format: [Temp Range, Count] ");   if (ConvertToF)      cnt += sprintf(&str[cnt],"(Fahrenheit)\n");   else      cnt += sprintf(&str[cnt],"(Celsius)\n");   // loop through bins   for (i = 0; i < 63; i++) // (2.00)   {      cnt += sprintf(&str[cnt],"%6.1f to %6.1f, %d\n",                      (ConvertToF) ? CToF(hist->start_range[i]): hist->start_range[i],                     (ConvertToF) ? CToF(hist->end_range[i]): hist->end_range[i],                      hist->bin_count[i]);   }   // zero terminate string   str[cnt] = 0;}//----------------------------------------------------------------------//  Interpret the Temperature Alarm Event data by looking at the 'raw' //  portion of the TempAlarmEvents structure.  Mission Status is needed//  to interpret the events.//void InterpretAlarms(TempAlarmEvents *alarm, MissionStatus *mstatus){   int i;   ulong event_mission_count;   uchar duration;   // low events   alarm->num_low = 0;   for (i = 0; i < 48; i += 4)   {      // get the mission start count of this event      event_mission_count = ((long)alarm->alarm_raw[i + 2] << 16) |                            ((int)alarm->alarm_raw[i + 1] << 8) |                             alarm->alarm_raw[i];        // check if done with low events      if (!event_mission_count)         break;      // get the duration      duration = alarm->alarm_raw[i + 3];         // calculate the start time      alarm->low_start_time[alarm->num_low] =          mstatus->mission_start_time +           (event_mission_count - 1) * (mstatus->sample_rate * 60);        // calculate the end time      alarm->low_end_time[alarm->num_low] =          alarm->low_start_time[alarm->num_low] +           (duration - 1) * (mstatus->sample_rate * 60);      // increment number of low events      alarm->num_low++;   }   // high events   alarm->num_high = 0;   for (i = 48; i < 96; i += 4)   {      // get the mission start count of this event      event_mission_count = ((long)alarm->alarm_raw[i + 2] << 16) |                            ((int)alarm->alarm_raw[i + 1] << 8) |                             alarm->alarm_raw[i];        // check if done with low events      if (!event_mission_count)         break;      // get the duration      duration = alarm->alarm_raw[i + 3];      // calculate the start time      alarm->high_start_time[alarm->num_high] =          mstatus->mission_start_time +           (event_mission_count - 1) * (mstatus->sample_rate * 60);        // calculate the end time      alarm->high_end_time[alarm->num_high] =          alarm->high_start_time[alarm->num_high] +           (duration - 1) * (mstatus->sample_rate * 60);      // increment number of low events      alarm->num_high++;   }}//--------------------------------------------------------------------------// Take the Temperature Alarms Events structure and convert to string // format//void AlarmsToString(TempAlarmEvents *alarm, char *str){   int i, cnt=0;   timedate td;   // title   cnt += sprintf(&str[cnt],"Temperature Alarms\n------------------\n"                              "Format: [(HIGH/LOW), Time/Date Range]\n");   // loop through each low alarm   for (i = 0; i < alarm->num_low; i++)   {      cnt += sprintf(&str[cnt],"LOW  , ");      // start time      SecondsToDate(&td,alarm->low_start_time[i]);            cnt += sprintf(&str[cnt]," %02d/%02d/%04d  %02d:%02d  to  ",         td.month,td.day,td.year,td.hour,td.minute);      // end time      SecondsToDate(&td,alarm->low_end_time[i]);            cnt += sprintf(&str[cnt]," %02d/%02d/%04d  %02d:%02d\n",         td.month,td.day,td.year,td.hour,td.minute);   }   // loop through each high alarm   for (i = 0; i < alarm->num_high; i++)   {      cnt += sprintf(&str[cnt],"HIGH , ");      // start time      SecondsToDate(&td,alarm->high_start_time[i]);            cnt += sprintf(&str[cnt]," %02d/%02d/%04d  %02d:%02d  to  ",         td.month,td.day,td.year,td.hour,td.minute);      // end time      SecondsToDate(&td,alarm->high_end_time[i]);            cnt += sprintf(&str[cnt]," %02d/%02d/%04d  %02d:%02d\n",         td.month,td.day,td.year,td.hour,td.minute);   }   // zero terminate string   str[cnt] = 0;}//----------------------------------------------------------------------//  Interpret the Log data by looking at the 'raw' //  portion of the Log structure.  Mission Status is needed//  to interpret when the logs occurred.//void InterpretLog(Log *log, MissionStatus *mstatus){   ulong loops=0,overlap=0,lastlog=2048,i;   int logcnt=0;   // check if wrap occurred   if (mstatus->rollover_occurred)   {      // calculate the number loops       loops = (mstatus->mission_samples / 2048) - 1;      // calculate the number of overlap      overlap = mstatus->mission_samples % 2048;      log->num_log = 2048;   }   else   {      log->start_time = mstatus->mission_start_time;      if (mstatus->mission_samples > 2048)  // (1.02)           lastlog = 2048;      else         lastlog = mstatus->mission_samples;      log->num_log = (int)lastlog;   }   // set the interval   log->interval = mstatus->sample_rate * 60;   // caluclate the start time of the first log value   log->start_time = mstatus->mission_start_time +      loops * 2048 * log->interval + overlap * log->interval;   // loop to fill in the remainder first   for (i = overlap; i < lastlog; i++)      log->temp[logcnt++] = TempToFloat(log->log_raw[i],FALSE);   // loop to get the overlap   for (i = 0; i < overlap; i++)      log->temp[logcnt++] = TempToFloat(log->log_raw[i],FALSE);}//--------------------------------------------------------------------------// Take the Log structure and convert to string // format//void LogToString(Log *log, int ConvertToF, char *str){   int i,cnt=0;   ulong logtime;   timedate td;   // title   cnt += sprintf(&str[cnt],"Log Data\n--------\n"                              "Format: [Time/Date , Temperature] ");   if (ConvertToF)      cnt += sprintf(&str[cnt],"(Fahrenheit)\n");   else      cnt += sprintf(&str[cnt],"(Celsius)\n");   // loop through the logs   logtime = log->start_time;   for (i = 0; i < log->num_log; i++)   {      // time      SecondsToDate(&td,logtime);            cnt += sprintf(&str[cnt],"%02d/%02d/%04d  %02d:%02d ,",         td.month,td.day,td.year,td.hour,td.minute);      // temp      cnt += sprintf(&str[cnt],"%6.1f\n",              (ConvertToF) ? CToF(log->temp[i]): log->temp[i]);      // increment the time      logtime += log->interval;   }   // zero terminate string   str[cnt] = 0;}//--------------------------------------------------------------------------// Convert the raw debug data to a string//void DebugToString(MissionStatus *mstatus, TempAlarmEvents *alarm,                    Histogram *hist, Log *log, char *str) {   int i,cnt=0;   // title   cnt += sprintf(&str[cnt],"Debug Dump\n----------\nRegister Page:\n");   // reg   for (i = 0; i < 32; i++)   {      cnt += sprintf(&str[cnt],"%02X ",mstatus->status_raw[i]);      if (i && (((i + 1) % 16) == 0))         cnt += sprintf(&str[cnt],"\n");   }   // alarms   cnt += sprintf(&str[cnt],"Alarms:\n");   for (i = 0; i < 96; i++)   {      cnt += sprintf(&str[cnt],"%02X ",alarm->alarm_raw[i]);      if (i && (((i + 1) % 16) == 0))         cnt += sprintf(&str[cnt],"\n");   }   // histogram   cnt += sprintf(&str[cnt],"Histogram:\n");   for (i = 0; i < 128; i++)   {      cnt += sprintf(&str[cnt],"%02X ",hist->hist_raw[i]);      if (i && (((i + 1) % 16) == 0))         cnt += sprintf(&str[cnt],"\n");   }   // log   cnt += sprintf(&str[cnt],"Log:\n");   for (i = 0; i < ((log->num_log > 2048) ? 2048 : log->num_log); i++)   {      cnt += sprintf(&str[cnt],"%02X ",log->log_raw[i]);      if (i && (((i + 1) % 16) == 0))         cnt += sprintf(&str[cnt],"\n");   }   // zero terminate string   str[cnt] = 0;}//--------------------------------------------------------------------------// Take one byte BCD value and return binary value//uchar BCDToBin(uchar bcd){   return (((bcd & 0xF0) >> 4) * 10) + (bcd & 0x0F);}//--------------------------------------------------------------------------// Take a 4 byte long string and convert it into a timedata structure.//static int dm[] = { 0,0,31,59,90,120,151,181,212,243,273,304,334,365 };void SecondsToDate(timedate *td, ulong x){   short tmp,i,j;   ulong y;      // check to make sure date is not over 2070 (sanity check)   if (x > 0xBBF81E00L)      x = 0;      y = x/60;  td->second = (ushort)(x-60*y);   x = y/60;  td->minute = (ushort)(y-60*x);   y = x/24;  td->hour   = (ushort)(x-24*y);   x = 4*(y+731);  td->year = (ushort)(x/1461);   i = (int)((x-1461*(ulong)(td->year))/4);  td->month = 13;      do   {      td->month -= 1;      tmp = (td->month > 2) && ((td->year & 3)==0) ? 1 : 0;      j = dm[td->month]+tmp;      } while (i < j);      td->day = i-j+1;      // slight adjustment to algorithm    if (td->day == 0)       td->day = 1;      td->year = (td->year < 32)  ? td->year + 68 + 1900: td->year - 32 + 2000;}//--------------------------------------------------------------------------// DateToSeconds takes a time/date structure and converts it into the // number of seconds since 1970//ulong DateToSeconds(timedate *td){   ulong Sv,Bv,Xv;   // convert the date/time values into the 5 byte format used in the touch    if (td->year >= 2000)       Sv = td->year + 32 - 2000;   else       Sv = td->year - 68 - 1900;   if ((td->month > 2) && ( (Sv & 3) == 0))     Bv = 1;   else     Bv = 0;   Xv = 365 * (Sv-2) + (Sv-1)/4 + dm[td->month] + td->day + Bv - 1;   Xv = 86400 * Xv + (ulong)(td->second) + 60*((ulong)(td->minute) + 60*(ulong)(td->hour));   return Xv;}//--------------------------------------------------------------------------// Convert from DS1921 termature format to a float// //float TempToFloat(uchar tmp, int ConvertToF){   float tfloat;   tfloat = (float)((tmp / 2.0) - 40.0);   if (ConvertToF)      return (float)(tfloat * 9.0 / 5.0 + 32.0);   else      return tfloat;   }//--------------------------------------------------------------------------// Convert from Celsius to Fahrenheit//float CToF(float CVal){   return (float)(CVal * 9.0 / 5.0 + 32.0);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -