日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁(yè) > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]最近在做一個(gè)8位單片機(jī)項(xiàng)目,其中用到了時(shí)間戳轉(zhuǎn)換函數(shù),這個(gè)在32位機(jī)上一個(gè)庫(kù)函數(shù)就解決了問題,沒想到在8位單片機(jī)中沒有對(duì)應(yīng)庫(kù)(time.h),沒有辦法只有自己來(lái)寫。目標(biāo):1,滿足和庫(kù)函數(shù)mktime localtime所計(jì)算出的

最近在做一個(gè)8位單片機(jī)項(xiàng)目,其中用到了時(shí)間戳轉(zhuǎn)換函數(shù),這個(gè)在32位機(jī)上一個(gè)庫(kù)函數(shù)就解決了問題,沒想到在8位單片機(jī)中沒有對(duì)應(yīng)庫(kù)(time.h),沒有辦法只有自己來(lái)寫。

目標(biāo):1,滿足和庫(kù)函數(shù)mktime localtime所計(jì)算出的數(shù)據(jù)一至;2,考慮8位單片機(jī)的處理能力慢軟件效率問題。

分享給大家,方便有同樣需求的朋友。

gcc 環(huán)境進(jìn)行測(cè)試:

測(cè)試程序:

1 #include

2 #include

3 #include

4 #include

5

6 #if 0

7 struct tm {

8 int tm_sec; /* seconds after the minute, 0 to 60

9 (0 - 60 allows for the occasional leap second) */

10 int tm_min; /* minutes after the hour, 0 to 59 */

11 int tm_hour; /* hours since midnight, 0 to 23 */

12 int tm_mday; /* day of the month, 1 to 31 */

13 int tm_mon; /* months since January, 0 to 11 */

14 int tm_year; /* years since 1900 */

15 // int tm_wday; /* days since Sunday, 0 to 6 */

16 // int tm_yday; /* days since January 1, 0 to 365 */

17 // int tm_isdst; /* Daylight Savings Time flag */

18 };

19 #endif

20 static const char mon_list[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

21 static const char leap_mon_list[12] = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

22

23 /*******************************************************************************

24 * Function Name : fun_mktime

25 * Description : 時(shí)間轉(zhuǎn)為時(shí)間戳

26 * Input :

27 * Output :

28 * Other :

29 * Date : 2016.11.14

30 *******************************************************************************/

31 int32_t fun_mktime(struct tm *pT)

32 {

33 const char *pDays = NULL;

34 int32_t tmp = 0;

35 int16_t i = 0;

36

37 //計(jì)算總共有多少個(gè)閏年

38 tmp = (pT->tm_year / 4 - pT->tm_year / 100 + pT->tm_year / 400) - (1970 / 4 - 1970 / 100 + 1970 / 400);

39

40 //如果當(dāng)年是閏年,需要減去當(dāng)年的閏年

41 if ((pT->tm_year % 4 == 0) && ((pT->tm_year % 100 != 0) || (pT->tm_year % 400 == 0)))

42 {

43 tmp = tmp - 1 + (pT->tm_year - 1970) * 365;

44 pDays = leap_mon_list;

45 }

46 else

47 {

48 tmp = tmp + (pT->tm_year - 1970) * 365;

49 pDays = mon_list;

50 }

51

52 for (i = 0; i < pT->tm_mon - 1; i++)

53 tmp += pDays[i];

54

55 tmp = tmp + pT->tm_mday - 1;

56

57 tmp = tmp * 24 + pT->tm_hour;

58

59 tmp = tmp * 60 + pT->tm_min;

60

61 tmp = tmp * 60 + pT->tm_sec;

62

63 return tmp;

64 }

65

66 /*******************************************************************************

67 * Function Name : fun_localtime

68 * Description : 時(shí)間戳轉(zhuǎn)為時(shí)間

69 * Input : struct tm *pT: 輸出的時(shí)間緩沖區(qū) uint32_t tim:當(dāng)前時(shí)間戳

70 * Output :

71 * Other :

72 * Date : 2016.11.14

73 *******************************************************************************/

74 void fun_localtime(struct tm *pT, int32_t tim)

75 {

76 const char *pDays = NULL;

77

78 uint16_t index = 0;

79

80 memset(pT, 0, sizeof(*pT));

81

82 //year initialization

83 if (tim > 0x5685C180L) // 2016-1-1 0:0:0

84 {

85 pT->tm_year = 2016;

86 tim -= 0x5685C180L;

87 }

88 else if (tim > 0x4B3D3B00L) // 2010-1-1 0:0:0

89 {

90 pT->tm_year = 2010;

91 tim -= 0x4B3D3B00L;

92 }

93 else if (tim > 0x386D4380L) // 2000-1-1 0:0:0

94 {

95 pT->tm_year = 2000;

96 tim -= 0x386D4380L;

97 }

98 else

99 {

100 pT->tm_year = 1970;

101 }

102

103 //now have year

104 while (tim >= 366L * 24 * 60 * 60)

105 {

106 if ((pT->tm_year % 4 == 0) && ((pT->tm_year % 100 != 0) || (pT->tm_year % 400 == 0)))

107 tim -= 366L * 24 * 60 * 60;

108 else

109 tim -= 365L * 24 * 60 * 60;

110

111 pT->tm_year++;

112 }

113

114 // then 365 * 24 * 60 * 60 < tim < 366 * 24 * 60 * 60

115 if (!(((pT->tm_year % 4 == 0) && ((pT->tm_year % 100 != 0) || (pT->tm_year % 400 == 0))))

116 && (tim > 365L * 24 * 60 * 60))

117 {

118 tim -= 365L * 24 * 60 * 60;

119 pT->tm_year++;

120 }

121

122 // this year is a leap year?

123 if (((pT->tm_year % 4 == 0) && ((pT->tm_year % 100 != 0) || (pT->tm_year % 400 == 0))))

124 pDays = leap_mon_list;

125 else

126 pDays = mon_list;

127

128 pT->tm_mon = 1;

129 // now have mon

130 while (tim > pDays[index] * 24L * 60 * 60)

131 {

132 tim -= pDays[index] * 24L * 60 * 60;

133 index++;

134 pT->tm_mon++;

135 }

136

137 // now have days

138 pT->tm_mday = tim / (24L * 60 * 60) + 1;

139 tim = tim % (24L * 60 * 60);

140

141 // now have hour

142 pT->tm_hour = tim / (60 * 60);

143 tim = tim % (60 * 60);

144

145 // now have min

146 pT->tm_min = tim / 60;

147 tim = tim % 60;

148

149 pT->tm_sec = tim;

150 }

151

152

153 int main (void *parg)

154 {

155 struct tm *pT = {0};

156 time_t timep = 0;

157 uint32_t cur_tim = 0;

158

159 time(&timep);

160

161 pT = localtime(&timep);

162

163 printf("linux time t= %dn", (int32_t)timep);

164 pT->tm_year += 1900;

165 pT->tm_mon += 1;

166 printf("fun_mktime t= %dn", cur_tim = (uint32_t)fun_mktime(pT));

167

168 printf("localtime t= %d-%d-%d %d:%d:%dn", pT->tm_year, pT->tm_mon, pT->tm_mday, pT->tm_hour, pT->tm_min, pT->tm_sec);

169 memset(pT, 0, sizeof(*pT));

170 fun_localtime(pT, cur_tim);

171 printf("fun_localtime t= %d-%d-%d %d:%d:%dn", pT->tm_year, pT->tm_mon, pT->tm_mday, pT->tm_hour, pT->tm_min, pT->tm_sec);

172 return 0;

173 }


測(cè)試結(jié)果:

linux time = 1480133002

fun_mktime = 1480161802

localtime = 2016-11-26 12:3:22

fun_localtime = 2016-11-26 12:3:22

linux time 是庫(kù)函數(shù)mktime計(jì)算結(jié)果,因?yàn)檫M(jìn)行了時(shí)區(qū)處理,所以與fun_mktime計(jì)算出來(lái)剛好是8 * 3600 秒的差值



本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

初學(xué)者的態(tài)度很重要。哪一款單片機(jī)不重要,只要你精通擅長(zhǎng)一款,日后再用其他公司的那都是小菜一碟,進(jìn)而學(xué)習(xí)32位的處理器也是游刃有余,輕松自如,否則,每個(gè)單片機(jī)對(duì)你來(lái)說,都永遠(yuǎn)處于入門狀態(tài)。

關(guān)鍵字: 單片機(jī) 8位單片機(jī)

YS65F805是一款8 位 MTP CMOS 觸摸單片機(jī)。性能強(qiáng)大,功耗較低,待機(jī)電流:電壓為 2.5V 時(shí),典型值 500nA。工作電流:頻率為 8MHz、電壓為 2.5V 時(shí),典型值為 500uA。頻率為 31kH...

關(guān)鍵字: 觸摸MCU 8位單片機(jī) 芯嶺技術(shù)

NY8B062D是以EPROM作為存儲(chǔ)器的 8 位單片機(jī),專為家電或量測(cè)等等的I/O應(yīng)用設(shè)計(jì)。采用CMOS制程并同時(shí)提供客戶低成本、高性能、及高性價(jià)比等顯著優(yōu)勢(shì)。NY8B062D核心建立在RISC精簡(jiǎn)指令集架構(gòu)可以很容易...

關(guān)鍵字: 九齊單片機(jī) MCU 8位單片機(jī) 微控制器

關(guān)注星標(biāo)公眾號(hào),不錯(cuò)過精彩內(nèi)容作者|strongerHuang微信公眾號(hào)?|?嵌入式專欄我想在單片機(jī)上,不跑操作系統(tǒng),在需要處理一些業(yè)務(wù)邏輯時(shí),還需要檢測(cè)按鍵短按、長(zhǎng)按、多個(gè)按鍵同時(shí)按下,我要如何實(shí)現(xiàn)?如果在業(yè)務(wù)邏輯比較...

關(guān)鍵字: RTOS 操作系統(tǒng) 8位單片機(jī)

引 言 DeviceNet是一個(gè)開放的網(wǎng)絡(luò)標(biāo)準(zhǔn)。規(guī)范和協(xié)議都是開放的——供應(yīng)商將設(shè)備連接到系統(tǒng)時(shí),無(wú)需為硬件、軟件或授權(quán)付費(fèi);任何人都能以名義上的復(fù)制成本(目前為250美元+郵費(fèi))從開放

關(guān)鍵字: 軟硬件 8位單片機(jī) 硬件系統(tǒng) 通信適配器

老兵傳奇-8bit MCU和EFM8BB1LCK開發(fā)板評(píng)測(cè)板子圖 板子前視圖拿到這個(gè)板子, 可以說沒有什么驚奇.這個(gè)板子從外觀還是功能講, 在筆者最近用過的板子中可以說非常普通. 不過評(píng)價(jià)一個(gè)板子并不能僅僅從外貌出發(fā)吧...

關(guān)鍵字: 51單片機(jī) 8位單片機(jī) labs MCU Silicon efm8bb1lck

89C52是INTEL公司MCS-51系列單片機(jī)中基本的產(chǎn)品,它采用ATMEL公司可靠的CMOS工藝技術(shù)制造的高性能8位單片機(jī),屬于標(biāo)準(zhǔn)的MCS-51的HCMOS產(chǎn)品。

關(guān)鍵字: 89c52 8位單片機(jī) mcs-51

  引 言  Flash存儲(chǔ)器又稱閃速存儲(chǔ)器,是20世紀(jì)80年代末逐漸發(fā)展起來(lái)的一種新型半導(dǎo)體不揮發(fā)存儲(chǔ)器。它兼有RAM和ROM的特點(diǎn),既可以在線擦除、改寫,又能夠在掉電后保持?jǐn)?shù)據(jù)不丟失?! OR Flash是Flas...

關(guān)鍵字: 8位單片機(jī) Flash nor 接口設(shè)計(jì)

前言谷歌的Protobuf的網(wǎng)址:https://developers.google.com/protocol-buffers/?csw=1按照國(guó)內(nèi)情況最好翻墻出去看一下.目前Protobuf的情況是主要支持Java,...

關(guān)鍵字: 8位單片機(jī) google protobuf

由于TI 254x采用的是8位單片機(jī),而且內(nèi)存只有可憐的8k,所以與普通PC編程有一些不一樣的地方,一定要注意。一、不要聲明太大的數(shù)組請(qǐng)時(shí)刻記住,內(nèi)存只有8k,你聲明一個(gè)太大的數(shù)組連編譯都無(wú)法通過。二、串口打印不一

關(guān)鍵字: 8位單片機(jī) 編程
關(guān)閉