{"id":301,"date":"2012-09-20T16:57:36","date_gmt":"2012-09-20T08:57:36","guid":{"rendered":"http:\/\/blog.dword1511.info\/?p=301"},"modified":"2012-09-20T17:32:08","modified_gmt":"2012-09-20T09:32:08","slug":"%e5%9f%ba%e4%ba%8e-avr-%e5%8d%95%e7%89%87%e6%9c%ba%e7%9a%84%e7%ae%80%e6%98%93%e9%94%82%e7%94%b5%e6%b1%a0%e7%94%b5%e9%87%8f%e8%ae%a1","status":"publish","type":"post","link":"http:\/\/blog.dword1511.info\/?p=301","title":{"rendered":"\u57fa\u4e8e AVR \u5355\u7247\u673a\u7684\u7b80\u6613\u9502\u7535\u6c60\u7535\u91cf\u8ba1"},"content":{"rendered":"<p>\u5f53\u6211\u624b\u4e0a\u7684\u65b0\u8001\u9502\u7535\u6c60\u8d8a\u6765\u8d8a\u591a\u7684\u65f6\u5019\uff0c\u6211\u5c31\u5f88\u60f3\u7ec4\u88c5\u4e00\u53f0\u673a\u5668\u6765\u6d4b\u5b9a\u5b83\u4eec\u7684\u7535\u91cf\u4e86\u3002\u4e8e\u662f\u5c31\u6709\u4e86\u4e0b\u9762\u7684\u73a9\u610f\u3002<\/p>\n<p><!--more--><\/p>\n<p>\u8fd9\u53f0\u57fa\u4e8e AVR \u5355\u7247\u673a\u7684\u7b80\u6613\u9502\u7535\u6c60\u7535\u91cf\u8ba1\u7684\u6d4b\u91cf\u539f\u7406\u5f88\u7b80\u5355\u3002\u9502\u79bb\u5b50\u7535\u6c60\u7684\u7535\u91cf\u901a\u5e38\u662f\u6307\u7535\u6c60\u8f93\u51fa\u7535\u538b\u4ece\u5145\u7535\u9650\u5236\u7535\u538b\uff08\u4e00\u822c\u662f 4.2V \uff09\u4e0b\u964d\u5230\u4e00\u4e2a\u9608\u503c\uff08\u4e00\u822c\u662f 3.3V \uff09\u7684\u8fc7\u7a0b\u4e2d\u6240\u6d41\u8fc7\u7684\u603b\u7535\u8377\u91cf\u3002\u4e8b\u5148\u6d4b\u91cf\u597d\u4e00\u53ea\u7535\u963b\u7684\u963b\u503c\u7136\u540e\u5c06\u5176\u4f5c\u4e3a\u5f85\u6d4b\u7535\u6c60\u7684\u8d1f\u8f7d\uff0c\u5e76\u7528 AVR \u5355\u7247\u673a\u5185\u7f6e\u7684 ADC \u6d4b\u91cf\u5176\u4e24\u7aef\u7684\u7535\u538b\uff0c\u518d\u5c06\u5145\u6ee1\u7684\u5f85\u6d4b\u7535\u6c60\u8fde\u63a5\u81f3\u5176\u4e24\u7aef\u5373\u53ef\u8fbe\u5230\u76ee\u7684\u3002\u5728\u8fd9\u4e2a\u8fc7\u7a0b\u4e2d\u5355\u7247\u673a\u901a\u8fc7\u7d2f\u52a0\u6bcf\u6b21\u53d6\u6837\u7684\u7535\u6d41\u503c\uff08\u7531 ADC \u6d4b\u91cf\u51fa\u7684\u7535\u538b\u9664\u4ee5\u4e8b\u5148\u77e5\u9053\u7684\u963b\u503c\u5f97\u51fa\uff09\u548c\u53d6\u6837\u95f4\u9694\u65f6\u95f4\u7684\u4e58\u79ef\u5f97\u5230\u7535\u6c60\u7684\u5bb9\u91cf\uff08 mAh \uff09\uff0c\u8fd8\u53ef\u4ee5\u901a\u8fc7\u7d2f\u52a0\u7535\u538b \u00d7 \u7535\u6d41 \u00d7 \u53d6\u6837\u95f4\u9694\u7684\u503c\u5f97\u5230\u7535\u6c60\u7684\u603b\u80fd\u91cf\uff08 Wh \uff09\u3002<\/p>\n<p>\u8fd9\u79cd\u7b80\u6613\u7535\u91cf\u8ba1\u5bf9\u7535\u963b\u7684\u8981\u6c42\u6bd4\u8f83\u9ad8\uff0c\u9996\u5148\u7535\u963b\u8981\u6709\u8db3\u591f\u5927\u7684 P<sub>D<\/sub> \uff0c\u7136\u540e\u5b83\u7684\u6e29\u6f02\u5fc5\u987b\u591f\u5c0f\uff0c\u6700\u540e\u963b\u503c\u8981\u5408\u9002\uff0c\u5426\u5219\u5c06\u4f1a\u964d\u4f4e\u6d4b\u91cf\u7684\u7cbe\u5ea6\u3002\u5b9e\u9645\u64cd\u4f5c\u4e2d\u8981\u6c42\u7535\u6c60\u7535\u91cf\u8ba1\u7684\u8bef\u5dee\u5728 3% \u4ee5\u4e0b\uff08\u5426\u5219\u6309 10% \u7684\u8bef\u5dee\uff0c1000mAh \u7684\u6d4b\u8bd5\u7ed3\u679c\u8303\u56f4\u8fbe\u5230\u4e86 900mAh &#8211; 1100 mAh \uff0c\u5b8c\u5168\u65e0\u6cd5\u63a5\u53d7\uff09\u3002\u56e0\u6b64\u4e3a\u4e86\u65b9\u4fbf\u963b\u503c\u7684\u51c6\u786e\u6d4b\u91cf\u5e76\u4e14\u4fdd\u8bc1\u7535\u91cf\u7684\u6d4b\u91cf\u8017\u65f6\u4e0d\u662f\u592a\u957f\uff08\u5f85\u6d4b\u7535\u6c60\u7684\u7535\u91cf\u8981\u901a\u8fc7\u7535\u963b\u653e\u7a7a\uff09\uff0c\u5b9c\u9009\u7528 20 &#8211; 50\u03a9 \u7684\u7535\u963b\uff0c\u5e76\u7528\u7cbe\u5bc6\u7684\u8bbe\u5907\u6d4b\u91cf\u5176\u963b\u503c\uff0c\u7cbe\u786e\u5230 0.1\u03a9 \u3002\u6709\u6761\u4ef6\u7684\u8bdd\u53ef\u4ee5\u8003\u8651\u4e13\u95e8\u7684\u5927\u529f\u7387\u4f4e\u6e29\u6f02\u7535\u963b\u3002\u5728\u8fd9\u91cc\u6211\u4f7f\u7528\u7684\u662f\u4e00\u53ea\u6807\u79f0 30\u03a9\u00b15% 5W \u7684\u7ed5\u7ebf\u7535\u963b\uff0c\u5e76\u4e14\u4e8b\u5148\u501f\u4e86 @zeroomega \u540c\u5b66\u7684 FLUKE \u4e07\u7528\u8868\u6765\u6d4b\u4e86\u4e0b\u963b\u503c\uff0c\u5f97\u5230\u5176\u5e38\u6e29\u4e0b\u7684\u963b\u503c\u7ea6\u4e3a 30.3\u03a9 \uff0c\u5728\u4e24\u7aef\u52a0\u4e86 5V \u7684\u7535\u538b\u4e4b\u540e\u6e29\u5ea6\u5347\u9ad8\uff0c\u963b\u503c\u53d8\u5927\uff0c\u5927\u7ea6\u4e3a 30.7\u03a9 \u3002<\/p>\n<p>\u4f59\u4e0b\u7684\u90e8\u5206\u4e3b\u8981\u662f\u5355\u7247\u673a\u548c LCD \u663e\u793a\u5c4f\uff0c\u8bbe\u5907\u672c\u8eab\u7528\u53e6\u5916\u7684\u7535\u6e90\u4f9b\u7535\u3002\u677f\u5b50\u56fe\u7701\u4e8b\u76f4\u63a5\u91c7\u7528\u4e86\u7f51\u4e0a\u4e70\u6765\u7684\u5e26 48 \u00d7 84 \u9ed1\u767d\u70b9\u9635 LCD \u7684\u6210\u54c1\uff08 LCD \u9a71\u52a8\u82af\u7247\u4e3a\u98de\u5229\u6d66\u7684 PCD8544 \uff0c\u4e5f\u5c31\u662f\u5e38\u8bf4\u7684 5110 \u6db2\u6676\u5c4f\uff09\uff0c\u5355\u7247\u673a\u7528\u7684\u662f ATMEL \u7684 ATMEGA88PA \uff08\u5176\u5b9e ATMEGA48 \u5e94\u8be5\u5c31\u8db3\u591f\u4e86\uff09\uff0c\u677f\u5b50\u4e0a\u8bbe\u7f6e\u4e86\u8db3\u591f\u7684\u7535\u5bb9\u6765\u4fdd\u6301\u7535\u538b\u6052\u5b9a\uff0c\u51cf\u5c0f\u7535\u6e90\u7535\u538b\u5bf9\u5355\u7247\u673a\u00a0ADC \u8bef\u5dee\u7684\u5f71\u54cd\uff0c\u540c\u65f6\u9632\u6b62\u5e72\u6270\u3002<\/p>\n<p>\u4e0b\u9762\u662f\u7535\u8def\u793a\u610f\u56fe\uff1a<\/p>\n<p><a href=\"http:\/\/blog.dword1511.info\/wp-uploads\/2012\/09\/mega5110lcd.png\"><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-medium wp-image-2708\" title=\"mega5110lcd\" src=\"http:\/\/blog.dword1511.info\/wp-uploads\/2012\/09\/mega5110lcd-400x300.png\" alt=\"\" width=\"400\" height=\"300\" srcset=\"http:\/\/blog.dword1511.info\/wp-uploads\/2012\/09\/mega5110lcd-400x300.png 400w, http:\/\/blog.dword1511.info\/wp-uploads\/2012\/09\/mega5110lcd-1024x768.png 1024w, http:\/\/blog.dword1511.info\/wp-uploads\/2012\/09\/mega5110lcd.png 1600w\" sizes=\"(max-width: 400px) 100vw, 400px\" \/><\/a><\/p>\n<p>\u677f\u5b50\u4e0a\u6709\u4e24\u4e2a\u7528\u4e8e\u6269\u5c55\u7684\u63a5\u53e3\u6ca1\u6709\u53bb\u6389\u3002\u7531\u4e8e\u677f\u5b50\u539f\u672c\u7684\u8bbe\u8ba1\u7528\u9014\u4e0e\u8fd9\u91cc\u7684\u4e0d\u4e00\u6837\uff0c\u6240\u4ee5\u7535\u8def\u90e8\u5206\u7a0d\u4f5c\u4e86\u4fee\u6539\u3002\u4e3a\u4e86\u51cf\u5c0f\u8017\u7535\u91cf\uff0c\u5ef6\u957f\u7535\u91cf\u8ba1\u672c\u8eab\u7684\u7535\u6c60\u5bff\u547d\uff0c\u6211\u628a\u7535\u6e90\u6307\u793a\u706f\u4ee5\u53ca LCD \u7684\u80cc\u5149\u53bb\u6389\u4e86\uff0c\u8fd9\u5728\u73af\u5883\u4eae\u5ea6\u5c1a\u53ef\u7684\u60c5\u51b5\u4e0b\u5b8c\u5168\u4e0d\u5f71\u54cd\u5c4f\u5e55\u7684\u663e\u793a\u6548\u679c\u3002\u867d\u7136 ADC \u5bf9\u7535\u538b\u7684\u91c7\u6837\u9891\u7387\u88ab\u8bbe\u7f6e\u6210\u4e86 4Hz \uff0c\u4f46\u662f LCD \u6bcf\u79d2\u949f\u4ec5\u66f4\u65b0\u4e00\u6b21\uff0c\u56e0\u4e3a\u6d4b\u8bd5\u53d1\u73b0\u8be5 LCD \u5728\u66f4\u65b0\u65f6\u7535\u6d41\u6d88\u8017\u975e\u5e38\u5927\uff0c\u964d\u4f4e LCD \u7684\u66f4\u65b0\u9891\u7387\u80fd\u5f97\u5230\u975e\u5e38\u53ef\u89c2\u7684\u8282\u7535\u6548\u679c\u3002\u7ecf\u8fc7\u5b9e\u9a8c\u53d1\u73b0\uff0c\u8fd9\u6837\u505a\u4e4b\u540e\uff0c\u6574\u4e2a\u8bbe\u5907\u7684\u5de5\u4f5c\u7535\u6d41\u964d\u5230\u4e86 8mA \u4ee5\u4e0b\uff0c\u7528 1000mAh \u7684\u9502\u7535\u6c60\u4f5c\u4e3a\u7535\u6e90\u4f9b\u7535\u5219\u81f3\u5c11\u53ef\u4ee5\u8fd0\u884c 125 \u5c0f\u65f6\u3002\u5355\u7247\u673a\u8bbe\u7f6e\u4e86 2.7V \u7684 BOD \uff08 Brown-out Detection\uff09\u3002<\/p>\n<p>\u5728\u63a5\u4e0a\u5f85\u6d4b\u8bd5\u7535\u6c60\u540e\u8bbe\u5907\u7684\u5de5\u4f5c\u6307\u793a\u706f\u4ee5 2Hz \u7684\u9891\u7387\u95ea\u70c1\uff0c\u5f85\u6d4b\u7535\u6c60\u7535\u538b\u4f4e\u4e8e\u9884\u5148\u8bbe\u5b9a\u7684\u9608\u503c\uff08\u5373\u653e\u7535\u5b8c\u6210\uff09\u540e\uff0c\u5de5\u4f5c\u6307\u793a\u706f\u7184\u706d\u3002\u6839\u636e\u8d1f\u8f7d\u7535\u6c60\u7684\u7535\u963b\uff0c\u6d4b\u8bd5\u65f6\u5f85\u6d4b\u7535\u6c60\u8f93\u51fa\u7684\u7535\u6d41\u7ea6\u4e3a 120mA \uff0c\u8fd9\u6837\u5bf9\u4e8e\u5bb9\u91cf\u7ea6\u4e3a 1000mAh \u7684\u9502\u7535\u6c60\u5b8c\u6210\u4e00\u6b21\u6d4b\u8bd5\u7ea6\u9700\u8981 8 \u4e2a\u5c0f\u65f6\u3002\u4e8e\u662f\uff0c\u4f5c\u4e3a\u7535\u6e90\u7684\u7535\u6c60\u4e00\u6b21\u5145\u7535\u5927\u7ea6\u53ef\u4ee5\u6d4b\u91cf 15 \u5757\u7535\u6c60\uff08\u5047\u5b9a\u5de5\u4f5c\u6307\u793a\u706f\u505c\u6b62\u95ea\u70c1\u540e\u4f60\u80fd\u53ca\u65f6\u66f4\u6362\u5f85\u6d4b\u8bd5\u7684\u7535\u6c60\u6216\u8005\u5173\u6389\u8bbe\u5907\u7535\u6e90\uff09\u3002<\/p>\n<p><a href=\"http:\/\/blog.dword1511.info\/wp-uploads\/2012\/09\/P1100238.jpg\"><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-medium wp-image-2710\" title=\"P1100238\" src=\"http:\/\/blog.dword1511.info\/wp-uploads\/2012\/09\/P1100238-400x300.jpg\" alt=\"\" width=\"400\" height=\"300\" srcset=\"http:\/\/blog.dword1511.info\/wp-uploads\/2012\/09\/P1100238-400x300.jpg 400w, http:\/\/blog.dword1511.info\/wp-uploads\/2012\/09\/P1100238-1024x768.jpg 1024w\" sizes=\"(max-width: 400px) 100vw, 400px\" \/><\/a><\/p>\n<p>\u5b9e\u7269\u6b63\u9762\uff0c\u5de6\u4e0a\u65b9\u4e3a\u8fde\u63a5\u8bbe\u5907\u7535\u6e90\u7684 HX2.54 \u63a5\u53e3\uff0c\u53f3\u4e0a\u65b9\u4e3a\u6d4b\u8bd5\u7528\u7684\u8d1f\u8f7d\u7535\u963b\u4ee5\u53ca\u7528\u4e8e\u8fde\u63a5\u5f85\u6d4b\u7535\u6c60\u7684 HX2.54 \u63a5\u53e3\u3002\u7531\u4e8e\u9632\u5446\u69fd\u7684\u5b58\u5728\uff0c\u4e00\u822c\u60c5\u51b5\u4e0b\u4f60\u4e0d\u4f1a\u628a\u7535\u6c60\u63a5\u53cd\uff0c\u800c\u4e14\u5c31\u7b97\u63a5\u53cd\u7531\u4e8e\u540e\u9762\u6709\u5206\u538b\u7535\u963b\u548c\u5355\u7247\u673a\u672c\u8eab\u7684\u7528\u4e8e\u4fdd\u62a4 I\/O \u53e3\u7684\u4e8c\u6781\u7ba1\uff0c\u7535\u6c60\u4e5f\u4e0d\u4f1a\u5bf9\u5355\u7247\u673a\u9020\u6210\u635f\u4f24\u3002\u4e2d\u95f4\u7684\u9ed1\u767d\u70b9\u9635 LCD \u5c31\u4e0d\u7528\u591a\u4ecb\u7ecd\u4e86\u3002\u5de6\u4e0b\u65b9\u662f\u4e2a\u5237\u65b0\u5c4f\u5e55\u7684\u6309\u94ae\uff0c\u8003\u8651\u5230 LCD \u7684\u6591\u9a6c\u7ebf\u6709\u63a5\u89e6\u4e0d\u826f\u5bfc\u81f4\u82b1\u5c4f\u7684\u53ef\u80fd\u6240\u4ee5\u8bbe\u7f6e\u4e86\u5b83\uff08\u4f60\u603b\u4e0d\u60f3\u6d4b\u91cf\u4e86 N \u4e2a\u5c0f\u65f6\u4e4b\u540e\u5374\u53d1\u73b0\u4ec0\u4e48\u90fd\u8bfb\u4e0d\u51fa\u6765\u5427\uff1f\uff09\uff0c\u4e2d\u95f4\u7684\u662f\u4e2a RESET \u6309\u94ae\uff0c\u53f3\u4e0b\u65b9\u4e3a\u9ec4\u8272\u7684\u5de5\u4f5c\u6307\u793a\u706f\u3002<\/p>\n<p><a href=\"http:\/\/blog.dword1511.info\/wp-uploads\/2012\/09\/P1100239.jpg\"><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-medium wp-image-2711\" title=\"P1100239\" src=\"http:\/\/blog.dword1511.info\/wp-uploads\/2012\/09\/P1100239-400x300.jpg\" alt=\"\" width=\"400\" height=\"300\" srcset=\"http:\/\/blog.dword1511.info\/wp-uploads\/2012\/09\/P1100239-400x300.jpg 400w, http:\/\/blog.dword1511.info\/wp-uploads\/2012\/09\/P1100239-1024x768.jpg 1024w\" sizes=\"(max-width: 400px) 100vw, 400px\" \/><\/a><\/p>\n<p>\u5b9e\u7269\u80cc\u9762\uff0c\u4e3b\u8981\u662f\u90a3\u53ea ATMEL ATMEGA88PA 8 \u4f4d AVR \u5355\u7247\u673a\u3002ADC \u90e8\u5206\u7684\u8d70\u7ebf\u8d34\u4e0a\u4e86\u7edd\u7f18\u80f6\u5e26\uff0c\u4ee5\u514d\u7070\u5c18\u548c\u6c57\u6e0d\u5bf9\u5176\u9020\u6210\u4e0d\u826f\u5f71\u54cd\u3002\u63a5\u53e3\u548c\u8d1f\u8f7d\u7535\u963b\u88ab\u710a\u5728\u4e86\u4e00\u4e2a\u5355\u72ec\u7684\u4e07\u7528\u677f\u4e0a\uff0c\u4e07\u7528\u677f\u548c\u4e3b\u677f\u901a\u8fc7\u6392\u9488\u8fde\u63a5\u3002<\/p>\n<p><a href=\"http:\/\/blog.dword1511.info\/wp-uploads\/2012\/09\/P1100246.jpg\"><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-medium wp-image-2716\" title=\"P1100246\" src=\"http:\/\/blog.dword1511.info\/wp-uploads\/2012\/09\/P1100246-400x300.jpg\" alt=\"\" width=\"400\" height=\"300\" srcset=\"http:\/\/blog.dword1511.info\/wp-uploads\/2012\/09\/P1100246-400x300.jpg 400w, http:\/\/blog.dword1511.info\/wp-uploads\/2012\/09\/P1100246-1024x768.jpg 1024w, http:\/\/blog.dword1511.info\/wp-uploads\/2012\/09\/P1100246.jpg 1600w\" sizes=\"(max-width: 400px) 100vw, 400px\" \/><\/a><\/p>\n<p>\u63a5\u53e3\u90e8\u5206\u7279\u5199\uff0c\u8d1f\u8f7d\u7535\u963b\u79bb\u63a5\u53e3\u5c3d\u91cf\u5730\u8fd1\uff0c\u5c3d\u91cf\u51cf\u5c11\u6d4b\u8bd5\u7535\u6d41\u5728\u7ebf\u8def\u4e0a\u4ea7\u751f\u7684\u5206\u538b\uff0c\u63d0\u9ad8 Wh \u6570\u7684\u6d4b\u91cf\u7cbe\u5ea6\u3002<\/p>\n<p><a href=\"http:\/\/blog.dword1511.info\/wp-uploads\/2012\/09\/P1100242.jpg\"><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-medium wp-image-2712\" title=\"P1100242\" src=\"http:\/\/blog.dword1511.info\/wp-uploads\/2012\/09\/P1100242-400x300.jpg\" alt=\"\" width=\"400\" height=\"300\" srcset=\"http:\/\/blog.dword1511.info\/wp-uploads\/2012\/09\/P1100242-400x300.jpg 400w, http:\/\/blog.dword1511.info\/wp-uploads\/2012\/09\/P1100242-1024x768.jpg 1024w, http:\/\/blog.dword1511.info\/wp-uploads\/2012\/09\/P1100242.jpg 2048w\" sizes=\"(max-width: 400px) 100vw, 400px\" \/><\/a><\/p>\n<p>\u677f\u5b50\u4ee5\u94dc\u516d\u89d2\u56db\u4e2a\u652f\u6491\uff0c\u4ee5\u4fbf\u4f7f\u7528\uff1b\u4fdd\u7559\u4e86 ISP \u63a5\u53e3\uff0c\u53ef\u4ee5\u968f\u65f6\u4fee\u6539\u7a0b\u5e8f\u3002<\/p>\n<p><a href=\"http:\/\/blog.dword1511.info\/wp-uploads\/2012\/09\/P1100243.jpg\"><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-medium wp-image-2713\" title=\"P1100243\" src=\"http:\/\/blog.dword1511.info\/wp-uploads\/2012\/09\/P1100243-400x300.jpg\" alt=\"\" width=\"400\" height=\"300\" srcset=\"http:\/\/blog.dword1511.info\/wp-uploads\/2012\/09\/P1100243-400x300.jpg 400w, http:\/\/blog.dword1511.info\/wp-uploads\/2012\/09\/P1100243-1024x768.jpg 1024w, http:\/\/blog.dword1511.info\/wp-uploads\/2012\/09\/P1100243.jpg 1600w\" sizes=\"(max-width: 400px) 100vw, 400px\" \/><\/a><\/p>\n<p>\u590d\u4f4d\u540e\u7684\u663e\u793a\u3002\u4f7f\u7528\u65f6\u5148\u5c06\u5f85\u6d4b\u7535\u6c60\u5b8c\u5168\u5145\u6ee1\uff0c\u7136\u540e\u8fde\u63a5\u4e0a\u7535\u91cf\u8ba1\u7684\u7535\u6e90\uff0c\u518d\u5c06\u5f85\u6d4b\u7535\u6c60\u8fde\u63a5\u5728\u6d4b\u8bd5\u63a5\u53e3\u4e0a\uff0c\u9ec4\u706f\u5f00\u59cb\u95ea\u70c1\uff0c\u6d4b\u8bd5\u5c31\u5f00\u59cb\u4e86\u3002\u7b49\u5230\u9ec4\u706f\u4e0d\u518d\u95ea\u70c1\u540e\u6d4b\u8bd5\u5b8c\u6210\uff0c\u5c4f\u5e55\u4e0a\u663e\u793a\u7684 mAh \u548c Wh \u4fe1\u606f\u4e3a\u7535\u6c60\u7684\u5bb9\u91cf\u3002<\/p>\n<p><a href=\"http:\/\/blog.dword1511.info\/wp-uploads\/2012\/09\/P1100244.jpg\"><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-medium wp-image-2714\" title=\"P1100244\" src=\"http:\/\/blog.dword1511.info\/wp-uploads\/2012\/09\/P1100244-400x300.jpg\" alt=\"\" width=\"400\" height=\"300\" srcset=\"http:\/\/blog.dword1511.info\/wp-uploads\/2012\/09\/P1100244-400x300.jpg 400w, http:\/\/blog.dword1511.info\/wp-uploads\/2012\/09\/P1100244-1024x768.jpg 1024w\" sizes=\"(max-width: 400px) 100vw, 400px\" \/><\/a><\/p>\n<p>Battery benchmark in Action\uff01<\/p>\n<p><a href=\"http:\/\/blog.dword1511.info\/wp-uploads\/2012\/09\/P1100245.jpg\"><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-medium wp-image-2715\" title=\"P1100245\" src=\"http:\/\/blog.dword1511.info\/wp-uploads\/2012\/09\/P1100245-400x300.jpg\" alt=\"\" width=\"400\" height=\"300\" srcset=\"http:\/\/blog.dword1511.info\/wp-uploads\/2012\/09\/P1100245-400x300.jpg 400w, http:\/\/blog.dword1511.info\/wp-uploads\/2012\/09\/P1100245-1024x768.jpg 1024w\" sizes=\"(max-width: 400px) 100vw, 400px\" \/><\/a><\/p>\n<p>\u4e3a\u4e86\u65b9\u4fbf\u4f7f\u7528\uff0c\u4f60\u8fd8\u9700\u8981\u4e00\u4e9b\u5939\u5177\u3002\u4f60\u53ef\u4ee5\u7528\u5e9f\u5f03\u7684\u4e07\u80fd\u5145\u5916\u58f3\u6765\u505a\u624b\u673a\u7535\u6c60\u7684\u5939\u5177\uff08\u4ffa\u4e70\u54c1\u80dc\u7684\u8fd9\u4e2a\u50bb\u5145\u5c31\u662f\u4e3a\u4e86\u8fd9\u4e2a\u58f3\u5b50\uff0c\u4e0d\u8fc7\u4e8b\u540e\u4e00\u60f3\u5b8c\u5168\u53ef\u4ee5\u53bb\u6279\u4e00\u5806\u5c71\u5be8\u8d27\u56de\u6765\u561b\uff09\uff0c\u6216\u8005\u6dd8\u4e2a 18650 \u7535\u6c60\u76d2\uff0c\u52a0\u4e0a\u5e9f\u7535\u6c60\u91cc\u9762\u62c6\u4e0b\u6765\u7684\u4fdd\u62a4\u677f\u7ec4\u6210\u4e00\u4e2a 18650 \u7535\u82af\u6d4b\u8bd5\u5ea7\uff08\u6ce8\u610f\u8fd9\u91cc\u4e00\u5b9a\u9700\u8981\u4fdd\u62a4\u677f\uff0c\u5426\u5219\u7535\u82af\u4f1a\u8fc7\u653e\uff0c\u9020\u6210\u6c38\u4e45\u7684\u635f\u4f24\uff09\u3002\u4e4b\u524d\u7684\u300a<a href=\"http:\/\/blog.dword1511.info\/?p=1481\" target=\"_blank\">\u574f\u6389\u7684 Acer AS4741G \u7535\u6c60\u62c6\u89e3\u4e0e\u5206\u6790<\/a>\u300b\u5c31\u662f\u7528\u8fd9\u5957\u4e1c\u897f\u5b8c\u6210\u7684\u3002<\/p>\n<p>\u81f3\u4e8e\u8fd9\u73a9\u610f\u51c6\u4e0d\u51c6\uff0c\u6211\u5012\u662f\u60f3\u529e\u6cd5\u505a\u4e86\u70b9\u5b9e\u9a8c\u3002\u7531\u4e8e\u6ca1\u6709\u522b\u7684\u4e13\u4e1a\u8bbe\u5907\uff0c\u6211\u53ea\u80fd\u901a\u8fc7 Nokia 6120c \u4e0a\u7684 Energy Profiler \u4ee5\u53ca\u4e00\u53ea Nokia \u539f\u88c5\u7684 BL-5B \u6765\u9a8c\u8bc1\u4e86\u3002\u6839\u636e\u51e0\u6b21\u6d4b\u8bd5\u7684\u7ed3\u679c\uff0c\u81ea\u5236\u7684\u7535\u91cf\u8ba1\u8ddf Nokia Energy Profiler \u5f97\u51fa\u7684\u7ed3\u679c\u6ca1\u6709\u660e\u663e\u7684\u51fa\u5165\uff08\u6700\u591a 20 mAh \/ 890mAh \uff09\u3002\u53e6\u5916\uff0c\u5bf9\u4e8e\u4e00\u4e9b\u54c1\u724c\u7684\u5168\u65b0\u7535\u6c60\uff0c\u8fd9\u53ea\u7535\u91cf\u8ba1\u6d4b\u5f97\u7684\u5bb9\u91cf\u548c\u6807\u79f0\u503c\u63a5\u8fd1\uff0c\u800c\u4e14\u591a\u6b21\u6d4b\u91cf\u540e\u7ed3\u679c\u6ca1\u6709\u5f88\u5927\u7684\u6d6e\u52a8\uff0c\u6240\u4ee5\u53ef\u4ee5\u6682\u65f6\u8ba4\u4e3a\u8fd9\u4e1c\u897f\u662f\u6bd4\u8f83\u9760\u8c31\u7684\u3002<\/p>\n<p>\u8fd9\u673a\u5668\u7684\u8bef\u5dee\u4e3b\u8981\u8ddf\u8d1f\u8f7d\u7535\u963b\u7684\u963b\u503c\u4ee5\u53ca\u5355\u7247\u673a\u7247\u4e0a\u7684 RC \u65f6\u949f\u6e90\u7684\u6e29\u6f02\u6709\u5173\uff0c\u800c\u8fd9\u4e24\u8005\u4e3b\u8981\u8ddf\u73af\u5883\u6e29\u5ea6\u6709\u5173\u7cfb\u3002\u6240\u4ee5\uff0c\u5982\u679c\u53ef\u80fd\u7684\u8bdd\u53ef\u4ee5\u8003\u8651\u5728\u6e29\u5ea6\u6052\u5b9a\u7684\u73af\u5883\u4e0b\u6d4b\u8bd5\u3002\u7531\u4e8e\u677f\u5b50\u672c\u8eab\u7684 IO \u53e3\u5206\u914d\uff0c\u5728\u8fd9\u5757\u677f\u5b50\u4e0a\u6ca1\u529e\u6cd5\u4f7f\u7528\u4f4e\u6e29\u6f02\u7684\u6676\u4f53\u632f\u8361\u5668\u3002<\/p>\n<hr \/>\n<p><strong>\u6700\u540e\uff0c\u5949\u4e0a\u5355\u7247\u673a\u91cc\u9762\u7684\u4ee3\u7801\u3002\u4e3a\u4e86\u5077\u61d2\uff0c\u6309\u952e\u7528\u4e2d\u65ad\u5904\u7406\u4e86\uff0c\u4f46\u662f\u5b9e\u9645\u4e0a\u4f60\u5e94\u8be5\u5728\u7a0b\u5e8f\u4e3b\u5faa\u73af\u91cc\u9762\u5904\u7406\u5b83\u3002\u53e6\u5916\u540c\u6837\u4e3a\u4e86\u5077\u61d2\uff0c\u5728\u8fd9\u91cc\u6211\u7528\u4e86 sprintf \uff0c\u5982\u679c\u4f60\u80fd\u82b1\u65f6\u95f4\u81ea\u5df1\u6784\u5efa\u4e00\u4e9b\u7b80\u5355\u7684\u5b57\u7b26\u4e32\u683c\u5f0f\u5316\u51fd\u6570\uff0c\u90a3\u4e48\u4f60\u7684\u76ee\u6807\u4ee3\u7801\u5c06\u6bd4\u6211\u7684\u5c0f\u5f97\u591a\uff08\u6211\u7684\u7ea6\u4e3a 4.5KB \uff09\u3002\u5f53\u7136\uff0c\u6700\u540e\u4ecd\u7136\u662f\u4e3a\u4e86\u5077\u61d2\uff0c\u6211\u628a\u51fd\u6570\u4f53\u76f4\u63a5\u5199\u5728\u4e86\u5934\u6587\u4ef6\u91cc\uff0c\u8fd9\u6837\u662f\u4e0d\u5bf9\u7684\uff0c\u8bf7\u52ff\u6a21\u4eff\u3002<\/strong><\/p>\n<p>\u4e3b\u7a0b\u5e8f\uff1abattbench.c<\/p>\n<p>\u8fd9\u91cc\u7528\u4e86\u4e00\u7cfb\u5217 MEGA88PA \u91cc\u9762\u7279\u6709\u7684\u529f\u80fd\u6765\u5b8c\u6210\u7535\u6e90\u7ba1\u7406\uff0c\u51cf\u5c0f\u529f\u7387\u3002\u8001\u4e00\u70b9\u7684 MEGA8 \u53ef\u80fd\u6ca1\u6709\u8fd9\u4e9b\u529f\u80fd\u3002<\/p>\n<pre class=\"brush: cpp; title: \u4ee3\u7801; notranslate\" title=\"\u4ee3\u7801\">\r\n#include &quot;include\/adc.h&quot;\r\n#include &quot;include\/lcdascii.h&quot;\r\n#include &quot;include\/intandled.h&quot;\r\n#include &quot;include\/common.h&quot;\r\n#include &lt;avr\/power.h&gt;\r\n#include &lt;avr\/wdt.h&gt;\r\n#include &lt;stdio.h&gt;\r\n\r\n\/* TODO:\r\n * 1. Add BATT selection(4.2 - 3.3V, 4.2 - 2.7V, 1.4 - 0.9V)\r\n * 2. Add RLOAD settings\r\n *\/\r\n\r\n\/* Current load: 30.7 ohm @ working temp *\/\r\n#define RLOAD 30700 \/* Load resistance, mohm *\/\r\n#define VMIN 3299   \/* Stop at voltage, mv   *\/\r\n#define MFREQ 4     \/* Sampling rate,   Hz   *\/\r\n\r\nvolatile uint8_t updinf;\r\nuint32_t mas = 0;\r\nuint32_t mws = 0;\r\nuint32_t adcmv = 0;\r\nchar strbuf[LCD_WCOL + 1];\r\nuint32_t tcount = 0;\r\nuint8_t intcyc = 0;\r\n\r\nvoid update_info(void) {\r\n  updinf = 1;\r\n  LCD_write_english_string(0, 0, &quot;BATT Benchmark&quot;);\r\n  \/* dmah = mas \/ 3600 * 10 = mas \/ 360 *\/\r\n  sprintf(strbuf, &quot;%4lu.%02lu mAh&quot;, (mas \/ 36) \/ 100, (mas \/ 36) % 100);\r\n  LCD_write_english_string(0, 1, strbuf);\r\n  sprintf(strbuf, &quot;%4lu.%02lu Wh&quot;, (mws \/ 3600) \/ 1000, ((mws \/ 3600) % 1000) \/ 10);\r\n  LCD_write_english_string(0, 2, strbuf);\r\n  sprintf(strbuf, &quot;%4lu.%02lu V&quot;, adcmv \/ 1000, (adcmv % 1000) \/ 10);\r\n  LCD_write_english_string(0, 3, strbuf);\r\n  sprintf(strbuf, &quot;%7lu mA&quot;, (adcmv * 1000) \/ RLOAD);\r\n  LCD_write_english_string(0, 4, strbuf);\r\n  sprintf(strbuf, &quot;%4lu:%02lu MM:SS&quot;, tcount \/ (4 * 60), (tcount % (4 * 60)) \/ 4);\r\n  LCD_write_english_string(0, 5, strbuf);\r\n  updinf = 0;\r\n}\r\n\r\nEMPTY_INTERRUPT(INT1_vect)\r\n\r\nISR(INT0_vect) {\r\n  \/* provides a way to recover LCD in case it is messed up *\/\r\n  if(updinf == 0) LCD_init(); \/* re-initialize LCD as user request *\/\r\n}\r\n\r\nISR(TIMER1_COMPA_vect) {\r\n  adcmv = ADC_read_mvolts();\r\n  if(adcmv &gt; VMIN) {\r\n    mas += (adcmv * (1000 \/ MFREQ)) \/ RLOAD;\r\n    mws += ((adcmv * adcmv) \/ RLOAD) \/ MFREQ;\r\n    tcount++;\r\n  }\r\n  intcyc++;\r\n  if(intcyc % MFREQ == 0) update_info();\r\n  if(intcyc % 2 == 0 &amp;&amp; adcmv &gt; VMIN) LED_ON();\r\n  else LED_OFF();\r\n}\r\n\r\nint main(void) {\r\n  LCD_init();\r\n  KL_init();\r\n  power_timer0_disable();\r\n  power_timer2_disable();\r\n  power_twi_disable();\r\n  power_usart0_disable();\r\n  wdt_disable();\r\n  ADC_init_ch(7); \/* ADC7 is specially designed for battery voltage measurement *\/\r\n  update_info();\r\n  cli();\r\n  SETBIT(TCCR1B, CS12);  \/* set timer prescaler to 256 *\/\r\n  SETBIT(TCCR1B, WGM12); \/* waveform configuration *\/\r\n  OCR1A = (uint16_t)(F_CPU \/ (MFREQ * 256));\r\n  SETBIT(TIMSK1, OCIE1A); \/* Output Compare Interrupt Enable (timer 1, OCR1A) *\/\r\n  _delay_ms(500);\r\n  sei(); \/* Set Enable Interrupts *\/\r\n  while(1);\r\n  return 0;\r\n}\r\n<\/pre>\n<p>ADC \u51fd\u6570\u5e93\uff1ainclude\/adc.h<\/p>\n<pre class=\"brush: cpp; title: \u4ee3\u7801; notranslate\" title=\"\u4ee3\u7801\">\r\n\r\n#ifndef __ADC_H__\r\n#define __ADC_H__\r\n\r\n#include &quot;include\/common.h&quot;\r\n#include &lt;avr\/interrupt.h&gt;\r\n\r\n#define ADC0 0b000\r\n#define ADC1 0b001\r\n#define ADC2 0b010\r\n#define ADC3 0b011\r\n#define ADC4 0b100\r\n#define ADC5 0b101\r\n#define ADC6 0b110\r\n#define ADC7 0b111\r\n#define AVREF 1100 \/* In mini-volts *\/\r\n\r\n\/* Function declarations *\/\r\nvoid ADC_init(void);\r\nvoid ADC_init_ch(uint8_t channel);\r\nuint16_t ADC_read_raw(void);\r\nuint16_t ADC_read_mvolts(void);\r\nuint16_t ADC_read_ch(uint8_t ch);\r\n\r\n\/* Functions *\/\r\n\r\n\/**********************************\r\n * ADC_init:\r\n *   Initialize ADC with selected\r\n *   channel. Can also be used to\r\n *   switch between channels.\r\n * Parameters:\r\n *   channel: Select ADC 0 - 7\r\n * Range:\r\n *   channel: 0 - 7\r\n *********************************\/\r\nvoid ADC_init_ch(uint8_t channel) {\r\n  \/\/ If channel is valid we should switch to it and continue\r\n  if(channel &gt; 7) return;\r\n  cli();\r\n  CLEARBIT(ADCSRA, ADEN);\r\n  ADMUX |= channel;\r\n\r\n  \/\/ Internal 2.65V reference with capacitor on pin AVref enabled\r\n  SETBIT(ADMUX, REFS0);\r\n  SETBIT(ADMUX, REFS1);\r\n\r\n  \/\/ Clock \/ 128 speed for highest accuracy\r\n  SETBIT(ADCSRA, ADPS0);\r\n  SETBIT(ADCSRA, ADPS1);\r\n  SETBIT(ADCSRA, ADPS2);\r\n\r\n  \/\/ Enable ADC\r\n  SETBIT(ADCSRA, ADEN);\r\n\r\n  \/\/ Reset ADC\r\n  CLEARBIT(ADCSRA, ADIE);\r\n  CLEARBIT(ADCSRA, ADIF);\r\n  CLEARBIT(ADCSRA, ADSC);\r\n\r\n  sei();\r\n}\r\n\r\nvoid ADC_init(void) {\r\n  \/\/ Internal 2.65V reference with capacitor on pin AVref enabled\r\n  SETBIT(ADMUX, REFS0);\r\n  SETBIT(ADMUX, REFS1);\r\n\r\n  \/\/ Clock \/ 128 speed for highest accuracy\r\n  SETBIT(ADCSRA, ADPS0);\r\n  SETBIT(ADCSRA, ADPS1);\r\n  SETBIT(ADCSRA, ADPS2);\r\n\r\n  \/\/ Enable ADC\r\n  SETBIT(ADCSRA, ADEN);\r\n}\r\n\r\nuint16_t ADC_read_raw(void) {\r\n  SETBIT(ADCSRA, ADSC);\r\n  while(CHECKBIT(ADCSRA, ADIF) == 0);\r\n  return ADC;\r\n}\r\n\r\nuint16_t ADC_read_mvolts(void) {\r\n  uint16_t adcr = ADC_read_raw();\r\n  if((ADMUX &amp; 7) == 7) {\r\n    adcr = (((uint32_t)adcr) * AVREF) &gt;&gt; 7;\r\n    adcr -= adcr &gt;&gt; 4;\r\n    adcr -= adcr &gt;&gt; 6;\r\n    adcr -= adcr &gt;&gt; 7;\r\n  }\r\n  else adcr = (((uint32_t)adcr) * AVREF) &gt;&gt; 10;\r\n  adcr += adcr \/ 20; \/* Simple but effective calibration *\/\r\n  return adcr;\r\n}\r\n\r\nuint16_t ADC_read_ch(uint8_t ch) {\r\n  \/* Select ADC Channel ch must be 0 - 7 *\/\r\n  ch &amp;= 0b00000111;\r\n  ADMUX &amp;= 0b11100000;\r\n  SETV(ADMUX, ch);\r\n\r\n  \/* Start Single conversion *\/\r\n  SETBIT(ADCSRA, ADSC);\r\n\r\n  \/* Wait for conversion to complete *\/\r\n  while(!(CHECKBIT(ADCSRA, ADIF)));\r\n\r\n  \/***********************************\r\n   * Clear ADIF by writing one to it\r\n   * Note you may be wondering why we have write one to clear it\r\n   * This is standard way of clearing bits in io as said in datasheets.\r\n   * The code writes '1' but it result in setting bit to '0' !!!\r\n   ***********************************\/\r\n  SETBIT(ADCSRA, ADIF);\r\n\r\n  return(ADC);\r\n}\r\n\r\n#endif \/* __ADC_H__ *\/\r\n<\/pre>\n<p>\u901a\u7528\u5b8f\u5e93\uff1ainclude\/common.h<\/p>\n<pre class=\"brush: cpp; title: \u4ee3\u7801; notranslate\" title=\"\u4ee3\u7801\">\r\n#ifndef __M85110_COMMON_H__\r\n#define __M85110_COMMON_H__\r\n\r\n\/* Includes *\/\r\n#include &lt;avr\/io.h&gt;\r\n\/* #include &lt;avr\/pgmspace.h&gt; in case that program needs to read itself. *\/\r\n#include &lt;util\/delay.h&gt;\r\n\r\n\/* Macros *\/\r\n#define BIT7 0x80\r\n#define BIT6 0x40\r\n#define BIT5 0x20\r\n#define BIT4 0x10\r\n#define BIT3 0x08\r\n#define BIT2 0x04\r\n#define BIT1 0x02\r\n#define BIT0 0x01\r\n#define BIT(x) (1 &lt;&lt; (x))\r\n#define SETBIT(x, y) (x |= BIT(y))\r\n#define CLEARBIT(x, y) (x &amp;= ~ BIT(y))\r\n#define CHECKBIT(x, y) (x &amp; BIT(y))\r\n#define SETV(x, y) (x |= y)\r\n#define CLEARV(x, y) (x &amp;= ~y)\r\n#define CHECKV(x, y) (x &amp; y)\r\n#define SLEEP() asm(&quot;sleep&quot;)\r\n\r\n#endif \/* __M85110_COMMON_H__ *\/\r\n<\/pre>\n<p>\u4e2d\u65ad\u3001\u6309\u952e\u4e0e\u6307\u793a\u706f\u51fd\u6570\u5e93\uff1ainclude\/intandled.h<\/p>\n<pre class=\"brush: cpp; title: \u4ee3\u7801; notranslate\" title=\"\u4ee3\u7801\">\r\n#ifndef __INTnLED_H__\r\n#define __INTnLED_H__\r\n\r\n#include &quot;include\/common.h&quot;\r\n#include &lt;avr\/interrupt.h&gt;\r\n\r\n\/* IO pins setup  *\/\r\n#define IOPORT PORTD\r\n#define IODIR DDRD\r\n#define INT_0 2\r\n#define INT_1 3\r\n#define LED_USER 6\r\n\r\n\/* Macros *\/\r\n#define LED_ON() (CLEARBIT(PORTD, LED_USER))\r\n#define LED_OFF() (SETBIT(PORTD, LED_USER))\r\n\r\n#ifndef INT_EXCEPTION_HANDLER\r\nEMPTY_INTERRUPT(__vector_default)\r\n#endif\r\n\r\nvoid KL_init(void) {\r\n  cli();\r\n\r\n  \/* Internal resistor \/ Charge before input *\/\r\n  SETBIT(IOPORT, INT_0);\r\n  SETBIT(IOPORT, INT_1);\r\n\r\n  \/* Charge the de-bounce capacitor *\/\r\n  \/* t = RC = 20kohm * 10uF = 200ms *\/\r\n  \/* When IO port is configured as  *\/\r\n  \/* Output, Ro is not known.       *\/\r\n  _delay_ms(10);\r\n\r\n  \/* Set input mode *\/\r\n  CLEARBIT(IODIR, INT_0);\r\n  CLEARBIT(IODIR, INT_1);\r\n\r\n  \/* LED output *\/\r\n  SETBIT(IODIR, LED_USER);\r\n  LED_ON();\r\n\r\n  \/* Rising-edge-triggered INT0 and INT1 *\/\r\n  SETBIT(EICRA, ISC00);\r\n  SETBIT(EICRA, ISC10);\r\n  SETBIT(EICRA, ISC01);\r\n  SETBIT(EICRA, ISC11);\r\n\r\n  \/* Enable INT0 and INT1 *\/\r\n  SETBIT(EIMSK, INT0);\r\n  SETBIT(EIMSK, INT1);\r\n\r\n  sei();\r\n}\r\n\r\n#endif \/* __INTnLED_H__ *\/\r\n<\/pre>\n<p>LCD \u5b57\u4f53\u548c\u6e32\u67d3\u51fd\u6570\u5e93\uff1ainclude\/lcdascii.h<\/p>\n<pre class=\"brush: cpp; title: \u4ee3\u7801; notranslate\" title=\"\u4ee3\u7801\">\r\n#ifndef __LCD_ASCII_H__\r\n#define __LCD_ASCII_H__\r\n\r\n#include &quot;include\/common.h&quot;\r\n#include &quot;include\/pcd8544.h&quot;\r\n#include &lt;avr\/pgmspace.h&gt;\r\n\r\n\/**********************************\r\n * 6 x 8 font\r\n * 1 pixel space at left and bottom\r\n * index = ASCII - 32\r\n **********************************\/\r\n\r\nconst uint8_t asciifont[][6] PROGMEM = {\r\n  { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, \/* ' ' *\/\r\n  { 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00 }, \/* '!' *\/\r\n  { 0x00, 0x00, 0x07, 0x00, 0x07, 0x00 }, \/* '&quot;' *\/\r\n  { 0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14 }, \/* '#' *\/\r\n  { 0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12 }, \/* '$' *\/\r\n  { 0x00, 0x62, 0x64, 0x08, 0x13, 0x23 }, \/* '%' *\/\r\n  { 0x00, 0x36, 0x49, 0x55, 0x22, 0x50 }, \/* '&amp;' *\/\r\n  { 0x00, 0x00, 0x05, 0x03, 0x00, 0x00 }, \/* ''' *\/\r\n  { 0x00, 0x00, 0x1c, 0x22, 0x41, 0x00 }, \/* '(' *\/\r\n  { 0x00, 0x00, 0x41, 0x22, 0x1c, 0x00 }, \/* ')' *\/\r\n  { 0x00, 0x14, 0x08, 0x3E, 0x08, 0x14 }, \/* '*' *\/\r\n  { 0x00, 0x08, 0x08, 0x3E, 0x08, 0x08 }, \/* '+' *\/\r\n  { 0x00, 0x00, 0x00, 0x50, 0x30, 0x00 }, \/* ',' *\/\r\n  { 0x00, 0x08, 0x08, 0x08, 0x08, 0x08 }, \/* '-' *\/\r\n  { 0x00, 0x00, 0x60, 0x60, 0x00, 0x00 }, \/* '.' *\/\r\n  { 0x00, 0x20, 0x10, 0x08, 0x04, 0x02 }, \/* '\/' *\/\r\n  { 0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E }, \/* '0' *\/\r\n  { 0x00, 0x00, 0x42, 0x7F, 0x40, 0x00 }, \/* '1' *\/\r\n  { 0x00, 0x42, 0x61, 0x51, 0x49, 0x46 }, \/* '2' *\/\r\n  { 0x00, 0x21, 0x41, 0x45, 0x4B, 0x31 }, \/* '3' *\/\r\n  { 0x00, 0x18, 0x14, 0x12, 0x7F, 0x10 }, \/* '4' *\/\r\n  { 0x00, 0x27, 0x45, 0x45, 0x45, 0x39 }, \/* '5' *\/\r\n  { 0x00, 0x3C, 0x4A, 0x49, 0x49, 0x30 }, \/* '6' *\/\r\n  { 0x00, 0x01, 0x71, 0x09, 0x05, 0x03 }, \/* '7' *\/\r\n  { 0x00, 0x36, 0x49, 0x49, 0x49, 0x36 }, \/* '8' *\/\r\n  { 0x00, 0x06, 0x49, 0x49, 0x29, 0x1E }, \/* '9' *\/\r\n  { 0x00, 0x00, 0x36, 0x36, 0x00, 0x00 }, \/* ':' *\/\r\n  { 0x00, 0x00, 0x56, 0x36, 0x00, 0x00 }, \/* ';' *\/\r\n  { 0x00, 0x08, 0x14, 0x22, 0x41, 0x00 }, \/* '&lt;' *\/\r\n  { 0x00, 0x14, 0x14, 0x14, 0x14, 0x14 }, \/* '=' *\/\r\n  { 0x00, 0x00, 0x41, 0x22, 0x14, 0x08 }, \/* '&gt;' *\/\r\n  { 0x00, 0x02, 0x01, 0x51, 0x09, 0x06 }, \/* '?' *\/\r\n  { 0x00, 0x3E, 0x41, 0x4D, 0x52, 0x5E }, \/* '@' *\/\r\n  { 0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C }, \/* 'A' *\/\r\n  { 0x00, 0x7F, 0x49, 0x49, 0x49, 0x36 }, \/* 'B' *\/\r\n  { 0x00, 0x3E, 0x41, 0x41, 0x41, 0x22 }, \/* 'C' *\/\r\n  { 0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C }, \/* 'D' *\/\r\n  { 0x00, 0x7F, 0x49, 0x49, 0x49, 0x41 }, \/* 'E' *\/\r\n  { 0x00, 0x7F, 0x09, 0x09, 0x09, 0x01 }, \/* 'F' *\/\r\n  { 0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A }, \/* 'G' *\/\r\n  { 0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F }, \/* 'H' *\/\r\n  { 0x00, 0x00, 0x41, 0x7F, 0x41, 0x00 }, \/* 'I' *\/\r\n  { 0x00, 0x20, 0x40, 0x41, 0x3F, 0x01 }, \/* 'J' *\/\r\n  { 0x00, 0x7F, 0x08, 0x14, 0x22, 0x41 }, \/* 'K' *\/\r\n  { 0x00, 0x7F, 0x40, 0x40, 0x40, 0x40 }, \/* 'L' *\/\r\n  { 0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F }, \/* 'M' *\/\r\n  { 0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F }, \/* 'N' *\/\r\n  { 0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E }, \/* 'O' *\/\r\n  { 0x00, 0x7F, 0x09, 0x09, 0x09, 0x06 }, \/* 'P' *\/\r\n  { 0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E }, \/* 'Q' *\/\r\n  { 0x00, 0x7F, 0x09, 0x19, 0x29, 0x46 }, \/* 'R' *\/\r\n  { 0x00, 0x46, 0x49, 0x49, 0x49, 0x31 }, \/* 'S' *\/\r\n  { 0x00, 0x01, 0x01, 0x7F, 0x01, 0x01 }, \/* 'T' *\/\r\n  { 0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F }, \/* 'U' *\/\r\n  { 0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F }, \/* 'V' *\/\r\n  { 0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F }, \/* 'W' *\/\r\n  { 0x00, 0x63, 0x14, 0x08, 0x14, 0x63 }, \/* 'X' *\/\r\n  { 0x00, 0x07, 0x08, 0x70, 0x08, 0x07 }, \/* 'Y' *\/\r\n  { 0x00, 0x61, 0x51, 0x49, 0x45, 0x43 }, \/* 'Z' *\/\r\n  { 0x00, 0x00, 0x7F, 0x41, 0x41, 0x00 }, \/* '[' *\/\r\n  { 0x00, 0x02, 0x04, 0x08, 0x10, 0x20 }, \/* '\\' *\/\r\n  { 0x00, 0x00, 0x41, 0x41, 0x7F, 0x00 }, \/* ']' *\/\r\n  { 0x00, 0x04, 0x02, 0x01, 0x02, 0x04 }, \/* '^' *\/\r\n  { 0x00, 0x40, 0x40, 0x40, 0x40, 0x40 }, \/* '_' *\/\r\n  { 0x00, 0x00, 0x01, 0x02, 0x04, 0x00 }, \/* '`' *\/\r\n  { 0x00, 0x20, 0x54, 0x54, 0x54, 0x78 }, \/* 'a' *\/\r\n  { 0x00, 0x7F, 0x48, 0x44, 0x44, 0x38 }, \/* 'b' *\/\r\n  { 0x00, 0x38, 0x44, 0x44, 0x44, 0x20 }, \/* 'c' *\/\r\n  { 0x00, 0x38, 0x44, 0x44, 0x48, 0x7F }, \/* 'd' *\/\r\n  { 0x00, 0x38, 0x54, 0x54, 0x54, 0x18 }, \/* 'e' *\/\r\n  { 0x00, 0x08, 0x7E, 0x09, 0x01, 0x02 }, \/* 'f' *\/\r\n  { 0x00, 0x0C, 0x52, 0x52, 0x52, 0x3E }, \/* 'g' *\/\r\n  { 0x00, 0x7F, 0x08, 0x04, 0x04, 0x78 }, \/* 'h' *\/\r\n  { 0x00, 0x00, 0x44, 0x7D, 0x40, 0x00 }, \/* 'i' *\/\r\n  { 0x00, 0x20, 0x40, 0x44, 0x3D, 0x00 }, \/* 'j' *\/\r\n  { 0x00, 0x7F, 0x10, 0x28, 0x44, 0x00 }, \/* 'k' *\/\r\n  { 0x00, 0x00, 0x41, 0x7F, 0x40, 0x00 }, \/* 'l' *\/\r\n  { 0x00, 0x7C, 0x04, 0x18, 0x04, 0x78 }, \/* 'm' *\/\r\n  { 0x00, 0x7C, 0x08, 0x04, 0x04, 0x78 }, \/* 'n' *\/\r\n  { 0x00, 0x38, 0x44, 0x44, 0x44, 0x38 }, \/* 'o' *\/\r\n  { 0x00, 0x7E, 0x14, 0x12, 0x12, 0x0C }, \/* 'p' *\/\r\n  { 0x00, 0x0C, 0x12, 0x12, 0x0A, 0x7E }, \/* 'q' *\/\r\n  { 0x00, 0x7C, 0x08, 0x04, 0x04, 0x08 }, \/* 'r' *\/\r\n  { 0x00, 0x48, 0x54, 0x54, 0x54, 0x20 }, \/* 's' *\/\r\n  { 0x00, 0x04, 0x3F, 0x44, 0x40, 0x20 }, \/* 't' *\/\r\n  { 0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C }, \/* 'u' *\/\r\n  { 0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C }, \/* 'v' *\/\r\n  { 0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C }, \/* 'w' *\/\r\n  { 0x00, 0x44, 0x28, 0x10, 0x28, 0x44 }, \/* 'x' *\/\r\n  { 0x00, 0x06, 0x48, 0x48, 0x44, 0x3E }, \/* 'y' *\/\r\n  { 0x00, 0x44, 0x64, 0x54, 0x4C, 0x44 }, \/* 'z' *\/\r\n  { 0x00, 0x08, 0x36, 0x41, 0x41, 0x00 }, \/* '{' *\/\r\n  { 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00 }, \/* '|' *\/\r\n  { 0x00, 0x41, 0x41, 0x36, 0x08, 0x00 }, \/* '}' *\/\r\n  { 0x04, 0x02, 0x02, 0x04, 0x04, 0x02 }, \/* '~' *\/\r\n};\r\n\r\nPGM_P font6x8 PROGMEM = asciifont;\r\n\r\n\/* Function declarations *\/\r\nvoid LCD_write_char(uint8_t c);\r\nvoid LCD_write_english_string(uint8_t X, uint8_t Y, char *s);\r\n\r\n\/* Functions *\/\r\n\r\nvoid LCD_write_char(uint8_t c) {\r\n  c -= 32;\r\n  LCD_write_byte(pgm_read_byte(font6x8 + c * 6), 1);\r\n  LCD_write_byte(pgm_read_byte(font6x8 + c * 6 + 1), 1);\r\n  LCD_write_byte(pgm_read_byte(font6x8 + c * 6 + 2), 1);\r\n  LCD_write_byte(pgm_read_byte(font6x8 + c * 6 + 3), 1);\r\n  LCD_write_byte(pgm_read_byte(font6x8 + c * 6 + 4), 1);\r\n  LCD_write_byte(pgm_read_byte(font6x8 + c * 6 + 5), 1);\r\n}\r\n\r\n\/**********************************\r\n * LCD_write_english_String:\r\n *   This function prints English\r\n *   (ASCII) strings on LCD, single\r\n *   line only.\r\n * Parameters:\r\n *   *s: The string.\r\n *   X, Y: Position of the string.\r\n * Range:\r\n *   X: 0 - 83\r\n *   Y: 0 - 5\r\n *********************************\/\r\nvoid LCD_write_english_string(uint8_t X, uint8_t Y, char *s) {\r\n  LCD_set_XY(X, Y);\r\n  while (*s) {\r\n    LCD_write_char(*s);\r\n    s++;\r\n  }\r\n}\r\n\r\n#endif \/* __LCD_ASCII_H__ *\/\r\n<\/pre>\n<p>LCD \u663e\u793a\u5c4f\u9a71\u52a8\u51fd\u6570\u5e93\uff1ainclude\/pcd8544.h<\/p>\n<pre class=\"brush: cpp; title: \u4ee3\u7801; notranslate\" title=\"\u4ee3\u7801\">\r\n#ifndef __PCD8544_H__\r\n#define __PCD8544_H__\r\n\r\n#include &quot;include\/common.h&quot;\r\n\r\n\/* IO pins defination *\/\r\n#define LCD_PORT PORTB\r\n#define LCD_DIR DDRB\r\n#define LCD_IN PINB\r\n#define SCLK 0\r\n#define SDIN 6\r\n#define LCD_DC 7\r\n\r\n#define LCD_PORT_AUX PORTD\r\n#define LCD_DIR_AUX DDRD\r\n#define LCD_IN_AUX PIND\r\n#define LCD_CE 0\r\n#define LCD_RST 1\r\n\r\n\/* LCD Size and ASCII Information *\/\r\n#define LCD_ROW 84\r\n#define LCD_LINE 48\r\n#define LCD_WLN 6\r\n#define LCD_WCOL 14\r\n#define LCD_RAM ((LCD_ROW * LCD_LINE) \/ 8)\r\n#define LCD_WORDS (LCD_WLN * LCD_WCOL)\r\n\r\n\/* Macros *\/\r\n#define ENABLE_LCD() (SETBIT(LCD_PORT_AUX, LCD_CE))\r\n#define DISABLE_LCD() (CLEARBIT(LCD_PORT_AUX, LCD_CE))\r\n\r\n\/* Function declarations *\/\r\nvoid LCD_init(void);\r\nvoid LCD_clear(void);\r\nvoid LCD_set_XY(uint8_t x, uint8_t y);\r\nvoid LCD_write_byte(uint8_t byte, uint8_t cmd);\r\n\r\n\/* Functions *\/\r\n\r\n\/**********************************\r\n * LCD_write_byte:\r\n *   Write data to LCD (Direct access)\r\n * Parameters:\r\n *   byte: The byte of data to write.\r\n *   cmd: Command mode true or false.\r\n *********************************\/\r\nvoid LCD_write_byte(uint8_t byte, uint8_t cmd) {\r\n  unsigned char i;\r\n  DISABLE_LCD();\r\n  if(cmd == 0) CLEARBIT(LCD_PORT,LCD_DC); \/* command mode, LCD_DC = 0 *\/\r\n  else SETBIT(LCD_PORT, LCD_DC); \/* data mode, LCD_DC = 1 *\/\r\n\r\n  for(i = 0; i &lt; 8; i++) {\r\n    if(byte &amp; 0x80) SETBIT(LCD_PORT, SDIN); \/* SDIN = 1 *\/\r\n    else CLEARBIT(LCD_PORT, SDIN); \/* SDIN = 0 *\/\r\n\r\n    CLEARBIT(LCD_PORT, SCLK); \/* SCLK = 0 *\/\r\n    byte = byte &lt;&lt; 1;\r\n    SETBIT(LCD_PORT, SCLK); \/* SCLK = 1 *\/\r\n  }\r\n\r\n  ENABLE_LCD();\r\n}\r\n\r\nvoid LCD_clear(void) {\r\n  unsigned int i;\r\n  LCD_write_byte(0x0c, 0); \r\n  LCD_write_byte(0x80, 0);\r\n  for(i = 0; i &lt; LCD_RAM; i++) LCD_write_byte(0, 1);\r\n}\r\n\r\nvoid LCD_set_XY(uint8_t X, uint8_t Y) {\r\n  LCD_write_byte(0x40 | Y, 0); \/* column *\/\r\n  LCD_write_byte(0x80 | X, 0); \/* row *\/\r\n}\r\n\r\nvoid LCD_init(void) {\r\n  DDRB = 0xFF;\r\n  PORTB = 0x3F;\r\n\r\n  \/* Switch to output *\/\r\n  SETBIT(LCD_DIR, SCLK);\r\n  SETBIT(LCD_DIR, SDIN);\r\n  SETBIT(LCD_DIR, LCD_DC);\r\n  SETBIT(LCD_DIR_AUX, LCD_CE);\r\n  SETBIT(LCD_DIR_AUX, LCD_RST);\r\n\r\n  \/* Reset LCD with a low pulse *\/\r\n  CLEARBIT(LCD_PORT_AUX, LCD_RST); \/* LCD_RST = 0 *\/\r\n  _delay_us(1);\r\n  SETBIT(LCD_PORT_AUX, LCD_RST); \/* LCD_RST = 1 *\/\r\n\r\n  \/* Disable and re-enable LCD *\/\r\n  DISABLE_LCD();\r\n  _delay_us(1);\r\n  ENABLE_LCD();\r\n  _delay_us(1);\r\n\r\n  \/* LCD Setup *\/\r\n  LCD_write_byte(0x21, 0); \/* Set LCD mode *\/\r\n  LCD_write_byte(0xc8, 0); \/* Set bias voltage *\/\r\n  LCD_write_byte(0x06, 0); \/* Thermal correction *\/\r\n  LCD_write_byte(0x16, 0); \/* 1:48 *\/\r\n  LCD_write_byte(0x20, 0); \/* Use basic commands *\/\r\n  LCD_clear();\r\n  LCD_write_byte(0x0c, 0); \/* Normal mode *\/\r\n\r\n  \/* Disable LCD *\/\r\n  DISABLE_LCD();\r\n}\r\n\r\n#endif \/* __PCD8544_H__ *\/\r\n<\/pre>\n<p>\u7f16\u8bd1\u811a\u672c\uff1aMakefile<\/p>\n<p>\u8fd9\u91cc\u9762\u5305\u542b\u4e86\u5bf9\u5e94\u7684\u7194\u4e1d\u4f4d\u7684\u8bbe\u7f6e\uff0cMakefile \u7684\u96cf\u5f62\u6765\u81ea\u4e8e<a href=\"http:\/\/www.ladyada.net\/make\/minipov2\/index.html\" target=\"_blank\"> ladyada \u7684 MiniPOV v2 \u9879\u76ee<\/a>\u3002\u7531\u4e8e avrdude \u7684\u6570\u636e\u5e93\u8f83\u8001\uff0c\u91cc\u9762\u6ca1\u6709 ATMEGA88PA \u7684\u4fe1\u606f\uff0c\u6240\u4ee5\u4f60\u9700\u8981\u628a avrdude.conf \u91cc\u9762\u6709\u5173 ATMEGA88 \u7684\u90e8\u5206\u590d\u5236\u4e00\u904d\uff0c\u5e76\u4e14\u4fee\u6539 part id \u3001description \u548c signature \uff0c\u6700\u540e\u628a\u4fee\u6539\u8fc7\u7684\u7248\u672c\u8ddf Makefile \u7f6e\u4e8e\u540c\u4e00\u76ee\u5f55\u3002<\/p>\n<pre class=\"brush: bash; title: \u4ee3\u7801; notranslate\" title=\"\u4ee3\u7801\">\r\nMCU = atmega88p\r\nF_CPU = 8000000   \t# 8 MHz\r\nAVRDUDE_PROGRAMMER = usbtiny\r\n\r\n# Default target.\r\nall: battbench.hex\r\n\r\n# Program the device w\/various programs\r\n\r\n# this is necessary if you're burning the AVR for the first time...\r\n# sets the proper fuse for 8MHz internal oscillator with no clk div\r\nburn-fuse:\r\n\t$(AVRDUDE) $(AVRDUDE_FLAGS) -u -U lfuse:w:0xe2:m -U hfuse:w:0xdd:m -U efuse:w:0x01:m\r\n\r\n# this programs the dependant hex file using our default avrdude flags\r\nprogram: battbench.hex\r\n\t$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH)$&lt;\r\n\r\nFORMAT = ihex \t\t# create a .hex file\r\n\r\nOPT = s\t\t\t# assembly-level optimization\r\n\r\n# Optional compiler flags.\r\n#  -g:        generate debugging information (for GDB, or for COFF conversion)\r\n#  -O*:       optimization level\r\n#  -f...:     tuning, see gcc manual and avr-libc documentation\r\n#  -Wall...:  warning level\r\n#  -Wa,...:   tell GCC to pass this to the assembler.\r\n#    -ahlms:  create assembler listing\r\nCFLAGS = -g -O$(OPT) \\\r\n-funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums \\\r\n-Wall -Wstrict-prototypes \\\r\n-DF_CPU=$(F_CPU) \\\r\n-Wa,-adhlns=$(&lt;:.c=.lst) \\\r\n$(patsubst %,-I%,$(EXTRAINCDIRS)) \\\r\n-mmcu=$(MCU)\r\n\r\n# Set a &quot;language standard&quot; compiler flag.\r\nCFLAGS += -std=gnu99\r\n\r\n# Optional assembler flags.\r\n#  -Wa,...:   tell GCC to pass this to the assembler.\r\n#  -ahlms:    create listing\r\n#  -gstabs:   have the assembler create line number information; note that\r\n#             for use in COFF files, additional information about filenames\r\n#             and function names needs to be present in the assembler source\r\n#             files -- see avr-libc docs [FIXME: not yet described there]\r\nASFLAGS = -Wa,-adhlns=$(&lt;:.S=.lst),-gstabs \r\n\r\n# Optional linker flags.\r\n#  -Wl,...:   tell GCC to pass this to linker.\r\n#  -Map:      create map file\r\n#  --cref:    add cross reference to  map file\r\nLDFLAGS = -Wl,-Map=$(TARGET).map,--cref\r\n\r\n# avr-size flags.\r\n#  -C:        friendly output\r\nSIZEFLAGS = -C --mcu=$(MCU)\r\n\r\n# ---------------------------------------------------------------------------\r\n# Programming support using avrdude.\r\nAVRDUDE = avrdude\r\n\r\nAVRDUDE_WRITE_FLASH = -U flash:w:\r\n\r\nAVRDUDE_FLAGS = -p $(MCU) -c $(AVRDUDE_PROGRAMMER) -C .\/avrdude.conf\r\n\r\n# ---------------------------------------------------------------------------\r\n# Define directories, if needed.\r\nDIRAVR = c:\/winavr\r\nDIRAVRBIN = $(DIRAVR)\/bin\r\nDIRAVRUTILS = $(DIRAVR)\/utils\/bin\r\nDIRINC = .\r\nDIRLIB = $(DIRAVR)\/avr\/lib\r\n\r\n# Define programs and commands.\r\nCC = avr-gcc\r\nOBJCOPY = avr-objcopy\r\nOBJDUMP = avr-objdump\r\nSIZE = avr-size\r\nREMOVE = rm -f\r\n\r\n# Define all object files.\r\nOBJ = $(SRC:.c=.o) $(ASRC:.S=.o) \r\n\r\n# Define all listing files.\r\nLST = $(ASRC:.S=.lst) $(SRC:.c=.lst)\r\n\r\n# Combine all necessary flags and optional flags.\r\n# Add target processor to flags.\r\nALL_CFLAGS = -I. $(CFLAGS)\r\nALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS)\r\n\r\n# Create final output files (.hex) from ELF output file.\r\n%.hex: %.elf\r\n\t@$(OBJCOPY) -O $(FORMAT) -R .eeprom $&lt; $@\r\n\r\n# Link: create ELF output file from object files.\r\n%.elf: %.o\r\n\t@$(CC) $(ALL_CFLAGS) $&lt; --output $@ $(LDFLAGS)\r\n\t@$(SIZE) $(SIZEFLAGS) $@\r\n\r\n# Compile: create object files from C source files.\r\n%.o : %.c\r\n\t@$(CC) -c $(ALL_CFLAGS) $&lt; -o $@\r\n\r\n# Compile: create assembler files from C source files.\r\n%.s : %.c\r\n\t@$(CC) -S $(ALL_CFLAGS) $&lt; -o $@\r\n\r\n# Assemble: create object files from assembler source files.\r\n%.o : %.S\r\n\t@$(CC) -c $(ALL_ASFLAGS) $&lt; -o $@\r\n\r\n# Target: clean project.\r\nclean:\r\n\t$(REMOVE) *.hex\r\n\t$(REMOVE) *.lst\r\n\t$(REMOVE) *.obj\r\n\t$(REMOVE) *.elf\r\n\t$(REMOVE) *.o\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u5f53\u6211\u624b\u4e0a\u7684\u65b0\u8001\u9502\u7535\u6c60\u8d8a\u6765\u8d8a\u591a\u7684\u65f6\u5019\uff0c\u6211\u5c31\u5f88\u60f3\u7ec4\u88c5\u4e00\u53f0\u673a\u5668\u6765\u6d4b\u5b9a\u5b83\u4eec\u7684\u7535\u91cf\u4e86\u3002\u4e8e\u662f\u5c31\u6709\u4e86\u4e0b\u9762\u7684\u73a9\u610f\u3002<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_mi_skip_tracking":false},"categories":[8,9],"tags":[],"_links":{"self":[{"href":"http:\/\/blog.dword1511.info\/index.php?rest_route=\/wp\/v2\/posts\/301"}],"collection":[{"href":"http:\/\/blog.dword1511.info\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/blog.dword1511.info\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/blog.dword1511.info\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/blog.dword1511.info\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=301"}],"version-history":[{"count":10,"href":"http:\/\/blog.dword1511.info\/index.php?rest_route=\/wp\/v2\/posts\/301\/revisions"}],"predecessor-version":[{"id":2723,"href":"http:\/\/blog.dword1511.info\/index.php?rest_route=\/wp\/v2\/posts\/301\/revisions\/2723"}],"wp:attachment":[{"href":"http:\/\/blog.dword1511.info\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=301"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.dword1511.info\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=301"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.dword1511.info\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=301"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}