<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-3474577459886827247</id><updated>2012-02-15T22:32:10.176-08:00</updated><category term='生活'/><category term='部落格使用'/><category term='家庭自動化'/><category term='飛行器'/><category term='VoIP'/><category term='范范'/><category term='Internet'/><category term='Arduino'/><category term='8051'/><category term='欲採購設備'/><category term='居家健康'/><category term='機器人(Robot)'/><category term='各式 Sensor'/><category term='Web'/><title type='text'>David 的個人 Blog</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://cwjen888.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://cwjen888.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default?start-index=101&amp;max-results=100'/><author><name>David Chang</name><uri>http://www.blogger.com/profile/05943998889053147615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>125</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3474577459886827247.post-7311051907223691574</id><published>2011-12-02T06:47:00.000-08:00</published><updated>2011-12-02T06:47:12.726-08:00</updated><title type='text'>YouTube Downloader Free - Download YouTube videos as MP3 or MP4 in HD!</title><content type='html'>&lt;a href="http://www.oxytube.com/"&gt;YouTube Downloader Free - Download YouTube videos as MP3 or MP4 in HD!&lt;/a&gt;: &lt;br&gt;&lt;br&gt;&lt;a style="font-size:13px" href="https://chrome.google.com/webstore/detail/pengoopmcjnbflcjbmoeodbmoflcgjlk"&gt;'via Blog this'&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3474577459886827247-7311051907223691574?l=cwjen888.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.oxytube.com/' title='YouTube Downloader Free - Download YouTube videos as MP3 or MP4 in HD!'/><link rel='replies' type='application/atom+xml' href='http://cwjen888.blogspot.com/feeds/7311051907223691574/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3474577459886827247&amp;postID=7311051907223691574' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/7311051907223691574'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/7311051907223691574'/><link rel='alternate' type='text/html' href='http://cwjen888.blogspot.com/2011/12/youtube-downloader-free-download.html' title='YouTube Downloader Free - Download YouTube videos as MP3 or MP4 in HD!'/><author><name>David Chang</name><uri>http://www.blogger.com/profile/05943998889053147615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3474577459886827247.post-393862746941726205</id><published>2009-02-03T01:59:00.001-08:00</published><updated>2009-02-03T01:59:31.860-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web'/><category scheme='http://www.blogger.com/atom/ns#' term='范范'/><category scheme='http://www.blogger.com/atom/ns#' term='Internet'/><title type='text'>Scene7 的說明</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;br/&gt;&lt;br/&gt;http://help.adobe.com/en_US/Scene7/4.0/WS26AB0D9A-F51C-464e-88C8-580A5A82F810.html&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3474577459886827247-393862746941726205?l=cwjen888.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cwjen888.blogspot.com/feeds/393862746941726205/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3474577459886827247&amp;postID=393862746941726205' title='4 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/393862746941726205'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/393862746941726205'/><link rel='alternate' type='text/html' href='http://cwjen888.blogspot.com/2009/02/scene7_03.html' title='Scene7 的說明'/><author><name>David Chang</name><uri>http://www.blogger.com/profile/05943998889053147615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3474577459886827247.post-5952678632695224418</id><published>2009-02-03T01:58:00.001-08:00</published><updated>2009-02-03T01:58:47.342-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web'/><category scheme='http://www.blogger.com/atom/ns#' term='范范'/><category scheme='http://www.blogger.com/atom/ns#' term='Internet'/><title type='text'>Scene7 的使用說明</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;br/&gt;&lt;a href='http://help.adobe.com/en_US/Scene7/4.0/WS26AB0D9A-F51C-464e-88C8-580A5A82F810.html'&gt;Scene7 的使用說明&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;http://help.adobe.com/en_US/Scene7/4.0/WS26AB0D9A-F51C-464e-88C8-580A5A82F810.html&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3474577459886827247-5952678632695224418?l=cwjen888.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cwjen888.blogspot.com/feeds/5952678632695224418/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3474577459886827247&amp;postID=5952678632695224418' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/5952678632695224418'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/5952678632695224418'/><link rel='alternate' type='text/html' href='http://cwjen888.blogspot.com/2009/02/scene7.html' title='Scene7 的使用說明'/><author><name>David Chang</name><uri>http://www.blogger.com/profile/05943998889053147615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3474577459886827247.post-2680744663313282150</id><published>2009-02-02T02:23:00.001-08:00</published><updated>2009-02-02T02:23:02.248-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web'/><category scheme='http://www.blogger.com/atom/ns#' term='范范'/><category scheme='http://www.blogger.com/atom/ns#' term='Internet'/><title type='text'>免費 PHP MySQL Web Hosting</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href='http://www.000webhost.com/'&gt;&lt;img border='0' src='http://www.000webhost.com/images/head.jpg'/&gt;&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href='http://www.000webhost.com/'&gt;http://www.000webhost.com/&lt;/a&gt;&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3474577459886827247-2680744663313282150?l=cwjen888.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cwjen888.blogspot.com/feeds/2680744663313282150/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3474577459886827247&amp;postID=2680744663313282150' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/2680744663313282150'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/2680744663313282150'/><link rel='alternate' type='text/html' href='http://cwjen888.blogspot.com/2009/02/php-mysql-web-hosting.html' title='免費 PHP MySQL Web Hosting'/><author><name>David Chang</name><uri>http://www.blogger.com/profile/05943998889053147615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3474577459886827247.post-7672945738406083169</id><published>2009-01-21T17:21:00.001-08:00</published><updated>2009-01-21T17:21:21.336-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='生活'/><category scheme='http://www.blogger.com/atom/ns#' term='范范'/><category scheme='http://www.blogger.com/atom/ns#' term='Internet'/><title type='text'>Camera rankings</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;a href='http://www.dxomark.com/index.php/eng/DxOMark-Sensor/Camera-rankin'&gt;Camera rankings&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;http://www.dxomark.com/index.php/eng/DxOMark-Sensor/Camera-rankings&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3474577459886827247-7672945738406083169?l=cwjen888.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cwjen888.blogspot.com/feeds/7672945738406083169/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3474577459886827247&amp;postID=7672945738406083169' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/7672945738406083169'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/7672945738406083169'/><link rel='alternate' type='text/html' href='http://cwjen888.blogspot.com/2009/01/camera-rankings_21.html' title='Camera rankings'/><author><name>David Chang</name><uri>http://www.blogger.com/profile/05943998889053147615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3474577459886827247.post-2128604130821106491</id><published>2009-01-21T17:20:00.001-08:00</published><updated>2009-01-21T17:20:09.657-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='生活'/><category scheme='http://www.blogger.com/atom/ns#' term='范范'/><title type='text'>Camera rankings</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;b&gt;&lt;br/&gt;&lt;a href='http://www.dxomark.com/index.php/eng/DxOMark-Sensor/Camera-rankings'&gt;&lt;br/&gt;&lt;/a&gt;&lt;/b&gt;&lt;a href='http://www.dxomark.com/index.php/eng/DxOMark-Sensor/Camera-rankings'&gt;Camera rankings&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href='javascript:go(&amp;apos;NIKON/D3X&amp;apos;)'&gt;&lt;img border='0' src='http://media.dxomark.com/dakdata/xml/D3X/vignette2.jpg'/&gt;&lt;/a&gt;&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3474577459886827247-2128604130821106491?l=cwjen888.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cwjen888.blogspot.com/feeds/2128604130821106491/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3474577459886827247&amp;postID=2128604130821106491' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/2128604130821106491'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/2128604130821106491'/><link rel='alternate' type='text/html' href='http://cwjen888.blogspot.com/2009/01/camera-rankings.html' title='Camera rankings'/><author><name>David Chang</name><uri>http://www.blogger.com/profile/05943998889053147615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3474577459886827247.post-8784791029610391724</id><published>2009-01-21T01:30:00.000-08:00</published><updated>2009-01-21T01:31:03.830-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web'/><category scheme='http://www.blogger.com/atom/ns#' term='范范'/><category scheme='http://www.blogger.com/atom/ns#' term='Internet'/><title type='text'>Microsoft Silverlight DeepZoom</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;br/&gt;&lt;a href='http://channel9.msdn.com/shows/Devs4Devs/Silverlight-DeepZoom-Amazing-UX/'&gt;http://channel9.msdn.com/shows/Devs4Devs/Silverlight-DeepZoom-Amazing-UX/&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3474577459886827247-8784791029610391724?l=cwjen888.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cwjen888.blogspot.com/feeds/8784791029610391724/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3474577459886827247&amp;postID=8784791029610391724' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/8784791029610391724'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/8784791029610391724'/><link rel='alternate' type='text/html' href='http://cwjen888.blogspot.com/2009/01/microsoft-silverlight-deepzoom.html' title='Microsoft Silverlight DeepZoom'/><author><name>David Chang</name><uri>http://www.blogger.com/profile/05943998889053147615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3474577459886827247.post-5930709610221312279</id><published>2009-01-21T01:11:00.001-08:00</published><updated>2009-01-21T01:11:43.999-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web'/><category scheme='http://www.blogger.com/atom/ns#' term='范范'/><category scheme='http://www.blogger.com/atom/ns#' term='Internet'/><title type='text'>Viewing Large Images - OpenLayers, GSIV, ModestMaps, DeepZoom, and Python</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;h2&gt;&lt;br /&gt;&lt;br /&gt;		&lt;br /&gt;						&lt;br /&gt;			&lt;br /&gt;				&lt;/h2&gt;&lt;div class='posttitle'&gt;&lt;br /&gt;					&lt;h2&gt;Viewing Large Images - OpenLayers, GSIV, ModestMaps, DeepZoom, and Python&lt;/h2&gt;&lt;br /&gt;					&lt;p class='post-info'&gt;November 30, 2008 by &lt;a title='Posts by kapilt' href='http://blog.kapilt.com/author/kapilt/'&gt;kapilt&lt;/a&gt;  &lt;/p&gt;&lt;br /&gt;				&lt;/div&gt;&lt;br /&gt;				&lt;br /&gt;				&lt;br /&gt;					&lt;p&gt;Lately&lt;br /&gt;I’ve been experimenting with displaying very large images on the&lt;br /&gt;internet via a web browser, with pan and zoom functionality. The guts&lt;br /&gt;of this functionality are the same regardless of implementation. On the&lt;br /&gt;server, a tile cutter processes a large image, and constructs an image&lt;br /&gt;pyramid. The image pyramid is a hierarchical structure composed of n&lt;br /&gt;levels of the same image at different resolutions. Starting with the&lt;br /&gt;bottom level as the original image, each successive level reduces the&lt;br /&gt;image size by half, and the process is repeated log_2( max( width,&lt;br /&gt;height)) times until finally an image of only 1 pixel (average of&lt;br /&gt;entire image) is generated as the top of the pyramid. Each level’s&lt;br /&gt;image is split into a set of fixed size tiles. A web browser client&lt;br /&gt;implementation ( flash, ajax, etc) constructs  a zoom interface, that&lt;br /&gt;responds to zoom in events by moving the viewport progressively further&lt;br /&gt;down the pyramid, showing tile images of the larger resolution to give&lt;br /&gt;the effect of zooming into an image. A nice illustrated write up of the&lt;br /&gt;concept can be found &lt;a href='http://gasi.ch/blog/inside-deep-zoom-1/'&gt;here&lt;/a&gt;. I’ve probably made it sound more complicated than it really is.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;The initial implementation I was working with utilized &lt;a href='http://openlayers.org/'&gt;OpenLayers&lt;/a&gt;, which implements a client for accessing OpenGIS Web Feature Servers (&lt;a href='http://www.opengeospatial.org/standards/wfs'&gt;WFS&lt;/a&gt;) and Web Mapping Servers (&lt;a href='http://www.opengeospatial.org/standards/wms'&gt;WMS&lt;/a&gt;).&lt;br /&gt;Unfortunately the size of the library seems to be constantly increasing&lt;br /&gt;(~200K in the last year) and currently weighs in at 560K uncompressed,&lt;br /&gt;and requires a special implementation to serve up the tile images, ie.&lt;br /&gt;a WMS Compliant system, in this case &lt;a href='http://tilecache.org/'&gt;TileCache&lt;/a&gt;. For scaling and efficiency purposes, I’d much prefer to directly serve these images off a &lt;a href='http://en.wikipedia.org/wiki/Content_Delivery_Network'&gt;CDN&lt;/a&gt;, disk (&lt;a href='http://nginx.net/'&gt;nginx&lt;/a&gt;), or via &lt;a href='http://varnish.projects.linpro.no/'&gt;varnish&lt;/a&gt;&lt;br /&gt;and bypass any application code. Additionally the sheer size of the&lt;br /&gt;OpenLayers code was unwieldy for the integrations requirements I had,&lt;br /&gt;which did not include any GIS functionality.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Surveying the land for other non-commercial image viewers, turned up a few of interest. &lt;a href='http://code.google.com/p/panojs/'&gt;GSIV&lt;/a&gt;&lt;br /&gt;( Giant Scalable Image Viewer), was a fairly basic but capable&lt;br /&gt;javascript based viewer, that fit my requirements bill, small size at&lt;br /&gt;26Kb uncompressed, and focused on pan and zoom functionality (&lt;a href='http://www.mojavelinux.com/cooker/demos/gsv/'&gt;demo&lt;/a&gt;).&lt;br /&gt;However as a project it appears to be abandoned, and hasn’t been&lt;br /&gt;touched in two years, although several patches have been submitted&lt;br /&gt;which retrofit the implementation using jquery are extant.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;I came across &lt;a href='http://modestmaps.com/'&gt;ModestMaps&lt;/a&gt; next, which is a flash (2 &amp;amp; 3 ) based implementation, with a small size (&lt;a href='http://modestmaps.com/example.html'&gt;demo&lt;/a&gt;).&lt;br /&gt;One nice feature of modest maps, is that it performs interpolation&lt;br /&gt;between successive levels giving a smooth zoom experience to an end&lt;br /&gt;user unlike somewhat jerky experience that GSIV produced. Unfortunately&lt;br /&gt;being flash based meant a whole different chain of development tools. I&lt;br /&gt;looked around at what was available for an opensource flash compiler&lt;br /&gt;toolchain and found &lt;a href='http://www.mtasc.org/'&gt;MTASC&lt;/a&gt; (Motion Twin Action Script Compiler ) and &lt;a href='http://www.haxe.org/'&gt;Haxe&lt;/a&gt;.&lt;br /&gt;In the end i decided against it, partly due to its GIS focus, and the&lt;br /&gt;customization/ maintenance cost for developing on propretiary platform&lt;br /&gt;(Flash). Despite that, i think its the best of the opensource viewer&lt;br /&gt;implementations if your already have/use an adobe flash development&lt;br /&gt;stack.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;I was set on using GSIV, and then i came across a&lt;a href='http://ajaxian.com/archives/seadragon'&gt; blurb on ajaxian&lt;/a&gt;&lt;br /&gt;about Seadragon Ajax and Deep Zoom from Microsoft’s Live Labs.&lt;br /&gt;Microsoft’s done some impressive work with image manipulation over the&lt;br /&gt;last few years. The &lt;a href='http://www.ted.com/index.php/talks/blaise_aguera_y_arcas_demos_photosynth.html'&gt;PhotoSynth TED talk&lt;/a&gt; is one of the most impressive technology demos i’ve seen to date. &lt;a href='http://en.wikipedia.org/wiki/Deep_Zoom'&gt;Deep Zoom&lt;/a&gt; is a &lt;a href='http://en.wikipedia.org/wiki/Silverlight'&gt;SilverLight&lt;/a&gt; technology ( more propretiary platform lockin), that allows for multiscale image zooming with smooth zooming. The&lt;a href='http://livelabs.com/seadragon-ajax/library/'&gt; Seadragon Ajax&lt;/a&gt;&lt;br /&gt;is a javascript implementation of the same functionality in a 154k&lt;br /&gt;library ( 20k minimized and gzipped). It fit the bill perfectly,&lt;br /&gt;standards (javascript) based, image zoom and pan, with a great user&lt;br /&gt;experience. One problem unlike all the other tools mentioned here,&lt;br /&gt;which have python based tile cutting implementations, Deep Zoom was&lt;br /&gt;utilizing a Windows only based program to process images and cut tiles.&lt;br /&gt;I had a couple of hundred gigabytes of images to cut, and not a windows&lt;br /&gt;system in sight. But based on this &lt;a href='http://gasi.ch/blog/inside-deep-zoom-2/'&gt;excellent blog write up by Daniel Gasiencia&lt;/a&gt;,&lt;br /&gt;I constructed a python program using PIL that can be used as a command&lt;br /&gt;line tool or library for constructing Deep Zoom Compatible image&lt;br /&gt;pyramids. It can be found &lt;a href='http://kapilt.com/files/seadragon.py'&gt;here&lt;/a&gt;,&lt;br /&gt;hopefully its useful to others. As a bonus, it runs in a fraction of&lt;br /&gt;the memory (1/6 by my measurements) needed by the GSIV image tile&lt;br /&gt;cutter and faster as well ( 100 images in 5m vs 1.25hr). Unfortunately&lt;br /&gt;the Seadragon Ajax Library is not opensource, but non commercial usage&lt;br /&gt;seems to be okay with the license, and i’ll give it over to some&lt;br /&gt;lawyers to figure it out.&lt;/p&gt;&lt;br /&gt;To process the several hundred gigabytes of images, i utilized this library and wrote a batch driver utilizing  &lt;a href='http://pyprocessing.berlios.de/'&gt;pyprocessing remote queues&lt;/a&gt;, a small &lt;a href='http://pypi.python.org/pypi/zc.buildout'&gt;zc.buildout&lt;/a&gt; and &lt;a href='http://code.google.com/p/cloudcontrol/'&gt;cloudcontrol&lt;/a&gt; to process the images across a cluster, but thats left as an implementation detail for the reader&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3474577459886827247-5930709610221312279?l=cwjen888.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cwjen888.blogspot.com/feeds/5930709610221312279/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3474577459886827247&amp;postID=5930709610221312279' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/5930709610221312279'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/5930709610221312279'/><link rel='alternate' type='text/html' href='http://cwjen888.blogspot.com/2009/01/viewing-large-images-openlayers-gsiv.html' title='Viewing Large Images - OpenLayers, GSIV, ModestMaps, DeepZoom, and Python'/><author><name>David Chang</name><uri>http://www.blogger.com/profile/05943998889053147615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3474577459886827247.post-2211476244004404942</id><published>2009-01-21T00:33:00.001-08:00</published><updated>2009-01-21T00:33:31.004-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web'/><category scheme='http://www.blogger.com/atom/ns#' term='范范'/><category scheme='http://www.blogger.com/atom/ns#' term='Internet'/><title type='text'>Photo Zoom Tools</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;br/&gt;http://www.softsia.com/flash-photo-zoom-download-1.html&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3474577459886827247-2211476244004404942?l=cwjen888.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cwjen888.blogspot.com/feeds/2211476244004404942/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3474577459886827247&amp;postID=2211476244004404942' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/2211476244004404942'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/2211476244004404942'/><link rel='alternate' type='text/html' href='http://cwjen888.blogspot.com/2009/01/photo-zoom-tools.html' title='Photo Zoom Tools'/><author><name>David Chang</name><uri>http://www.blogger.com/profile/05943998889053147615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3474577459886827247.post-1002453496174769205</id><published>2009-01-20T22:42:00.001-08:00</published><updated>2009-01-20T22:42:46.881-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web'/><category scheme='http://www.blogger.com/atom/ns#' term='范范'/><category scheme='http://www.blogger.com/atom/ns#' term='Internet'/><title type='text'>Image Optimization 讀書心得</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;br/&gt;&lt;h2&gt;前言&lt;/h2&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;上個月在 YUI Blog 上有 4 篇 Image Optimization 的連載，若你重視網站的效能，這篇是非常經典且必讀的文章。&lt;br /&gt;主要在於圖片格式的介紹、使用免費的命令列工具縮小圖片但不失真。難能可貴的是，作者 Stoyan Stefanov 也做了許多的實際測試，讓這系列的文章非常有說服力。以下為文章列表： &lt;br/&gt;&lt;/p&gt;&lt;p&gt;http://josephj.com/entry.php?id=209&lt;br/&gt;&lt;/p&gt;&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3474577459886827247-1002453496174769205?l=cwjen888.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cwjen888.blogspot.com/feeds/1002453496174769205/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3474577459886827247&amp;postID=1002453496174769205' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/1002453496174769205'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/1002453496174769205'/><link rel='alternate' type='text/html' href='http://cwjen888.blogspot.com/2009/01/image-optimization.html' title='Image Optimization 讀書心得'/><author><name>David Chang</name><uri>http://www.blogger.com/profile/05943998889053147615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3474577459886827247.post-3035713329097423351</id><published>2009-01-20T12:24:00.001-08:00</published><updated>2009-01-20T12:24:06.941-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web'/><category scheme='http://www.blogger.com/atom/ns#' term='范范'/><category scheme='http://www.blogger.com/atom/ns#' term='Internet'/><title type='text'>Flash Image Zoom</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;br/&gt;&lt;br/&gt;http://www.flashden.net/item/zoom-pan-controls-with-dynamic-image-settings/15713?page=5&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3474577459886827247-3035713329097423351?l=cwjen888.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cwjen888.blogspot.com/feeds/3035713329097423351/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3474577459886827247&amp;postID=3035713329097423351' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/3035713329097423351'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/3035713329097423351'/><link rel='alternate' type='text/html' href='http://cwjen888.blogspot.com/2009/01/flash-image-zoom.html' title='Flash Image Zoom'/><author><name>David Chang</name><uri>http://www.blogger.com/profile/05943998889053147615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3474577459886827247.post-7595062764779978994</id><published>2009-01-15T02:03:00.001-08:00</published><updated>2009-01-15T02:03:51.551-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web'/><category scheme='http://www.blogger.com/atom/ns#' term='Internet'/><title type='text'>Popular Science Magazine架站案例分享</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;br/&gt;http://drupaltaiwan.org/forum/20080325/1976&lt;br/&gt;&lt;br/&gt;&lt;img alt='Popular Science Magazine screenshot' src='http://drupal.org/files/PopSci-fp-40.png'/&gt;&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3474577459886827247-7595062764779978994?l=cwjen888.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cwjen888.blogspot.com/feeds/7595062764779978994/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3474577459886827247&amp;postID=7595062764779978994' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/7595062764779978994'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/7595062764779978994'/><link rel='alternate' type='text/html' href='http://cwjen888.blogspot.com/2009/01/popular-science-magazine.html' title='Popular Science Magazine架站案例分享'/><author><name>David Chang</name><uri>http://www.blogger.com/profile/05943998889053147615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3474577459886827247.post-3667573470055856319</id><published>2009-01-07T23:50:00.002-08:00</published><updated>2009-01-07T23:51:22.329-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='范范'/><category scheme='http://www.blogger.com/atom/ns#' term='Internet'/><title type='text'>PHP: Object Oriented Web Forms</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;p&gt;As I've gone from project to project over the years I've built up my&lt;br /&gt;personal code library. One piece of code that I've found extremely&lt;br /&gt;useful time and time again is an object oriented class for building web&lt;br /&gt;forms. It allows me to keep consistent looking/acting forms throughout&lt;br /&gt;a web application, rapidly develop new forms, make global changes by&lt;br /&gt;editing a single file, and keep all the logic of a form within one file.&lt;br/&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;The following code and examples are for php version 5 or higher.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;b&gt;Example 1: The Basics&lt;/b&gt;&lt;br/&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class='geshifilter'&gt;&lt;pre class='geshifilter-text'&gt;include("forms.php");&lt;br/&gt; &lt;br/&gt;function Button1Clicked(&amp;amp;$data,&amp;amp;$error){&lt;br/&gt;        $error .= "Field 1 = ".$data["field1"]."&amp;lt;br/&amp;gt;";&lt;br/&gt;        $error .= "Field 2 = ".$data["field2"]."&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;";&lt;br/&gt;        $error .= "You clicked Button 1. &amp;lt;br/&amp;gt;";&lt;br/&gt; &lt;br/&gt;        return true;&lt;br/&gt;}&lt;br/&gt; &lt;br/&gt;$form = new form("myform");&lt;br/&gt; &lt;br/&gt;$element = new form_element_text("field1","Field 1","This is field 1");&lt;br/&gt;$form-&amp;gt;add($element);&lt;br/&gt; &lt;br/&gt;$form-&amp;gt;newline();&lt;br/&gt; &lt;br/&gt;$element = new form_element_text("field2","Field 2","This is field 2");&lt;br/&gt;$form-&amp;gt;add($element);&lt;br/&gt; &lt;br/&gt;$form-&amp;gt;newline();&lt;br/&gt; &lt;br/&gt;$element = new form_button("Button 1","Button1Clicked");&lt;br/&gt;$form-&amp;gt;add($element);&lt;br/&gt; &lt;br/&gt;$form-&amp;gt;run();&lt;/pre&gt;&lt;/div&gt;&lt;a href='http://examples.osspro.com/?f=10'&gt;Download&lt;/a&gt; or &lt;a title='forms.php: Example 1' target='_blank' href='http://examples.osspro.com/9/example1.php'&gt;View Demo&lt;/a&gt;&lt;br /&gt;&lt;p&gt;&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;&lt;b&gt;Example 2: Pre-loading Data&lt;/b&gt;&lt;br/&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class='geshifilter'&gt;&lt;pre class='geshifilter-php'&gt;&lt;span style='color: rgb(0, 0, 0); font-weight: bold;'&gt;function&lt;/span&gt; LoadData&lt;span style='color: rgb(102, 204, 102);'&gt;(&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;&amp;amp;&lt;/span&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;$data&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;,&amp;amp;&lt;/span&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;$error&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;)&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;{&lt;/span&gt;&lt;br/&gt; &lt;br/&gt;        &lt;span style='color: rgb(128, 128, 128); font-style: italic;'&gt;// Load initial data here.&lt;/span&gt;&lt;br/&gt;        &lt;span style='color: rgb(255, 0, 0);'&gt;$error&lt;/span&gt; &lt;span style='color: rgb(102, 204, 102);'&gt;.=&lt;/span&gt; &lt;span style='color: rgb(255, 0, 0);'&gt;"Data Loaded!!&amp;lt;br/&amp;gt;"&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;;&lt;/span&gt;&lt;br/&gt; &lt;br/&gt;        &lt;span style='color: rgb(177, 177, 0);'&gt;return&lt;/span&gt; &lt;span style='color: rgb(0, 0, 0); font-weight: bold;'&gt;true&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;;&lt;/span&gt;  &lt;span style='color: rgb(128, 128, 128); font-style: italic;'&gt;// return true to show form and false to not show it.&lt;/span&gt;&lt;br/&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;}&lt;/span&gt;&lt;br/&gt; &lt;br/&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;...&lt;/span&gt;&lt;br/&gt; &lt;br/&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;$form&lt;/span&gt; &lt;span style='color: rgb(102, 204, 102);'&gt;=&lt;/span&gt; &lt;span style='color: rgb(0, 0, 0); font-weight: bold;'&gt;new&lt;/span&gt; form&lt;span style='color: rgb(102, 204, 102);'&gt;(&lt;/span&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;"myform"&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;,&lt;/span&gt; &lt;span style='color: rgb(255, 0, 0);'&gt;"LoadData"&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;)&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;;&lt;/span&gt;  &lt;span style='color: rgb(128, 128, 128); font-style: italic;'&gt;// Call LoadData on load.&lt;/span&gt;&lt;br/&gt; &lt;br/&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;...&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;a href='http://examples.osspro.com/?f=11'&gt;Download&lt;/a&gt; or &lt;a title='forms.php: Example 2' target='_blank' href='http://examples.osspro.com/9/example2.php'&gt;View Demo&lt;/a&gt;&lt;br /&gt;&lt;p&gt;&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;&lt;b&gt;Example 3: Buttons&lt;/b&gt;&lt;br/&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class='geshifilter'&gt;&lt;pre class='geshifilter-php'&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;...&lt;/span&gt;&lt;br/&gt; &lt;br/&gt;&lt;span style='color: rgb(0, 0, 0); font-weight: bold;'&gt;function&lt;/span&gt; Button1Clicked&lt;span style='color: rgb(102, 204, 102);'&gt;(&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;&amp;amp;&lt;/span&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;$data&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;,&amp;amp;&lt;/span&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;$error&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;)&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;{&lt;/span&gt;&lt;br/&gt;        &lt;span style='color: rgb(255, 0, 0);'&gt;$error&lt;/span&gt; &lt;span style='color: rgb(102, 204, 102);'&gt;.=&lt;/span&gt; &lt;span style='color: rgb(255, 0, 0);'&gt;"You clicked Button 1. &amp;lt;br/&amp;gt;"&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;;&lt;/span&gt;&lt;br/&gt;        &lt;span style='color: rgb(177, 177, 0);'&gt;return&lt;/span&gt; &lt;span style='color: rgb(0, 0, 0); font-weight: bold;'&gt;true&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;;&lt;/span&gt;&lt;br/&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;}&lt;/span&gt;&lt;br/&gt; &lt;br/&gt;&lt;span style='color: rgb(0, 0, 0); font-weight: bold;'&gt;function&lt;/span&gt; Button2Clicked&lt;span style='color: rgb(102, 204, 102);'&gt;(&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;&amp;amp;&lt;/span&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;$data&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;,&amp;amp;&lt;/span&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;$error&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;)&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;{&lt;/span&gt;&lt;br/&gt;        &lt;a href='http://www.php.net/echo'&gt;&lt;span style='color: rgb(0, 0, 102);'&gt;echo&lt;/span&gt;&lt;/a&gt; &lt;span style='color: rgb(255, 0, 0);'&gt;"You clicked Button 2. &amp;lt;br/&amp;gt;"&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;;&lt;/span&gt;&lt;br/&gt;        &lt;a href='http://www.php.net/echo'&gt;&lt;span style='color: rgb(0, 0, 102);'&gt;echo&lt;/span&gt;&lt;/a&gt; &lt;span style='color: rgb(255, 0, 0);'&gt;"&amp;lt;a href='example3.php'&amp;gt;Click here to go back.&amp;lt;/a&amp;gt;"&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;;&lt;/span&gt;&lt;br/&gt;        &lt;span style='color: rgb(177, 177, 0);'&gt;return&lt;/span&gt; &lt;span style='color: rgb(0, 0, 0); font-weight: bold;'&gt;false&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;;&lt;/span&gt;&lt;br/&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;}&lt;/span&gt;&lt;br/&gt; &lt;br/&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;...&lt;/span&gt;&lt;br/&gt; &lt;br/&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;$element&lt;/span&gt; &lt;span style='color: rgb(102, 204, 102);'&gt;=&lt;/span&gt; &lt;span style='color: rgb(0, 0, 0); font-weight: bold;'&gt;new&lt;/span&gt; form_button&lt;span style='color: rgb(102, 204, 102);'&gt;(&lt;/span&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;"Button 1"&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;,&lt;/span&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;"Button1Clicked"&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;)&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;;&lt;/span&gt;&lt;br/&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;$form&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;-&amp;gt;&lt;/span&gt;&lt;span style='color: rgb(0, 102, 0);'&gt;add&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;(&lt;/span&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;$element&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;)&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;;&lt;/span&gt;&lt;br/&gt; &lt;br/&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;$element&lt;/span&gt; &lt;span style='color: rgb(102, 204, 102);'&gt;=&lt;/span&gt; &lt;span style='color: rgb(0, 0, 0); font-weight: bold;'&gt;new&lt;/span&gt; form_button&lt;span style='color: rgb(102, 204, 102);'&gt;(&lt;/span&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;"Button 2"&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;,&lt;/span&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;"Button2Clicked"&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;)&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;;&lt;/span&gt;&lt;br/&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;$form&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;-&amp;gt;&lt;/span&gt;&lt;span style='color: rgb(0, 102, 0);'&gt;add&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;(&lt;/span&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;$element&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;)&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;;&lt;/span&gt;&lt;br/&gt; &lt;br/&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;$element&lt;/span&gt; &lt;span style='color: rgb(102, 204, 102);'&gt;=&lt;/span&gt; &lt;span style='color: rgb(0, 0, 0); font-weight: bold;'&gt;new&lt;/span&gt; form_button&lt;span style='color: rgb(102, 204, 102);'&gt;(&lt;/span&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;"Button 3"&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;)&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;;&lt;/span&gt;&lt;br/&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;$element&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;-&amp;gt;&lt;/span&gt;&lt;span style='color: rgb(0, 102, 0);'&gt;submit&lt;/span&gt; &lt;span style='color: rgb(102, 204, 102);'&gt;=&lt;/span&gt; &lt;span style='color: rgb(0, 0, 0); font-weight: bold;'&gt;false&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;;&lt;/span&gt;&lt;br/&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;$element&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;-&amp;gt;&lt;/span&gt;&lt;span style='color: rgb(0, 102, 0);'&gt;on&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;[&lt;/span&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;"Click"&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;]&lt;/span&gt; &lt;span style='color: rgb(102, 204, 102);'&gt;=&lt;/span&gt; &lt;span style='color: rgb(255, 0, 0);'&gt;"alert('You clicked Button 3!!');"&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;;&lt;/span&gt;&lt;br/&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;$form&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;-&amp;gt;&lt;/span&gt;&lt;span style='color: rgb(0, 102, 0);'&gt;add&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;(&lt;/span&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;$element&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;)&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;;&lt;/span&gt;&lt;br/&gt; &lt;br/&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;...&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;a href='http://examples.osspro.com/?f=12'&gt;Download&lt;/a&gt; or &lt;a title='forms.php: Example 3' target='_blank' href='http://examples.osspro.com/9/example3.php'&gt;View Demo&lt;/a&gt;&lt;br /&gt;&lt;p&gt;&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;&lt;b&gt;Example 4: Individual Element Styling&lt;/b&gt;&lt;br/&gt;&lt;br /&gt;Most of the styling is done via the forms.css file but occasionally you'll need to apply a style to an individual element.&lt;br/&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class='geshifilter'&gt;&lt;pre class='geshifilter-php'&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;...&lt;/span&gt;&lt;br/&gt; &lt;br/&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;$element&lt;/span&gt; &lt;span style='color: rgb(102, 204, 102);'&gt;=&lt;/span&gt; &lt;span style='color: rgb(0, 0, 0); font-weight: bold;'&gt;new&lt;/span&gt; form_element_text&lt;span style='color: rgb(102, 204, 102);'&gt;(&lt;/span&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;"field1"&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;,&lt;/span&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;"Field 1"&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;)&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;;&lt;/span&gt;&lt;br/&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;$element&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;-&amp;gt;&lt;/span&gt;&lt;span style='color: rgb(0, 102, 0);'&gt;style&lt;/span&gt; &lt;span style='color: rgb(102, 204, 102);'&gt;=&lt;/span&gt; &lt;span style='color: rgb(255, 0, 0);'&gt;"width: 400px;"&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;;&lt;/span&gt;&lt;br/&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;$form&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;-&amp;gt;&lt;/span&gt;&lt;span style='color: rgb(0, 102, 0);'&gt;add&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;(&lt;/span&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;$element&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;)&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;;&lt;/span&gt;&lt;br/&gt; &lt;br/&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;...&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;a href='http://examples.osspro.com/?f=13'&gt;Download&lt;/a&gt; or &lt;a title='forms.php: Example 4' target='_blank' href='http://examples.osspro.com/9/example4.php'&gt;View Demo&lt;/a&gt;&lt;br /&gt;&lt;p&gt;&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;&lt;b&gt;Example 5: Validation&lt;/b&gt;&lt;br/&gt;&lt;br /&gt;Form validation is done through making an element required and/or&lt;br /&gt;applying a regular expression to an element that the value must match.&lt;br /&gt;If you need more complicated validation then you would put that logic&lt;br /&gt;within the function associated with a form_button.&lt;br/&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class='geshifilter'&gt;&lt;pre class='geshifilter-php'&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;...&lt;/span&gt;&lt;br/&gt; &lt;br/&gt;&lt;span style='color: rgb(0, 0, 0); font-weight: bold;'&gt;function&lt;/span&gt; Button1Clicked&lt;span style='color: rgb(102, 204, 102);'&gt;(&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;&amp;amp;&lt;/span&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;$data&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;,&amp;amp;&lt;/span&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;$error&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;)&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;{&lt;/span&gt;&lt;br/&gt;        &lt;span style='color: rgb(177, 177, 0);'&gt;if&lt;/span&gt; &lt;span style='color: rgb(102, 204, 102);'&gt;(&lt;/span&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;$data&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;[&lt;/span&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;"field1"&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;]&lt;/span&gt; &lt;span style='color: rgb(102, 204, 102);'&gt;==&lt;/span&gt; &lt;a href='http://www.php.net/strtoupper'&gt;&lt;span style='color: rgb(0, 0, 102);'&gt;strtoupper&lt;/span&gt;&lt;/a&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;(&lt;/span&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;$data&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;[&lt;/span&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;"field1"&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;]&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;)&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;)&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;{&lt;/span&gt;&lt;br/&gt;                &lt;a href='http://www.php.net/echo'&gt;&lt;span style='color: rgb(0, 0, 102);'&gt;echo&lt;/span&gt;&lt;/a&gt; &lt;span style='color: rgb(255, 0, 0);'&gt;"Form Validated!&amp;lt;br/&amp;gt;"&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;;&lt;/span&gt;&lt;br/&gt;                &lt;a href='http://www.php.net/echo'&gt;&lt;span style='color: rgb(0, 0, 102);'&gt;echo&lt;/span&gt;&lt;/a&gt; &lt;span style='color: rgb(255, 0, 0);'&gt;"&amp;lt;a href='example5.php'&amp;gt;Click here to continue.&amp;lt;/a&amp;gt;"&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;;&lt;/span&gt;&lt;br/&gt;                &lt;span style='color: rgb(177, 177, 0);'&gt;return&lt;/span&gt; &lt;span style='color: rgb(0, 0, 0); font-weight: bold;'&gt;false&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;;&lt;/span&gt;  &lt;span style='color: rgb(128, 128, 128); font-style: italic;'&gt;// Don't show form.&lt;/span&gt;&lt;br/&gt;        &lt;span style='color: rgb(102, 204, 102);'&gt;}&lt;/span&gt;&lt;span style='color: rgb(177, 177, 0);'&gt;else&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;{&lt;/span&gt;&lt;br/&gt;                &lt;span style='color: rgb(255, 0, 0);'&gt;$error&lt;/span&gt; &lt;span style='color: rgb(102, 204, 102);'&gt;.=&lt;/span&gt; &lt;span style='color: rgb(255, 0, 0);'&gt;"Field 1 must be all uppercase.&amp;lt;br/&amp;gt;"&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;;&lt;/span&gt;&lt;br/&gt;                &lt;span style='color: rgb(177, 177, 0);'&gt;return&lt;/span&gt; &lt;span style='color: rgb(0, 0, 0); font-weight: bold;'&gt;true&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;;&lt;/span&gt;&lt;br/&gt;        &lt;span style='color: rgb(102, 204, 102);'&gt;}&lt;/span&gt;&lt;br/&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;}&lt;/span&gt;&lt;br/&gt; &lt;br/&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;...&lt;/span&gt;&lt;br/&gt; &lt;br/&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;$element&lt;/span&gt; &lt;span style='color: rgb(102, 204, 102);'&gt;=&lt;/span&gt; &lt;span style='color: rgb(0, 0, 0); font-weight: bold;'&gt;new&lt;/span&gt; form_element_text&lt;span style='color: rgb(102, 204, 102);'&gt;(&lt;/span&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;"field1"&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;,&lt;/span&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;"Field 1"&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;,&lt;/span&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;"UPPERCASE only."&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;)&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;;&lt;/span&gt;&lt;br/&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;$element&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;-&amp;gt;&lt;/span&gt;&lt;span style='color: rgb(0, 102, 0);'&gt;required&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;(&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;)&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;;&lt;/span&gt;&lt;br/&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;$form&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;-&amp;gt;&lt;/span&gt;&lt;span style='color: rgb(0, 102, 0);'&gt;add&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;(&lt;/span&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;$element&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;)&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;;&lt;/span&gt;&lt;br/&gt; &lt;br/&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;...&lt;/span&gt;&lt;br/&gt; &lt;br/&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;$element&lt;/span&gt; &lt;span style='color: rgb(102, 204, 102);'&gt;=&lt;/span&gt; &lt;span style='color: rgb(0, 0, 0); font-weight: bold;'&gt;new&lt;/span&gt; form_element_text&lt;span style='color: rgb(102, 204, 102);'&gt;(&lt;/span&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;"field2"&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;,&lt;/span&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;"Field 2"&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;,&lt;/span&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;"Integer value only."&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;)&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;;&lt;/span&gt;&lt;br/&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;$element&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;-&amp;gt;&lt;/span&gt;&lt;span style='color: rgb(0, 102, 0);'&gt;required&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;(&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;)&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;;&lt;/span&gt;&lt;br/&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;$element&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;-&amp;gt;&lt;/span&gt;&lt;span style='color: rgb(0, 102, 0);'&gt;regex&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;(&lt;/span&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;"&lt;span style='color: rgb(0, 0, 153); font-weight: bold;'&gt;\d&lt;/span&gt;+"&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;,&lt;/span&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;"Field 2 must be an integer."&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;)&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;;&lt;/span&gt;&lt;br/&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;$form&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;-&amp;gt;&lt;/span&gt;&lt;span style='color: rgb(0, 102, 0);'&gt;add&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;(&lt;/span&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;$element&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;)&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;;&lt;/span&gt;&lt;br/&gt; &lt;br/&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;...&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;a href='http://examples.osspro.com/?f=14'&gt;Download&lt;/a&gt; or &lt;a title='forms.php: Example 5' target='_blank' href='http://examples.osspro.com/9/example5.php'&gt;View Demo&lt;/a&gt;&lt;br /&gt;&lt;p&gt;&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;Note that Button1Clicked() never gets called until the built-in form validation passes.&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;&lt;b&gt;Example 6: Other Form Elements&lt;/b&gt;&lt;br/&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class='geshifilter'&gt;&lt;pre class='geshifilter-php'&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;...&lt;/span&gt;&lt;br/&gt; &lt;br/&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;$element&lt;/span&gt; &lt;span style='color: rgb(102, 204, 102);'&gt;=&lt;/span&gt; &lt;span style='color: rgb(0, 0, 0); font-weight: bold;'&gt;new&lt;/span&gt; form_element_text&lt;span style='color: rgb(102, 204, 102);'&gt;(&lt;/span&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;"field1"&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;,&lt;/span&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;"text"&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;)&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;;&lt;/span&gt;&lt;br/&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;$form&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;-&amp;gt;&lt;/span&gt;&lt;span style='color: rgb(0, 102, 0);'&gt;add&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;(&lt;/span&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;$element&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;)&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;;&lt;/span&gt;&lt;br/&gt; &lt;br/&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;$form&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;-&amp;gt;&lt;/span&gt;&lt;span style='color: rgb(0, 102, 0);'&gt;newline&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;(&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;)&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;;&lt;/span&gt;&lt;br/&gt; &lt;br/&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;$element&lt;/span&gt; &lt;span style='color: rgb(102, 204, 102);'&gt;=&lt;/span&gt; &lt;span style='color: rgb(0, 0, 0); font-weight: bold;'&gt;new&lt;/span&gt; form_element_password&lt;span style='color: rgb(102, 204, 102);'&gt;(&lt;/span&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;"field2"&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;,&lt;/span&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;"password"&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;)&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;;&lt;/span&gt;&lt;br/&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;$form&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;-&amp;gt;&lt;/span&gt;&lt;span style='color: rgb(0, 102, 0);'&gt;add&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;(&lt;/span&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;$element&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;)&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;;&lt;/span&gt;&lt;br/&gt; &lt;br/&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;$form&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;-&amp;gt;&lt;/span&gt;&lt;span style='color: rgb(0, 102, 0);'&gt;newline&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;(&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;)&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;;&lt;/span&gt;&lt;br/&gt; &lt;br/&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;$element&lt;/span&gt; &lt;span style='color: rgb(102, 204, 102);'&gt;=&lt;/span&gt; &lt;span style='color: rgb(0, 0, 0); font-weight: bold;'&gt;new&lt;/span&gt; form_element_textarea&lt;span style='color: rgb(102, 204, 102);'&gt;(&lt;/span&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;"field3"&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;,&lt;/span&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;"textarea"&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;)&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;;&lt;/span&gt;&lt;br/&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;$element&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;-&amp;gt;&lt;/span&gt;&lt;span style='color: rgb(0, 102, 0);'&gt;cols&lt;/span&gt; &lt;span style='color: rgb(102, 204, 102);'&gt;=&lt;/span&gt; &lt;span style='color: rgb(204, 102, 204);'&gt;50&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;;&lt;/span&gt;&lt;br/&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;$element&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;-&amp;gt;&lt;/span&gt;&lt;span style='color: rgb(0, 102, 0);'&gt;rows&lt;/span&gt; &lt;span style='color: rgb(102, 204, 102);'&gt;=&lt;/span&gt; &lt;span style='color: rgb(204, 102, 204);'&gt;3&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;;&lt;/span&gt;&lt;br/&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;$form&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;-&amp;gt;&lt;/span&gt;&lt;span style='color: rgb(0, 102, 0);'&gt;add&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;(&lt;/span&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;$element&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;)&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;;&lt;/span&gt;&lt;br/&gt; &lt;br/&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;$form&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;-&amp;gt;&lt;/span&gt;&lt;span style='color: rgb(0, 102, 0);'&gt;newline&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;(&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;)&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;;&lt;/span&gt;&lt;br/&gt; &lt;br/&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;$element&lt;/span&gt; &lt;span style='color: rgb(102, 204, 102);'&gt;=&lt;/span&gt; &lt;span style='color: rgb(0, 0, 0); font-weight: bold;'&gt;new&lt;/span&gt; form_element_checkbox&lt;span style='color: rgb(102, 204, 102);'&gt;(&lt;/span&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;"field4"&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;,&lt;/span&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;"checkbox"&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;)&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;;&lt;/span&gt;&lt;br/&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;$form&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;-&amp;gt;&lt;/span&gt;&lt;span style='color: rgb(0, 102, 0);'&gt;add&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;(&lt;/span&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;$element&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;)&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;;&lt;/span&gt;&lt;br/&gt; &lt;br/&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;$form&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;-&amp;gt;&lt;/span&gt;&lt;span style='color: rgb(0, 102, 0);'&gt;newline&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;(&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;)&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;;&lt;/span&gt;&lt;br/&gt; &lt;br/&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;$element&lt;/span&gt; &lt;span style='color: rgb(102, 204, 102);'&gt;=&lt;/span&gt; &lt;span style='color: rgb(0, 0, 0); font-weight: bold;'&gt;new&lt;/span&gt; form_element_select&lt;span style='color: rgb(102, 204, 102);'&gt;(&lt;/span&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;"field5"&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;,&lt;/span&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;"select"&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;)&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;;&lt;/span&gt;&lt;br/&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;$element&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;-&amp;gt;&lt;/span&gt;&lt;span style='color: rgb(0, 102, 0);'&gt;option&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;(&lt;/span&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;""&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;,&lt;/span&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;""&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;)&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;;&lt;/span&gt;&lt;br/&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;$element&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;-&amp;gt;&lt;/span&gt;&lt;span style='color: rgb(0, 102, 0);'&gt;option&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;(&lt;/span&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;"option1"&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;,&lt;/span&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;"Option 1"&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;)&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;;&lt;/span&gt;&lt;br/&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;$element&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;-&amp;gt;&lt;/span&gt;&lt;span style='color: rgb(0, 102, 0);'&gt;option&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;(&lt;/span&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;"option2"&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;,&lt;/span&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;"Option 2"&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;)&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;;&lt;/span&gt;&lt;br/&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;$form&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;-&amp;gt;&lt;/span&gt;&lt;span style='color: rgb(0, 102, 0);'&gt;add&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;(&lt;/span&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;$element&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;)&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;;&lt;/span&gt;&lt;br/&gt; &lt;br/&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;$form&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;-&amp;gt;&lt;/span&gt;&lt;span style='color: rgb(0, 102, 0);'&gt;newline&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;(&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;)&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;;&lt;/span&gt;&lt;br/&gt; &lt;br/&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;$element&lt;/span&gt; &lt;span style='color: rgb(102, 204, 102);'&gt;=&lt;/span&gt; &lt;span style='color: rgb(0, 0, 0); font-weight: bold;'&gt;new&lt;/span&gt; form_element_select&lt;span style='color: rgb(102, 204, 102);'&gt;(&lt;/span&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;"field6"&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;,&lt;/span&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;"select (multiple)"&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;)&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;;&lt;/span&gt;&lt;br/&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;$element&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;-&amp;gt;&lt;/span&gt;&lt;span style='color: rgb(0, 102, 0);'&gt;multiple&lt;/span&gt; &lt;span style='color: rgb(102, 204, 102);'&gt;=&lt;/span&gt; &lt;span style='color: rgb(0, 0, 0); font-weight: bold;'&gt;true&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;;&lt;/span&gt;&lt;br/&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;$element&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;-&amp;gt;&lt;/span&gt;&lt;span style='color: rgb(0, 102, 0);'&gt;option&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;(&lt;/span&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;"option1"&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;,&lt;/span&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;"Option 1"&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;)&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;;&lt;/span&gt;&lt;br/&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;$element&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;-&amp;gt;&lt;/span&gt;&lt;span style='color: rgb(0, 102, 0);'&gt;option&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;(&lt;/span&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;"option2"&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;,&lt;/span&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;"Option 2"&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;)&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;;&lt;/span&gt;&lt;br/&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;$element&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;-&amp;gt;&lt;/span&gt;&lt;span style='color: rgb(0, 102, 0);'&gt;option&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;(&lt;/span&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;"option3"&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;,&lt;/span&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;"Option 3"&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;)&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;;&lt;/span&gt;&lt;br/&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;$element&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;-&amp;gt;&lt;/span&gt;&lt;span style='color: rgb(0, 102, 0);'&gt;option&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;(&lt;/span&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;"option4"&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;,&lt;/span&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;"Option 4"&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;)&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;;&lt;/span&gt;&lt;br/&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;$form&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;-&amp;gt;&lt;/span&gt;&lt;span style='color: rgb(0, 102, 0);'&gt;add&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;(&lt;/span&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;$element&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;)&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;;&lt;/span&gt;&lt;br/&gt; &lt;br/&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;$form&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;-&amp;gt;&lt;/span&gt;&lt;span style='color: rgb(0, 102, 0);'&gt;newline&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;(&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;)&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;;&lt;/span&gt;&lt;br/&gt; &lt;br/&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;$element&lt;/span&gt; &lt;span style='color: rgb(102, 204, 102);'&gt;=&lt;/span&gt; &lt;span style='color: rgb(0, 0, 0); font-weight: bold;'&gt;new&lt;/span&gt; form_element_radio&lt;span style='color: rgb(102, 204, 102);'&gt;(&lt;/span&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;"field7"&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;,&lt;/span&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;"radio"&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;)&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;;&lt;/span&gt;&lt;br/&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;$element&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;-&amp;gt;&lt;/span&gt;&lt;span style='color: rgb(0, 102, 0);'&gt;option&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;(&lt;/span&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;"option1"&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;,&lt;/span&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;"Option 1"&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;)&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;;&lt;/span&gt;&lt;br/&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;$element&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;-&amp;gt;&lt;/span&gt;&lt;span style='color: rgb(0, 102, 0);'&gt;option&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;(&lt;/span&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;"option2"&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;,&lt;/span&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;"Option 2"&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;)&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;;&lt;/span&gt;&lt;br/&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;$form&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;-&amp;gt;&lt;/span&gt;&lt;span style='color: rgb(0, 102, 0);'&gt;add&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;(&lt;/span&gt;&lt;span style='color: rgb(255, 0, 0);'&gt;$element&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;)&lt;/span&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;;&lt;/span&gt;&lt;br/&gt; &lt;br/&gt;&lt;span style='color: rgb(102, 204, 102);'&gt;...&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;a href='http://examples.osspro.com/?f=15'&gt;Download&lt;/a&gt; or &lt;a title='forms.php: Example 6' target='_blank' href='http://examples.osspro.com/9/example6.php'&gt;View Demo&lt;/a&gt;&lt;br /&gt;&lt;p&gt;&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;&lt;br /&gt;&lt;b&gt;Download the Code&lt;/b&gt;&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;&lt;a title='forms.php' href='http://examples.osspro.com/?f=8'&gt;forms.php&lt;/a&gt;&lt;br/&gt;The form class to include in your php code.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3474577459886827247-3667573470055856319?l=cwjen888.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cwjen888.blogspot.com/feeds/3667573470055856319/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3474577459886827247&amp;postID=3667573470055856319' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/3667573470055856319'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/3667573470055856319'/><link rel='alternate' type='text/html' href='http://cwjen888.blogspot.com/2009/01/php-object-oriented-web-forms.html' title='PHP: Object Oriented Web Forms'/><author><name>David Chang</name><uri>http://www.blogger.com/profile/05943998889053147615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3474577459886827247.post-7206304481269068532</id><published>2009-01-07T23:50:00.001-08:00</published><updated>2009-01-07T23:50:44.806-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='范范'/><category scheme='http://www.blogger.com/atom/ns#' term='Internet'/><title type='text'>PHP: Easy Tabs for your webpages</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;h2&gt;PHP: Easy Tabs for your webpages&lt;/h2&gt;                                                  &lt;br /&gt;            &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      &lt;span class='submitted'&gt;Mon, 04/21/2008 - 14:44 — jondale&lt;/span&gt;&lt;br /&gt;  &lt;br /&gt;  &lt;br /&gt;    &lt;p&gt;Easy tabs is a short and simple php class that makes it very easy to have tabbed dialogs in your webpages.&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;/p&gt;&lt;br /&gt;&lt;h1&gt;Usage&lt;/h1&gt;&lt;br /&gt;&lt;div class='geshifilter'&gt;&lt;pre class='geshifilter-text'&gt;$tabs = new tabs("mytabs");&lt;br/&gt; &lt;br/&gt;	$tabs-&amp;gt;start("Tab1");&lt;br/&gt;	// Tab1's content goes here....&lt;br/&gt;	$tabs-&amp;gt;end();&lt;br/&gt; &lt;br/&gt;	$tabs-&amp;gt;start("Tab2");&lt;br/&gt;	// Tab2's content goes here...&lt;br/&gt;	$tabs-&amp;gt;end();&lt;br/&gt; &lt;br/&gt;$tabs-&amp;gt;run();&lt;/pre&gt;&lt;/div&gt;&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;&lt;h1&gt;Examples&lt;/h1&gt;&lt;br /&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Here we just create 3 tabs and put some text in each one.&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class='geshifilter'&gt;&lt;pre class='geshifilter-text'&gt;include("tabs.php");&lt;br/&gt; &lt;br/&gt;$tabs = new tabs("example1");&lt;br/&gt; &lt;br/&gt;        $tabs-&amp;gt;start("Tab #1");&lt;br/&gt;        echo "This is tab number one.&amp;lt;br/&amp;gt;";&lt;br/&gt;        $tabs-&amp;gt;end();&lt;br/&gt; &lt;br/&gt;        $tabs-&amp;gt;start("Tab #2");&lt;br/&gt;        echo "This is tab number two.&amp;lt;br/&amp;gt;";&lt;br/&gt;        $tabs-&amp;gt;end();&lt;br/&gt; &lt;br/&gt;        $tabs-&amp;gt;start("Tab #3");&lt;br/&gt;        echo "This is tab number three.&amp;lt;br/&amp;gt;";&lt;br/&gt;        $tabs-&amp;gt;end();&lt;br/&gt; &lt;br/&gt;$tabs-&amp;gt;run();&lt;/pre&gt;&lt;/div&gt;&lt;br/&gt;&lt;br /&gt;&lt;a target='_blank' title='ossPro Examples: Easy Tabs Example 1' href='http://examples.osspro.com/11/example1.php'&gt;View Example&lt;/a&gt; or &lt;a title='ossPro Examples: Easy Tabs Example 1' href='http://examples.osspro.com/?f=16'&gt;Download Source&lt;/a&gt;&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;For a bit of a more complicated example, we use the forms class from a &lt;a target='_blank' title='PHP: Object Oriented Web Forms' href='http://osspro.com/php-object-oriented-web-forms'&gt;previous article&lt;/a&gt; to put some simple forms in each tab.&lt;br/&gt;&lt;br /&gt;&lt;div class='geshifilter'&gt;&lt;pre class='geshifilter-text'&gt;include("tabs.php");&lt;br/&gt;include("forms.php");&lt;br/&gt; &lt;br/&gt;function Form1_Button1_Clicked(&amp;amp;$data,&amp;amp;$error){&lt;br/&gt;        $error .= "You clicked button 1 on Form 1!&amp;lt;br/&amp;gt;";&lt;br/&gt;        return true;&lt;br/&gt;}&lt;br/&gt; &lt;br/&gt;function Form2_Button1_Clicked(&amp;amp;$data,&amp;amp;$error){&lt;br/&gt;        $error .= "You clicked button 1 on Form 2!&amp;lt;br/&amp;gt;";&lt;br/&gt;        return true;&lt;br/&gt;}&lt;br/&gt; &lt;br/&gt; &lt;br/&gt;$tabs = new tabs("example2");&lt;br/&gt; &lt;br/&gt;        $tabs-&amp;gt;start("Form 1");&lt;br/&gt;                $form = new form("form1");&lt;br/&gt;                        $element = new form_element_text("field1","Field 1","This is field 1");&lt;br/&gt;                        $form-&amp;gt;add($element);&lt;br/&gt;                        $element = new form_element_text("field2","Field 2","This is field 2");&lt;br/&gt;                        $form-&amp;gt;add($element);&lt;br/&gt;                        $element = new form_button("Button 1","Form1_Button1_Clicked");&lt;br/&gt;                        $form-&amp;gt;add($element);&lt;br/&gt;                $form-&amp;gt;run();&lt;br/&gt;                if ($form-&amp;gt;submitted){ $tabs-&amp;gt;active = "Form 1"; }&lt;br/&gt;        $tabs-&amp;gt;end();&lt;br/&gt; &lt;br/&gt;        $tabs-&amp;gt;start("Form 2");&lt;br/&gt;                $form = new form("form2");&lt;br/&gt;                        $element = new form_element_text("field1","Field 1","This is field 1");&lt;br/&gt;                        $form-&amp;gt;add($element);&lt;br/&gt;                        $element = new form_element_text("field2","Field 2","This is field 2");&lt;br/&gt;                        $form-&amp;gt;add($element);&lt;br/&gt;                        $element = new form_element_text("field3","Field 3","This is field 3");&lt;br/&gt;                        $form-&amp;gt;add($element);&lt;br/&gt;                        $element = new form_button("Button 1","Form2_Button1_Clicked");&lt;br/&gt;                        $form-&amp;gt;add($element);&lt;br/&gt;                $form-&amp;gt;run();&lt;br/&gt;                if ($form-&amp;gt;submitted){ $tabs-&amp;gt;active = "Form 2"; }&lt;br/&gt;        $tabs-&amp;gt;end();&lt;br/&gt; &lt;br/&gt;$tabs-&amp;gt;run();&lt;/pre&gt;&lt;/div&gt;&lt;br/&gt;&lt;br /&gt;&lt;a target='_blank' title='ossPro Examples: Easy Tabs Example 2' href='http://examples.osspro.com/11/example2.php'&gt;View Example&lt;/a&gt; or &lt;a title='ossPro Examples: Easy Tabs Example 2' href='http://examples.osspro.com/?f=17'&gt;Download Source&lt;/a&gt;&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;&lt;h1&gt;Download&lt;/h1&gt;&lt;br /&gt;If you would like to use Easy Tabs you can download and include the tabs.php file below.&lt;br/&gt;&lt;br /&gt;Also included is a sample tabs.css file to get you started on styling it to fit your website.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3474577459886827247-7206304481269068532?l=cwjen888.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cwjen888.blogspot.com/feeds/7206304481269068532/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3474577459886827247&amp;postID=7206304481269068532' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/7206304481269068532'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/7206304481269068532'/><link rel='alternate' type='text/html' href='http://cwjen888.blogspot.com/2009/01/php-easy-tabs-for-your-webpages.html' title='PHP: Easy Tabs for your webpages'/><author><name>David Chang</name><uri>http://www.blogger.com/profile/05943998889053147615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3474577459886827247.post-2773206194065270084</id><published>2009-01-07T23:37:00.001-08:00</published><updated>2009-01-07T23:37:30.793-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='范范'/><category scheme='http://www.blogger.com/atom/ns#' term='Internet'/><title type='text'>memcached - 解決高流量問題</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;h2&gt;memcached - 解決高流量問題&lt;/h2&gt;&lt;br /&gt;						&lt;br /&gt;						&lt;br /&gt;																											&lt;div class='t_msgfont' id='postmessage_89256'&gt;###################################################&lt;br/&gt;&lt;br /&gt;# 文章來源 &lt;a target='_blank' href='http://www.ecstart.com/'&gt;http://www.ecstart.com&lt;/a&gt;&lt;br/&gt;&lt;br /&gt;# 作者 : FIEND&lt;br/&gt;&lt;br /&gt;# 轉貼請註明出處&lt;br/&gt;&lt;br /&gt;###################################################&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;strong&gt;介紹 : &lt;/strong&gt;&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;現在機器的記憶體真的比起過去便宜太多了....&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;看到這個套件 感觸蠻多的 ^^ ....&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;使用這個套件 必需是個有經驗 而且具備分析和規畫能力的 programer ..&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;因為它必需要建置 services 時 就開始想怎麼去規畫它 . &lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;a target='_blank' href='http://tw2.php.net/manual/en/intro.memcache.php'&gt;http://tw2.php.net/manual/en/intro.memcache.php&lt;/a&gt;&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;什麼是 memcache : &lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;memcache 官方網站的介紹 - &lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;memcached is a high-performance, distributed memory object caching&lt;br /&gt;system, generic in nature, but intended for use in speeding up dynamic&lt;br /&gt;web applications by alleviating database load.&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;Danga Interactive developed memcached to enhance the speed of &lt;span class='t_tag' onclick='tagshow(event)' href='http://bbs.ecstart.com/tag.php?name=Live'&gt;Live&lt;/span&gt;Journal.com, a site which was already doing 20 million+ dynamic page views per day for 1 million users with a bunch of web&lt;span class='t_tag' onclick='tagshow(event)' href='http://bbs.ecstart.com/tag.php?name=server'&gt;server&lt;/span&gt;s and a bunch of database &lt;span class='t_tag' onclick='tagshow(event)' href='http://bbs.ecstart.com/tag.php?name=server'&gt;server&lt;/span&gt;s.&lt;br /&gt;memcached dropped the database load to almost nothing, yielding faster&lt;br /&gt;page load times for users, better resource utilization, and faster&lt;br /&gt;access to the databases on a memcache miss.&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;############## &lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;台灣同時幾萬人就很了不起了 @@ &lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;百萬人環境 存取資料庫將會非常的可怕 , 一般這種流量等級的網站是絕對不會輕易的把資料庫的存取對外的 .&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;所以 能夠節省 動態網頁 / user　存取動作去接觸到 db 的動作 能快取就盡量快取 ( 最好能沒有 db 就盡量全部從 db doump 出靜態 html )&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;當然這樣的苦和想法 早在很久以前就大家都玩過了 , 很多做 http 技術多年的朋友們看到這個工具應該都會覺得現在的硬體科技進步太多了 ^^ .&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;而 這個工具主要是為了 降低 存取 資料庫次數及要求 將 動態網頁 所需要的存取行為快取下來 , 而沿生出來的工具 .&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;當然 它還有一個好處是可以去避免 sql injection 啦... @@ &lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;strong&gt;感想 :&lt;/strong&gt;&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;@@ 不過 這麼幹算你狠 .... &lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;我記得多年前 在某一家流量蠻大的公司...&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;@@ 同時線上人數四萬人 , 會員人數二百多萬..每日點擊次數 幾千萬 , 而且 server 還是 p4 1.x 及 p3 古董 等級的 cpu 而 記憶體 也才 幾百mb 就是屌了.&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;光是靜態的一個服務就要幾台 做 分散式架構了 ...而且 我們在做這種東西時都只能存在 硬碟 .. ( 記憶體那有這麼大 @@ )&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;而它提供了 記憶體存取 物件 , 而且可以 分散式的存取 .&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;現在寫程式的人真幸福... @@ 看到這個 tool 我直接聯想就是... 記憶體真便宜 哈哈哈....&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;這個玩法 之前和一個南非工程師在閒聊 他們公司是 &lt;span class='t_tag' onclick='tagshow(event)' href='http://bbs.ecstart.com/tag.php?name=java'&gt;java&lt;/span&gt; 好像也是用類似這樣的工具來做的 在南非有五萬人會同時去存取他們的伺服器...&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;用這個方法 一台伺服器就可以搞定五萬人同時存取... @@ 只是 記憶體用的超兇... 不過總比 買一堆伺服器好吧  ccc&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;在無名還沒賣掉前 我在 it home 看到 無名小站用了 幾百台伺服器才搞定 超高流量存取量的問題 ( 我家伺服器還在貨櫃上 厚~ 別跟大家說你用 php 架 services  ) ..... &lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;看到這篇報導時我覺得當時還真是會亂花錢 , 還好賣掉了 cccc ....&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;你家網站存取量超級高而且機器用很兇嗎??? 玩看看吧. ^^&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;strong&gt;範例&lt;/strong&gt;&lt;br/&gt;&lt;br /&gt;In this example, an object is being saved in the cache and then&lt;br /&gt;retrieved back. Object and other non-scalar types are serialized before&lt;br /&gt;saving, so it's impossible to store resources (i.e. connection&lt;br /&gt;identifiers and others) in the cache.&lt;div class='blockcode'&gt;&lt;span onclick='copycode($(&amp;apos;code0&amp;apos;));' class='headactions'&gt;複製內容到剪貼板&lt;/span&gt;&lt;h5&gt;代碼:&lt;/h5&gt;&lt;code id='code0'&gt;&amp;lt;?php&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;$memcache = new Memcache;&lt;br/&gt;&lt;br /&gt;$memcache-&amp;gt;connect('localhost', 11211) or die ("Could not connect");&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;$version = $memcache-&amp;gt;getVersion();&lt;br/&gt;&lt;br /&gt;echo "Server's version: ".$version."&lt;br/&gt;&lt;br /&gt;\n";&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;$tmp_object = new stdClass;&lt;br/&gt;&lt;br /&gt;$tmp_object-&amp;gt;str_attr = 'test';&lt;br/&gt;&lt;br /&gt;$tmp_object-&amp;gt;int_attr = 123;&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;$memcache-&amp;gt;set('key', $tmp_object, false, 10) or die ("Failed to save data at the server");&lt;br/&gt;&lt;br /&gt;echo "Store data in the cache (data will expire in 10 seconds)&lt;br/&gt;&lt;br /&gt;\n";&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;$get_result = $memcache-&amp;gt;get('key');&lt;br/&gt;&lt;br /&gt;echo "Data from the cache:&lt;br/&gt;&lt;br /&gt;\n";&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;var_dump($get_result);&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;?&amp;gt;&lt;/code&gt;&lt;/div&gt;&lt;div class='blockcode'&gt;&lt;span onclick='copycode($(&amp;apos;code1&amp;apos;));' class='headactions'&gt;複製內容到剪貼板&lt;/span&gt;&lt;h5&gt;代碼:&lt;/h5&gt;&lt;code id='code1'&gt;&amp;lt;?php&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;$session_save_path = "tcp://$host:$port?persistent=1&amp;amp;weight=2&amp;amp;timeout=2&amp;amp;retry_interval=10,&amp;amp;nbsp; ,tcp://$host:$port  ";&lt;br/&gt;&lt;br /&gt;ini_set('session.save_handler', 'memcache');&lt;br/&gt;&lt;br /&gt;ini_set('session.save_path', $session_save_path);&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;?&amp;gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3474577459886827247-2773206194065270084?l=cwjen888.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cwjen888.blogspot.com/feeds/2773206194065270084/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3474577459886827247&amp;postID=2773206194065270084' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/2773206194065270084'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/2773206194065270084'/><link rel='alternate' type='text/html' href='http://cwjen888.blogspot.com/2009/01/memcached.html' title='memcached - 解決高流量問題'/><author><name>David Chang</name><uri>http://www.blogger.com/profile/05943998889053147615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3474577459886827247.post-7297774560959342520</id><published>2009-01-05T21:52:00.001-08:00</published><updated>2009-01-05T21:52:31.634-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='生活'/><category scheme='http://www.blogger.com/atom/ns#' term='范范'/><title type='text'>傻瓜相機拍攝教學</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;p align='center'&gt;&lt;a href='http://www.486word.com/index.htm'&gt;&lt;small&gt;回486的小窩&lt;/small&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align='center'&gt;&lt;small&gt;&lt;a href='http://www.486word.com/newpage21.htm'&gt;新手篇&lt;/a&gt;   &lt;a href='http://www.486word.com/newpage22.htm'&gt;入門篇&lt;/a&gt;  &lt;a href='http://www.486word.com/newpage27.htm'&gt;瞭解篇&lt;/a&gt;  &lt;a href='http://www.486word.com/newpage28.htm'&gt;進階篇&lt;/a&gt;  &lt;a href='http://www.486word.com/newpage33.htm'&gt;夜景拍攝&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align='center'&gt;&lt;small&gt;&lt;a href='http://www.486word.com/newpage56.htm'&gt;善用程式模式&lt;/a&gt;    &lt;a href='http://www.486word.com/newpage36.htm'&gt;善用小山遠景模式&lt;/a&gt;    &lt;a href='http://www.486word.com/newpage57.htm'&gt;淺談構圖&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;hr width='50%'/&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;center&gt;&lt;br /&gt;&lt;br /&gt;&lt;table height='226' border='1' width='609'&gt;&lt;br /&gt;  &lt;tbody&gt;&lt;tr&gt;&lt;br /&gt;    &lt;td height='189' align='left' width='302' valign='top'&gt;&lt;img height='225' width='300' alt='Dscf2146.jpg (25108 bytes)' src='http://www.486word.com/Dscf2146.jpg'/&gt;&lt;/td&gt;&lt;br /&gt;    &lt;td height='189' align='left' width='295' valign='top'&gt;&lt;small&gt;數位相機重要三大功能之『測光模式』。&lt;/small&gt;&lt;p&gt;&lt;small&gt;一般來說，測光有三種模式。分別是：平均測光、點測光、中央側光這三種。但不一定每種相機都一定會內建這三種測光模式。當然，最好還是要有比較好啦。&lt;/small&gt;&lt;/p&gt;&lt;br /&gt;    &lt;p&gt;&lt;small&gt;當日正當中，豔陽高照，人物背光『背光就是背後有強光』時，主題會明顯過暗。&lt;/small&gt;&lt;/p&gt;&lt;br /&gt;    &lt;p&gt;&lt;small&gt;這張是以『平均測光』來拍攝。&lt;/small&gt;&lt;/p&gt;&lt;br /&gt;    &lt;p&gt;&lt;small&gt;主題的那郭...大葉子植物，一坨黑黑的，誰知到那是啥阿。&lt;/small&gt;&lt;/p&gt;&lt;/td&gt;&lt;br /&gt;  &lt;/tr&gt;&lt;br /&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;/center&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align='center'&gt;　&lt;/p&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;center&gt;&lt;br /&gt;&lt;br /&gt;&lt;table height='226' border='1' width='609'&gt;&lt;br /&gt;  &lt;tbody&gt;&lt;tr&gt;&lt;br /&gt;    &lt;td height='189' align='left' width='302' valign='top'&gt;&lt;img height='225' width='300' alt='Dscf2145.jpg (14694 bytes)' src='http://www.486word.com/Dscf2145.jpg'/&gt;&lt;/td&gt;&lt;br /&gt;    &lt;td height='189' align='left' width='295' valign='top'&gt;&lt;small&gt;分析：&lt;/small&gt;&lt;p&gt;&lt;small&gt;這時候你就能使用『點測光模式』來拍攝了。&lt;/small&gt;&lt;/p&gt;&lt;br /&gt;    &lt;p&gt;&lt;small&gt;將測光模式調到點測光，畫面對著右下方紅點左右的位置，半按快門對焦與測光之後，再將畫面移到你要拍的角度按下快門既可。&lt;/small&gt;&lt;/p&gt;&lt;br /&gt;    &lt;p&gt;　&lt;/p&gt;&lt;/td&gt;&lt;br /&gt;  &lt;/tr&gt;&lt;br /&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;/center&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align='center'&gt;　&lt;/p&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;center&gt;&lt;br /&gt;&lt;br /&gt;&lt;table height='226' border='1' width='609'&gt;&lt;br /&gt;  &lt;tbody&gt;&lt;tr&gt;&lt;br /&gt;    &lt;td height='189' align='left' width='302' valign='top'&gt;&lt;img height='225' width='300' alt='DSCF0665.JPG (34330 bytes)' src='http://www.486word.com/DSCF0665.JPG'/&gt;&lt;/td&gt;&lt;br /&gt;    &lt;td height='189' align='left' width='295' valign='top'&gt;&lt;small&gt;範例2&lt;/small&gt;&lt;p&gt;&lt;small&gt;前幾年與太太旅遊時拍攝的。&lt;/small&gt;&lt;/p&gt;&lt;br /&gt;    &lt;p&gt;&lt;small&gt;當時因為背光，所以也是利用點測光來測臉部之後拍攝。&lt;/small&gt;&lt;/p&gt;&lt;br /&gt;    &lt;p&gt;&lt;small&gt;使用點測光時，背景一般來說會曝光過渡，造成一遍白茫茫。但這效果，也往往能將主題很清楚明確的表達出來。&lt;/small&gt;&lt;/p&gt;&lt;/td&gt;&lt;br /&gt;  &lt;/tr&gt;&lt;br /&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;/center&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align='center'&gt;　&lt;/p&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;center&gt;&lt;br /&gt;&lt;br /&gt;&lt;table height='204' border='1' width='609'&gt;&lt;br /&gt;  &lt;tbody&gt;&lt;tr&gt;&lt;br /&gt;    &lt;td height='167' align='left' width='302' valign='top'&gt;&lt;img height='200' width='300' alt='DSC06524.JPG (41757 bytes)' src='http://www.486word.com/DSC06524.JPG'/&gt;&lt;/td&gt;&lt;br /&gt;    &lt;td height='167' align='left' width='295' valign='top'&gt;&lt;small&gt;相反的，我們也能利用點測光來達到一種所謂『剪影』的特殊感覺。&lt;/small&gt;&lt;p&gt;&lt;small&gt;拍攝方法：&lt;/small&gt;&lt;/p&gt;&lt;br /&gt;    &lt;p&gt;&lt;small&gt;將點測光對著光亮之處，半按快門之後再進行畫面構圖。&lt;/small&gt;&lt;/p&gt;&lt;br /&gt;    &lt;p&gt;&lt;small&gt;你看，醬子一來，有種很特殊的味道了吧。&lt;/small&gt;&lt;/p&gt;&lt;/td&gt;&lt;br /&gt;  &lt;/tr&gt;&lt;br /&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;/center&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align='center'&gt;　&lt;/p&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;center&gt;&lt;br /&gt;&lt;br /&gt;&lt;table height='95' border='1' width='609'&gt;&lt;br /&gt;  &lt;tbody&gt;&lt;tr&gt;&lt;br /&gt;    &lt;td height='58' align='left' width='597' valign='top'&gt;&lt;small&gt;筆記本：&lt;/small&gt;&lt;p&gt;&lt;small&gt;平均測光：將畫面分割成64等分、甚至254等分之後，相機會去計算每一個格子的明暗度後，平均數值總和來判斷曝光值。拍照時大多使用這模式。&lt;/small&gt;&lt;/p&gt;&lt;br /&gt;    &lt;p&gt;&lt;small&gt;中央測光：以畫面中間約60％～70％來做曝光值計算的一種方式。&lt;/small&gt;&lt;/p&gt;&lt;/td&gt;&lt;br /&gt;  &lt;/tr&gt;&lt;br /&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;/center&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align='center'&gt;　&lt;/p&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;center&gt;&lt;br /&gt;&lt;br /&gt;&lt;table height='570' border='1' width='609'&gt;&lt;br /&gt;  &lt;tbody&gt;&lt;tr&gt;&lt;br /&gt;    &lt;td height='189' align='left' width='302' valign='top'&gt;&lt;img height='225' width='300' alt='brfg01.JPG (31952 bytes)' src='http://www.486word.com/brfg01.JPG'/&gt;&lt;/td&gt;&lt;br /&gt;    &lt;td height='570' align='left' width='295' valign='top' rowspan='3'&gt;&lt;small&gt;白平衡：&lt;/small&gt;&lt;p&gt;&lt;small&gt;相機選項幾乎一定會有一個『白平衡』的設定模式。除非你是非常低階的數位相機。&lt;/small&gt;&lt;/p&gt;&lt;br /&gt;    &lt;p&gt;&lt;small&gt;相機大多會內建幾種白平衡模式。例如『AUTO』、『太陽』、『陰天』、『燈泡』、『日光燈』等。比較好一點的，還會有1～2組『自訂白平衡』模式。&lt;/small&gt;&lt;/p&gt;&lt;br /&gt;    &lt;p&gt;&lt;small&gt;簡單說，在戶外出太陽時，白平衡就要調成『太陽』，戶外陰天時，就要調成『陰天』，依此類推。&lt;/small&gt;&lt;/p&gt;&lt;br /&gt;    &lt;p&gt;&lt;small&gt;為何要這樣麻煩呢？那是因為相機構造不像人的眼睛醬子精密與複雜。&lt;/small&gt;&lt;/p&gt;&lt;br /&gt;    &lt;p&gt;&lt;small&gt;不管是在戶外、室內、燈泡下、還是日光燈，我們人眼所看到白色紙張時，我們就知道那是一張白色的紙張，不會誤判『色盲除外』。&lt;/small&gt;&lt;/p&gt;&lt;br /&gt;    &lt;p&gt;&lt;small&gt;相機就沒這麼聰明了『廢話，花100萬元買你一對雙眼你肯挖出來賣嗎』。&lt;/small&gt;&lt;/p&gt;&lt;br /&gt;    &lt;p&gt;&lt;small&gt;所以我們必須告訴相機這些資訊、訊息來幫助相機判斷。&lt;/small&gt;&lt;/p&gt;&lt;br /&gt;    &lt;p&gt;&lt;small&gt;以左邊，下方照片就是標準顏色。&lt;/small&gt;&lt;/p&gt;&lt;br /&gt;    &lt;p&gt;&lt;small&gt;當然，現在相機越做越聰明，大多數場合，使用AUTO模式也不一定會造成相機的誤判。&lt;/small&gt;&lt;/p&gt;&lt;br /&gt;    &lt;p&gt;&lt;small&gt;有時候我們也能利用刻意亂調白平衡來做一些特殊色彩的變化喔。&lt;/small&gt;&lt;/p&gt;&lt;br /&gt;    &lt;p&gt;　&lt;/p&gt;&lt;/td&gt;&lt;br /&gt;  &lt;/tr&gt;&lt;br /&gt;  &lt;tr&gt;&lt;br /&gt;    &lt;td height='192' align='left' width='302' valign='top'&gt;&lt;img height='225' width='300' alt='brfg04.JPG (35735 bytes)' src='http://www.486word.com/brfg04.JPG'/&gt;&lt;/td&gt;&lt;br /&gt;  &lt;/tr&gt;&lt;br /&gt;  &lt;tr&gt;&lt;br /&gt;    &lt;td height='189' align='left' width='302' valign='top'&gt;&lt;img height='225' width='300' alt='brfg03.JPG (30880 bytes)' src='http://www.486word.com/brfg03.JPG'/&gt;&lt;/td&gt;&lt;br /&gt;  &lt;/tr&gt;&lt;br /&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;/center&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align='center'&gt;　&lt;/p&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;center&gt;&lt;br /&gt;&lt;br /&gt;&lt;table height='273' border='1' width='609'&gt;&lt;br /&gt;  &lt;tbody&gt;&lt;tr&gt;&lt;br /&gt;    &lt;td height='216' align='left' width='302' valign='top'&gt;&lt;img height='225' width='300' alt='DSC00035_2.JPG (54503 bytes)' src='http://www.486word.com/DSC00035_2.JPG'/&gt;&lt;/td&gt;&lt;br /&gt;    &lt;td height='216' align='left' width='295' valign='top'&gt;&lt;img height='225' width='300' alt='DSC00036_2.JPG (58936 bytes)' src='http://www.486word.com/DSC00036_2.JPG'/&gt;&lt;/td&gt;&lt;br /&gt;  &lt;/tr&gt;&lt;br /&gt;  &lt;tr&gt;&lt;br /&gt;    &lt;td height='45' align='left' width='597' valign='top' colspan='2'&gt;&lt;small&gt;1998年，世貿資訊展。筆者故意將白平衡設成『燈泡』模式，拍出左邊比較冰冷的感覺。而右邊則為AUTO白平衡模式。&lt;/small&gt;&lt;p&gt;&lt;small&gt;你看，兩張照片感覺有差吧！&lt;/small&gt;&lt;/p&gt;&lt;/td&gt;&lt;br /&gt;  &lt;/tr&gt;&lt;br /&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;/center&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align='center'&gt;　&lt;/p&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;center&gt;&lt;br /&gt;&lt;br /&gt;&lt;table height='226' border='1' width='609'&gt;&lt;br /&gt;  &lt;tbody&gt;&lt;tr&gt;&lt;br /&gt;    &lt;td height='189' align='left' width='302' valign='top'&gt;&lt;img height='225' width='300' alt='DSC00006.JPG (41353 bytes)' src='http://www.486word.com/DSC00006.JPG'/&gt;&lt;/td&gt;&lt;br /&gt;    &lt;td height='189' align='left' width='295' valign='top'&gt;&lt;small&gt;1998年攝於筆者辦公室。&lt;/small&gt;&lt;p&gt;&lt;small&gt;有沒有感覺到很怪異的偏綠色色調？&lt;/small&gt;&lt;/p&gt;&lt;br /&gt;    &lt;p&gt;&lt;small&gt;現在室內燈源太複雜啦。明明都是日光燈管，但廠牌、型號不同，其顏色都不一樣。&lt;/small&gt;&lt;/p&gt;&lt;br /&gt;    &lt;p&gt;&lt;small&gt;這時候，若相機有『自設白平衡』功能，只要隨便找一張白紙，就能立即做設定。&lt;/small&gt;&lt;/p&gt;&lt;br /&gt;    &lt;p&gt;&lt;small&gt;可惜當時筆者的相機沒有這功能，所以辦公室內所拍的照片，都是這個怪色調。&lt;/small&gt;&lt;/p&gt;&lt;/td&gt;&lt;br /&gt;  &lt;/tr&gt;&lt;br /&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;/center&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align='center'&gt;　&lt;/p&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;center&gt;&lt;br /&gt;&lt;br /&gt;&lt;table height='226' border='1' width='609'&gt;&lt;br /&gt;  &lt;tbody&gt;&lt;tr&gt;&lt;br /&gt;    &lt;td height='189' align='left' width='302' valign='top'&gt;&lt;img height='225' width='300' alt='010708162.JPG (16346 bytes)' src='http://www.486word.com/010708162.JPG'/&gt;&lt;/td&gt;&lt;br /&gt;    &lt;td height='189' align='left' width='295' valign='top'&gt;&lt;small&gt;在光線不夠明亮的時候，相機為了達到足夠的光線，會降低快門的速度。&lt;/small&gt;&lt;p&gt;&lt;small&gt;快門一放慢，若主題晃動或者拍攝者的身體、手也晃動，那麼拍出來的效果就是這個樣子。&lt;/small&gt;&lt;/p&gt;&lt;br /&gt;    &lt;p&gt;&lt;small&gt;感謝我兒子286友情客串。&lt;/small&gt;&lt;/p&gt;&lt;/td&gt;&lt;br /&gt;  &lt;/tr&gt;&lt;br /&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;/center&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align='center'&gt;　&lt;/p&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;center&gt;&lt;br /&gt;&lt;br /&gt;&lt;table height='226' border='1' width='609'&gt;&lt;br /&gt;  &lt;tbody&gt;&lt;tr&gt;&lt;br /&gt;    &lt;td height='189' align='left' width='302' valign='top'&gt;&lt;img height='225' width='300' alt='010708165.JPG (21579 bytes)' src='http://www.486word.com/010708165.JPG'/&gt;&lt;/td&gt;&lt;br /&gt;    &lt;td height='189' align='left' width='295' valign='top'&gt;&lt;small&gt;窩喔，那怎辦阿，拍得那樣模糊，有拍跟沒拍也沒甚麼兩樣了耶！&lt;/small&gt;&lt;p&gt;&lt;small&gt;沒關係，教你一招『必殺技』。&lt;/small&gt;&lt;/p&gt;&lt;/td&gt;&lt;br /&gt;  &lt;/tr&gt;&lt;br /&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;/center&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align='center'&gt;　&lt;/p&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;center&gt;&lt;br /&gt;&lt;br /&gt;&lt;table height='226' border='1' width='609'&gt;&lt;br /&gt;  &lt;tbody&gt;&lt;tr&gt;&lt;br /&gt;    &lt;td height='189' align='left' width='302' valign='top'&gt;&lt;img height='225' width='300' alt='0106100041.JPG (22674 bytes)' src='http://www.486word.com/0106100041.JPG'/&gt;&lt;/td&gt;&lt;br /&gt;    &lt;td height='189' align='left' width='295' valign='top'&gt;&lt;small&gt;挖咧....別亂教啦486，要是學你這一招，我不被我家人打死才怪...&lt;/small&gt;&lt;p&gt;&lt;small&gt;好啦好啦，講正經的。&lt;/small&gt;&lt;/p&gt;&lt;br /&gt;    &lt;p&gt;&lt;small&gt;若光線不足，你可以移一展檯燈過來，醬子不就行啦。&lt;/small&gt;&lt;/p&gt;&lt;/td&gt;&lt;br /&gt;  &lt;/tr&gt;&lt;br /&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;/center&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align='center'&gt;　&lt;/p&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;center&gt;&lt;br /&gt;&lt;br /&gt;&lt;table height='226' border='1' width='609'&gt;&lt;br /&gt;  &lt;tbody&gt;&lt;tr&gt;&lt;br /&gt;    &lt;td height='189' align='left' width='302' valign='top'&gt;&lt;img height='225' width='300' alt='DSCF0820.JPG (34712 bytes)' src='http://www.486word.com/DSCF0820.JPG'/&gt;&lt;/td&gt;&lt;br /&gt;    &lt;td height='189' align='left' width='295' valign='top'&gt;&lt;small&gt;或者等白天再拍不會喔。&lt;/small&gt;&lt;p&gt;&lt;small&gt;不要不要...人家就是要在晚上拍攝啦。&lt;/small&gt;&lt;/p&gt;&lt;br /&gt;    &lt;p&gt;　&lt;/p&gt;&lt;/td&gt;&lt;br /&gt;  &lt;/tr&gt;&lt;br /&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;/center&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align='center'&gt;　&lt;/p&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;center&gt;&lt;br /&gt;&lt;br /&gt;&lt;table height='226' border='1' width='609'&gt;&lt;br /&gt;  &lt;tbody&gt;&lt;tr&gt;&lt;br /&gt;    &lt;td height='189' align='left' width='302' valign='top'&gt;&lt;img height='225' width='300' alt='DSCF0785.JPG (25804 bytes)' src='http://www.486word.com/DSCF0785.JPG'/&gt;&lt;/td&gt;&lt;br /&gt;    &lt;td height='189' align='left' width='295' valign='top'&gt;&lt;small&gt;其實你可以開啟閃光燈來拍。&lt;/small&gt;&lt;p&gt;&lt;small&gt;但若有些場合不能開啟閃當燈，又或者拍小寶寶怕閃燈會傷害寶寶眼睛，你可以將ISO值調高一些。&lt;/small&gt;&lt;/p&gt;&lt;br /&gt;    &lt;p&gt;&lt;small&gt;這是才是這單元要講的重點啦！&lt;/small&gt;&lt;/p&gt;&lt;br /&gt;    &lt;p&gt;&lt;small&gt;大多數位相機值能從100調到400。數值越高，感光度越高。&lt;/small&gt;&lt;/p&gt;&lt;br /&gt;    &lt;p&gt;&lt;small&gt;但，有部分相機，若ISO值太高，畫面的顆粒會很粗糙喔。&lt;/small&gt;&lt;/p&gt;&lt;br /&gt;    &lt;p&gt;&lt;small&gt;所以關於這點，挑選相機時要問問口碑了。&lt;/small&gt;&lt;/p&gt;&lt;/td&gt;&lt;br /&gt;  &lt;/tr&gt;&lt;br /&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;/center&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align='center'&gt;&lt;small&gt;2002.08.27 &lt;/small&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align='center'&gt;&lt;small&gt;&lt;a href='http://www.486word.com/newpage21.htm'&gt;新手篇&lt;/a&gt;   &lt;a href='http://www.486word.com/newpage22.htm'&gt;入門篇&lt;/a&gt;  &lt;a href='http://www.486word.com/newpage27.htm'&gt;瞭解篇&lt;/a&gt;  &lt;a href='http://www.486word.com/newpage28.htm'&gt;進階篇&lt;/a&gt;  &lt;a href='http://www.486word.com/newpage33.htm'&gt;夜景拍攝&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align='center'&gt;&lt;small&gt;&lt;a href='http://www.486word.com/newpage56.htm'&gt;善用程式模式&lt;/a&gt;    &lt;a href='http://www.486word.com/newpage36.htm'&gt;善用小山遠景模式&lt;/a&gt;    &lt;a href='http://www.486word.com/newpage57.htm'&gt;淺談構圖&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3474577459886827247-7297774560959342520?l=cwjen888.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cwjen888.blogspot.com/feeds/7297774560959342520/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3474577459886827247&amp;postID=7297774560959342520' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/7297774560959342520'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/7297774560959342520'/><link rel='alternate' type='text/html' href='http://cwjen888.blogspot.com/2009/01/blog-post_05.html' title='傻瓜相機拍攝教學'/><author><name>David Chang</name><uri>http://www.blogger.com/profile/05943998889053147615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3474577459886827247.post-5646660930938316590</id><published>2009-01-05T21:22:00.001-08:00</published><updated>2009-01-05T21:22:35.431-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='范范'/><title type='text'>光影魔術手使用說明</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;br/&gt;&lt;br /&gt;          &lt;div class='list-linkcontrol'&gt;&lt;br /&gt;                      &lt;/div&gt;&lt;br /&gt;          &lt;br/&gt;&lt;br /&gt;          &lt;br /&gt;                        &lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;br /&gt;              &lt;td nowrap='nowrap'&gt;&lt;br /&gt;              2007.08.20 &lt;a href='http://www.wretch.cc/blog/mscraft/17512749'&gt;【分享】nEO 撕邊修改&lt;/a&gt;&lt;br /&gt;              &lt;/td&gt;&lt;br /&gt;              &lt;td&gt;mscraft&lt;/td&gt;&lt;br /&gt;                            &lt;/tr&gt;&lt;br /&gt;                                    &lt;tr&gt;&lt;br /&gt;              &lt;td nowrap='nowrap'&gt;&lt;br /&gt;              2007.08.08 &lt;a href='http://www.wretch.cc/blog/mscraft/17510390'&gt;【分享】nEO 撕邊應用&lt;/a&gt;&lt;br /&gt;              &lt;/td&gt;&lt;br /&gt;              &lt;td&gt;mscraft&lt;/td&gt;&lt;br /&gt;                            &lt;/tr&gt;&lt;br /&gt;                                    &lt;tr&gt;&lt;br /&gt;              &lt;td nowrap='nowrap'&gt;&lt;br /&gt;              2007.07.23 &lt;a href='http://www.wretch.cc/blog/mscraft/17505550'&gt;【分享】nEO 撕邊下載&lt;/a&gt;&lt;br /&gt;              &lt;/td&gt;&lt;br /&gt;              &lt;td&gt;mscraft&lt;/td&gt;&lt;br /&gt;                            &lt;/tr&gt;&lt;br /&gt;                                    &lt;tr&gt;&lt;br /&gt;              &lt;td nowrap='nowrap'&gt;&lt;br /&gt;              2007.07.16 &lt;a href='http://www.wretch.cc/blog/mscraft/17500892'&gt;【分享】nEO 撕邊邊框&lt;/a&gt;&lt;br /&gt;              &lt;/td&gt;&lt;br /&gt;              &lt;td&gt;mscraft&lt;/td&gt;&lt;br /&gt;                            &lt;/tr&gt;&lt;br /&gt;                                    &lt;tr&gt;&lt;br /&gt;              &lt;td nowrap='nowrap'&gt;&lt;br /&gt;              2007.07.02 &lt;a href='http://www.wretch.cc/blog/mscraft/17378786'&gt;【分享】nEO 素材站&lt;/a&gt;&lt;br /&gt;              &lt;/td&gt;&lt;br /&gt;              &lt;td&gt;mscraft&lt;/td&gt;&lt;br /&gt;                            &lt;/tr&gt;&lt;br /&gt;                                    &lt;tr&gt;&lt;br /&gt;              &lt;td nowrap='nowrap'&gt;&lt;br /&gt;              2007.06.25 &lt;a href='http://www.wretch.cc/blog/mscraft/17352849'&gt;【教學】nEO 嚴重白平衡&lt;/a&gt;&lt;br /&gt;              &lt;/td&gt;&lt;br /&gt;              &lt;td&gt;mscraft&lt;/td&gt;&lt;br /&gt;                            &lt;/tr&gt;&lt;br /&gt;                                    &lt;tr&gt;&lt;br /&gt;              &lt;td nowrap='nowrap'&gt;&lt;br /&gt;              2007.06.04 &lt;a href='http://www.wretch.cc/blog/mscraft/16916790'&gt;【教學】nEO 浮水印（三）&lt;/a&gt;&lt;br /&gt;              &lt;/td&gt;&lt;br /&gt;              &lt;td&gt;mscraft&lt;/td&gt;&lt;br /&gt;                            &lt;/tr&gt;&lt;br /&gt;                                    &lt;tr&gt;&lt;br /&gt;              &lt;td nowrap='nowrap'&gt;&lt;br /&gt;              2007.04.16 &lt;a href='http://www.wretch.cc/blog/mscraft/15505625'&gt;【教學】nEO 自由文字圖層&lt;/a&gt;&lt;br /&gt;              &lt;/td&gt;&lt;br /&gt;              &lt;td&gt;mscraft&lt;/td&gt;&lt;br /&gt;                            &lt;/tr&gt;&lt;br /&gt;                                    &lt;tr&gt;&lt;br /&gt;              &lt;td nowrap='nowrap'&gt;&lt;br /&gt;              2007.04.09 &lt;a href='http://www.wretch.cc/blog/mscraft/15141189'&gt;【分享】nEO 多圖邊框論壇&lt;/a&gt;&lt;br /&gt;              &lt;/td&gt;&lt;br /&gt;              &lt;td&gt;mscraft&lt;/td&gt;&lt;br /&gt;                            &lt;/tr&gt;&lt;br /&gt;                                    &lt;tr&gt;&lt;br /&gt;              &lt;td nowrap='nowrap'&gt;&lt;br /&gt;              2007.03.26 &lt;a href='http://www.wretch.cc/blog/mscraft/14822436'&gt;【教學】nEO 裁剪虛化（二）&lt;/a&gt;&lt;br /&gt;              &lt;/td&gt;&lt;br /&gt;              &lt;td&gt;mscraft&lt;/td&gt;&lt;br /&gt;                            &lt;/tr&gt;&lt;br /&gt;                                    &lt;tr&gt;&lt;br /&gt;              &lt;td nowrap='nowrap'&gt;&lt;br /&gt;              2007.03.21 &lt;a href='http://www.wretch.cc/blog/mscraft/14818668'&gt;【教學】nEO 裁剪填充（一）&lt;/a&gt;&lt;br /&gt;              &lt;/td&gt;&lt;br /&gt;              &lt;td&gt;mscraft&lt;/td&gt;&lt;br /&gt;                            &lt;/tr&gt;&lt;br /&gt;                                    &lt;tr&gt;&lt;br /&gt;              &lt;td nowrap='nowrap'&gt;&lt;br /&gt;              2007.03.12 &lt;a href='http://www.wretch.cc/blog/mscraft/14756989'&gt;【分享】nEO 新版上市&lt;/a&gt;&lt;br /&gt;              &lt;/td&gt;&lt;br /&gt;              &lt;td&gt;mscraft&lt;/td&gt;&lt;br /&gt;                            &lt;/tr&gt;&lt;br /&gt;                                    &lt;tr&gt;&lt;br /&gt;              &lt;td nowrap='nowrap'&gt;&lt;br /&gt;              2007.03.05 &lt;a href='http://www.wretch.cc/blog/mscraft/14589676'&gt;【分享】nEO 新版0.24&lt;/a&gt;&lt;br /&gt;              &lt;/td&gt;&lt;br /&gt;              &lt;td&gt;mscraft&lt;/td&gt;&lt;br /&gt;                            &lt;/tr&gt;&lt;br /&gt;                                    &lt;tr&gt;&lt;br /&gt;              &lt;td nowrap='nowrap'&gt;&lt;br /&gt;              2006.12.18 &lt;a href='http://www.wretch.cc/blog/mscraft/9406634'&gt;【分享】nEO 繁體中文 0.23&lt;/a&gt;&lt;br /&gt;              &lt;/td&gt;&lt;br /&gt;              &lt;td&gt;mscraft&lt;/td&gt;&lt;br /&gt;                            &lt;/tr&gt;&lt;br /&gt;                                    &lt;tr&gt;&lt;br /&gt;              &lt;td nowrap='nowrap'&gt;&lt;br /&gt;              2006.11.29 &lt;a href='http://www.wretch.cc/blog/mscraft/9113016'&gt;【教學】nEO 油畫效果 II&lt;/a&gt;&lt;br /&gt;              &lt;/td&gt;&lt;br /&gt;              &lt;td&gt;mscraft&lt;/td&gt;&lt;br /&gt;                            &lt;/tr&gt;&lt;br /&gt;                                    &lt;tr&gt;&lt;br /&gt;              &lt;td nowrap='nowrap'&gt;&lt;br /&gt;              2006.11.24 &lt;a href='http://www.wretch.cc/blog/mscraft/8720637'&gt;【教學】nEO 油畫效果&lt;/a&gt;&lt;br /&gt;              &lt;/td&gt;&lt;br /&gt;              &lt;td&gt;mscraft&lt;/td&gt;&lt;br /&gt;                            &lt;/tr&gt;&lt;br /&gt;                                    &lt;tr&gt;&lt;br /&gt;              &lt;td nowrap='nowrap'&gt;&lt;br /&gt;              2006.10.02 &lt;a href='http://www.wretch.cc/blog/mscraft/7553006'&gt;【分享】nEO 開發中的 0.23&lt;/a&gt;&lt;br /&gt;              &lt;/td&gt;&lt;br /&gt;              &lt;td&gt;mscraft&lt;/td&gt;&lt;br /&gt;                            &lt;/tr&gt;&lt;br /&gt;                                    &lt;tr&gt;&lt;br /&gt;              &lt;td nowrap='nowrap'&gt;&lt;br /&gt;              2006.09.29 &lt;a href='http://www.wretch.cc/blog/mscraft/7522011'&gt;【教學】nEO 花樣邊框 INI&lt;/a&gt;&lt;br /&gt;              &lt;/td&gt;&lt;br /&gt;              &lt;td&gt;mscraft&lt;/td&gt;&lt;br /&gt;                            &lt;/tr&gt;&lt;br /&gt;                                    &lt;tr&gt;&lt;br /&gt;              &lt;td nowrap='nowrap'&gt;&lt;br /&gt;              2006.09.25 &lt;a href='http://www.wretch.cc/blog/mscraft/7408778'&gt;【下載】花樣邊框&lt;/a&gt;&lt;br /&gt;              &lt;/td&gt;&lt;br /&gt;              &lt;td&gt;mscraft&lt;/td&gt;&lt;br /&gt;                            &lt;/tr&gt;&lt;br /&gt;                                    &lt;tr&gt;&lt;br /&gt;              &lt;td nowrap='nowrap'&gt;&lt;br /&gt;              2006.08.28 &lt;a href='http://www.wretch.cc/blog/mscraft/7148059'&gt;【分享】nEO 花樣邊框下載&lt;/a&gt;&lt;br /&gt;              &lt;/td&gt;&lt;br /&gt;              &lt;td&gt;mscraft&lt;/td&gt;&lt;br /&gt;                            &lt;/tr&gt;&lt;br /&gt;                                    &lt;tr&gt;&lt;br /&gt;              &lt;td nowrap='nowrap'&gt;&lt;br /&gt;              2006.08.14 &lt;a href='http://www.wretch.cc/blog/mscraft/7016853'&gt;【分享】nEO 官方論壇&lt;/a&gt;&lt;br /&gt;              &lt;/td&gt;&lt;br /&gt;              &lt;td&gt;mscraft&lt;/td&gt;&lt;br /&gt;                            &lt;/tr&gt;&lt;br /&gt;                                    &lt;tr&gt;&lt;br /&gt;              &lt;td nowrap='nowrap'&gt;&lt;br /&gt;              2006.08.11 &lt;a href='http://www.wretch.cc/blog/mscraft/6908542'&gt;【教學】nEO 邊框工廠&lt;/a&gt;&lt;br /&gt;              &lt;/td&gt;&lt;br /&gt;              &lt;td&gt;mscraft&lt;/td&gt;&lt;br /&gt;                            &lt;/tr&gt;&lt;br /&gt;                                    &lt;tr&gt;&lt;br /&gt;              &lt;td nowrap='nowrap'&gt;&lt;br /&gt;              2006.08.09 &lt;a href='http://www.wretch.cc/blog/mscraft/6906640'&gt;【分享】光影魔術手 0.22&lt;/a&gt;&lt;br /&gt;              &lt;/td&gt;&lt;br /&gt;              &lt;td&gt;mscraft&lt;/td&gt;&lt;br /&gt;                            &lt;/tr&gt;&lt;br /&gt;                                    &lt;tr&gt;&lt;br /&gt;              &lt;td nowrap='nowrap'&gt;&lt;br /&gt;              2006.07.21 &lt;a href='http://www.wretch.cc/blog/mscraft/6373177'&gt;【下載】撕邊邊框（四）　&lt;/a&gt;&lt;br /&gt;              &lt;/td&gt;&lt;br /&gt;              &lt;td&gt;mscraft&lt;/td&gt;&lt;br /&gt;                            &lt;/tr&gt;&lt;br /&gt;                                    &lt;tr&gt;&lt;br /&gt;              &lt;td nowrap='nowrap'&gt;&lt;br /&gt;              2006.07.07 &lt;a href='http://www.wretch.cc/blog/mscraft/6416229'&gt;【下載】光影魔術手0.21版&lt;/a&gt;&lt;br /&gt;              &lt;/td&gt;&lt;br /&gt;              &lt;td&gt;mscraft&lt;/td&gt;&lt;br /&gt;                            &lt;/tr&gt;&lt;br /&gt;                                    &lt;tr&gt;&lt;br /&gt;              &lt;td nowrap='nowrap'&gt;&lt;br /&gt;              2006.06.23 &lt;a href='http://www.wretch.cc/blog/mscraft/6180230'&gt;【下載】nEO 邊框下載&lt;/a&gt;&lt;br /&gt;              &lt;/td&gt;&lt;br /&gt;              &lt;td&gt;mscraft&lt;/td&gt;&lt;br /&gt;                            &lt;/tr&gt;&lt;br /&gt;                                    &lt;tr&gt;&lt;br /&gt;              &lt;td nowrap='nowrap'&gt;&lt;br /&gt;              2006.06.05 &lt;a href='http://www.wretch.cc/blog/mscraft/5808175'&gt;【下載】撕邊邊框下載　總整理&lt;/a&gt;&lt;br /&gt;              &lt;/td&gt;&lt;br /&gt;              &lt;td&gt;mscraft&lt;/td&gt;&lt;br /&gt;                            &lt;/tr&gt;&lt;br /&gt;                                    &lt;tr&gt;&lt;br /&gt;              &lt;td nowrap='nowrap'&gt;&lt;br /&gt;              2006.05.15 &lt;a href='http://www.wretch.cc/blog/mscraft/5447402'&gt;【分享】nEO 撕邊邊框下載（三）&lt;/a&gt;&lt;br /&gt;              &lt;/td&gt;&lt;br /&gt;              &lt;td&gt;mscraft&lt;/td&gt;&lt;br /&gt;                            &lt;/tr&gt;&lt;br /&gt;                                    &lt;tr&gt;&lt;br /&gt;              &lt;td nowrap='nowrap'&gt;&lt;br /&gt;              2006.05.12 &lt;a href='http://www.wretch.cc/blog/mscraft/5422150'&gt;【下載】nEO 撕邊邊框（二）&lt;/a&gt;&lt;br /&gt;              &lt;/td&gt;&lt;br /&gt;              &lt;td&gt;mscraft&lt;/td&gt;&lt;br /&gt;                            &lt;/tr&gt;&lt;br /&gt;                                    &lt;tr&gt;&lt;br /&gt;              &lt;td nowrap='nowrap'&gt;&lt;br /&gt;              2006.05.11 &lt;a href='http://www.wretch.cc/blog/mscraft/5407677'&gt;【下載】nEO 撕邊邊框（一）&lt;/a&gt;&lt;br /&gt;              &lt;/td&gt;&lt;br /&gt;              &lt;td&gt;mscraft&lt;/td&gt;&lt;br /&gt;                            &lt;/tr&gt;&lt;br /&gt;                                    &lt;tr&gt;&lt;br /&gt;              &lt;td nowrap='nowrap'&gt;&lt;br /&gt;              2006.05.03 &lt;a href='http://www.wretch.cc/blog/mscraft/5295548'&gt;【教學】nEO 郵寄戳章 ＆ 浮水印（十）&lt;/a&gt;&lt;br /&gt;              &lt;/td&gt;&lt;br /&gt;              &lt;td&gt;mscraft&lt;/td&gt;&lt;br /&gt;                            &lt;/tr&gt;&lt;br /&gt;                                    &lt;tr&gt;&lt;br /&gt;              &lt;td nowrap='nowrap'&gt;&lt;br /&gt;              2006.05.02 &lt;a href='http://www.wretch.cc/blog/mscraft/5279810'&gt;【教學】nEO 撕邊邊框 DIY（九）&lt;/a&gt;&lt;br /&gt;              &lt;/td&gt;&lt;br /&gt;              &lt;td&gt;mscraft&lt;/td&gt;&lt;br /&gt;                            &lt;/tr&gt;&lt;br /&gt;                                    &lt;tr&gt;&lt;br /&gt;              &lt;td nowrap='nowrap'&gt;&lt;br /&gt;              2006.04.28 &lt;a href='http://www.wretch.cc/blog/mscraft/5213393'&gt;【教學】nEO 花樣邊框DIY（八）&lt;/a&gt;&lt;br /&gt;              &lt;/td&gt;&lt;br /&gt;              &lt;td&gt;mscraft&lt;/td&gt;&lt;br /&gt;                            &lt;/tr&gt;&lt;br /&gt;                                    &lt;tr&gt;&lt;br /&gt;              &lt;td nowrap='nowrap'&gt;&lt;br /&gt;              2006.04.27 &lt;a href='http://www.wretch.cc/blog/mscraft/5198019'&gt;【教學】nEO 撕邊邊框（七）&lt;/a&gt;&lt;br /&gt;              &lt;/td&gt;&lt;br /&gt;              &lt;td&gt;mscraft&lt;/td&gt;&lt;br /&gt;                            &lt;/tr&gt;&lt;br /&gt;                                    &lt;tr&gt;&lt;br /&gt;              &lt;td nowrap='nowrap'&gt;&lt;br /&gt;              2006.04.26 &lt;a href='http://www.wretch.cc/blog/mscraft/5182389'&gt;【教學】nEO 輕鬆與花樣邊框（六）&lt;/a&gt;&lt;br /&gt;              &lt;/td&gt;&lt;br /&gt;              &lt;td&gt;mscraft&lt;/td&gt;&lt;br /&gt;                            &lt;/tr&gt;&lt;br /&gt;                                    &lt;tr&gt;&lt;br /&gt;              &lt;td nowrap='nowrap'&gt;&lt;br /&gt;              2006.04.21 &lt;a href='http://www.wretch.cc/blog/mscraft/5097095'&gt;【教學】nEO 製作多圖組合（五）&lt;/a&gt;&lt;br /&gt;              &lt;/td&gt;&lt;br /&gt;              &lt;td&gt;mscraft&lt;/td&gt;&lt;br /&gt;                            &lt;/tr&gt;&lt;br /&gt;                                    &lt;tr&gt;&lt;br /&gt;              &lt;td nowrap='nowrap'&gt;&lt;br /&gt;              2006.04.20 &lt;a href='http://www.wretch.cc/blog/mscraft/5081856'&gt;【教學】nEO 自動處理（四）&lt;/a&gt;&lt;br /&gt;              &lt;/td&gt;&lt;br /&gt;              &lt;td&gt;mscraft&lt;/td&gt;&lt;br /&gt;                            &lt;/tr&gt;&lt;br /&gt;                                    &lt;tr&gt;&lt;br /&gt;              &lt;td nowrap='nowrap'&gt;&lt;br /&gt;              2006.04.19 &lt;a href='http://www.wretch.cc/blog/mscraft/5066137'&gt;【教學】nEO  白平衡（三）&lt;/a&gt;&lt;br /&gt;              &lt;/td&gt;&lt;br /&gt;              &lt;td&gt;mscraft&lt;/td&gt;&lt;br /&gt;                            &lt;/tr&gt;&lt;br /&gt;                                    &lt;tr&gt;&lt;br /&gt;              &lt;td nowrap='nowrap'&gt;&lt;br /&gt;              2006.04.18 &lt;a href='http://www.wretch.cc/blog/mscraft/5050670'&gt;【教學】nEO 曝光調整（二）&lt;/a&gt;&lt;br /&gt;              &lt;/td&gt;&lt;br /&gt;              &lt;td&gt;mscraft&lt;/td&gt;&lt;br /&gt;                            &lt;/tr&gt;&lt;br /&gt;                                    &lt;tr&gt;&lt;br /&gt;              &lt;td nowrap='nowrap'&gt;&lt;br /&gt;              2006.04.17 &lt;a href='http://www.wretch.cc/blog/mscraft/5035495'&gt;【教學】nEO 檢視縮放（一）&lt;/a&gt;&lt;br /&gt;              &lt;/td&gt;&lt;br /&gt;              &lt;td&gt;mscraft&lt;/td&gt;&lt;br /&gt;                            &lt;/tr&gt;&lt;br /&gt;                                    &lt;tr&gt;&lt;br /&gt;              &lt;td nowrap='nowrap'&gt;&lt;br /&gt;              2006.03.30 &lt;a href='http://www.wretch.cc/blog/mscraft/4734679'&gt;【教學】nEO 0.2 繁體中文版&lt;/a&gt;&lt;br /&gt;              &lt;/td&gt;&lt;br /&gt;              &lt;td&gt;mscraft&lt;/td&gt;&lt;br /&gt;                            &lt;/tr&gt;&lt;br /&gt;                                    &lt;tr&gt;&lt;br /&gt;              &lt;td nowrap='nowrap'&gt;&lt;br /&gt;              2006.03.28 &lt;a href='http://www.wretch.cc/blog/mscraft/4705153'&gt;【分享】光影魔術手&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3474577459886827247-5646660930938316590?l=cwjen888.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cwjen888.blogspot.com/feeds/5646660930938316590/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3474577459886827247&amp;postID=5646660930938316590' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/5646660930938316590'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/5646660930938316590'/><link rel='alternate' type='text/html' href='http://cwjen888.blogspot.com/2009/01/blog-post.html' title='光影魔術手使用說明'/><author><name>David Chang</name><uri>http://www.blogger.com/profile/05943998889053147615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3474577459886827247.post-1710569643077997747</id><published>2008-12-29T00:20:00.001-08:00</published><updated>2008-12-29T00:20:23.827-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web'/><category scheme='http://www.blogger.com/atom/ns#' term='Internet'/><title type='text'>Web Application 自動測試軟體</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;h3 class='storytitle'&gt;&lt;a rel='bookmark' href='http://scw1109.wordpress.com/2006/07/26/selenium-ide-%e6%b8%ac%e8%a9%a6%ef%bc%8c%e5%8e%9f%e4%be%86%e4%b9%9f%e5%8f%af%e4%bb%a5%e9%80%99%e9%ba%bc%e8%bc%95%e9%ac%86/'&gt;Selenium IDE - 測試，原來也可以這麼輕鬆&lt;/a&gt;&lt;/h3&gt;&lt;br /&gt;	&lt;div class='meta'&gt;Filed under:  &lt;a rel='category tag' title='View all posts in JavaScript' href='http://wordpress.com/tag/javascript/'&gt;JavaScript&lt;/a&gt;, &lt;a rel='category tag' title='View all posts in Programming' href='http://wordpress.com/tag/programming/'&gt;Programming&lt;/a&gt;, &lt;a rel='category tag' title='View all posts in Technologies' href='http://wordpress.com/tag/technologies/'&gt;Technologies&lt;/a&gt;, &lt;a rel='category tag' title='View all posts in 技術' href='http://wordpress.com/tag/%e6%8a%80%e8%a1%93/'&gt;技術&lt;/a&gt; —  Alan @ 23:27 &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;	&lt;br /&gt;		&lt;p&gt;&lt;a href='http://www.openqa.org/selenium-ide/'&gt;Selenium IDE: Selenium IDE&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;今天介紹的這個工具真是做 web testing 的終極武器。Selenium IDE，是一個 Browser 的&lt;br /&gt;plugin，安裝之後，你可以把你在網頁上的操作錄製起來。加上一些 check point 之後，就是一個全自動的 web testing&lt;br /&gt;了。以前猛點、一直 key in&lt;br /&gt;資料、搞不清楚自己按了什麼的日子不再出現。觀念簡單，操作容易，我想多寫幾句話去解釋它都有點難。如果還沒有弄懂的就看一下 &lt;a href='http://wiki.openqa.org/display/SIDE/Recording+a+Test'&gt;demo影片吧&lt;/a&gt;！&lt;/p&gt;&lt;br /&gt;&lt;p&gt;安裝方面，下載後直接安裝就好了。雖然是 Firefox plugin 但在 Flock 用也沒問題喔！&lt;/p&gt;&lt;br /&gt;&lt;p&gt;使用上，就是像影片看到的，用錄的方式，你點什麼或打什麼字就會錄起來了。關鍵是 check point 的設定，如同 xUnit&lt;br /&gt;一派的做法，可以由一些 assertXXX 來當 check point。最當用的大概就是把文字選取起來，點右鍵就會出現&lt;br /&gt;assertTextPresent 的選項，目的當然是希望來到這頁時需要檢查有沒有出現目標字串囉。錄製好之後，按 run 就會從頭跑一次，到&lt;br /&gt;check point 的地方如果正確就會是綠色，出現錯誤會是紅色。而錄起來的 script 可以存成多種格式。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;曾經在開發專案時開玩笑的說如果 UAT (User Acceptence Test) 能夠自動化就好了。因為 UAT 有幾十到幾百個&lt;br /&gt;test case，由專人去跑一遍可能也要個一兩天，對時程是很傷的。而且大家都知道，測試通常會找出一些問題，那問題改了是要全部重測還是只測&lt;br /&gt;fail case？考量到人力跟時間資源，大部份會只測 fail case，好一點再加抽幾個 test case&lt;br /&gt;做抽檢。問題是，天知道改一個東西會影響到哪些部份，除非你敢保證你的 change impact analysis&lt;br /&gt;做得很好。如果沒有，那還是乖乖全測比較保險。有了 Selenium IDE，那就好辦啦，把 script 開始來重跑一次就好了嘛！UAT&lt;br /&gt;自動化不是夢！&lt;/p&gt;&lt;br /&gt;&lt;p&gt;另一個可行的用途是，網管或 MIS 需要確保 service alive，把 Selenium IDE 當作 service&lt;br /&gt;monitor 也沒有什麼不行的，至少它簡單好用，在你學會或有錢買那些重型產品前之前，用 Selenium IDE&lt;br /&gt;先頂住至少日子會好過一點。說穿了 service monitoring 就是一種測試嘛 (測試 service 有沒有活著)。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Selenium IDE 是由 &lt;a href='http://www.openqa.org/'&gt;OpenQA&lt;/a&gt; 所開發的，lincense 是親切可愛的 Apache 2.0。除了 Selenium IDE 以外，OpenQA 還有很多不錯的產品都是在 QA 方面會有用的。目前還沒有詳細做研究，但是 &lt;a href='http://www.openqa.org/selenium-rc/'&gt;Selenium RC&lt;/a&gt; 似乎可以把 Selenium IDE 錄製的 script 再做點事。因為存 script 時的格式有些就是 for Selenium RC 的。如果你是 developer/tester，那不要懷疑了，趕快安裝 Selenium IDE 吧。&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3474577459886827247-1710569643077997747?l=cwjen888.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cwjen888.blogspot.com/feeds/1710569643077997747/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3474577459886827247&amp;postID=1710569643077997747' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/1710569643077997747'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/1710569643077997747'/><link rel='alternate' type='text/html' href='http://cwjen888.blogspot.com/2008/12/web-application.html' title='Web Application 自動測試軟體'/><author><name>David Chang</name><uri>http://www.blogger.com/profile/05943998889053147615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3474577459886827247.post-2696649720427383347</id><published>2008-12-24T08:22:00.001-08:00</published><updated>2008-12-24T08:22:33.285-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='8051'/><title type='text'>如果8051電路沒有動作，硬體除錯流程</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;br/&gt;&lt;br/&gt;&lt;h2&gt;&lt;span&gt;如果8051電路沒有動作，硬體除錯流程&lt;/span&gt; &lt;/h2&gt;&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;  &lt;div class='blgfolderbar'&gt;&lt;br /&gt;    &lt;div class='folder'&gt;分類：&lt;a href='http://tw.myblog.yahoo.com/jl0821/archive?l=f&amp;amp;id=15'&gt;805x 小東西&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;    &lt;div class='date'&gt;2008/03/09 11:02&lt;/div&gt;&lt;br /&gt;  &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;  &lt;div class='msgcontent'&gt;&lt;br /&gt;    &lt;strong style='font-weight: normal;'&gt;如果8051電路沒有動作~~大部份都是哪邊出了問題？&lt;/strong&gt;&lt;br/&gt;&lt;strong style='font-weight: normal;'&gt;先撇開"程式沒燒入進去"這問題來說~&lt;/strong&gt;&lt;br/&gt;&lt;br/&gt;&lt;strong style='font-weight: bold;'&gt;硬體除錯流程&lt;/strong&gt;&lt;br/&gt;&lt;strong style='font-weight: normal;'&gt;0）確定 電路 VCC/GND 沒短路, 電壓是你要的&lt;br/&gt;      一般的 8051 大部分 4.8 ~5.1V 都會正常工作。&lt;br/&gt;&lt;/strong&gt;&lt;strong style='font-weight: normal;'&gt;1）用示波器量一下 18, 19 pin, 看有沒有 clock&lt;br/&gt;　有些 Crystal的輸出很弱，用示波器會把它吃掉變沒有信號。&lt;br/&gt;　如果沒信號，建議要試試 ALE確認。&lt;br/&gt;&lt;/strong&gt;&lt;strong style='font-weight: normal;'&gt;2）量 40 VCC, 31 EA pin 和 20pin 的壓差是否為 VCC&lt;br/&gt;　因為大部分的 8051都使用內部程式空間開機，EA要 pull-high。&lt;br/&gt;&lt;/strong&gt;&lt;strong style='font-weight: normal;'&gt;3）量 20 GND pin 是否為 GND(0V)&lt;br/&gt;&lt;/strong&gt;&lt;strong style='font-weight: normal;'&gt;4）量 第9 RST pin 看RESET 時 是不是 拉到VCC(5V) &lt;/strong&gt;&lt;strong style='font-weight: normal;'&gt;再下降到 GND(0V)&lt;br/&gt;　8051 是 high reset，Ｒ／Ｃ下降曲線不要太長，一般 R 4.7K / C 0.1uF 就可以了。&lt;br/&gt;　如果一直是high，那當然是不會工作囉。&lt;br/&gt;&lt;/strong&gt;&lt;strong style='font-weight: normal;'&gt;5）如果使用 Port 0 記得加 提升電阻,一般加10K&lt;br/&gt;　不然 High時沒sink 電流出去，輸出會變成 high-Z。&lt;br/&gt;&lt;/strong&gt;&lt;strong style='font-weight: normal;'&gt;6）把 pin 31 EA 接地， 重開電源，量 ALE 應該有脈波信號。&lt;br/&gt;　沒信號的話，也有可能是 AT89S5X的 lock bit 設定，不要誤殺喔！&lt;br/&gt;&lt;/strong&gt;&lt;br/&gt;&lt;strong style='font-weight: normal;'&gt;上述信號都對, 但 51 還是沒正常工作, &lt;/strong&gt;&lt;strong style='font-weight: normal;'&gt;恭喜你 --&amp;gt; CODE 不對。&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;但是有時一開機對，程式好像也沒錯，但是一下子電路就掛點了～&lt;/strong&gt;&lt;br/&gt;1) 輸出短路，這有可能是你控制錯誤，像電晶體導通時造成的。&lt;br/&gt;2) 電壓不穩定&lt;br/&gt;　有時用7805 降壓，但是實在太多壓降在7805上造成發燙過熱，會使 7805失常。&lt;br/&gt;　負載超量，比方用USB電源只有 500mA，有些甚至是HUB 100mA而已，&lt;br/&gt;　你多亮幾個LED 可能就超載了，要注意～&lt;br/&gt;3) 電路雜訊太大&lt;br/&gt;　控制交流輸出時，要避免輸出漣波交連回數位區，最好用隔離式控制，Relay / 光耦合。&lt;br/&gt;4)  浮接點雜訊輸入&lt;br/&gt;　只要有用到的點，都不可以浮接，要不pull-high&lt;/strong&gt;&lt;strong style='font-weight: normal;'&gt;，&lt;/strong&gt;&lt;strong style='font-weight: normal;'&gt;要嘛 pull-low&lt;/strong&gt;&lt;strong style='font-weight: normal;'&gt;，不要空接不確定。&lt;/strong&gt;&lt;br /&gt;  &lt;/div&gt;&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3474577459886827247-2696649720427383347?l=cwjen888.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cwjen888.blogspot.com/feeds/2696649720427383347/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3474577459886827247&amp;postID=2696649720427383347' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/2696649720427383347'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/2696649720427383347'/><link rel='alternate' type='text/html' href='http://cwjen888.blogspot.com/2008/12/8051.html' title='如果8051電路沒有動作，硬體除錯流程'/><author><name>David Chang</name><uri>http://www.blogger.com/profile/05943998889053147615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3474577459886827247.post-4540878929719400543</id><published>2008-12-19T01:53:00.001-08:00</published><updated>2008-12-19T01:53:46.729-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='8051'/><category scheme='http://www.blogger.com/atom/ns#' term='家庭自動化'/><category scheme='http://www.blogger.com/atom/ns#' term='Arduino'/><title type='text'>Proteus 的大陸網站</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;br/&gt;&lt;a href='http://www.proteus.com.cn/html/bbs.html'&gt;Proteus 的大陸網站&lt;br/&gt;&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3474577459886827247-4540878929719400543?l=cwjen888.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cwjen888.blogspot.com/feeds/4540878929719400543/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3474577459886827247&amp;postID=4540878929719400543' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/4540878929719400543'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/4540878929719400543'/><link rel='alternate' type='text/html' href='http://cwjen888.blogspot.com/2008/12/proteus.html' title='Proteus 的大陸網站'/><author><name>David Chang</name><uri>http://www.blogger.com/profile/05943998889053147615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3474577459886827247.post-5654412333122504644</id><published>2008-12-17T05:55:00.000-08:00</published><updated>2008-12-17T05:56:13.060-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='生活'/><title type='text'>LifeStraw 生命吸管救人一命</title><content type='html'>&lt;h2&gt;LifeStraw 生命吸管救人一命&lt;/h2&gt;                                          &lt;div id="postmessage_801727" class="t_msgfont"&gt;在貧窮落後的國家，清潔食水是寶貴資源，全球1/6人口完全沒有清潔食水飲用，逾20億人衛生設施不足，每數分鐘就有一人死於不潔食水傳播的疾病。去年獲《時代》雜誌選為最佳發明之一的「生命飲管」(LifeStraw)，為缺乏清潔食水的人帶來希望。&lt;br /&gt;&lt;br /&gt;「生命飲管」公司行政總裁弗倫德松(Mikkel Vestergaard Frandsen)說，「生命飲管」就像一般飲管簡單易用，「使用者把膠管插進水中，然後吸吮」。他表示，「生命飲管」毋須修理，又不用電，「可以在地球 上最複雜的環境上使用」。每支「生命飲管」附有圖解說明書。&lt;br /&gt;&lt;br /&gt;LifeStraw使用7種過濾器，包括網絲、活性碳和碘，可以阻絕病毒、細菌及寄生蟲(詳細過程請詳Index網頁說明)。首先兩層絲製濾器先過濾掉髒 東西，再來含碘的樹脂可殺死 99.3% 的細菌和病毒；最後活性碳可捕捉到漏網的細菌和病毒，以確保水的純淨(達log7~log8，比很多先進國家的自來水還乾淨)。因此再髒的水都可過濾消毒 成可飲用的水質；進而預防飲水引發的疾病，如霍亂、傷寒及痢疾等。&lt;br /&gt;&lt;br /&gt;「 生命飲管」採用殺菌樹脂，當水通過「生命飲管」時，飲管內多種混合物質會殺死水中細菌，過濾了導致腹瀉、痢疾、傷寒和霍亂等疾病的微生物，每支飲管僅售約3.5美元 (約台幣100元)，但可用上1年或過濾700公升水，可以挽救數百萬條人命。&lt;br /&gt;&lt;br /&gt;弗倫德松指，現時每天逾6,000名兒童因飲用不潔食水死亡，這些悲劇可避免，「生命飲管」也可派給地震和颶風災民使用。致力打擊貧窮和缺乏清潔食水問題的國際慈善機構WaterAid，稱讚「生命飲管」是個「驚人發明」，但擔心它治標不治本。&lt;/div&gt;                 &lt;div class="box postattachlist"&gt;          &lt;h4&gt;附件&lt;/h4&gt;            &lt;dl class="t_attachlist"&gt;&lt;dt&gt;    &lt;img src="http://www.efly98.com/cdb_efly98/images/attachicons/image.gif" class="absmiddle" alt="" border="0" /&gt;    &lt;a href="http://www.efly98.com/cdb_efly98/attachment.php?aid=181025&amp;amp;nothumb=yes" class="bold" target="_blank"&gt;生命吸管救人一命LifeStraw -001-裁aa.jpg&lt;/a&gt;    &lt;em&gt;(34.27 KB)&lt;/em&gt;   &lt;/dt&gt;&lt;dd&gt;    &lt;p&gt;     2008-12-17 21:42              &lt;/p&gt;    &lt;p&gt;LifeStraw 生命吸管救人一命-001&lt;/p&gt;         &lt;p&gt;                  &lt;a href="http://www.efly98.com/cdb_efly98/viewthread.php?tid=79630&amp;amp;highlight=#zoom"&gt;&lt;img onclick="zoom(this, 'attachments/month_0812/20081217_f219ddbd936f473c9320xJlBdRxziLXe.jpg')" src="http://www.efly98.com/cdb_efly98/attachments/month_0812/20081217_f219ddbd936f473c9320xJlBdRxziLXe.jpg.thumb.jpg" alt="生命吸管救人一命LifeStraw -001-裁aa.jpg" /&gt;&lt;/a&gt;                &lt;/p&gt;       &lt;/dd&gt;&lt;/dl&gt;   &lt;dl class="t_attachlist"&gt;&lt;dt&gt;    &lt;img src="http://www.efly98.com/cdb_efly98/images/attachicons/image.gif" class="absmiddle" alt="" border="0" /&gt;    &lt;a href="http://www.efly98.com/cdb_efly98/attachment.php?aid=181026&amp;amp;nothumb=yes" class="bold" target="_blank"&gt;生命吸管救人一命LifeStraw -002-裁.jpg&lt;/a&gt;    &lt;em&gt;(35.56 KB)&lt;/em&gt;   &lt;/dt&gt;&lt;dd&gt;    &lt;p&gt;     2008-12-17 21:42              &lt;/p&gt;    &lt;p&gt;LifeStraw 生命吸管救人一命-002&lt;/p&gt;         &lt;p&gt;                  &lt;a href="http://www.efly98.com/cdb_efly98/viewthread.php?tid=79630&amp;amp;highlight=#zoom"&gt;&lt;img onclick="zoom(this, 'attachments/month_0812/20081217_d1455dcf36efd290602fKjL70jH95k7F.jpg')" src="http://www.efly98.com/cdb_efly98/attachments/month_0812/20081217_d1455dcf36efd290602fKjL70jH95k7F.jpg.thumb.jpg" alt="生命吸管救人一命LifeStraw -002-裁.jpg" /&gt;&lt;/a&gt;                &lt;/p&gt;       &lt;/dd&gt;&lt;/dl&gt;   &lt;dl class="t_attachlist"&gt;&lt;dt&gt;    &lt;img src="http://www.efly98.com/cdb_efly98/images/attachicons/image.gif" class="absmiddle" alt="" border="0" /&gt;    &lt;a href="http://www.efly98.com/cdb_efly98/attachment.php?aid=181027&amp;amp;nothumb=yes" class="bold" target="_blank"&gt;生命吸管救人一命LifeStraw -003-裁aa.jpg&lt;/a&gt;    &lt;em&gt;(36.47 KB)&lt;/em&gt;   &lt;/dt&gt;&lt;dd&gt;    &lt;p&gt;     2008-12-17 21:42              &lt;/p&gt;    &lt;p&gt;LifeStraw 生命吸管救人一命-003&lt;/p&gt;         &lt;p&gt;                  &lt;a href="http://www.efly98.com/cdb_efly98/viewthread.php?tid=79630&amp;amp;highlight=#zoom"&gt;&lt;img onclick="zoom(this, 'attachments/month_0812/20081217_aa3379af77f5e762e517hIyEzJg2G2u3.jpg')" src="http://www.efly98.com/cdb_efly98/attachments/month_0812/20081217_aa3379af77f5e762e517hIyEzJg2G2u3.jpg.thumb.jpg" alt="生命吸管救人一命LifeStraw -003-裁aa.jpg" /&gt;&lt;/a&gt;                &lt;/p&gt;       &lt;/dd&gt;&lt;/dl&gt;   &lt;dl class="t_attachlist"&gt;&lt;dt&gt;    &lt;img src="http://www.efly98.com/cdb_efly98/images/attachicons/image.gif" class="absmiddle" alt="" border="0" /&gt;    &lt;a href="http://www.efly98.com/cdb_efly98/attachment.php?aid=181028&amp;amp;nothumb=yes" class="bold" target="_blank"&gt;生命吸管救人一命LifeStraw -004-裁.jpg&lt;/a&gt;    &lt;em&gt;(71.18 KB)&lt;/em&gt;   &lt;/dt&gt;&lt;dd&gt;    &lt;p&gt;     2008-12-17 21:42              &lt;/p&gt;    &lt;p&gt;LifeStraw 生命吸管救人一命-004&lt;/p&gt;         &lt;p&gt;                  &lt;a href="http://www.efly98.com/cdb_efly98/viewthread.php?tid=79630&amp;amp;highlight=#zoom"&gt;&lt;img onclick="zoom(this, 'attachments/month_0812/20081217_8c958ca4ba5aacde06147j441harVjEN.jpg')" src="http://www.efly98.com/cdb_efly98/attachments/month_0812/20081217_8c958ca4ba5aacde06147j441harVjEN.jpg.thumb.jpg" alt="生命吸管救人一命LifeStraw -004-裁.jpg" /&gt;&lt;/a&gt;                &lt;/p&gt;       &lt;/dd&gt;&lt;/dl&gt;   &lt;dl class="t_attachlist"&gt;&lt;dt&gt;    &lt;img src="http://www.efly98.com/cdb_efly98/images/attachicons/image.gif" class="absmiddle" alt="" border="0" /&gt;    &lt;a href="http://www.efly98.com/cdb_efly98/attachment.php?aid=181029&amp;amp;nothumb=yes" class="bold" target="_blank"&gt;生命吸管救人一命LifeStraw -005-裁aa.jpg&lt;/a&gt;    &lt;em&gt;(44.51 KB)&lt;/em&gt;   &lt;/dt&gt;&lt;dd&gt;    &lt;p&gt;     2008-12-17 21:42              &lt;/p&gt;    &lt;p&gt;LifeStraw 生命吸管救人一命-005&lt;/p&gt;         &lt;p&gt;                  &lt;a href="http://www.efly98.com/cdb_efly98/viewthread.php?tid=79630&amp;amp;highlight=#zoom"&gt;&lt;img onclick="zoom(this, 'attachments/month_0812/20081217_d32913efdcbe962e5eee18DdZrUy7zSh.jpg')" src="http://www.efly98.com/cdb_efly98/attachments/month_0812/20081217_d32913efdcbe962e5eee18DdZrUy7zSh.jpg.thumb.jpg" alt="生命吸管救人一命LifeStraw -005-裁aa.jpg" /&gt;&lt;/a&gt;                &lt;/p&gt;       &lt;/dd&gt;&lt;/dl&gt;         &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3474577459886827247-5654412333122504644?l=cwjen888.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cwjen888.blogspot.com/feeds/5654412333122504644/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3474577459886827247&amp;postID=5654412333122504644' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/5654412333122504644'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/5654412333122504644'/><link rel='alternate' type='text/html' href='http://cwjen888.blogspot.com/2008/12/lifestraw.html' title='LifeStraw 生命吸管救人一命'/><author><name>David Chang</name><uri>http://www.blogger.com/profile/05943998889053147615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3474577459886827247.post-2193082936311319615</id><published>2008-12-16T22:22:00.001-08:00</published><updated>2008-12-16T22:22:40.911-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='家庭自動化'/><category scheme='http://www.blogger.com/atom/ns#' term='VoIP'/><category scheme='http://www.blogger.com/atom/ns#' term='Internet'/><title type='text'>嵌入式作業系統為用戶帶來嶄新連接體驗</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;br/&gt;http://www.eettaiwan.com/ART_8800479675_676964_TA_49ec953e.HTM&lt;br/&gt;&lt;p&gt;未來的家庭和辦公室都離不開&lt;a target='_blank' href='http://www.eettaiwan.com/SEARCH/ART/%B3s%B1%B5%C5%E9%C5%E7.HTM'&gt;連接體驗&lt;/a&gt;(connected experience)，這些連接將從現有的PC擴展到包括電視、&lt;a target='_blank' href='http://www.eettaiwan.com/SEARCH/ART/GPS.HTM'&gt;GPS&lt;/a&gt;和&lt;a target='_blank' href='http://www.eettaiwan.com/SEARCH/ART/VoIP.HTM'&gt;VoIP&lt;/a&gt;在內的更多設備，催生新一代不僅可享受服務，而且能與服務互動的設備。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;時至今日，資訊不再只是儲存於PC和伺服器中並等待設備來存取。包括PC、電話、視訊轉換盒、視訊遊戲機、音樂播放設備在內的所有設備，已經能透過某種方式連接起來。用戶希望這些設備能夠有效連接，以便能隨時隨地在各類設備上獲得想要的工具、數據、資訊甚至娛樂體驗。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;預計未來5年內，將有更多適合消費者和企業使用的互連產品上市。在這個互連環境下，供應商提供的服務也趨向多元化，所有服務都具備雙向傳輸能力，而系統中的所有設備也都必須具備智慧化能力，才能為消費者提供特別的體驗。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;以三星最近開發的一款數位相框為例，該產品採用&lt;a target='_blank' title='Atheros的WLAN軟體通過微軟CE 6.0平台認證' href='http://www.eettaiwan.com/ART_8800440632_675327_NT_80c73eff.HTM'&gt;Windows Embedded CE&lt;/a&gt;平&lt;br /&gt;台，並運用Visual Studio 2005提供的工具和.NET緊密框架。這種數位相框既能利用Windows Media&lt;br /&gt;Connect透過家庭網路從本地SD記憶卡擷取影像，也能連接到Flickr、Windows Live&lt;br /&gt;Spaces或其他支援RSS的來源獲取影像。由於它能存取線上相簿，因此可接收由朋友或家人拍攝的照片。這種簡易性和互通作業性確實使連接體驗更加生&lt;br /&gt;動。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;如果是五年前，開發人員必須在類設備上安裝作業系統。但如今，這些設備就像一台PC一樣，不僅需要智慧功能，還必須能擴展並提供服務，而且必須易於使用。全球定位系統(GPS)設備是另一種可提供連接體驗的設備。在不久的將來，GPS設備將有更多的用途。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;下一代智慧互連設備&lt;/b&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;過去幾年來，GPS日益普及。最初，GPS僅作為交通運輸和物流公司的必備技術，但目前它即將成為一種主流設備，特別是兼具可播放媒體檔案&lt;br /&gt;功能的混合型設備。如今，用於定位服務的基礎設備在服務供應商承諾多年後終於架設完成，於是，GPS服務也從只能下載地圖資料，發展為可提供位置感知服務&lt;br /&gt;(location aware&lt;br /&gt;service)。據ABI研究公司預測，到2011年，基於定位的GPS服務將擁有3.15億用戶，遠高於2006年全球的1,200萬用戶數。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;定位應用在增強並豐富用戶體驗方面的價值不可估量。隨著GPS定位技術日益普及，開拓此類資訊的應用和服務開始引人矚目。基於用戶訂購的&lt;br /&gt;定位服務，如地圖更新和透過交通服務提供即時交通數據，能在考慮到事故資訊、臨時道路封閉和高速公路改道等情況下，為客戶找出到達目的地的最快路線。市場&lt;br /&gt;上已經出現配備了歷史交通條件資料庫的GPS導航系統，此類系統主要用於大都市，它們能更準確地計算出客戶所需的最快路線。很快，用戶將可透過網際網路瀏&lt;br /&gt;覽器或微軟的Outlook，將資訊(如一個地址)直接發送到車載GPS導航系統中。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;在此同時，於汽車內整合這類系統的可能性也相對提高。在配備車輛位置監控系統後，用戶將可獲知汽車何時被開走以及開往何處。此外，開始日&lt;br /&gt;益普及的即時交通訊息服務也將推動GPS設備(如車載GPS)的需求迅速成長。此類服務可以為消費者節省在路上花費的時間，同時減輕交通壓力。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;除了地圖類應用之外，當GPS設備成為發佈點播廣告(demand-generated&lt;br /&gt;advertising)的媒介時，它們同時成為了下一代智慧設備。今天的媒體聚合器(Media&lt;br /&gt;aggregator)已經有能力發展行動購物服務，消費者可直接透過其手持設備的帳戶為所購買的商品買單，或透過手持設備下載最近一家銷售其所需商品的&lt;br /&gt;商場優惠券。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;對廣告商而言，具備GPS功能的設備將為區域化宣傳和銷售開闢一條新通路，尤其是在包含個人導航設備(PND)銷售量逐日攀升的情況下。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;市調公司Frost &amp;amp; Sullivan指出，家人協尋(family finder)和子女定位(child locator)這類在GSM手機上採用GPS技術的定位服務可望於今年內推出。此外，股票報價、體育賽事分數播報和新聞播報需求也將持續提升。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;儘管行動電話製造商也準備在電話中增加GPS導航功能，但PND市場將持續出現強勁需求。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;為配合這一發展趨勢，微軟在Windows Embedded CE 6.0中推出了新的cell&lt;br /&gt;core數據和語音組件，以便在該系統基礎上設計設備能透過蜂巢式網設立數據連接和語音呼叫，推動從機器到機器這類通訊連接的發展，使Windows&lt;br /&gt;Embedded CE成為適合停車計時器、販賣機和GPS等設備使用的即時作業系統。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;在基於Windows Embedded&lt;br /&gt;CE的設備上用於獲取定位資訊的平台層稱為GPS中介驅動器與位置框架。GPS中介驅動器不僅有益於GPS設備的應用軟體設計，也能為GPS硬體製造商提&lt;br /&gt;供優勢。因為它提供了一個中介層，讓真實的GPS設備從應用開發商和GPS設備製造商抽離開來，於是應用開發商編寫的程式碼能夠用於所有GPS硬體，而&lt;br /&gt;GPS硬體製造商生產的硬體上也可以執行所有應用程式。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;位置框架則有益於軟體開發商編寫基於定位的應用軟體。位置框架在應用軟體與底層硬體和/或提供設備實體位置的網路服務之間提供了一個抽象層，因此，應用軟體可登記並透過位置框架獲取經度和緯度等資訊。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;本文小結&lt;/b&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;連接體驗將為OS(作業系統)和應用開發商創造許多商機。電信公司迫切需要除了行動上網和電子郵件之外，還能創造新收入來源的差異化服務。&lt;br /&gt;而能夠為消費者提供連接體驗的線上服務正是他們需要的，此類服務的市場潛力不可限量。同時，應用供應商也可透過電信公司向消費者銷售其產品，充分利用現有&lt;br /&gt;的數據服務。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;今天，GPS技術的價格已低至可讓製造商將其整合在大多數消費者都買得起的可攜式CE設備中。目前，微軟在台灣的一家合作廠商正準備授權&lt;br /&gt;電子設備製造商開發一款集GPS、MDTV(行動數位電視)和行動電話功能於一身，並支援數位相機和媒體播放器等許多其他應用的產品。該產品將採用採用由&lt;br /&gt;微軟合作廠商所開發、基於Windows Embedded CE的軟體平台。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;連接體驗將推動新一代技術和支援Web服務之開發工具的發展，這些技術與工具將協助人們在遠端控制家庭環境。在下一代版本的Windows Embedded CE中，媒體、導航和自動化將是三大發展重點。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/p&gt;&lt;p&gt;&lt;i&gt;作者：John Boladian&lt;br /&gt;&lt;/i&gt;&lt;/p&gt;&lt;p&gt;&lt;i&gt;亞太、大中華暨日本首席產品經理&lt;br /&gt;&lt;/i&gt;&lt;/p&gt;&lt;p&gt;&lt;i&gt;嵌入式視窗部門&lt;br /&gt;&lt;/i&gt;&lt;/p&gt;&lt;i&gt;微軟公司&lt;/i&gt;&lt;br /&gt;			&lt;br /&gt;			&lt;br /&gt;&lt;br /&gt;			&lt;br /&gt;			&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3474577459886827247-2193082936311319615?l=cwjen888.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cwjen888.blogspot.com/feeds/2193082936311319615/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3474577459886827247&amp;postID=2193082936311319615' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/2193082936311319615'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/2193082936311319615'/><link rel='alternate' type='text/html' href='http://cwjen888.blogspot.com/2008/12/blog-post_16.html' title='嵌入式作業系統為用戶帶來嶄新連接體驗'/><author><name>David Chang</name><uri>http://www.blogger.com/profile/05943998889053147615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3474577459886827247.post-6933769352573809277</id><published>2008-12-16T22:05:00.001-08:00</published><updated>2008-12-16T22:05:34.159-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='家庭自動化'/><title type='text'>採用符合HomePlug的智慧SoC實現主流數位家庭應用</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;p&gt;許多年來，消費電子產業一直擘畫著能將各種不同音/視訊娛樂設備、電腦、安全監控設備和其它設備互通互連的‘&lt;a target='_blank' href='http://www.eettaiwan.com/SEARCH/ART/%BC%C6%A6%EC%AEa%AEx.HTM'&gt;數位家庭&lt;/a&gt;’美景。遺憾的是，這些預測經常是設立在家庭為了佈設高速網路進行預佈線和再裝修的基礎上，只有這樣才能滿足動態傳送多媒體資訊所要求的連接性。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;很大程度上，這些限制將數位家庭侷限在整個消費市場的一小部份，即能夠負擔數萬美元的佈線費用並使用高階音視訊設備的少部份用戶。然而，對&lt;br /&gt;於像網頁瀏覽或傳輸文件這類非即時數據運算任務來說，無線技術已被證實是非常有用的，但由於牆體和其它干擾造成的訊號劣化影響，無線技術始終無法穩定地提&lt;br /&gt;供所需的覆蓋、可靠性以及即時動態音視訊內容所需的頻寬。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;家庭設備間互通作業性要求進一步提升的另一個原因是潮水般湧現的各種新型音視訊應用。例如，數以百萬計的&lt;a target='_blank' href='http://www.eettaiwan.com/SEARCH/ART/iPod.HTM'&gt;iPod&lt;/a&gt;用&lt;br /&gt;戶希望以一種無縫和舒適的方式在家中的任何地方欣賞音樂。而且越來越多基於網際網路的視訊(如YouTube和可下載的電視節目)應用、視訊點播服務，以&lt;br /&gt;及用戶自創的視訊內容等，都使用戶能將數位視訊方便地分送到家庭的各個角落。與透過中介媒體(如CD音樂和DVD)不同，迅速成長的各類節目內容正以原始&lt;br /&gt;數位資訊的形式流入家庭。結果是，利用和欣賞這類數位內容的機會大幅增加，當然條件是能夠很容易地將這些內容分送到家庭中的各個地方。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;實現數位家庭連接&lt;/b&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;要確實讓數位家庭功能成為主流的條件，是必須具有一種可靠易用的技術，以連接各種高、中及低階消費性設備，無需進行任何額外佈線，同時能穩定地提供並維持支援即時和動態音視訊內容所需的頻寬、覆蓋和可靠性。能夠實現上述功能的技術目前已經以&lt;a target='_blank' href='http://www.eettaiwan.com/SEARCH/ART/HomePlug.HTM'&gt;HomePlug&lt;/a&gt;標準的形式獲得了驗證，該標準可透過任何一個家庭中現有的電源線網路來支援可靠的高頻寬通訊。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;成立於2000年的HomePlug電源線聯盟已經吸引了全球多家消費電子、通訊和零售業領域的廠商參與，共同開發具有高度互通作業性和強&lt;br /&gt;韌性的標準，最終目標是利用現有住宅佈線，將數位訊號分散到家庭的各個角落。由於許多設備已經採用了這種技術，且全球已經安裝了數以百萬計符合&lt;br /&gt;HomePlug的產品，故HomePlug已成為電源線通訊的標準。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;音樂無處不在&lt;/b&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;雖然在家庭中，處處能欣賞音訊通常意味著多房間音訊系統(MRAS)，不過，這些功能對許多消費者而言是可望而不可及的。建構該系統的費用&lt;br /&gt;高達2萬美元，包含對整個房屋進行預佈線或翻修。現在，HomePlug技術將有助於數位家庭功能向大眾市場推進，從少數富有家庭投入大量主流用戶，使各&lt;br /&gt;類音視訊設備都能方便地透過現有佈線網路實現互連。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;隨著HomePlug 生態系統中各類產品的增加，能夠容易地與其它符合HomePlug&lt;br /&gt;的設備互連互通，很快就會成為許多消費者購買時的關鍵考慮因素之一。為了充分掌握此一商機，設計生產消費電子產品的OEM廠商必須在提供嵌入式智慧功能的&lt;br /&gt;同時，也能迅速地以低成本整合HomePlug 技術和多種CE介面，以支援其特定應用。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;a target='_blank' href='http://www.eettaiwan.com/SEARCH/ART/SoC.HTM'&gt;SoC&lt;/a&gt;建構模組&lt;/b&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;開發這種數位家庭生態系統設備的關鍵因素，將取決於SoC解決方案的可用性，以提供整合各種目標應用的所有介面。例如，這種SoC除了提供電源線介面外，還要能處理乙太網路通訊、控制網路協定堆疊、管理數據處理以及處理用戶介面功能(見圖1)。&lt;/p&gt;&lt;p align='center'&gt;&lt;i&gt;&lt;img alt='圖1：Arkados AI-1100系統單晶片(SoC)' src='http://www.eettaiwan.com/ARTICLES/2007MAY/B/0705B_DC4_F1.jpg'/&gt;&lt;br/&gt; 圖1：Arkados AI-1100系統單晶片(SoC)     &lt;/i&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;透過節省大多數多元件板級方案所需的板級佈線、裝配要求和潛在的故障點，SoC在成本和可靠性方面也具備很大優勢。單晶片SoC架構還能消除與分離式元件設計中每個晶片上必須實現之驅動電路有關的成本、功耗和時序問題。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;最終，對於產品設計師來說，SoC提供了許多優勢：它提供了一個完整的嵌入式解決方案，具有軟體支援和經過驗證的參考設計，用戶能輕鬆整合符合HomePlug的通訊功能，同時把主要精力集中產品功能的差異化。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;相同智慧的基本SoC方案可以與不同的參考設計和韌體一起用來在揚聲器、數位相框、監視器或音視訊儲存和分配中心之間實現符合&lt;br /&gt;HomePlug規格的通訊。這不僅能夠使用戶快速且方便地實現將音視訊分配到各房間的願望，而且透過整合其它的數位音視訊應用，如安全監控、對講和嬰兒&lt;br /&gt;監控等，為擴展和升級他們其HomePlug互連系統建構了廣泛的基礎。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;數位家庭夢想的實現&lt;/b&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;看一看下面的典型數位家庭的使用場景。用戶一回到家，將其iPod插到具有HomePlug介面的充電座上，他們的音樂資料庫就立即成為家&lt;br /&gt;庭體驗環境的一部份。在經過臥室時，用戶可以在有HomePlug連接的數位相框上調用iPod介面，並選擇一個播放列表，然後就可以在房屋各處安放並有&lt;br /&gt;HomePlug連接的揚聲器上播放音樂。隨後，當他們晚飯後坐在客廳?媟Q觀看他們一早下載到iPod中的電視節目時，只需在具備HomePlug連接&lt;br /&gt;的平面電視上彈出選單，並直接從iPod讀取視訊串流。在觀看的過程中，如果有人按門鈴，用戶只需簡單地切換電視螢幕選單就可以觀看安裝在門前，並具備&lt;br /&gt;HomePlug連接功能的監控相機。不是以iPod為中心的用戶怎麼辦？只需要用任何型號的MP-3、數位視訊記錄器(DVR)或者電腦系統(PC或蘋&lt;br /&gt;果電腦)置入上述場景中即可，而所有的基本原理都保持不變。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;實質上，數位家庭的主要意義，就是提供分佈於家中各處的‘來源’與‘目的’之間靈活的連接性，用戶只需輕按按鍵，即可立即欣賞音視訊內容，無論他們位於家?堛漱偵穧a方(見圖2)。&lt;/p&gt;&lt;p align='center'&gt;&lt;i&gt;&lt;img alt='圖2：Arkados 公司的技術可用來實現家庭中音視訊訊號的來源和目的之間的數位連接。 &amp;lt;p&amp;gt;' src='http://www.eettaiwan.com/ARTICLES/2007MAY/B/0705B_DC4_F2.jpg'/&gt;&lt;br/&gt; 圖2：Arkados 公司的技術可用來實現家庭中音視訊訊號的來源和目的之間的數位連接。&lt;br /&gt;&lt;/i&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;無論要將音視訊內容分配到家庭環境中的什麼地方，HomePlug技術能夠提供最具成本效益的解決方案。對於OEM廠商、產品設計師、零售商和家庭設計師或服務供應商來說，提供符合HomePlug的智慧電源線介面的SoC將成為通往成功之路的基本建構模組。&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3474577459886827247-6933769352573809277?l=cwjen888.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cwjen888.blogspot.com/feeds/6933769352573809277/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3474577459886827247&amp;postID=6933769352573809277' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/6933769352573809277'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/6933769352573809277'/><link rel='alternate' type='text/html' href='http://cwjen888.blogspot.com/2008/12/homeplugsoc.html' title='採用符合HomePlug的智慧SoC實現主流數位家庭應用'/><author><name>David Chang</name><uri>http://www.blogger.com/profile/05943998889053147615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3474577459886827247.post-431261736961762941</id><published>2008-12-16T21:53:00.001-08:00</published><updated>2008-12-16T21:53:43.088-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VoIP'/><title type='text'>NEC展出採Linux作業系統之IP語音伺服器SV7000</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;br/&gt;http://www.eettaiwan.com/ART_8800485030_675327_NP_870d11a2.HTM&lt;br/&gt;&lt;p&gt;台灣NEC於10/23~25的2007 &lt;a target='_blank' href='http://www.eettaiwan.com/SEARCH/ART/IP.HTM'&gt;IP&lt;/a&gt;電信暨視訊傳播展覽會上展出一系列&lt;a target='_blank' href='http://www.eettaiwan.com/SEARCH/ART/SV7000.HTM'&gt;SV7000&lt;/a&gt;的寬頻通訊平台與應用解決方案。NEC UNIVERGE SV7000是一款以inux為作業系統的純網路IP語音&lt;a target='_blank' href='http://www.eettaiwan.com/SEARCH/ART/%A6%F8%AAA%BE%B9.HTM'&gt;伺服器&lt;/a&gt;，是能夠透過聲音、數據通訊與電腦系統整合，達到改變工作型態，並提高生產力的企業級通訊解決方案。NEC此次展示了多元化的應用解決方案。其中Video Conference提供了訊號穩定清晰的電視會議解決方案。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;SIP Trunk節費解決方案可讓用戶在撥打行動、長途或是國際電話時，節省30%以上的通話費。Web&lt;br /&gt;Call解決方案可直接讓員工及客戶透過網際網路的IE瀏覽器，連上企業網站撥打電話，而不受到防火牆的安全防護阻隔。用戶可以進一步透過LCS&lt;br /&gt;Integration的解決方案，達到即時的語音通訊，且不會漏接任何一通重要電話。&lt;br /&gt;&lt;/p&gt;除了以上的解決方案之外，尚有交換機平台、IP Telephony、WLAN、Phone Book、NAT&lt;br /&gt;Solution、以及IP&lt;br /&gt;Recording等解決方案，都有實際展示解說。NEC表示，當世界各地的寬頻網路使用量逐年增加，而傳統的通訊習慣也悄悄被顛覆的時候，IP網路電話&lt;br /&gt;已儼然成為了將傳統電話路線取而代之的明日之星。在寬頻網路的需求日益提升的現在，強化IP網路的基礎建設更是各產業界的大中小型企業刻不容緩的議題。&lt;br /&gt;&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3474577459886827247-431261736961762941?l=cwjen888.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cwjen888.blogspot.com/feeds/431261736961762941/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3474577459886827247&amp;postID=431261736961762941' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/431261736961762941'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/431261736961762941'/><link rel='alternate' type='text/html' href='http://cwjen888.blogspot.com/2008/12/neclinuxipsv7000.html' title='NEC展出採Linux作業系統之IP語音伺服器SV7000'/><author><name>David Chang</name><uri>http://www.blogger.com/profile/05943998889053147615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3474577459886827247.post-3066576004507021388</id><published>2008-12-16T21:52:00.000-08:00</published><updated>2008-12-16T21:53:00.553-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VoIP'/><title type='text'>Polycom採用TI VoIP技術支援桌上型IP電話</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;http://www.eettaiwan.com/ART_8800532469_622964_NP_7b7d4a1a.HTM&lt;br/&gt;&lt;br/&gt;德州儀器(TI)宣佈，Polycom公司採用TI的數位訊號處理(&lt;a href='http://www.eettaiwan.com/SEARCH/ART/DSP.HTM'&gt;DSP&lt;/a&gt;)技術，推出全新SoundPoint IP 670桌上型電話。透過TI的DSP技術與Polycom的軟體與系統專業知識，Polycom的商業客戶可體驗絕佳且逼真的高解析度(HD)語音品質，並進一步擴展其創新IP電話系列產品。&lt;p&gt;為&lt;br /&gt;了滿足企業用戶的需求，Polycom的SoundPoint IP&lt;br /&gt;670為一款應用型的桌上型SIP電話，具有高效能色彩色顯示示、HD語音技術，以及Gigabit乙太網路(GigE)連線功能。Polycom的共同&lt;br /&gt;創辦人暨語音部門技術長Jeffrey Rodman表示，透過TI&lt;br /&gt;DSP的可程式化與彈性等優勢，Polycom將持續開發各式更新、更先進的電話，適用於各種工作場所、辦公桌和會議桌。&lt;/p&gt;&lt;p&gt;TI通訊基礎架構暨語音部門產品管理總監Angela Raucher表示，Polycom的產品採用TI DSP技術，結合其SoundPoint IP 670桌上型電話，將可為其全球超過2百萬名用戶提供優異品質與清晰的語音傳輸效果。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;			&lt;br /&gt;			&lt;br /&gt;&lt;br /&gt;			&lt;br /&gt;			&lt;br/&gt;&lt;br /&gt;				&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3474577459886827247-3066576004507021388?l=cwjen888.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cwjen888.blogspot.com/feeds/3066576004507021388/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3474577459886827247&amp;postID=3066576004507021388' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/3066576004507021388'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/3066576004507021388'/><link rel='alternate' type='text/html' href='http://cwjen888.blogspot.com/2008/12/polycomti-voipip.html' title='Polycom採用TI VoIP技術支援桌上型IP電話'/><author><name>David Chang</name><uri>http://www.blogger.com/profile/05943998889053147615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3474577459886827247.post-8933791264150278879</id><published>2008-12-16T21:51:00.000-08:00</published><updated>2008-12-16T21:52:06.039-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VoIP'/><title type='text'>ARC與HelloSoft合作推出高品質VoIP方案</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;br/&gt;http://www.eettaiwan.com/ART_8800556289_622964_NP_40c6f5f7.HTM&lt;br/&gt;&lt;br/&gt;ARC International宣佈推出一項建構在ARC Sound平台上的VoIP方案，可執行VoIP技術廠商HelloSoft公司的軟體套件，為SoC客戶提供比同級IP核心方案更多一倍的語音通道。&lt;p&gt;ARC和HelloSoft的VoIP方案支援由單一通道提供的完整電話堆疊，包括Session Initiation Protocol (&lt;a title='femto技術藉全IP方案與VoWi-Fi展開競爭' href='http://www.eettaiwan.com/ART_8800466358_617723_NT_73c185e3.HTM'&gt;SIP&lt;/a&gt;)、G.723.1、全雙工三向電話會議、線路回音消除、即時作業系統和TCP/IP。預期整個方案所需的處理器頻寬少於65MHz。&lt;/p&gt;&lt;p&gt;新的VoIP方案也允許在130奈米製程進行的二個通道實作擁有餘裕在90奈米製程成長到四個通道。採用ARC和HelloSoft的軟硬體組合，SoC開發業者就可以在小於現有RISC處理器的矽晶面積上，以更低的功耗提供兩倍的語音通道。&lt;/p&gt;&lt;p&gt;ARC &lt;a href='http://www.eettaiwan.com/SEARCH/ART/Sound.HTM'&gt;&lt;span class='maintext'&gt;Sound&lt;/span&gt;&lt;/a&gt; Subsystem已開放授權。&lt;a title='HelloSoft積極在台推廣VoIP解決方案' href='http://www.eettaiwan.com/ART_8800382637_676964_NT_30694c8b.HTM'&gt;HelloSoft&lt;/a&gt; VoIP軟體將於2009年第一季結束前上市。&lt;/p&gt;&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3474577459886827247-8933791264150278879?l=cwjen888.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cwjen888.blogspot.com/feeds/8933791264150278879/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3474577459886827247&amp;postID=8933791264150278879' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/8933791264150278879'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/8933791264150278879'/><link rel='alternate' type='text/html' href='http://cwjen888.blogspot.com/2008/12/archellosoftvoip.html' title='ARC與HelloSoft合作推出高品質VoIP方案'/><author><name>David Chang</name><uri>http://www.blogger.com/profile/05943998889053147615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3474577459886827247.post-6656899401119017691</id><published>2008-12-16T21:50:00.001-08:00</published><updated>2008-12-16T21:50:54.129-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VoIP'/><title type='text'>良好整合軟硬體滿足VoIP設備開發需求</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;br/&gt;http://www.eettaiwan.com/ART_8800444433_675327_TA_0d475f45.HTM&lt;br/&gt;&lt;p&gt;語音/數據網路的整合是未來幾年&lt;a target='_blank' href='http://www.eettaiwan.com/SEARCH/ART/%B3q%B0T.HTM'&gt;通訊&lt;/a&gt;產品的成長焦點之一，其中最具成長潛力的當屬&lt;a target='_blank' href='http://www.eettaiwan.com/SEARCH/ART/VoIP.HTM'&gt;VoIP&lt;/a&gt;，從五年前開始，VoIP已逐漸從一種不成熟的技術迅速成為成熟的、普及的新興應用，在企業級和電信級領域中，VoIP正在迅速發展，而且其成長態勢也進一步擴展至其他通訊相關領域。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;今天，40%以上的PBX線路均支援&lt;a target='_blank' href='http://www.eettaiwan.com/SEARCH/ART/IP%BA%F4%B8%F4.HTM'&gt;IP網路&lt;/a&gt;，像英國電信這類的電信公司，正著手將他們的所有電信網路改造為以IP為基礎的網路，IP語音的通訊量也已大幅提升，這些實例都說明了未來的語音通訊將朝VoIP方向發展。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;雙模蜂巢式網路；語音&lt;a target='_blank' href='http://www.eettaiwan.com/SEARCH/ART/Wi%7E%40%7EFi.HTM'&gt;Wi-Fi&lt;/a&gt;或&lt;a target='_blank' title='經理人觀點(0704A)' href='http://www.eettaiwan.com/ART_8800460185_617739_NT_b942b5d6.HTM'&gt;WiMax&lt;/a&gt;；寬頻語音如&lt;a target='_blank' title='xDSL線的排錯' href='http://www.eettaiwan.com/ART_8800265892_644847_AN_c3e3b047.HTM'&gt;xDSL&lt;/a&gt;、寬頻&lt;a target='_blank' title='美國IDEAL公司進軍中國大陸電氣測試與測量市場' href='http://www.eettaiwan.com/ART_8800408402_480402_NT_06cf6466.HTM'&gt;纜線&lt;/a&gt;、光纖到家(FTTH)；IP電話和視訊IP電話等新興應用領域則將持續刺激此一新技術的發展，最終，基於IP網路的語音傳送技術將迅速取代已經有30年發展歷史，目前廣泛使用的成熟技術－TDM。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;要在短時間內以最新產品促成這些新興技術的發展，必須要投入巨額資金。這種投資不是對現有成熟產品的投資，而是對先進技術長期性需要緊隨技&lt;br /&gt;術發展趨勢的投資。由於對各種VoIP功能的標準情況目前尚不明確，因此，緊跟著最新技術的發展趨勢對能否提供良好VoIP產品及服務來說至關重要。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;對服務供應商或設備製造商來說，選擇一個既具有能夠支援大規模生產的硬體，而且具備能滿足該市場日新月異更新標準或提升功能之軟體的&lt;br /&gt;VoIP半導體供應商，是開發VoIP產品時最值得關注的問題。本文詳細描述了VoIP的主要功能，在實際操作時可能會面臨的技術挑戰，以及因應之道。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;VoIP主要功能&lt;/b&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;當透過IP網路傳送語音時，VoIP技術的主要障礙來自於語音延遲、抖動和數據封包丟失。雖然主要用於透過IP網路傳輸的數據通訊業務對上&lt;br /&gt;述問題並不敏感，但對語音通訊來說，這些因素可能會導致非常嚴重的問題，例如，若語音封包延遲或丟失，則受話的一方將無法獲得完整方資訊。為解決上述問&lt;br /&gt;題，需要一些特定的VoIP軟體來協助改善整體功能，以更可靠的方法傳輸封包交換網路中的語音串流。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;語音編碼&lt;br /&gt;將PCM(G.711)語音串流編碼成封包是VoIP設備的首要目標。這項任務也能透過採用諸如G.723.1A和G.729A/B等較低位元速率的音訊&lt;br /&gt;編碼器來實現，運用編碼功能節省頻寬。現在，許多公司都開發出各種新的音訊編碼器，根據各種應用予以標準化，如用於無線通訊的AMR和WB-AMR等，以&lt;br /&gt;節省更多頻寬(如在4KbpsLBR以下)，或是提升整體語音品質。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;回聲消除&lt;br /&gt;VoIP的另一項重要功能是回聲消除。良好的回聲消除是提高VoIP語音品質的關鍵。由於數據封包網路固有的延遲，通常在TDM網路中聽不到的回聲會在&lt;br /&gt;VoIP應用中成為一個主要問題。由於G.168標準(目前版本為G.168-2004)的不斷發展且制定迅速，收斂回聲消除演算法和建立良好回聲消除的&lt;br /&gt;追蹤模型遂成為當務之急。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;訊息封包 根據RFC 3550，將語音封裝到RTP封包內是VoIP設備的主要功能之一。現在，定義新型被壓縮介質的新型有效載荷，以及冗餘和其他支援更可靠訊息封包的操作類型正在不斷被定義中。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;傳真和數據機的支援 電話線不僅可傳送語音訊息，還能傳送數據資訊。傳真與數據機對封包網路的損壞更加敏感，因此，可靠的T.38傳真轉送就成為不可或缺的要素。通常，數據業務是採用G.711(PCM)編碼進行傳輸。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;訊號傳輸 傳統PSTN的訊號必須被轉換並重新發送。因此，DTMF、呼叫者識別和呼叫進行音訊(如忙錄音或播號音)等訊號必須要能被檢測和產生。&lt;br /&gt;&lt;/p&gt;&lt;p align='center'&gt;&lt;i&gt;&lt;img src='http://www.eettaiwan.com/ARTICLES/2006DEC/A/0612A_DC_TWS2.jpg'/&gt;&lt;br/&gt;圖：&lt;a target='_blank' href='http://www.eettaiwan.com/SEARCH/ART/AudioCodes.HTM'&gt;AudioCodes&lt;/a&gt;的FXO PSTN線路SIP/H.323 IP電話系統單晶片結構圖      &lt;/i&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;語音品質強化 要克服抖動和數據封包丟失等網路損壞情況，必須採用最適合的抖動緩衝機制。這項技術可最大限度地減少語音延遲，同時維持緩衝以避免遺漏數據封包。先進的數據封包遺失修補(PLC)機制可以在語音數據封包遺失的情況下仍然維持一定水準的通話品質。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;協議堆疊&lt;br /&gt;成熟的H.323和MGCP/MEGACO標準或一些新制定且正在完善中的SIP標準對呼叫建立和控制進行了詳細規定。當VoIP採用系統單晶片時，這些&lt;br /&gt;協議堆疊也須由供應商提供。當上述標準(特別是SIP標準)還沒有達到最終確定的情況下，保證協議堆疊可不斷更新和維護是非常重要的。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;正如目前的市場所顯示的，先進的VoIP處理軟體正處於不斷變化和發展中，而像加密和多方通話等其他功能也正不斷增加中，VoIP供應商必須隨時關注VoIP市場的發展動向，持續制定並完善標準。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;VoIP晶片的軟硬體平衡&lt;/b&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;在選擇VoIP晶片供應商時，原始設備供應商最常犯的一個主要錯誤是將VoIP晶片視為其電路板上的另一個硬體。毫無疑問的，VoIP設備的硬體是非常重要的，在為你開發的VoIP設備選擇晶片時，有幾點必須特別注意：&lt;br /&gt;&lt;/p&gt;&lt;p&gt;1. 晶片是否具有足夠的處理能力以完成上述的訊號處理，同時還要保留一定的餘量以備日後改進或增加新功能；&lt;br /&gt;&lt;/p&gt;&lt;p&gt;2. 矽晶片可以由多個晶圓廠生產，以確保在一家晶圓廠產能不足時不影響供貨。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;3. 矽晶片製造商是否足夠可靠，這些供應商是否能大量供貨，並同時保證晶片品質均有良好的歷史記錄。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;這些原則適用於任何一家晶片供應商。而在檢查供應商的軟體能力時，則應該特別注意以下幾點：&lt;br /&gt;&lt;/p&gt;&lt;p&gt;1. 供應商是否擁有自行開發軟體的技術，而不用依賴於第三方供應商提供軟體，從而減少由於使用多種來源的軟體所導致的風險增加；&lt;br /&gt;&lt;/p&gt;&lt;p&gt;2. 供應商的VoIP軟體是否經過大量客戶長期的現場應用考驗。儘管許多供應商都聲稱他們的產品已經過現場驗證，但事實上，真正經過考驗的並不多。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;3. 軟體功能是否齊全。持續追蹤市場和技術的發展趨勢能夠迅速更新軟體，以滿足新需求。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;4. 在惡劣的網路環境下是否仍能維持較高的語音品質。供應商應該提供在經過授權之實驗室中進行的測試報告。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;5. 供應商是否致力於將VoIP技術應用於廣泛的產品領域，並有長期發展的產品規劃藍圖，如此將確保軟體能不斷進行技術更新，並緊跟著市場潮流。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;能夠滿足上述原則的公司將能更有效地向客戶提供最新功能和軟體。在數年前就宣佈已開發出VoIP晶片的廠商中，目前僅有一小部份取得了成功，如德州儀器(TI)和AudioCodes。這些公司正致力於開發更多VoIP產品，並為現有產品增添新功能。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;為VoIP矽晶片選擇適合的合作夥伴將大幅提升產品在競爭激烈但充滿潛力的市場上取得成功的可能性。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;i&gt; 作者：Shaul Weissman&lt;br /&gt;&lt;/i&gt;&lt;/p&gt;&lt;p&gt;&lt;i&gt;CMBU經理&lt;br /&gt;&lt;/i&gt;&lt;/p&gt;&lt;p&gt;&lt;i&gt;AudioCodes公司&lt;br /&gt;&lt;/i&gt;&lt;/p&gt;&lt;br /&gt;			&lt;br /&gt;			&lt;br /&gt;&lt;br /&gt;			&lt;br /&gt;			&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3474577459886827247-6656899401119017691?l=cwjen888.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cwjen888.blogspot.com/feeds/6656899401119017691/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3474577459886827247&amp;postID=6656899401119017691' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/6656899401119017691'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/6656899401119017691'/><link rel='alternate' type='text/html' href='http://cwjen888.blogspot.com/2008/12/voip_16.html' title='良好整合軟硬體滿足VoIP設備開發需求'/><author><name>David Chang</name><uri>http://www.blogger.com/profile/05943998889053147615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3474577459886827247.post-8220230288949166900</id><published>2008-12-16T21:49:00.000-08:00</published><updated>2008-12-16T21:50:01.845-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VoIP'/><title type='text'>VoIP進入家庭應用的技術現狀及發展趨勢</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;http://www.eettaiwan.com/ART_8800347502_480202_TA_d627545f.HTM&lt;br/&gt;&lt;br/&gt;&lt;p&gt;&lt;a target='_blank' href='http://www.eettaiwan.com/SEARCH/ART/VoIP.HTM'&gt;VoIP&lt;/a&gt;技術在企業應用相對廣泛，而家庭應用卻發展緩慢，除了寬頻網路普及不足的原因外，標準、功能特性定型以及半導體方案等方面還存在很大的制約因素。本文介紹了VoIP的應用現狀和技術平台，並分析了VoIP相關的半導體和軟體的發展路線圖和未來VoIP技術的發展趨勢。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;VoIP是透過封包交換網路傳輸語音採樣。通常有三種VoIP業務類型，今天最常見的一種是透過IP電話卡來進行的通話，一般用於長途語音通訊，使用者可能永遠都不知道他的通話是採用VoIP技術。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;第二種是PC至電話(或PC至PC)通話，是利用PC上執行的軟體電話來進行。通話者對著與PC相連的麥克風、手機或無線電&lt;br /&gt;話講話。很明顯，這種模式不可能擴展到普通大眾，而僅限於熟悉電腦的用戶。使用筆記型及PDA上執行的軟體電話客戶程式，將隨著無線數據及語音接取業務的&lt;br /&gt;繼續融合變得更為流行。&lt;img align='right' width='239' alt='' src='http://www.eettaiwan.com/ARTICLES/2004SEP/B/0409B_DC_S2F1.JPG'/&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;第三種是設備至電話業務，其中將標準電話插入&lt;a target='_blank' href='http://www.eettaiwan.com/SEARCH/ART/%C3%FE%A4%F1%B9q%B8%DC%B0t%B1%B5%BE%B9.HTM'&gt;類比電話配接器&lt;/a&gt;(&lt;a target='_blank' title='宇力在CeBIT展示PCI-E及多媒體方案' href='http://www.eettaiwan.com/ART_8800360584_876045_NT_2dd9f650.HTM'&gt;ATA&lt;/a&gt;)/語音路由器中，或採用實際IP電話，用戶借助寬頻連接通話。無需用PC來實現通話，且用戶體驗類似於常規電話業務，因而使其成為迄今VoIP技術供應商最感興趣的市場。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;VoIP應用現狀&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;儘管VoIP在去年獲得了廣泛關注，但其出貨量仍較低，尤其在美國。實際上，今天的大多數語音通訊都屬於電話至電話或PC至電話。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;VoIP發展成為主流消費性業務將推動電話業務向設備至電話的模式進行大規模轉移，且將隨著低成本、具有豐富特性的VoIP設備推出而獲得大量應用。而這決定於半導體廠商能否提供滿足市場需求的價格點、特性及功能的元件，而要滿足這些要求還有待時日。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;有意思的是，企業對VoIP的採用卻相對廣泛，這是因為企業中通常普及了乙太網路聯接，且採用VoIP能大幅減少電話開銷。&lt;br /&gt;IT經理們通常已經擁有專用數據網路，且能方便地利用該網路實現VoIP業務。特別是與專用封包交換機(PBX)解決方案相較，IP電話平均可將企業的服&lt;br /&gt;務成本降低20%。不僅能大幅減少通話成本，且VoIP所採用的會話發起協議(SIP)還能使通話雙方設定除語音以外的其它應用，包括語音、視訊和即時消&lt;br /&gt;息等。在服務品質(QoS)方面，VoIP在企業比在家庭中更容易得到滿足，因為數據網路是一種封閉系統及受控環境，且客戶端管理也比較簡單，只需將電話&lt;br /&gt;插入現有數據網路中即可。VoIP還為區域內通話漫遊提供了一種移植到無線區域網路語音(&lt;a target='_blank' href='http://www.eettaiwan.com/SEARCH/ART/VoWLAN.HTM'&gt;VoWLAN&lt;/a&gt;)的途徑。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;今天的企業市場主要由少數幾家供應商(如Cisco、Avaya等)主導，但包括主要電話公司在內的其它設備與服務供應商也&lt;br /&gt;正轉向VoIP，以佔領SOHO市場，它們首先推出不受通話時數限制的月繳制計劃，並開放市場來讓大家競爭。如果能得到低成本及高性能設備廠商的支援，同&lt;br /&gt;樣的電話業務供應商甚至還能利用其設備及基礎設備投資來進入大眾市場。更低的成本以及增強特性，例如統一消息、個人(與位置無關)電話號碼、電話簿/目&lt;br /&gt;錄、呼叫轉移、會議以及其它特性，將有助於創造更多用戶需求。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;但VoIP進入大眾市場的速度卻比較緩慢，且全球的步伐還不統一。在普通消費市場上，迄今最成功的VoIP部署是在日本，&lt;br /&gt;由於其它電話業務的高成本，以及由Yahoo&lt;br /&gt;Broadband這樣的服務供應商所推出的雄心勃勃的寬頻及VoIP策略，近幾年日本每年新增數百萬條VoIP電話線。而最具吸引力的機會將在擁有高寬&lt;br /&gt;頻部署率的韓國，以及許多地區缺少傳統銅線電話基礎設備，並可能一步跨越到光纖到戶(FTTH)的中國。VoIP在美國的採用相對較慢，主要因為美國的&lt;br /&gt;PSTN電話太便宜，因此幾乎沒有改變現狀的動機。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;VoIP產品平台&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;目前，三種VoIP平台都已經出現潛在的應用(見圖1)。第一種是將VoIP功能增加到路由器或&lt;br /&gt;DSL/纜線數據機中，因此可稱為ATA、客戶端設備(CPE)或整合接取設備(IAD)。ATA平台是其中最基本的一種，它能在一邊提供寬頻或乙太網路&lt;br /&gt;連接，而在另一邊則提供RJ11連接(亦稱為外部交換業務或FXS)，因而使得任何常規電話都能充當IP電話使用。儘管這是一種最簡單的配置，但目前業界&lt;br /&gt;開始轉向更高整合方案，譬如將VoIP功能與多埠有線或無線路由器整合的VoIP路由器等。更高整合度的解決方案甚至還包含VoIP&lt;br /&gt;ADSL路由器，它將所有三種功能都整合在一個可提供寬頻接取、LAN連接、電話配接器甚至撥號連接的設備盒中。未來這種設備盒還將增加視訊、儲存及其它&lt;br /&gt;周邊電路。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;由於部署及協調所有業務將面臨很多挑戰，在很多情況下將涉及到多種業務及內容供應商，因此這種平台的最終上市還須待時日。儘管ATA盒是目前普通消費者選用的設備，但它們很可能最終將轉變為IP電話及WiFi手機，以實現高級IP業務並取代無線電話。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;第二種VoIP平台是目前主要用於中小型企業的IP電話/網路接取設備。IP電話外觀及使用的體驗類似常規電話，唯一的區別&lt;br /&gt;是它們與LAN連接而不是與PSTN線連接。透過IP電話/網路介面，人們即可用同樣的終端來存取數據業務、即時消息甚至網路瀏覽器。幾乎以同樣的方式，&lt;br /&gt;隨著服務供應商開始在其無線語音網路上增加數據業務，行動電話已經發展成為一種多功能通訊平台。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;第三種VoIP平台是無線區域網路(WLAN)，亦稱為WiFi手機，它將行動性及可能的漫遊功能與統一的消息傳送功能相&lt;br /&gt;結合。當越來越多的寬頻接取家庭採用無線接取點時，就可用來實現這種無線手機業務。所有可用數據業務都能被無線手機存取，因而使其實現地址簿、電子日曆、&lt;br /&gt;瀏覽器等多功能整合。WLAN手機具有可行動、易配置及部署成本相對較低的特點。今天，WLAN手機主要部署在一些垂直細分市場，如醫院、大型商店及校園&lt;br /&gt;等。&lt;img hspace='12' align='right' vspace='12' alt='' src='http://www.eettaiwan.com/ARTICLES/2004SEP/B/0409B_DC_S2F2.JPG'/&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;要使家庭及SOHO WiFi手機應用成為現實，其價格必須低於50美元。IEEE&lt;br /&gt;802.11e標準的最終敲定，也為WLAN語音傳輸提供了必要的QoS保證。In-Stat&lt;br /&gt;MDR預計，全球WiFi手機的出貨量將從2003年的6萬部成長到2007年的350萬部，到2008年將達到550萬部。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;最新的一種平台可能是同時具有蜂巢式及WLAN功能的雙模式手機。蜂巢式網路廠商可能將WLAN嵌入到手機中，使其既能作&lt;br /&gt;為採用WLAN的VoIP手機，又能作為常規手機使用。這樣廠商將獲得更多利益，因為這樣一來，在用戶密集地區只需增加網路頻寬而無需擴大整個蜂巢式基礎&lt;br /&gt;設備，降低了通訊實現成本。這種電話具有充分的智慧，如果有可用的接取點，它即會將IP通話透過成本較低的WLAN，否則透過蜂巢式網路來傳輸語音通訊。&lt;br /&gt;這種平台的主要設計挑戰是：兩種模式共處而不互相干擾；可無縫地從一種模式切換到另一種模式；基於WLAN的VoIP通話能滿足QoS要求。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;據In-Stat資料，這些平台的市場預計將從去年的1100萬埠迅速成長至2007年的3600萬埠，將為技術供應商及&lt;br /&gt;ODM提供廣闊的市場機會。與IP電話相較，配接器盒將繼續擁有更大的出貨量，因為它們是一種能擴展路由器功能及採用傳統電話的更為直接的VoIP實現途&lt;br /&gt;徑。但這些數位卻沒有考慮整合WLAN/蜂巢式手機所具有的巨大成長潛力，預計到2007及2008年手機市場規模將達到6億部，以如此巨大的市場基數，&lt;br /&gt;即使僅10%至20%的手機整合了WLAN，其市場潛力也十分巨大。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;半導體及軟體發展路線圖&lt;/b&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;儘管目前已有好幾種整合半導體解決方案，但它們主要適合於企業IP電話市場。而在VoIP迄今仍主要作為DSL、纜線數據機&lt;br /&gt;或路由器附加功能的消費市場，大多數半導體廠商一直在等待設備特性要求能早點固定，以便提供相關的SoC解決方案。對於大眾消費市場而言，在很大程度上模&lt;br /&gt;組化比整合更為重要，因為其目標是以幾種選項來在單個設計中實現帶或不帶語音的多個不同類產品，同時等待特性要求固定以及VoIP成為主流。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;VoIP實現的語音處理基本上可以下列三種方式來實現：採用DSP語音處理器；採用整合了主處理器與DSP核心的整合度更&lt;br /&gt;高的元件；採用執行語音處理軟體的功能更強大的主處理器。隨著嵌入式主處理器的功能更加強大，它們能實現更多的語音處理功能，因而可以不需要專用DSP核&lt;br /&gt;心，有助於減少產品尺寸和更好的功耗管理。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;迄今為止，採用語音協同處理器對於那些VoIP作為附加功能的應用來說不失為一種最佳策略，而IP電話及WiFi手機則可&lt;br /&gt;利用整合SoC解決方案或軟體來實現。同時擁有DSP核心及軟VoIP能力的半導體廠商，將能更好地定位以滿足迅速發展的需求，並能為每種應用在基於主&lt;br /&gt;機、基於嵌入式DSP或基於語音協同處理器的實現之間進行最佳折衷選擇。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;VoIP設備中整合越來越多特性和語音處理功能，這些通常可以分成三類，即語音處理、呼叫控制及應用。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;語音處理主要任務包括各種語音編碼器、回音消除器以及音調檢波器與產生器。語音編碼器包括：G.729，它能以市話(或長途&lt;br /&gt;電話)品質在低於8kbps的速率上編碼語音訊號；G.722，它能以自適應差分脈衝編碼調變(ADPCM)方案來在48kbps、56kbps及&lt;br /&gt;64kbps速率上對7kHz頻寬的語音訊號進行編碼。此外，還有其它很多種語音增強功能，像舒適噪音產生(CNG)及語音訊號檢測(VAD)和訊框丟失&lt;br /&gt;隱藏等，VAD透過只傳輸人耳能聽到的聲音來提高頻寬利用率，訊框丟失隱藏可補償封包網路中丟失數據訊框，以及可吸收封包網路中延遲變化的‘動態抖動補償&lt;br /&gt;’等功能。值得注意的是，這些增強功能對所感覺的語音品質具有很大影響，同時也是區分各種解決方案優劣的關鍵。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;其它必須考慮的功能包括傳真、數據機直通、IP傳真(T.38)、IP&lt;br /&gt;Modem(V.150)以及IP文本(V.151)等功能。有許多專利權問題與各種IP編碼器有關，這可能會直接或間接地增加產品成本。在定義產品特性&lt;br /&gt;集以及選擇技術供應商時，開發商必須清楚這些問題。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;通話控制功能是一組協議，它能利用各種網路元素(如各種類型的網路閘道)來實現並超越一般的PSTN電話特性。此外，它還&lt;br /&gt;能提供用於設立並端接通話(或多媒體對話)以及橋接PSTN與封包交換網路的方法。目前已經開發了幾種協議，包括H.323、媒體網路閘道控制協議&lt;br /&gt;(MGCP)以及SIP等，早期採用H.323及SIP由於其相對簡單、可擴展及特性豐富而獲得了最多支援。應用軟體將最終決定設備的功能，無論是IP電&lt;br /&gt;話、ATA還是任何其它類似設備。同時，軟體還決定用戶介面、設備配置與管理，以及整體功能和可用模式。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;由於上述三種主要設備的發展有些互相獨立且經常改變，因此採用分層軟體架構很重要。這種分層架構還必須足夠模組化，以便於整合、定製，以及便於由晶片供應商或系統整合商(或任何其它IP供應商)所設計組件的發展。圖2為此一架構示意圖。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;外部交換局(FXO)是VoIP設備需支援的新功能之一，它實際上是與PSTN線的介面。FXO不僅能在IP網路掉線時使通&lt;br /&gt;話方可以使用PSTN，而且還能在同一設備中實現在PSTN與VoIP之間切換，還能使ATA盒接受遠端撥號，並根據所撥號碼或其它參數來將長途及國際呼&lt;br /&gt;叫接到更便宜的IP網路上。最便宜的通話、遠端終端呼叫以及呼叫轉移等功能結合，充分利用了早期採用相同電話介面的類比數據機技術經驗。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;下一代VoIP手機&lt;/b&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;儘管面臨跨越幾種技術發展方向的高度動態環境，晶片供應商們已開始聚集在擁有多種近期機會的架構上。企業所使用的全特性IP手機、利用&lt;a target='_blank' href='http://www.eettaiwan.com/SEARCH/ART/%AEa%AEx%BA%F4%B8%F4.HTM'&gt;家庭網路&lt;/a&gt;閘道的啞IP手機(dumb IP handset)、甚至採用USB連接的功能強大的PDA等，都很快能用到整合晶片。後者依靠網路網路閘道、PC筆記型電腦或PDA來承載通話控制協議堆疊，並負責全部VoIP處理任務。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;由於VoIP數據頻寬要求並不高，故802.11b完全可以滿足WLAN手機應用。但在WLAN手機設計中還其它幾個方面問&lt;br /&gt;題需要仔細考慮，其中功耗是關鍵問題，目前市場上大多數802.11元件並不能滿足手機的長待機時間要求；安全是另一個關切的問題，儘管目前WLAN領域&lt;br /&gt;中已有多種安全方案，但並不是全部都能支援，且安全IP客戶端的配置並非很順暢；最後一個重要問題是QoS，儘管已有眾多的標準及產業規格(如&lt;br /&gt;802.11e)，但它仍是一個需要特別關注的棘手問題，語音應用嚴格的低延遲要求進一步增加了QoS的挑戰。在這種情況下，對等網路連接是WLAN&lt;br /&gt;VoIP系統的關鍵要求。而WLAN一般被設置成即使在其互相通訊時也能使所有客戶端都透過接取點，因而會佔用更多的頻寬並導入額外的延遲，故關鍵是必須&lt;br /&gt;在任何可能的情況下，透過對等連接來最有效地利用可用頻寬，並使延遲最小。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;如上所述，IP電話與WiFi手機設計擁有許多共同點。設計工程師可以利用同一個平台來實現兩種應用，並利用相同的軟體。&lt;br /&gt;IP電話還要求更廣泛的LCD顯示以及乙太網路驅動器等其它特性，而WiFi手機則可能會使用這些功能中功耗較少的部份，並增加一個WLAN介面。這兩種&lt;br /&gt;應用的典型設備都將採用功能強大的ARM或類似處理器核心，並根據成本及功耗目標來選擇軟體或硬體語音編解碼器。也可能會結合A/D、D/A、LCD控制&lt;br /&gt;器、鍵盤掃描邏輯及功率管理特性等，同時也要求用USB連接來實現增加儲存或連接相機以實現視訊電話等功能。甚至可以利用USB on-the-go&lt;br /&gt;(OTG)功能，使設備動態地成為一個USB客戶機(當充電或同步傳輸數據時)或主機(當採用相機功能時等)。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;因此，像這樣的SoC將能為VoIP系統ODM提供各種具有吸引力的下一代平台設計選擇。在標準推出、應用及特性定型後，&lt;br /&gt;半導體廠商將會著手提供各種新的整合解決方案，並從目前的功能跨越到能提供整合語音＋WLAN解決方案，以及可充分利用USB&lt;br /&gt;2.0這種新型連接技術的設備功能。此外，單一整合式SoC解決方案還將日益擁有用於多種產品平台以及經濟高效地為多個市場服務的靈活性。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;i&gt;作者：Zeev Collin&lt;br /&gt;&lt;/i&gt;&lt;/p&gt;&lt;p&gt;&lt;i&gt;&lt;br/&gt;VoIP產品副總裁&lt;br /&gt;&lt;/i&gt;&lt;/p&gt;&lt;p&gt;&lt;i&gt;&lt;br/&gt;科勝訊系統公司&lt;/i&gt;&lt;br /&gt;&lt;/p&gt;&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3474577459886827247-8220230288949166900?l=cwjen888.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cwjen888.blogspot.com/feeds/8220230288949166900/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3474577459886827247&amp;postID=8220230288949166900' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/8220230288949166900'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/8220230288949166900'/><link rel='alternate' type='text/html' href='http://cwjen888.blogspot.com/2008/12/voip.html' title='VoIP進入家庭應用的技術現狀及發展趨勢'/><author><name>David Chang</name><uri>http://www.blogger.com/profile/05943998889053147615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3474577459886827247.post-2955256590278616396</id><published>2008-12-16T21:48:00.001-08:00</published><updated>2008-12-16T21:48:56.109-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VoIP'/><title type='text'>利用軟體DSP VoIP和硬體加速技術設計低成本視訊電話</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;p&gt;&lt;i&gt;&lt;a target='_blank' href='http://www.eettaiwan.com/SEARCH/ART/%B5%F8%B0T%B9q%B8%DC.HTM'&gt;http://www.eettaiwan.com/ART_8800380419_480102_TA_354474ac.HTM&lt;br/&gt;&lt;/a&gt;&lt;/i&gt;&lt;/p&gt;&lt;p&gt;&lt;i&gt;&lt;a target='_blank' href='http://www.eettaiwan.com/SEARCH/ART/%B5%F8%B0T%B9q%B8%DC.HTM'&gt;視訊電話&lt;/a&gt;利用快速成長的VoIP基礎架構進入大眾市場的機會已經來臨，一些新技術和新產品已經使高性價比的視訊電話成為可能。本文介紹了視訊電話的成本現狀和音訊、視訊功能實現的技術方法，並介紹了軟體DSP(soft-DSP)VoIP技術和硬體加速視訊編碼技術。&lt;/i&gt;&lt;/p&gt;&lt;p&gt;在&lt;br /&gt;1964年世界展覽會(World's Fair)上推出的AT&amp;amp;T&lt;br /&gt;Picturephone每分鐘的語音加視訊業務費用為16到24美元(考慮通貨膨脹因素，相當於今天的78到118美元)，如此之高的價格很自然難以普&lt;br /&gt;及。之後，人們不斷嘗試推出針對大眾市場的視訊電話，然而設備的價格一直在500到上千美元之間徘徊，視訊訊框速率範圍在每秒1訊框到10訊框之間，因此&lt;br /&gt;視訊電話一直受住宅用戶的冷落。&lt;/p&gt;&lt;p&gt;而現在情況出現了轉機，視訊電話所面臨的技術挑戰被逐一克服，日益成熟的VoIP方案已解決&lt;br /&gt;了大部份的問題。寬頻網路際網路接取已經普及，因此家庭具有了足夠的頻寬。一些新創企業和老牌廠商正聯合提供基於封包的電話服務，這些服務形成了視訊電話&lt;br /&gt;的良好基礎。更重要的是，摩爾定律再一次發揮了它的魔力，現在已經有能夠非常高效地處理全動態視訊的&lt;a target='_blank' href='http://www.eettaiwan.com/SEARCH/ART/%B3B%B2z%BE%B9.HTM'&gt;處理器&lt;/a&gt;。透過恰當地使用軟體VoIP設計技術和硬體加速視訊處理技術，視訊電話已經達到大眾化產品所需的關鍵成本點。&lt;/p&gt;&lt;table align='right'&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;&lt;img border='0' align='right' src='http://www.eettaiwan.com/ARTICLES/2005NOV/A/0511A_DC_BB8F1.JPG'/&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class='maintext'&gt;&lt;p&gt;&lt;i&gt;圖1：傳統的多晶片視訊電話架構。&lt;/i&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;b&gt;視訊電話的成本現狀&lt;/b&gt;&lt;/p&gt;&lt;p&gt;要&lt;br /&gt;得到普及，視訊電話的價格必須達到合適的水準。99美元的‘魔力’消費價格點是許多供應商要面對的住宅視訊電話市場的目標價格。雖然對於目前的技術來說這&lt;br /&gt;仍具有相當的挑戰性，但很多VoIP服務供應商一年前就開始在交換機中部署視訊電話了，有的更是承諾提供更多更好的服務。如果服務供應商的優惠促銷，目前&lt;br /&gt;視訊電話的零售價在800美元以上，因此對服務供應商來說是一項沈重的負擔，很可能會抑制他們展開這種業務的興趣。&lt;/p&gt;&lt;p&gt;目前具有VoIP功能的視訊電話設計成本決定於眾多必需的專業元件。傳統的IP視訊和語音(V2IP)設計至少包含三個獨立的處理器：一個用於語音處理的DSP，一個視訊&lt;a target='_blank' href='http://www.eettaiwan.com/SEARCH/ART/%BDs%B8%D1%BDX.HTM'&gt;編解碼&lt;/a&gt;處&lt;br /&gt;理器(一個專用視訊處理器，或者是一個能夠處理視訊編解碼的通用DSP)和一個處理VoIP呼叫訊號、用戶介面和設備一般性控制的應用處理器。這些處理器&lt;br /&gt;加上其它一些必要的電子元件(如攝影鏡頭、LCD和音訊編解碼器)，總的電子材料成本將達到500美元以上，這還沒計算軟體、封裝或製造所需的成本。&lt;/p&gt;&lt;p&gt;幸&lt;br /&gt;運的是，新的技術可以將視訊電話的零組件成本至少砍掉一半。透過使用高度整合的應用處理器和軟體DSP技術(如Trinity&lt;br /&gt;Convergence公司的VeriCall&lt;br /&gt;Edge嵌入式VoIP通訊軟體)實現VoIP處理，就可以用一個元件代替前面所述的多個處理器，因而大幅節省成本、功耗，並減少設備體積。&lt;/p&gt;&lt;p&gt;&lt;b&gt;音訊功能的實現&lt;/b&gt;&lt;/p&gt;&lt;p&gt;在傳統的視訊電話設備中，一個DSP用來實現封包語音處理(語音編解碼、音調產生和檢測、回波消除、噪音抑制等)，另外一個獨立的DSP或專用&lt;a target='_blank' href='http://www.eettaiwan.com/SEARCH/ART/%A8%F3%A6P%B3B%B2z%BE%B9.HTM'&gt;協同處理器&lt;/a&gt;處理視訊編解碼，還有一個應用處理器用於管理VoIP呼叫控制協議和用戶介面，如圖1所示。&lt;/p&gt;&lt;p&gt;在&lt;br /&gt;這種多元件架構中，任務被分配給系統中的不同元件完成，因此協調和管理整個系統的任務量也有所增加。元件數量的增加不僅會增加設備的體積，還會增加電路板&lt;br /&gt;的整體複雜性。在多個元件情況下，由於每個元件有不同的電源要求，系統內的供電設計也會變得非常複雜，需要採用多電壓轉換器產生不同的電壓值。&lt;/p&gt;&lt;p&gt;使&lt;br /&gt;用幾個分離的處理器來分別實現語音、視訊和系統控制的傳統架構還要求多種編程模式和開發工具鏈，因此常常需要較大的開發團隊，因而增加開發工具方面的培訓&lt;br /&gt;和其它額外成本。基於ARM和MIPS架構的通用應用處理器現在已經增強了其處理能力，透過最佳化的‘DSP類’指令，可以將原本用DSP實現的音訊處理&lt;br /&gt;任務交給應用處理器來完成。如果仔細地採用匯編編碼和手工最佳化過的軟體，同時在視訊編解碼方面適當地採用某種形式的硬體加速器來實現的話，那麼VoIP&lt;br /&gt;編解碼(G.711、G.729AB、G.723.1、iLBC)、音訊處理(DTMF(雙音多頻)和呼叫過程音調檢測/產生)、語音品質增強(線路和聲&lt;br /&gt;學回波消除、抖動緩衝等)和其它類似功能都可以在應用處理器上高效執行。&lt;/p&gt;&lt;table align='right'&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;&lt;img border='0' align='right' src='http://www.eettaiwan.com/ARTICLES/2005NOV/A/0511A_DC_BB8F2.JPG'/&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class='maintext'&gt;&lt;p&gt;&lt;i&gt;圖2：基於軟VoIP的視訊電話架構。&lt;/i&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;在&lt;br /&gt;標準的視訊電話設計中，硬體音訊編解碼器(如AC97編解碼器)提供麥克風/揚聲器與通用處理器之間的實體介面。由通用應用處理器上執行的軟體完成音訊數&lt;br /&gt;據的收發和必要的VoIP處理，例如接收來自麥克風的輸入音訊數據，透過G.723.1之類的語音編解碼模組進行處理後，再以封包數據串流的形式向外發&lt;br /&gt;送，或者讓揚聲器播放產生的DTMF音調(透過硬體音訊編解碼器)。&lt;/p&gt;&lt;p&gt;設計工程師需要有關處理器架構和VoIP音訊處理演算法&lt;br /&gt;方面的詳細知識，才能有效地實現這些處理器密切相關的演算法。雖然針對適當的應用處理器架構實現這些語音處理模組需要付出很大的精力，但最終獲得的好處可&lt;br /&gt;以証明在這方面的投入是很值得的。由於VoIP業務的即時特性，以及為了提供廣泛的VoIP編解碼器支援以確保設備間互通作業性的需要，應該透過靈活的架&lt;br /&gt;構實現對正確VoIP編解碼器的在線選擇和配置，並對指定媒體通道中使用的媒體處理單元實現動態配置。採用的架構及相關調度模組必須能確保指定通道定義所&lt;br /&gt;要求的所有演算法能在允許的時間週期內執行完成。&lt;/p&gt;&lt;p&gt;在單通道系統中調度這些演算法的任務有點類似於按順序對相關演算法進行的一&lt;br /&gt;系列連續調用，多通道系統則要複雜得多，每個通道可能需要不同的VoIP編解碼器，而且有些通道可能需要回波消除，有些通道則不需要。視訊電話一般是‘單&lt;br /&gt;通道’系統，不過也經常會有三方音訊呼叫需求，此時視訊電話應具有本地音訊混合的能力，目前對支援多通道的需求正不斷增多。&lt;/p&gt;&lt;p&gt;為&lt;br /&gt;了簡化設備設計工程師的工作，可以利用VeriCall&lt;br /&gt;Edge這樣的軟體平台。這些平台提供了高度最佳化和整合的解決方案，可以快速整合在最終的產品設計中。在針對基於ARM9、ARM9E和MIPS32的&lt;br /&gt;元件整合的靈活架構內，提供必要的媒體處理演算法以及基於SIP或H.323的VoIP呼叫控制，因而讓視訊電話開發商專注於開發設備上的增殖業務。透過&lt;br /&gt;將封包語音處理合併到通用處理器上，只要一個元件就可以處理視訊電話中與VoIP相關的所有任務，VoIP呼叫控制、用戶介面和一般的電話控制應用都在這&lt;br /&gt;個通用應用處理器上完成。由於其它一些任務沒有相似的嚴格時間要求，因此可以用‘C’實現，不需要最最佳化的匯編程式碼。將媒體處理和呼叫控制/系統管理&lt;br /&gt;合併到單個應用處理器可以進一步簡化設計，減少元件數量、成本和體積。另外，合併後還可以取消VoIP媒體處理和系統控制原本所需的各項單獨開發工作和單&lt;br /&gt;獨開發工具鏈。&lt;/p&gt;&lt;p&gt;為了進一步增加系統整合度，並獲得更低功耗、更小體積和整體更低的系統成本，可以使用內含通用處理器和專用視訊&lt;a target='_blank' href='http://www.eettaiwan.com/SEARCH/ART/%A8%F3%A6P%B3B%B2z%BE%B9.HTM'&gt;協同處理器&lt;/a&gt;或DSP的系統單晶片(SoC)。飛思卡爾的i.MX21多媒體應用處理器就是這樣的元件，它包含一個基於ARM9E的通用處理器和一個專門用於H.263和MPEG4編碼/解碼的硬體加速引擎，該引擎在CIF&lt;a target='_blank' title='TI三款視訊放大器功耗降低20倍' href='http://www.eettaiwan.com/ART_8800401310_480702_NP_8f28754f.HTM'&gt;解析度&lt;/a&gt;情&lt;br /&gt;況下可達到每秒30訊框的視訊處理速率。VeriCall&lt;br /&gt;Edge解決方案也充分利用了這種架構的優勢，可以在ARM9E通用處理器上完成所有的VoIP媒體處理任務，同時可利用VeriCall&lt;br /&gt;Edge軟體框架配置和管理基於硬體的視訊加速模組來控制H.263或MPEG4視訊串流。&lt;/p&gt;&lt;p&gt;&lt;b&gt;影像功能的實現&lt;/b&gt;&lt;/p&gt;&lt;p&gt;視&lt;br /&gt;訊電話中最繁重的處理任務是對視訊的處理。所需要的具體處理量變化相當大，取決於發送和接收影像的大小以及採用的特別編碼方案。視訊電話中最常用的是&lt;br /&gt;H.263、MPEG4和H.264標準。H.264傳送一幅與H.263相當品質的視訊影像所需頻寬要比H.263小，但需要更強的處理能力來實現更高&lt;br /&gt;的壓縮率。滿足最大訊框速率和解析度範圍的特定視訊壓縮方案將為元件中的視訊處理選取‘合適’的解決方案。&lt;/p&gt;&lt;p&gt;系統設計工程師可&lt;br /&gt;以有多種選擇，可以在通用處理器或DSP上透過軟體實現，也可以使用提供特殊視訊串流編解碼的專用矽元件。只有在非常低的訊框速率和解析度條件下，才可全&lt;br /&gt;部利用執行於通用處理器上的軟體實現視訊串流的編解碼。對視訊串流的編碼要比解碼耗費更多的處理資源，因此合理的方案應該是在通用處理器上完成視訊解碼，&lt;br /&gt;利用某種形式的硬體加速電路完成視訊編碼。隨著最新通用應用處理器(如基於ARM11和MIPS24K核心的處理器)的推出，處理器將擁有更強的處理能&lt;br /&gt;力，因此軟體解碼和硬體支援下的編碼可能是下一代視訊電話採用的最理想解決方案。&lt;/p&gt;&lt;table align='right'&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;&lt;img border='0' align='right' src='http://www.eettaiwan.com/ARTICLES/2005NOV/A/0511A_DC_BB8F3.JPG'/&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class='maintext'&gt;&lt;p&gt;&lt;i&gt;圖3：採用軟VoIP方法的V2IP系統單晶片架構。&lt;/i&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;為&lt;br /&gt;了在CIF或更高解析度下獲得完全運動(30fps)的視訊，目前的VoIP視訊電話肯定需要某種形式的硬體加速電路。這種加速電路可以是某種形式的&lt;br /&gt;SoC，比如一個通用處理器處理語音，一個專用視訊編碼元件或更通用的DSP處理視訊。專用視訊編碼元件的優勢在於可以簡化編程模型，與嵌入在SoC中的&lt;br /&gt;DSP相較，它在功耗和矽電路閘數方面更有效率。然而，DSP可以為系統設計工程師提供更好的靈活性，透過DSP軟體升級可以支援新的視訊編解碼格式(假&lt;br /&gt;設所用DSP具有處理新的視訊編解碼標準的足夠能力)。總之，系統設計工程師必須決定所需的工作特性，充分考慮所需支援的視訊格式，以及元件可提供的處理&lt;br /&gt;能力、功耗預算和尺寸。&lt;/p&gt;&lt;p&gt;&lt;b&gt;音訊和視訊功能整合&lt;/b&gt;&lt;/p&gt;&lt;p&gt;在明確語音和視訊系統的設計要點後，也許最重要就是將這兩個獨立的子系統整合。在基於VoIP的視訊電話中，音訊和視訊是作為兩個獨立的封包數據串流進行收發的，這兩個數據串流必須在接收側取得關聯性和&lt;a target='_blank' title='立錡的同步降壓調節器效率達95%' href='http://www.eettaiwan.com/ART_8800375528_675763_NP_e73566b8.HTM'&gt;同步&lt;/a&gt;。不能正確地同步音訊和視訊串流將導致類似於電影中演員的語音一直不能與影像相配合的後果。&lt;/p&gt;&lt;p&gt;視&lt;br /&gt;訊電話設計時還需要考慮抖動緩衝。要想使產品可以實用，必須認真對待抖動緩衝的問題。雖然音訊和視訊數據串流都包含有可用來關聯數據的時間標籤&lt;br /&gt;(timestamp)，但系統還必須能夠正確處理網路中可能會產生的數據封包丟失和網路抖動。設計時必須考慮緩衝記憶體和同步這兩個數據串流的方法，同&lt;br /&gt;時還不能給系統帶來不必要的時延。某些視訊電話允許用戶修改視訊和音訊串流之間的時延或偏移來取得基本的同步，雖然這種方法可以同步音訊和視訊串流，但用&lt;br /&gt;戶每次呼叫或通話期間網路狀態改變導致流失步時都需要進行人工修正。VeriCall Edge&lt;br /&gt;V2IP解決方案則提供了音視訊自動同步技術，不再需要用戶手動去同步數據串流，而且照樣能適應網路狀態的改變。VeriCall&lt;br /&gt;Edge可以透過主動地監視和管理輸入的音視訊數據串流來適應某個數據串流中封包的延遲或丟失，因而確保用戶能在多種網路環境下取得高品質的視訊效果。&lt;/p&gt;&lt;p&gt;&lt;b&gt;本文小結&lt;/b&gt;&lt;/p&gt;&lt;p&gt;雖&lt;br /&gt;然四十多年來視訊電話經歷了很多坎坷，但目前的新技術和新產品已經使高性價比的視訊電話成為可能，利用快速成長的VoIP基礎架構進入大眾市場的機會已經&lt;br /&gt;來臨。軟體DSP&lt;br /&gt;VoIP技術和硬體加速視訊編碼技術的有機結合，能使視訊電話所需的電子材料成本減少一半之多。這種產品成本的大幅降低將促使視訊電話迅速普及，而像&lt;br /&gt;VeriCall Edge等高度整合的軟體架構可以幫助系統開發人員以更短的時間和最小的風險開發出創新性產品。&lt;/p&gt;&lt;p&gt;&lt;i&gt;作者: Michael Ward&lt;/i&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3474577459886827247-2955256590278616396?l=cwjen888.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cwjen888.blogspot.com/feeds/2955256590278616396/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3474577459886827247&amp;postID=2955256590278616396' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/2955256590278616396'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/2955256590278616396'/><link rel='alternate' type='text/html' href='http://cwjen888.blogspot.com/2008/12/dsp-voip.html' title='利用軟體DSP VoIP和硬體加速技術設計低成本視訊電話'/><author><name>David Chang</name><uri>http://www.blogger.com/profile/05943998889053147615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3474577459886827247.post-9085023991260786035</id><published>2008-12-14T22:53:00.001-08:00</published><updated>2008-12-14T22:53:47.614-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='8051'/><category scheme='http://www.blogger.com/atom/ns#' term='家庭自動化'/><category scheme='http://www.blogger.com/atom/ns#' term='Arduino'/><title type='text'>8051装上ZigBee的车轮，单片机进军无线大市场</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;p&gt;一、 单片机的无线化和无线网络化大趋势&lt;/p&gt;&lt;p&gt;芯片巨人TI公司收购&lt;a target='_blank' href='http://www.eetchina.com/SEARCH/ART/%CE%DE%CF%DF%B5%A5%C6%AC%BB%FA.HTM'&gt;无线单片机&lt;/a&gt;的先锋CHIPCON公司后，推出了全新概念的新一代&lt;a target='_blank' href='http://www.eetchina.com/SEARCH/ART/ZigBee.HTM'&gt;ZigBee&lt;/a&gt;无线单片机 &lt;a target='_blank' href='http://www.eetchina.com/SEARCH/ART/CC2430.HTM'&gt;CC2430&lt;/a&gt;/CC2431&lt;br /&gt;系列和短距离通讯的新一代无线单片机CC2510/CC1110系列，这些以经典8051微处理器为内核无线单片机，也称“射频SoC(片上系统)”，以&lt;br /&gt;其优异的无线性能，超低功耗，超低成本，在单片机技术领域，开创了单片机无线化和无线网络化的全新时代，采用这些新型无线单片机，进行无线通&lt;br /&gt;讯，RFID，无线数传产品等产品设计，是开发低成本、低功耗单片机应用产品的非常理想方案。&lt;/p&gt;&lt;p&gt;以CC2430为代表的新一代射频SoC(片上系统)的特点是：&lt;/p&gt;&lt;p&gt;1 专门的设计，将全部的ZigBee/&lt;a target='_blank' href='http://www.eetchina.com/SEARCH/ART/802.15.4.HTM'&gt;802.15.4&lt;/a&gt; 需要的高频部分电路全部集成到了电路内部，从无线单片机到天线之间，只有3-5个 0603的普通零件，系统设计者完成不必需要任何高频方面的经验；&lt;/p&gt;&lt;p&gt;2 采用特殊设计，使8051微处理器和高频线路间，实现完美的配合，数字电路对高频通讯的影响减低到最小(因为对于非常微小高频信号而言，8051就是一个很大的数字噪声源)；&lt;/p&gt;&lt;p&gt;3&lt;br /&gt;将高速8051微处理器，32K 到128K闪存，8k&lt;br /&gt;SRAM多种外围电路，A/D，RTC和CC2420无线芯片等全部设计成一只非常小的芯片(48脚&lt;br /&gt;7X7平方毫米大小)，真正实现了单片机的无线化，微型化，使采用这类单片机的产品可以做成微型遥控器，信用卡一样薄的微型卡片，RFID长距离卡片，能&lt;br /&gt;置入人体的微型传感器等等；&lt;/p&gt;&lt;p&gt;4 无线通讯中的需要的大量软件处理，包括纠错，防止空气中包装碰撞，IEEE&lt;br /&gt;802.15.4标准通讯协议处理，网络路由，多种网络拓扑等等，都可以象“搭积木”一样，轻易放入无线单片机内部存储器中间去，由于CC2430这样的&lt;br /&gt;新一代无线单片机具有较大的存储空间，以CC2430-F128 为例，如果将IEEE&lt;br /&gt;802.15.4的协议软件放进去，大概只需要1/4存储空间，将完整ZigBee&lt;br /&gt;无线网络协议栈放入进去，也只需要1/2空间，我们还有足够空间存储我们的应用代码；&lt;/p&gt;&lt;p&gt;5 功耗非常低，CC2430无线单片机待机是电流消耗仅0.2UA, 在32K晶体时钟下运行，电流消耗小于1UA； 使用小型电池寿命可以长达10年；&lt;/p&gt;&lt;p&gt;6&lt;br /&gt;价格非常低： CC2430分别包括高速8051内核，ZigBee RF硬件部分，8K SRAM,128K/64K/32K&lt;br /&gt;闪存，大量购买的分别是 4美元 到&lt;br /&gt;2美元；而更加简化的CC2510/CC1100，价格会更低；从目前情况看，由于高频部分的硅成本非常低，加上非常大的生产数量，所以RF+MCU的总&lt;br /&gt;体价格，可能会低于普通常见8051单片机的价格；&lt;/p&gt;&lt;p&gt;从以上的这些特点我们看到了单片机无线化，无线网络化的大趋势，对于准备学习使用无线技&lt;br /&gt;术的广大单片机工程师和电子工程师而言，这是一个大好的消息，因为，从有线到无线的技术过渡中，将不再需要重新学习和熟悉单片机的结构/指令系统/编译开&lt;br /&gt;发工具；而直接快速进入无线产品开发的实践中去；&lt;/p&gt;&lt;p&gt;二、 8051的单片机，装上802.15.4标准和ZigBee智慧&lt;/p&gt;&lt;p&gt;作为&lt;br /&gt;8051兼容的无线单片机第一代产品的代表是chipcon 公司的cc1010, Nordic&lt;br /&gt;公司的nRF24E1/nRF9E5。推出的时间是2004年；分别工作在300-1000mhz/2.4GHZ频道；价格在30-50人民币/每片左&lt;br /&gt;右；这些无线单片机由于工作可靠，技术成熟，软件丰富，所以这几年获得了非常广泛的应用，对于一般的点到点，点到多点，无线数传，和各种类似无线键盘，无&lt;br /&gt;线摇杆，简单遥控器，无线抄表等应用和学习无线通讯知识，教学实验等，直到今天应该仍然是很好的选择；&lt;/p&gt;&lt;p&gt;无线通讯(我们这里主要指短距离无线通讯和嵌入式无线通讯)的发展，需要将更多的节点通过无线联系起来，包括各种传感器网络，无线实时定位网络，射频识别网络，数字家庭网络，安全监视网络等等，这就需要解决两方面的问题：无线通讯的标准化和网络拓扑管理。&lt;/p&gt;&lt;p&gt;网&lt;br /&gt;络标准化，通俗而言就是网络节点的互通性，各种不同功能的无线网络节点需要能相互交流，相互认识，举例而言，为来家庭中，各种家电将装有无线功能，汇集成&lt;br /&gt;一个互通的无线网络，冰箱可能是日本的，电视是中国造，烟雾报警器可能来自美国，所有的家电通过无线汇集到家庭网关，必须要可以相互认识，才可以进行无线&lt;br /&gt;数据通讯，这就需要一个所有制造厂家可以遵循的标准，目前这个标准就是IEEE 802.15.4， 一个专门针对这类应用的国际标准；&lt;/p&gt;&lt;p&gt;网&lt;br /&gt;络拓扑管理，主要是建立在IEEE&lt;br /&gt;802.15.4之上的网络层，包括各种网络的形态，无线网络节点可以象一个星状连接，也可以象一个葡萄串一样，串在一起，也可以象一张大网，相互连接，&lt;br /&gt;相互间可以从任意节点间进行通讯；这就需要在网络层能相互兼容，这就有了ZigBee, ---- 一套标准化的网络层协议规范；&lt;/p&gt;&lt;p&gt;802.15.4标准和ZigBee网络，已经是当今世界的技术热点，你可以在网上发现数量巨大相关信息，也可以方便的学习到这方面知识；&lt;/p&gt;&lt;p&gt;实&lt;br /&gt;现网络的标准化，管理越来越复杂的无线网络，需要有大量的软件代码来实现，也需要对无线通讯的技术的精通和大量的人力物力投入来进行开发，决非那家公司可&lt;br /&gt;以独自包揽，自己来完成，所以&lt;br /&gt;802.15.4标准和ZigBee网络实现的代码，都是由国际标准组织和ZigBee联盟这样的机构协助组织完成的，然后以软件库，源代码库的方式提供&lt;br /&gt;给用户，由用户可以进行高层调用，用户加上自己的应用程序，固化到单片机中实现的；&lt;/p&gt;&lt;p&gt;而新一代无线单片机(象CC2430)，就是具体了全部&lt;br /&gt;802.15.4标准和ZigBee无线网络结构的8051单片机，当你用USB接口连接上cc2430仿真器，(好消息，这种仿真器目前已经有国产现货&lt;br /&gt;了 )接上你的CC2430电路板，在IAR IDE调试环境上，装上 802.15.4标准和ZigBee网络现成软件项目文件(包括&lt;br /&gt;802.15.4标准和ZigBee网络库文件，表演软件等)，编译，下载，然后运行，几秒种的时间，敲几下按键，一切OK， 神奇无比的&lt;br /&gt;802.15.4标准和ZigBee网络，(数万行C51语言写成的代码，组成的软件)就在你的弹指一挥间，被你驾驭了：&lt;/p&gt;&lt;p&gt;需要将节点加入无线网络吗？调用 “加入网络”功能就可以了；&lt;/p&gt;&lt;p&gt;需要传输数据吗？数据送送入指定的缓冲区，调用需要“发送数据”功能，你立刻会知道你的数据是否发送成功，无线信号强度是多少……&lt;/p&gt;&lt;p&gt;需&lt;br /&gt;要将数据透过其他节点，向下跳棋一样，传输到远方的无线节点吗？指定节点的名字，准备好数据，调用“网状网络拓扑的数据传输”功能，数据就自动通过墙壁，&lt;br /&gt;绕过天花板，从一楼到10楼，将数据自动传输到最远端的无线节点，同时，不到一秒时间，你可以得到回应“数据安全送到了！！”…&lt;/p&gt;&lt;p&gt;听起来好象不可能，但这正是802.15.4标准和ZigBee无线单片机带给你的，今天就可以在你手中实现的实实在在的现实场境；&lt;/p&gt;&lt;p&gt;面&lt;br /&gt;对这样的场境，我们会感慨万千，这不正是电子工程师们多年来的“将一切用无线连接起来的”的梦想吗？在办公室，复印机坏了，这边你正着急，那边该公司的服&lt;br /&gt;务人员已经赶到了现场，为什么这么快？复印机内的无线节点早就将故障的部分，维修需要的零件自动传输到了服务的公司；家里的地上管道漏水了，你并不在家，&lt;br /&gt;但无线传感器迅速知道了情况，一边自动通知无线水表关闭进水阀门，一边发出短信，通知主人，这里出了什么问题……&lt;/p&gt;&lt;p&gt;802.15.4标准和ZigBee技术和8051无线单片机的结合，给单片机技术，带来了一场全新的革命，由此而产生的巨大市场和广泛的应用，是我们每个电子工程师都应该关注的；&lt;/p&gt;&lt;p&gt;三、 投身无线的大潮，你需要的“船”和“桥”&lt;/p&gt;&lt;p&gt;高频无线技术，单片机技术，C51编程，无线传感器技术，无线网络技术都属于实验技术和实用技术，具体的掌握这些技术，都需要实际的动手，通过编程序，实际调试，实际电路板，现场测试分析等，来真正了解技术的核心，来具备实际的经验；&lt;/p&gt;&lt;p&gt;基&lt;br /&gt;本而言，你需要一套实际的系统，该系统可以在你的实验室，也可以在你家里，无论是化你老板的“银子”，还是你自己为未来进行技术投资而“自掏腰包”，这将&lt;br /&gt;根据你的目标，实际起步的水平，而有很大的不同。当然，越是高级的系统，使用会越简单，但价格也会越不低；俗话说“舍不得孩子套不着狼”，如果你决心要尽&lt;br /&gt;快掌握最先进的无线技术，化几千银子也是值得的事情；许多电子工程师/单片机工程师在熟悉8位单片及技术后，开始自己学习ARM等32位单片机技术，也自&lt;br /&gt;己花费多达几千人民币购买ARM开发工具，在家建立自己的ARM开发平台；其实，从上面的讨论我们可以看出：从电子/单片机技术发展的眼光来，单片机从8&lt;br /&gt;位到32位的的发展，主要是在运行速度上的量的改变，而单片机的无线化和无线网络化集成，才是单片机在质的方面的飞跃，如果讲到单片机工程师应该朝那方面&lt;br /&gt;进一步发展的话，学无线比学ARM更重要，更紧迫；&lt;/p&gt;&lt;p&gt;从知识准备来讲，可以直接读无线单片机的各种数据手册，也可以看看有没有象《无线通讯的&lt;br /&gt;入门和实战》这样类似的无线通俗读物，可惜目前这类实用的无线书籍太少了，希望我们的大学教授们，多出一些实用的书籍，目前书店的无线类书籍大多是理论，&lt;br /&gt;各种复杂的计算公式，让人看起来非常吃力。但如何去象开发单片机一样，实实在在的做程序，做电路板，去调试。测试，最后做一个实际的无线产品，在这些书籍&lt;br /&gt;中很难发现，而这才是我们电子工程师最需要的东西；&lt;/p&gt;&lt;p&gt;从硬件上讲，建立这个实验室需要的必须条件是：&lt;/p&gt;&lt;p&gt;1 一台PC机&lt;/p&gt;&lt;p&gt;能运行WINDOWS XP，任何中文/英文板本，&lt;/p&gt;&lt;p&gt;40G以上的硬盘，普通光盘驱动器，USB口，速度800M以上就可以工作；&lt;/p&gt;&lt;p&gt;不必很新的电脑，一台旧电脑工作也没有问题；&lt;/p&gt;&lt;p&gt;2 一台C51RF-3型cc2430无线单片机开发系统&lt;/p&gt;&lt;p&gt;这&lt;br /&gt;也是目前是市面上唯一可以买到地地道道的高质量国产货(通过www.c51rf.com你可以立即买到现货)，在今天这个信息时代，无线开发系统也不再只&lt;br /&gt;是“老外”们的专利，地处西部的成都无线龙通讯公司，在CC2430芯片实际上市之日，同步完成了全部开发系统的设计工作，而且同时提供全部&lt;br /&gt;802.15.4标准和ZigBee网络库文件/C51源代码，价格低于国外同类产品；&lt;/p&gt;&lt;p&gt;你只要将开发系统C51RF-3实时在线仿真器通过&lt;br /&gt;USB接口直接连接到你的电脑，同时，通过10线仿真电缆连接到CC2430ZigBee无线单片及目标板,(无线龙C51RF-3开发系统随开发系统提&lt;br /&gt;供了两个经过全部高频测试的CC2430无线目标模块)就方便的完成了连接；无需其他的直流电源；&lt;/p&gt;&lt;p&gt;3 IAR 7.20 以上C51开发环境&lt;/p&gt;&lt;p&gt;该开发平台非常类似KELL的开发平台，如果你熟悉KELL的C51开发平台，你应该非常容易去使用和非常喜欢这个功能强大的类似的IDE/DEBUG平台；&lt;/p&gt;&lt;p&gt;4 一个万用表&lt;/p&gt;&lt;p&gt;当&lt;br /&gt;你完成连接后，你已经拥有了自己的无线网络产品开发平台，采用这个平台，你可以在家使用cc2430系列ZigBee&lt;br /&gt;无线单片机(如果你选择c51rf-3)开发许多带有无线网络功能的无线产品；你完全不用去考虑这是工作在2.4Ghz的高频产品，只要你会8051,你&lt;br /&gt;就可以在这个无线平台上，自由飞翔，开发你希望的无线产品；采用这个低价格的开发系统，你照样可以开发出国外在价值几十万的无线网络实验室里开发的，同样&lt;br /&gt;功能的高级无线通讯产品；&lt;/p&gt;&lt;p&gt;当然，这只是一个基本的平台，如果你有条件，你可以选择下面的配备：&lt;/p&gt;&lt;p&gt;5 Protel 99等电路板设计软件，设计你自己的电路板；&lt;/p&gt;&lt;p&gt;6 一台示波器，观查微处理器的低频数字信号；&lt;/p&gt;&lt;p&gt;7&lt;br /&gt;低成本的C51RF-3-F型ZigBee/802.15.4无线协议分析仪器，该协议分析仪和国外专业ZigBee/802.15.4无线协议分析仪器&lt;br /&gt;相同，采用USB高速连接PC，可以方便/快捷观察在空气中间传输的无线数据包装，使你的无线网络调试/测试更加方便，而价格只有国外同类产品的1&lt;br /&gt;/10。&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3474577459886827247-9085023991260786035?l=cwjen888.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cwjen888.blogspot.com/feeds/9085023991260786035/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3474577459886827247&amp;postID=9085023991260786035' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/9085023991260786035'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/9085023991260786035'/><link rel='alternate' type='text/html' href='http://cwjen888.blogspot.com/2008/12/8051zigbee.html' title='8051装上ZigBee的车轮，单片机进军无线大市场'/><author><name>David Chang</name><uri>http://www.blogger.com/profile/05943998889053147615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3474577459886827247.post-3333319872803241292</id><published>2008-12-12T07:01:00.000-08:00</published><updated>2008-12-12T07:02:56.310-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='8051'/><category scheme='http://www.blogger.com/atom/ns#' term='家庭自動化'/><category scheme='http://www.blogger.com/atom/ns#' term='Arduino'/><title type='text'>8051卡拉OK</title><content type='html'>&lt;a href="http://www.dianziw.com/t-691.htm"&gt;http://www.dianziw.com/t-691.htm&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;引言&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;在当今这样一个充满竞争与挑战的社会，人们的生活显得日益紧张而繁忙，同时也对休闲娱乐的要求越来越高。卡拉&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;OK&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;作为一种休闲娱乐项目一直备受人们青睐。但人们在唱歌时往往被局限于狭小的卡拉&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;OK&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;厅内，行动、思维、灵感上都大大受到影响，无法最佳发挥。针对这种现状，我们设计出一种基于&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;U&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;盘存储的体积小巧的移动卡拉&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;OK&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;系统。用户可以在精心设计的环境中随心所欲地引吭高歌，充分展示自己的激情与灵感，使人与音乐达到完美结合。&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;系统硬件实现&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;本系统以&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;AT&lt;st1:chmetcnv st="on" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="89" unitname="C"&gt;89C&lt;/st1:chmetcnv&gt;51SND&lt;st1:chmetcnv st="on" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="1" unitname="C"&gt;1C&lt;/st1:chmetcnv&gt;&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;为核心&lt;a href="http://www.dianziw.com/p2.htm"&gt;&lt;span style="color:#0000ff;"&gt;处理器&lt;/span&gt;&lt;/a&gt;，采用美国国家&lt;a href="http://www.dianziw.com/semiconductor.htm"&gt;&lt;span style="color:#0000ff;"&gt;半导体&lt;/span&gt;&lt;/a&gt;公司的&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;LM4832&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;、&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;LMV722&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;和&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;LM4838&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;作为立体声音频功率&lt;a href="http://www.dianziw.com/p31.htm"&gt;&lt;span style="color:#0000ff;"&gt;放大器&lt;/span&gt;&lt;/a&gt;，&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;"&gt; &lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;以&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;CS4330&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;为音频&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;DAC&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;，&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;K&lt;st1:chmetcnv st="on" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="9" unitname="F"&gt;9F&lt;/st1:chmetcnv&gt;5608U&lt;st1:chmetcnv st="on" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="0" unitname="a"&gt;0A&lt;/st1:chmetcnv&gt;&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;为&lt;a href="http://www.dianziw.com/p3.htm"&gt;&lt;span style="color:#0000ff;"&gt;存储器&lt;/span&gt;&lt;/a&gt;并通过&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;USB&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;接口与主机通信，从而实现歌曲播放与麦克风输入；同时辅以键盘输入控制和&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;LCD&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;实时显示。整体硬件结构如图&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;1&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;所示。&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;table class="MsoNormalTable" style="width: 412.5pt;" border="0" cellpadding="0" cellspacing="0" width="550"&gt; &lt;tbody&gt; &lt;tr style=""&gt; &lt;td style="padding: 0cm;"&gt; &lt;p class="MsoNormal" style="text-align: center;" align="center"&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;&lt;img src="http://www.dianziw.com/manageweb/edit/uploadfile/20070203163933563.jpg" shapes="_x0000_i1025" width="553" height="255" /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;歌曲播放部分设计&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt; &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;歌曲播放部分主要实现歌曲播放与麦克风输入，即实现音乐与用户歌声的融合，是系统的核心部分。本系统采用&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;AT&lt;st1:chmetcnv st="on" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="89" unitname="C"&gt;89C&lt;/st1:chmetcnv&gt;51SND&lt;st1:chmetcnv st="on" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="1" unitname="C"&gt;1C&lt;/st1:chmetcnv&gt;&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;作为中央处理器。&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;&lt;a href="http://www.dianziw.com/p48.htm"&gt;&lt;span style="color:#0000ff;"&gt;Flash&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;中存储的&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;MP3&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;文件经解码器解码后输出&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;I2S&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;格式的数字信号，通过数模转换芯片转换后输出左右两路微弱的音频模拟信号，分别作为&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;LM4832&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;左右声道的输入信号。本设计利用&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;LM4832&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;、&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;LMV722&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;和&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;LM4838&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;的巧妙结合&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;(&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;如图&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;1&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;所示&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;)&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;，对音乐信号和用户歌声进行混合和功率放大，达到绝佳的音响效果。&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;LM4832&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;是具有&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;I&lt;st1:chmetcnv st="on" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="2" unitname="C"&gt;2C&lt;/st1:chmetcnv&gt;&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;接口的数控音质音量的立体声音频功率放大器。它的左右声道、高低音均独立可调，并具有&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;3D&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;音响效果和软件可控低功耗休眠模式。此外，它还提供两路独立可选的麦克风输入前置放大与音量控制，这就使得整个系统实现卡拉&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;OK&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;的功能成为可能。但&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;LM4832&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;的音频输出与麦克风输出是独立的，这就需要对歌曲和用户歌声进行前置混合。在此采用&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;LMV722&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;构成的加法运算电路，它具有低噪声高增益带宽的特点，其增益带宽高达&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;10MHz&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;，完全满足本系统的要求。由于&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;LMV722&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;是单电源供电的，要结合前级输入信号幅值来设计它的直流偏置电压值，同时其输出的两路混合信号要经过滤波电路滤除其直流偏置后方可作为后级功放输入。为了达到卡拉&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;OK&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;震撼人心的音响效果，需要对音频信号进行功率放大，因此选用功率高达&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;2W&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;的&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;LM4838&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;音频功率放大器。它具有&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;DC&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;音量控制、可选内外部增益、低音加重等特点，并带有过热保护电路和低功耗休眠模式（休眠电流为&lt;/span&gt;&lt;st1:chmetcnv st="on" tcsc="0" numbertype="1" negative="False" hasspace="True" sourcevalue="0.7" unitname="a"&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;0.7 A&lt;/span&gt;&lt;/st1:chmetcnv&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;）。这里通过螺旋&lt;a href="http://www.dianziw.com/p13.htm"&gt;&lt;span style="color:#0000ff;"&gt;电位器&lt;/span&gt;&lt;/a&gt;来调节功率大小。&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;LM4838&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;输出提供扬声器和耳机两种接口，而且两者之间可以方便切换，使得用户可以随意改变自己的方式。&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;值得注意的是：在整个音频功放实现过程中，要合理分配每级电路的增益，以免音频信号失真。&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt; LCD&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;实时显示部分设计&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;&lt;br /&gt;LCD&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;用于实时歌词和状态显示。由于&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;Windows &lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;系统自带的字库有&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;267K&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;之多，因此选用容量为&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;512K&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;的&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;Flash W&lt;st1:chmetcnv st="on" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="29" unitname="C"&gt;29C&lt;/st1:chmetcnv&gt;040&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;来存放字库。同时考虑到主处理器&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;RAM&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;大小及音频解码的连续性，我们选用一片&lt;a href="http://www.dianziw.com/p44.htm"&gt;&lt;span style="color:#0000ff;"&gt;单片机&lt;/span&gt;&lt;/a&gt;（即从处理器）来专门处理&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;LCD&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;的显示，它与主处理器之间通过串口（&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;UART&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;）来通信。&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;LCD&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;上的每个汉字是以&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;16 16&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;点阵方式来显示的，需用&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;32&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;字节来表示；每个&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;ASCII&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;字符是以&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;8 16&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;点阵方式显示&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;,&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;需用&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;16&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;字节来表示。而&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;1&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;首歌曲歌词文件（&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;*.lrc&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;）一般有&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;1&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;～&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;2K&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;字节左右大小，故采用外扩&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;RAM(62256)&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;来存储歌词文件。整个&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;LCD&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;显示部分采用总线结构，编程简单方便，处理数据游刃有余。&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;U&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;盘设计部分&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;歌曲的存放与更新采用&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;USB&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;接口。存储器大小可以自选，作为代表性实验，本系统采用&lt;/span&gt;&lt;st1:chmetcnv st="on" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="32" unitname="m"&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;32M&lt;/span&gt;&lt;/st1:chmetcnv&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt; Flash K&lt;st1:chmetcnv st="on" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="9" unitname="F"&gt;9F&lt;/st1:chmetcnv&gt;5608U&lt;st1:chmetcnv st="on" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="0" unitname="a"&gt;0A&lt;/st1:chmetcnv&gt;&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;作存储器。&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;U&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;盘设计的硬件电路十分简单，只需将&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;Flash&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;和主处理器的一些相应引脚相连即可。&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;U&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;盘设计的重点是&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;USB&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;协议的实现，在后文将会详细介绍。为了保证系统能正确识别出当前状态是处于&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;U&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;盘状态，还是处于歌曲播放状态，需要设置状态判定电路，如图&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;2&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;所示。&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;table class="MsoNormalTable" style="width: 412.5pt;" border="0" cellpadding="0" cellspacing="0" width="550"&gt; &lt;tbody&gt; &lt;tr style=""&gt; &lt;td style="padding: 0cm;"&gt; &lt;p class="MsoNormal" style="text-align: center;" align="center"&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;&lt;img src="http://www.dianziw.com/manageweb/edit/uploadfile/20070203163934689.jpg" shapes="_x0000_i1026" width="553" height="151" /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;系统软件设计&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt; &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;系统软件主要包括歌曲播放和&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;USB&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;通信程序。系统上电后，根据&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;P3_4&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;口判断当前所处的状态而分别执行相应的程序代码。&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;"&gt; &lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;歌曲播放软件设计&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;歌曲播放器程序要与键盘和&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;LCD&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;配合起来设计。程序流程大概可分为：硬件初始化&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;→&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;获取&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;U&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;盘中&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;mp3&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;歌曲列表&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;→&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;歌曲播放和&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;LCD&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;显示。&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;硬件初始化主要负责&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;mp3&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;解码器的时钟设置、&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;Flash&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;复位和&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;LM4832&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;的初始化，这是系统正常工作的关键。&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;LM4832&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;上电时，其声道音量和麦克风音量均为无声状态，表&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;1&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;为左声道的&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;I&lt;st1:chmetcnv st="on" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="2" unitname="C"&gt;2C&lt;/st1:chmetcnv&gt;&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;数据流格式真值表，其他类似，具体可参考&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;LM4832&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;芯片资料。因此需设置各状态初始值，将各初始值均设在&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;0dB&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;。另外硬件初始化还包括键盘、&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;LCD&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;、&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;UART&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;初始化等工作。&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;获取&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;U&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;盘中的&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;mp3&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;歌曲列表通过查找&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;U&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;盘根目录区中每个目录项来实现，同时将歌曲数目通过串口发送给&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;LCD&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;显示从处理器。&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;table class="MsoNormalTable" style="width: 412.5pt;" border="0" cellpadding="0" cellspacing="0" width="550"&gt; &lt;tbody&gt; &lt;tr style=""&gt; &lt;td style="padding: 0cm;"&gt; &lt;p class="MsoNormal" style="text-align: center;" align="center"&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;&lt;img src="http://www.dianziw.com/manageweb/edit/uploadfile/20070203163934235.jpg" shapes="_x0000_i1027" width="553" height="278" /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;歌曲播放和&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;LCD&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;显示是程序的核心部分。主处理器和&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;LCD&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;从处理器之间通过串口进行通信，以达到歌曲播放与歌词显示的同步以及键盘操作状态的及时刷新。其程序流程图如图&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;3&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;所示。&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;table class="MsoNormalTable" style="width: 412.5pt;" border="0" cellpadding="0" cellspacing="0" width="550"&gt; &lt;tbody&gt; &lt;tr style=""&gt; &lt;td style="padding: 0cm;"&gt; &lt;p class="MsoNormal" style="text-align: center;" align="center"&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;&lt;img src="http://www.dianziw.com/manageweb/edit/uploadfile/20070203163935646.jpg" shapes="_x0000_i1028" width="392" height="528" /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;MP3&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;解码器一旦开始工作，就会一直向&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt; CPU&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;请求数据，直至歌曲结束。只有用键盘操作才能中断&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;CPU&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;。键盘操作总共&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;4&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;个按键（&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;Menu/Previous/Next/Play&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;）。&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;Menu&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;负责功能切换，共有&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;5&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;项功能：歌曲音量控制、高音调节、低音调节、麦克风音量控制和歌曲选择。在不同功能下&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;Previous&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;和&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;Next&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;分别代表不同的含义。在音量控制上为加&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;/&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;减音量，在歌曲选择上为上一首&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;/&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;下一首歌曲。&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;LCD&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;在显示歌词的同时实时显示键盘操作状态，以便用户操作。&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt; &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;USB&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;海量存储设计&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;主处理器让&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;USB&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;海量存储设备在批量传输方式下工作，这样共需要&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;3&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;个端点。&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;0&lt;/span&gt;&lt;span style="font-size: 9pt; font-family: 宋体;"&gt;端点：控制端点。用于控制传输，&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;PC&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;机通过与端点&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;0&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;相对应的管道来读取设备描述符，完成对设备地址的设置，并完成配置。此端点为双向数据传输端点。&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;两个非&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;0&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;端点：批量传输端点。这种端点为单向数据传输端点，分别为批量输入端点和批量输出端点。&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;主处理器通过一个端点中断寄存器（&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;UEPINT&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;）和&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;PC&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;机通信。如果某个端点完成了相应的操作，就会引发中断。&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;U&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;盘主程序流程图如图&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;4&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;所示。&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;table class="MsoNormalTable" style="width: 412.5pt;" border="0" cellpadding="0" cellspacing="0" width="550"&gt; &lt;tbody&gt; &lt;tr style=""&gt; &lt;td style="padding: 0cm;"&gt; &lt;p class="MsoNormal" style="text-align: center;" align="center"&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;&lt;img src="http://www.dianziw.com/manageweb/edit/uploadfile/20070203163936541.jpg" shapes="_x0000_i1029" width="427" height="685" /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;当&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;USB&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;设备插入到&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;PC&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;机时，&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;PC&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;机一旦检测到设备后，就会通过控制管道向默认地址发送&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;USB&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;标准请求，进入设备配置阶段，即&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;PC&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;机向设备索取各种描述符的过程，如&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;Get Descriptor&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;、&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;Set Address&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;、&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;Set Configuration&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;等。每当设备收到主机发送的数据后，便会触发端点中断寄存器中端点&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;0&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;所代表的位。此时，应读取端点&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;0&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;的数据缓冲区，对照&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;USB&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;标准设备请求的数据格式，对请求类型进行识别，然后转向相应的标准请求处理函数。配置完成后，主机便使用在描述符中所选定的命令块向批量传输端点发送控制消息和数据。&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt; &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;在批量传输方式下，有&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;3&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;种类型的数据在&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;USB&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;和设备之间传送：&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;CBW&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;、&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;CSW&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;和普通数据。因此，批量传输阶段程序设计的任务就是要识别来自批量输出端点的&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;CBW&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;与数据，进行相应的处理，然后通过批量输入端点向主机回传相应的&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;CSW&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;或数据。&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;PC&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;机依次向设备发出&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;Inquiry&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;、&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;Read Capacity&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;、&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;UFI Mode Sense&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;、&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;Read Format Capacity&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;等请求，这几个命令用于告知&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;PC&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;这个设备的存储器情况，&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;PC&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;基于此创建一个存储器设备，即在浏览器中生成一个移动盘符，并可以复制、删除或创建文件等。系统自动将这些命令都转换成&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;Read&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;或&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;Write&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;两种命令，通过&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;USB&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;的&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;READ&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;或&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;WRITE&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;命令块描述符从&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;Flash&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;中相应扇区读取数据，或是将特定长度的数据写入&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;Flash&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;相应簇中。文件在&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;U&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;盘中按&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;Fat16&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;协议存储。由于&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;PC&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;对存储器的读写是按扇区（&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;512&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;字节&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;/&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;扇区）为最小单位进行的，但&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;Bulk&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;端点的最大传输能力为&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;64&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;字节。因此，主机读写操作的数据传输过程要分多次才能完成。而写操作比读操作更加繁琐一些，这是因为&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;Flash&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;在对某扇区进行写之前，必须要将其擦除，而擦之前存在已有数据的保存问题。为了加快主机与&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;U&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;盘之间数据传输率，读写操作的代码改用汇编来编写。测试表明，&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;U&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;盘的读写速度可达到&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;450Kbps&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;。&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;结束语&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;本系统采用&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;LM4832&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;、&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;LMV722&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;和&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;LM4838&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;的巧妙结合作为立体声音频功率放大器，并利用&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;U&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;盘存储技术来存储歌曲，使得整个系统不仅拥有优质的视听效果，而且体积仅有&lt;/span&gt;&lt;st1:chmetcnv st="on" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="180" unitname="mm"&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;180mm&lt;/span&gt;&lt;/st1:chmetcnv&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt; &lt;st1:chmetcnv st="on" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="70" unitname="mm"&gt;70mm&lt;/st1:chmetcnv&gt; &lt;st1:chmetcnv st="on" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="100" unitname="mm"&gt;100mm&lt;/st1:chmetcnv&gt;&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;这么大。实验表明，本移动卡拉&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;OK&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;系统不仅具有数控音质音量、立体声音频功率放大和超强&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;3D&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;音响效果的特点，而且功耗低、用户界面友好、便于携带。同时它也可作为&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;MP3&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;播放器或&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: Arial;" lang="EN-US"&gt;U&lt;/span&gt;&lt;span style="font-size: 9pt; color: black; font-family: 宋体;"&gt;盘使用，功能齐全。&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3474577459886827247-3333319872803241292?l=cwjen888.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.dianziw.com/t-691.htm' title='8051卡拉OK'/><link rel='replies' type='application/atom+xml' href='http://cwjen888.blogspot.com/feeds/3333319872803241292/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3474577459886827247&amp;postID=3333319872803241292' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/3333319872803241292'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/3333319872803241292'/><link rel='alternate' type='text/html' href='http://cwjen888.blogspot.com/2008/12/8051ok.html' title='8051卡拉OK'/><author><name>David Chang</name><uri>http://www.blogger.com/profile/05943998889053147615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3474577459886827247.post-3519491686545981999</id><published>2008-12-10T19:32:00.001-08:00</published><updated>2008-12-10T19:32:32.936-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='生活'/><category scheme='http://www.blogger.com/atom/ns#' term='Web'/><category scheme='http://www.blogger.com/atom/ns#' term='Arduino'/><category scheme='http://www.blogger.com/atom/ns#' term='Internet'/><title type='text'>Excel 趨勢線的公式</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;span id='_ctl0_MainContent_PostFlatView'&gt;&lt;span&gt;&lt;h3&gt;Excel 趨勢線的公式&lt;br/&gt;&lt;/h3&gt;&lt;h3&gt;&lt;br/&gt;&lt;/h3&gt;&lt;h3&gt;Linear Trendline&lt;/h3&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;p&gt;Equation: y = m * x + b &lt;br /&gt;&lt;/p&gt;&lt;p&gt;m: =SLOPE(y,x) &lt;br /&gt;&lt;/p&gt;&lt;p&gt;b: =INTERCEPT(y,x)&lt;/p&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;h3&gt;Logarithmic Trendline&lt;/h3&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;p&gt;Equation: y = (c * LN(x)) - b &lt;br /&gt;&lt;/p&gt;&lt;p&gt;c: =INDEX(LINEST(y,LN(x)),1) &lt;br /&gt;&lt;/p&gt;&lt;p&gt;b: =INDEX(LINEST(y,LN(x)),1,2)&lt;/p&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;h3&gt;Power Trendline&lt;/h3&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;p&gt;Equation: y=c*x^b &lt;br /&gt;&lt;/p&gt;&lt;p&gt;c: =EXP(INDEX(LINEST(LN(y),LN(x),,),1,2)) &lt;br /&gt;&lt;/p&gt;&lt;p&gt;b: =INDEX(LINEST(LN(y),LN(x),,),1)&lt;/p&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;h3&gt;Exponential Trendline&lt;/h3&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;p&gt;Equation: y = c *e ^(b * x) &lt;br /&gt;&lt;/p&gt;&lt;p&gt;c: =EXP(INDEX(LINEST(LN(y),x),1,2)) &lt;br /&gt;&lt;/p&gt;&lt;p&gt;b: =INDEX(LINEST(LN(y),x),1)&lt;/p&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;h3&gt;2nd Order Polynomial Trendline&lt;/h3&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;p&gt;Equation: y = (c2 * x^2) + (c1 * x ^1) + b &lt;br /&gt;&lt;/p&gt;&lt;p&gt;c2: =INDEX(LINEST(y,x^{1,2}),1) &lt;br /&gt;&lt;/p&gt;&lt;p&gt;C1: =INDEX(LINEST(y,x^{1,2}),1,2) &lt;br /&gt;&lt;/p&gt;&lt;p&gt;b = =INDEX(LINEST(y,x^{1,2}),1,3)&lt;/p&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;h3&gt;3rd Order Polynomial Trendline&lt;/h3&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;p&gt;Equation: y = (c3 * x^3) + (c2 * x^2) + (c1 * x^1) + b &lt;br /&gt;&lt;/p&gt;&lt;p&gt;c3: =INDEX(LINEST(y,x^{1,2,3}),1) &lt;br /&gt;&lt;/p&gt;&lt;p&gt;c2: =INDEX(LINEST(y,x^{1,2,3}),1,2) &lt;br /&gt;&lt;/p&gt;&lt;p&gt;C1: =INDEX(LINEST(y,x^{1,2,3}),1,3) &lt;br /&gt;&lt;/p&gt;&lt;p&gt;b: =INDEX(LINEST(y,x^{1,2,3}),1,4)&lt;/p&gt;&lt;/blockquote&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3474577459886827247-3519491686545981999?l=cwjen888.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cwjen888.blogspot.com/feeds/3519491686545981999/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3474577459886827247&amp;postID=3519491686545981999' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/3519491686545981999'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/3519491686545981999'/><link rel='alternate' type='text/html' href='http://cwjen888.blogspot.com/2008/12/excel.html' title='Excel 趨勢線的公式'/><author><name>David Chang</name><uri>http://www.blogger.com/profile/05943998889053147615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3474577459886827247.post-5077708725975075776</id><published>2008-12-05T09:16:00.001-08:00</published><updated>2008-12-05T09:16:36.935-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='家庭自動化'/><category scheme='http://www.blogger.com/atom/ns#' term='Arduino'/><title type='text'>DS18B20+LCD1602液晶显示</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;br/&gt;&lt;br/&gt;&lt;h1&gt;&lt;a href='http://blog.ednchina.com/Alexi2008/176182/message.aspx#'&gt;DS18B20+LCD1602液晶显示&lt;/a&gt;&lt;/h1&gt;&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3474577459886827247-5077708725975075776?l=cwjen888.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cwjen888.blogspot.com/feeds/5077708725975075776/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3474577459886827247&amp;postID=5077708725975075776' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/5077708725975075776'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/5077708725975075776'/><link rel='alternate' type='text/html' href='http://cwjen888.blogspot.com/2008/12/ds18b20lcd1602.html' title='DS18B20+LCD1602液晶显示'/><author><name>David Chang</name><uri>http://www.blogger.com/profile/05943998889053147615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3474577459886827247.post-1557695955242752676</id><published>2008-12-04T03:11:00.001-08:00</published><updated>2008-12-04T03:11:55.226-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='家庭自動化'/><category scheme='http://www.blogger.com/atom/ns#' term='Arduino'/><title type='text'>單晶片</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;br/&gt;&lt;br/&gt;51 單晶片&lt;br/&gt;&lt;br/&gt;&lt;a href='http://jevoswang.myweb.hinet.net/'&gt;&lt;br/&gt;http://jevoswang.myweb.hinet.net/&lt;/a&gt;&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3474577459886827247-1557695955242752676?l=cwjen888.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cwjen888.blogspot.com/feeds/1557695955242752676/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3474577459886827247&amp;postID=1557695955242752676' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/1557695955242752676'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/1557695955242752676'/><link rel='alternate' type='text/html' href='http://cwjen888.blogspot.com/2008/12/blog-post_04.html' title='單晶片'/><author><name>David Chang</name><uri>http://www.blogger.com/profile/05943998889053147615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3474577459886827247.post-660907736679504030</id><published>2008-12-04T03:04:00.001-08:00</published><updated>2008-12-04T03:04:53.221-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='家庭自動化'/><category scheme='http://www.blogger.com/atom/ns#' term='Arduino'/><title type='text'>紅外線研究</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;br/&gt;&lt;br/&gt;紅外線研究&lt;br/&gt;&lt;br/&gt;http://jevoswang.myweb.hinet.net/51/ir.htm&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3474577459886827247-660907736679504030?l=cwjen888.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cwjen888.blogspot.com/feeds/660907736679504030/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3474577459886827247&amp;postID=660907736679504030' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/660907736679504030'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/660907736679504030'/><link rel='alternate' type='text/html' href='http://cwjen888.blogspot.com/2008/12/blog-post.html' title='紅外線研究'/><author><name>David Chang</name><uri>http://www.blogger.com/profile/05943998889053147615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3474577459886827247.post-358924935407364909</id><published>2008-12-03T10:41:00.001-08:00</published><updated>2008-12-03T10:41:35.314-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='家庭自動化'/><category scheme='http://www.blogger.com/atom/ns#' term='Arduino'/><category scheme='http://www.blogger.com/atom/ns#' term='Internet'/><title type='text'>TBsoft-G</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;div&gt;&lt;span style='font-size: 12pt;'&gt;TBsoft-GUI&lt;/span&gt;&lt;span style='font-size: 12pt;'&gt;，一个很小的，功能一般的&lt;/span&gt;&lt;span style='font-size: 12pt;'&gt;GUI&lt;/span&gt;&lt;span style='font-size: 12pt;'&gt;，一个结合了某些现代程序设计要素的&lt;/span&gt;&lt;span style='font-size: 12pt;'&gt;GUI&lt;/span&gt;&lt;span style='font-size: 12pt;'&gt;。&lt;br/&gt;&lt;br/&gt;&lt;a href='http://blog.mcuol.com/user/TBsoft/article/5326_1.htm'&gt;http://blog.mcuol.com/user/TBsoft/article/5326_1.htm&lt;/a&gt;&lt;br/&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3474577459886827247-358924935407364909?l=cwjen888.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cwjen888.blogspot.com/feeds/358924935407364909/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3474577459886827247&amp;postID=358924935407364909' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/358924935407364909'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/358924935407364909'/><link rel='alternate' type='text/html' href='http://cwjen888.blogspot.com/2008/12/tbsoft-g.html' title='TBsoft-G'/><author><name>David Chang</name><uri>http://www.blogger.com/profile/05943998889053147615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3474577459886827247.post-15499281903963806</id><published>2008-11-25T09:59:00.001-08:00</published><updated>2008-11-25T09:59:44.211-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Internet'/><title type='text'>Neo's Blog 網路</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;br/&gt;&lt;a href='http://www.neo.com.tw/'&gt;一個不錯的 Internet 網路 Blog&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3474577459886827247-15499281903963806?l=cwjen888.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cwjen888.blogspot.com/feeds/15499281903963806/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3474577459886827247&amp;postID=15499281903963806' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/15499281903963806'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/15499281903963806'/><link rel='alternate' type='text/html' href='http://cwjen888.blogspot.com/2008/11/neo-blog.html' title='Neo&amp;#39;s Blog 網路'/><author><name>David Chang</name><uri>http://www.blogger.com/profile/05943998889053147615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3474577459886827247.post-7396343467906767373</id><published>2008-11-25T07:39:00.001-08:00</published><updated>2008-11-25T07:39:48.386-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Internet'/><title type='text'>Bug Tracker</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;br/&gt;&lt;a href='http://www.twbsd.org/cht/bug_tracker/index.php'&gt;一套台灣人自己寫的 Bug Tracker．&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3474577459886827247-7396343467906767373?l=cwjen888.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cwjen888.blogspot.com/feeds/7396343467906767373/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3474577459886827247&amp;postID=7396343467906767373' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/7396343467906767373'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/7396343467906767373'/><link rel='alternate' type='text/html' href='http://cwjen888.blogspot.com/2008/11/bug-tracker.html' title='Bug Tracker'/><author><name>David Chang</name><uri>http://www.blogger.com/profile/05943998889053147615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3474577459886827247.post-1329966892815200346</id><published>2008-11-23T21:49:00.000-08:00</published><updated>2008-11-23T21:50:01.856-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web'/><title type='text'>PHP 用的 Issue Tracking System</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Mantisbt 是 PHP 用的 ITS&lt;br/&gt;&lt;br/&gt;http://www.mantisbt.org/&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3474577459886827247-1329966892815200346?l=cwjen888.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cwjen888.blogspot.com/feeds/1329966892815200346/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3474577459886827247&amp;postID=1329966892815200346' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/1329966892815200346'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/1329966892815200346'/><link rel='alternate' type='text/html' href='http://cwjen888.blogspot.com/2008/11/php-issue-tracking-system.html' title='PHP 用的 Issue Tracking System'/><author><name>David Chang</name><uri>http://www.blogger.com/profile/05943998889053147615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3474577459886827247.post-7434593608456038027</id><published>2008-11-17T11:39:00.001-08:00</published><updated>2008-11-17T11:39:56.852-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Arduino'/><title type='text'>Soundcard oscilloscope</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Soundcard oscilloscope&lt;a href='http://www.zeitnitz.de/Christian/Scope/Scope_en.html'&gt;&lt;b&gt;&lt;img hspace='30' src='http://www.zeitnitz.de/Christian/Scope/scope_123_en.jpg' alt='Front panel of the ssounbdcard oscilloscope' style='border: 0px solid ; width: 345px; height: 242px; float: left; margin-top: 10px; margin-bottom: 10px; margin-right: 10px;'/&gt;&lt;/b&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3474577459886827247-7434593608456038027?l=cwjen888.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cwjen888.blogspot.com/feeds/7434593608456038027/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3474577459886827247&amp;postID=7434593608456038027' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/7434593608456038027'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/7434593608456038027'/><link rel='alternate' type='text/html' href='http://cwjen888.blogspot.com/2008/11/soundcard-oscilloscope.html' title='Soundcard oscilloscope'/><author><name>David Chang</name><uri>http://www.blogger.com/profile/05943998889053147615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3474577459886827247.post-6093509530261572641</id><published>2008-11-13T07:33:00.001-08:00</published><updated>2008-11-13T07:33:53.486-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='家庭自動化'/><category scheme='http://www.blogger.com/atom/ns#' term='Arduino'/><title type='text'>【串列埠控制】RS232腳位 &amp; 腳位偵測</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;a href='http://www.embedds.com/avr-based-generic-infrared-transceiver/'/&gt;&lt;a href='http://tw.myblog.yahoo.com/lk-hsu/article?mid=762&amp;amp;prev=806&amp;amp;next=703&amp;amp;l=f&amp;amp;fid=8'&gt;&lt;img src='http://tw.f14.yahoofs.com/myper/t7pzMwuaAwLmvvVP5J4M/blog/ap_20070621115522376.jpg?TT8tEHJBcajvWr8L'/&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3474577459886827247-6093509530261572641?l=cwjen888.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cwjen888.blogspot.com/feeds/6093509530261572641/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3474577459886827247&amp;postID=6093509530261572641' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/6093509530261572641'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/6093509530261572641'/><link rel='alternate' type='text/html' href='http://cwjen888.blogspot.com/2008/11/rs232.html' title='【串列埠控制】RS232腳位 &amp;amp; 腳位偵測'/><author><name>David Chang</name><uri>http://www.blogger.com/profile/05943998889053147615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3474577459886827247.post-6226341190705544433</id><published>2008-11-12T20:39:00.001-08:00</published><updated>2008-11-12T20:39:14.300-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='家庭自動化'/><title type='text'>LIRC</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;h1 align='center'&gt;&lt;a href='http://www.lirc.org/'&gt;LIRC&lt;/a&gt;&lt;/h1&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3474577459886827247-6226341190705544433?l=cwjen888.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cwjen888.blogspot.com/feeds/6226341190705544433/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3474577459886827247&amp;postID=6226341190705544433' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/6226341190705544433'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/6226341190705544433'/><link rel='alternate' type='text/html' href='http://cwjen888.blogspot.com/2008/11/lirc.html' title='LIRC'/><author><name>David Chang</name><uri>http://www.blogger.com/profile/05943998889053147615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3474577459886827247.post-8379449129993896595</id><published>2008-11-12T20:35:00.001-08:00</published><updated>2008-11-12T20:35:18.908-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='家庭自動化'/><title type='text'>红外线遥控器解码程序</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;div align='center'&gt;&lt;b&gt;&lt;font size='5'&gt;红外线遥控器解码程序&lt;/font&gt;&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;&lt;font size='3'&gt;这里我们以红外线遥控编码芯片为&lt;span class='main1'&gt;uPD6121G&lt;/span&gt;(或者是   &lt;br /&gt;HT622、7461等芯片)为例来说明用单片机实现红外遥控解码的详细过程，站长琢磨这个解码程序花了相当多的精力，期间几经修改逐步完善，后来还用它开发了几个小产品，希望能对网友学习单片机有所帮助。&lt;/font&gt;   &lt;br /&gt;&lt;/strong&gt;   &lt;br /&gt;&lt;/p&gt;   &lt;br /&gt;&lt;p align='left'&gt;    红外线遥控是目前使用最广泛的一种通信和遥控手段。由于红外线遥控装置具有体积小、功耗低、功能强、成本低等特&lt;br /&gt;点，因而，继彩电、录像机之后，在录音机、音响设备、空凋机以及玩具等其它小型电器装置上也纷纷采用红外线遥控。工业设备中，在高压、辐射、有毒气体、粉&lt;br /&gt;尘等环境下，采用红外线遥控不仅完全可靠而且能有效地隔离电气干扰。&lt;/p&gt;   &lt;br /&gt;&lt;p style='text-indent: 0px;'&gt;&lt;span class='main1'&gt;&lt;b&gt;1 红外遥控系统&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;   &lt;br /&gt;&lt;p style='text-indent: 30px;'&gt;&lt;span class='main1'&gt;通用红外遥控系统由发射和接收两大部分组成，应用编/解码专用集成电路芯片来进行控制操作，如图1所示。发射部分包括键盘矩阵、编码调制、LED红外发送器；接收部分包括光、电转换放大器、解调、解码电路。&lt;/span&gt;&lt;/p&gt;   &lt;br /&gt;&lt;p style='text-indent: 30px;'&gt;&lt;img height='164' width='287' src='http://www.51c51.com/WEB/hong11.files/21a.gif'/&gt;&lt;/p&gt;   &lt;br /&gt;&lt;p style='text-indent: 0px;'&gt;&lt;span class='main1'&gt;&lt;b&gt;2   &lt;br /&gt;遥控发射器及其编码&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;   &lt;br /&gt;&lt;p style='text-indent: 30px;'&gt;&lt;span class='main1'&gt;遥控发射器专用芯片很多，根据编码格式可以分成两大类，这里我们以运用比较广泛，解码比较容易的一类来加以说明，现以日本NEC的uPD6121G组成发射电路为例说明编码原理。当发射器按键按下后，即有遥控码发出，所按的键不同遥控编码也不同。这种遥控码具有以下特征：&lt;/span&gt;&lt;/p&gt;   &lt;br /&gt;&lt;p style='text-indent: 30px;'&gt;&lt;span class='main1'&gt;采用脉宽调制的串行码，以脉宽为0.565ms、间隔0.56ms、周期为1.125ms的组合表示二进制的“0”；以脉宽为0.565ms、间隔1.685ms、周期为2.25ms的组合表示二进制的“1”，其波形如图2所示。&lt;/span&gt;&lt;/p&gt;   &lt;br /&gt;&lt;p style='text-indent: 30px;'&gt;&lt;img height='131' width='414' src='http://www.51c51.com/WEB/hong11.files/21b.gif'/&gt;&lt;/p&gt;   &lt;br /&gt;&lt;p style='text-indent: 30px;'&gt;&lt;span class='main1'&gt;上述“0”和“1”组成的32位二进制码经38kHz的载频进行二次调制以提高发射效率，达到降低电源功耗的目的。然后再通过红外发射二极管产生红外线向空间发射，如图3所示。&lt;/span&gt;&lt;/p&gt;   &lt;br /&gt;&lt;p style='text-indent: 30px;'&gt;&lt;img height='136' width='549' src='http://www.51c51.com/WEB/hong11.files/21c.gif'/&gt;&lt;/p&gt;   &lt;br /&gt;&lt;p style='text-indent: 30px;'&gt;&lt;span class='main1'&gt;UPD6121G产生的遥控编码是连续的32位&lt;br /&gt;二进制码组，其中前16位为用户识别码，能区别不同的电器设备，防止不同机种遥控码互相干扰。该芯片的用户识别码固定为十六进制01H；后16位为8位操&lt;br /&gt;作码（功能码）及其反码。UPD6121G最多额128种不同组合的编码。&lt;/span&gt;&lt;/p&gt;   &lt;br /&gt;&lt;p style='text-indent: 30px;'&gt;&lt;span class='main1'&gt;遥控器在按键按下后，周期性地发出同一种32位二进制码，周期约为108ms。一组码本身的持续时间随它包含的二进制“0”和“1”的个数不同而不同，大约在45～63ms之间，图4为发射波形图。&lt;/span&gt;&lt;/p&gt;   &lt;br /&gt;&lt;p style='text-indent: 30px;'&gt;&lt;font lang='ZH-CN'&gt;当一个键按下超过36ms，振荡器使芯片激活，将&lt;br /&gt;发射一组108ms的编码脉冲,这108ms发射代码由一个起始码（9ms）,一个结果码（4.5ms）,低8位地址码（9ms~18ms）,高8位地址&lt;br /&gt;码（9ms~18ms）,8位数据码（9ms~18ms）和这8位数据的反码（9ms~18ms）组成。如果键按下超过108ms仍未松开，接下来发射的&lt;br /&gt;代码（连发代码）将仅由起始码（9ms）和结束码（2.5ms）组成。&lt;/font&gt;&lt;/p&gt;   &lt;br /&gt;&lt;h4&gt;&lt;font lang='ZH-CN' face='楷体_GB2312' size='3'&gt;代码格式（以接收代码为准，接收代码与发射代码反向）&lt;/font&gt;   &lt;br /&gt;&lt;/h4&gt;   &lt;br /&gt;&lt;dir&gt;①位定义 &lt;/dir&gt;&lt;img height='47' width='165' src='http://www.51c51.com/WEB/hong11.files/Image4.gif'/&gt;   &lt;br /&gt; 　 　 　  　 　 　 &lt;br /&gt;&lt;dir&gt;②单发代码格式 &lt;/dir&gt;&lt;img height='125' width='227' src='http://www.51c51.com/WEB/hong11.files/Image6.gif'/&gt;   　 　 　 　 　 &lt;br /&gt;&lt;dir&gt;③连发代码格式 &lt;/dir&gt;&lt;br /&gt;&lt;p&gt;&lt;img height='104' width='189' src='http://www.51c51.com/WEB/hong11.files/Image7.gif'/&gt;&lt;br/&gt;&lt;br/&gt;注：代码宽度算法：&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;font size='3'&gt;16&lt;/font&gt;&lt;font lang='ZH-CN' face='楷体_GB2312' size='3'&gt;位地址码的最短宽度：&lt;/font&gt;&lt;font size='3'&gt;1.12&lt;/font&gt;&lt;font lang='ZH-CN' face='楷体_GB2312' size='3'&gt;×&lt;/font&gt;&lt;font size='3'&gt;16=18ms&lt;/font&gt; 16&lt;font lang='ZH-CN' face='楷体_GB2312' size='3'&gt;位地址码的最长宽度：&lt;/font&gt;&lt;font size='3'&gt;2.24ms&lt;/font&gt;&lt;font lang='ZH-CN' face='楷体_GB2312' size='3'&gt;×&lt;/font&gt;&lt;font size='3'&gt;16=36ms&lt;/font&gt;   &lt;br /&gt;&lt;/p&gt;&lt;dir/&gt;  &lt;br /&gt;&lt;dir/&gt;  &lt;br /&gt;&lt;dir/&gt;  &lt;br /&gt;&lt;dir/&gt;  &lt;br /&gt;&lt;dir/&gt;  &lt;br /&gt;  &lt;br /&gt;&lt;p&gt;&lt;font lang='ZH-CN' face='楷体_GB2312'&gt;易知&lt;font size='3'&gt;8&lt;/font&gt;&lt;font lang='ZH-CN' face='楷体_GB2312' size='3'&gt;位数据代码及其&lt;/font&gt;&lt;font size='3'&gt;8&lt;/font&gt;&lt;font lang='ZH-CN' face='楷体_GB2312' size='3'&gt;位反代码的宽度和不变：（&lt;/font&gt;&lt;font size='3'&gt;1.12ms+2.24ms&lt;/font&gt;&lt;font lang='ZH-CN' face='楷体_GB2312' size='3'&gt;）×&lt;/font&gt;&lt;font size='3'&gt;8=27ms&lt;/font&gt; &lt;/font&gt;&lt;/p&gt;  &lt;br /&gt;&lt;p&gt;&lt;font lang='ZH-CN' face='楷体_GB2312'&gt;∴&lt;font size='3'&gt;32&lt;/font&gt;&lt;font lang='ZH-CN' face='楷体_GB2312' size='3'&gt;位代码的宽度为（&lt;/font&gt;&lt;font size='3'&gt;18ms+27ms&lt;/font&gt;&lt;font lang='ZH-CN' face='楷体_GB2312' size='3'&gt;）&lt;/font&gt;&lt;font size='3'&gt;~(36ms+27ms)&lt;/font&gt;   &lt;br /&gt;&lt;br/&gt;&lt;br/&gt;&lt;/font&gt;1．&lt;br /&gt;解码的关键是如何识别“0”和“1”，从位的定义我们可以发现“0”、“1”均以0.56ms的低电平开始，不同的是高电平的宽度不同，“0”为&lt;br /&gt;0.56ms,“1”为1.68ms,所以必须根据高电平的宽度区别“0”和“1”。如果从0.56ms低电平过后，开始延时，0.56ms以后，若读到&lt;br /&gt;的电平为低，说明该位为“0”，反之则为“1”，为了可靠起见，延时必须比0.56ms长些，但又不能超过1.12ms,否则如果该位为“0”，读到的已&lt;br /&gt;是下一位的高电平，因此取（1.12ms+0.56ms）/2=0.84ms最为可靠，一般取0.84ms左右均可。&lt;/p&gt;  &lt;br /&gt;&lt;p&gt;2． 根据码的格式，应该等待9ms的起始码和4.5ms的结果码完成后才能读码。&lt;/p&gt;   &lt;br /&gt;&lt;p&gt;　&lt;/p&gt;  &lt;br /&gt;&lt;p align='left'&gt;    如果邮购我们开发的51单片机试验板和扩展元件的网友，可以获得如上图所示的红外遥控手柄，这种遥控器的编码格&lt;br /&gt;式符合上面的描述规律，而且价格低廉，有32个按键，按键外形比较统一，如果用于批量开发，可以把遥控器上贴膜换成你需要的字符，这为开发产品提供了便&lt;br /&gt;利。&lt;/p&gt;  &lt;br /&gt;&lt;p style='text-indent: 0px;'&gt;&lt;span class='main1'&gt;&lt;b&gt;接收器及解码&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;  &lt;br /&gt;&lt;p style='text-indent: 30px;'&gt;&lt;span class='main1'&gt;一体化红外线接收器是一种集红外线接收和放大于一体，不需要任何外接元件，就能完成从红外线接收到输出与TTL电平信号兼容的所有工作，而体积和普通的塑封三极管大小一样，它适合于各种红外线遥控和红外线数据传输。&lt;/span&gt;   &lt;br /&gt;&lt;/p&gt;  &lt;br /&gt;&lt;p align='left'&gt;ORG 0000H &lt;br/&gt;START:MOV P0,#0FFH&lt;br/&gt;MOV P1,#0FFH&lt;br/&gt;MOV   &lt;br /&gt;P2,#0FFH&lt;br/&gt;MOV P3,#0FFH&lt;br/&gt;JNB P3.2,$;等待遥控信号出现&lt;br/&gt;MOV R6,#10&lt;br/&gt;SB: ACALL   &lt;br /&gt;YS1;调用882微秒延时子程序&lt;br/&gt;JB P3.2,START;延时882微秒后判断P3.2脚是否出现高电平如果有就退出解码程序&lt;br/&gt;DJNZ   &lt;br /&gt;R6,   &lt;br /&gt;SB;重复10次，目的是检测在8820微秒内如果出现高电平就退出解码程序&lt;br/&gt;;以上完成对遥控信号的9000微秒的初始低电平信号的识别。&lt;br/&gt;JNB   &lt;br /&gt;P3.2, $ ;等待高电平避开9毫秒低电平引导脉冲&lt;br/&gt;ACALL YS2 ;延时4.74毫秒避开4.5毫秒的结果码&lt;br/&gt;MOV   &lt;br /&gt;R1,#1AH ;设定1AH为起始RAM区&lt;br/&gt;MOV R2,#4 &lt;br/&gt;PP: MOV R3,#8&lt;br/&gt;JJJJ: JNB   &lt;br /&gt;P3.2,$;等待地址码第一位的高电平信号&lt;br/&gt;LCALL YS1;高电平开始后用882微秒的时间尺去判断信号此时的高低电平状态&lt;br/&gt;MOV   &lt;br /&gt;C,P3.2;将P3.2引脚此时的电平状态0或1存入C中&lt;br/&gt;JNC UUU;如果为0就跳转到UUU&lt;br/&gt;JB   &lt;br /&gt;P3.2,$;如果为1就等待高电平信号结束&lt;br/&gt;UUU: MOV A,@R1;将R1中地址的给A&lt;br/&gt;RRC   &lt;br /&gt;A;将C中的值0或1移入A中的最低位&lt;br/&gt;MOV @R1,A;将A中的数暂时存放在R1中&lt;br/&gt;DJNZ   &lt;br /&gt;R3,JJJJ;接收地址码的高8位&lt;br/&gt;INC R1;对R1中的值加1，换成下一个RAM&lt;br/&gt;DJNZ R2,PP   &lt;br /&gt;;接收完16位地址码和8位数据码和8位数据反码，存放在1AH/1BH/1CH/1DH的RAM中&lt;br/&gt;;以下对代码是否正确和定义进行识别&lt;br/&gt;MOV   &lt;br /&gt;A,1AH;比较高8位地址码&lt;br/&gt;XRL A,#00000000B ;判断1AH的值是否等于00000000，相等的话A为0&lt;br/&gt;JNZ   &lt;br /&gt;EXIT;如果不相等说明解码失败退出解码程序&lt;br/&gt;MOV A,1BH;比较低8位地址&lt;br/&gt;XRL A,#11111111B   &lt;br /&gt;;再判断高8位地址是否正确&lt;br/&gt;JNZ EXIT;如果不相等说明解码失败退出解码程序&lt;br/&gt;MOV   &lt;br /&gt;A,1CH;比较数据码和数据反码是否正确?&lt;br/&gt;CPL A&lt;br/&gt;XRL A,1DH ;将1CH的值取反后和1DH比较   &lt;br /&gt;不同则无效丢弃，核对数据是否准确&lt;br/&gt;JNZ EXIT;如果不相等说明解码失败退出解码程序&lt;br/&gt;CLR   &lt;br /&gt;P2.7;解码成功发光二极管点亮指示!&lt;br/&gt;AJMP BIJIAO&lt;/p&gt;   &lt;br /&gt;&lt;p&gt;;判断在118毫秒内是否有连发码&lt;br/&gt;AA:MOV R1,#25&lt;br/&gt;XX:ACALL YS2&lt;br/&gt;JNB   &lt;br /&gt;P3.2,HH;跳转到判断连发代码是否正确的程序段&lt;br/&gt;DJNZ R1,XX&lt;br/&gt;EXIT: MOV   &lt;br /&gt;P0,#0FFH;对所有端口清零&lt;br/&gt;MOV P1,#0FFH&lt;br/&gt;MOV P2,#0FFH&lt;br/&gt;MOV P3,#0FFH&lt;br/&gt;AJMP   &lt;br /&gt;START&lt;/p&gt;  &lt;br /&gt;&lt;p&gt;;连发码判断程序段-----------&lt;br/&gt;HH:MOV R6,#4&lt;br/&gt;S: ACALL YS1;调用882微秒延时子程序&lt;br/&gt;JB   &lt;br /&gt;P3.2,EXIT;延时882微秒后判断P3.2脚是否出现高电平如果有就退出解码程序&lt;br/&gt;DJNZ R6,   &lt;br /&gt;S;重复4次，目的是确认连发码的低电平信号波形&lt;br/&gt;JNB P3.2, $ ;等待高电平&lt;br/&gt;AJMP AA&lt;/p&gt;   &lt;br /&gt;&lt;p&gt;BIJIAO:MOV A,1CH;按键数值判断执行&lt;br/&gt;CJNE A,#00000101B,TT1 &lt;br/&gt;CPL P0.0&lt;br/&gt;TT1:   &lt;br /&gt;CJNE A,#00000100B,TT2&lt;br/&gt;CPL P0.1&lt;br/&gt;TT2: CJNE A,#00010000B,T3&lt;br/&gt;CPL   &lt;br /&gt;P0.2&lt;br/&gt;T3: CJNE A,#01001101B,T5&lt;br/&gt;CPL P0.3&lt;br/&gt;T5: CJNE   &lt;br /&gt;A,#01001110B,T6&lt;br/&gt;CPL P0.4&lt;br/&gt;T6: CJNE A,#01001100B,T7&lt;br/&gt;CPL P0.5&lt;br/&gt;T7:   &lt;br /&gt;CJNE A,#00001001B,T8&lt;br/&gt;CPL P0.6&lt;br/&gt;T8: CJNE A,#00011101B,T9&lt;br/&gt;CPL   &lt;br /&gt;P0.7&lt;br/&gt;T9: CJNE A,#00011111B,T10&lt;br/&gt;CPL P2.6&lt;br/&gt;T10: CJNE   &lt;br /&gt;A,#00001101B,T11&lt;br/&gt;CPL P2.5&lt;br/&gt;T11: CJNE A,#00011001B,T12&lt;br/&gt;CPL   &lt;br /&gt;P2.4&lt;br/&gt;T12: CJNE A,#00011011B,T13&lt;br/&gt;CPL P2.3&lt;br/&gt;T13: CJNE   &lt;br /&gt;A,#00010001B,T14&lt;br/&gt;CPL P2.2&lt;br/&gt;T14: CJNE A,#00010101B,T15&lt;br/&gt;CPL   &lt;br /&gt;P2.1&lt;br/&gt;T15: CJNE A,#00010111B,T16&lt;br/&gt;CPL P2.0&lt;br/&gt;T16: CJNE   &lt;br /&gt;A,#00010010B,T17&lt;br/&gt;CPL P1.0&lt;br/&gt;T17: CJNE A,#00010110B,T18&lt;br/&gt;CPL   &lt;br /&gt;P1.1&lt;br/&gt;T18: CJNE A,#01011110B,T19&lt;br/&gt;CPL P1.2&lt;br/&gt;T19: CJNE   &lt;br /&gt;A,#01011101B,T20&lt;br/&gt;CPL P1.3&lt;br/&gt;T20: CJNE A,#01011100B,T21&lt;br/&gt;CPL   &lt;br /&gt;P1.4&lt;br/&gt;T21: CJNE A,#01001111B,T22&lt;br/&gt;CPL P1.5&lt;br/&gt;T22: CJNE   &lt;br /&gt;A,#00000001B,T23&lt;br/&gt;CPL P1.6&lt;br/&gt;T23: CJNE A,#00000011B,T24&lt;br/&gt;CPL   &lt;br /&gt;P1.7&lt;br/&gt;T24: CJNE A,#00000000B,T25&lt;br/&gt;CPL P3.0&lt;br/&gt;T25: CJNE   &lt;br /&gt;A,#00010100B,T26&lt;br/&gt;CPL P3.1&lt;br/&gt;T26: CJNE A,#00011110B,T27&lt;br/&gt;CPL   &lt;br /&gt;P3.3&lt;br/&gt;T27: CJNE A,#00011010B,T28&lt;br/&gt;CPL P3.4&lt;br/&gt;T28: CJNE   &lt;br /&gt;A,#00001111B,T29&lt;br/&gt;CPL P3.5&lt;br/&gt;T29: CJNE A,#00001010B,T30&lt;br/&gt;CPL   &lt;br /&gt;P3.6&lt;br/&gt;T30: CJNE A,#00001110B,OK&lt;br/&gt;CPL P3.7&lt;br/&gt;OK:AJMP AA&lt;br/&gt;YS1: MOV   &lt;br /&gt;R4,#20 ;延时子程序1，精确延时882微秒&lt;br/&gt;D1: MOV R5,#20&lt;br/&gt;DJNZ R5,$&lt;br/&gt;DJNZ R4,D1   &lt;br /&gt;&lt;br/&gt;RET&lt;br/&gt;YS2: MOV R4,#10 ;延时子程序2，精确延时4740微秒&lt;br/&gt;D2: MOV R5,#235&lt;br/&gt;DJNZ   &lt;br /&gt;R5,$&lt;br/&gt;DJNZ R4,D2 &lt;br/&gt;RET&lt;br/&gt;END&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3474577459886827247-8379449129993896595?l=cwjen888.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cwjen888.blogspot.com/feeds/8379449129993896595/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3474577459886827247&amp;postID=8379449129993896595' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/8379449129993896595'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/8379449129993896595'/><link rel='alternate' type='text/html' href='http://cwjen888.blogspot.com/2008/11/blog-post_829.html' title='红外线遥控器解码程序'/><author><name>David Chang</name><uri>http://www.blogger.com/profile/05943998889053147615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3474577459886827247.post-606562992979246367</id><published>2008-11-12T20:15:00.001-08:00</published><updated>2008-11-12T20:15:59.972-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='生活'/><category scheme='http://www.blogger.com/atom/ns#' term='家庭自動化'/><title type='text'>[很好DIY] WinLIRC電腦萬用紅外線遙控器</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;因為在上一篇JetKTV的介紹中..有提到 WinLIRC 這個遙控器模組..而且JetKTV有直接的支援. 再加上很多大大們的鼓勵...所以就有這篇的誕生.&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;[什麼是 WinLIRC ]&lt;br/&gt;&lt;br /&gt;WinLIRC是一個以 LIRC為基礎而在Windows環境發展出來的模組, 而什麼是LIRC呢...它其實是 Linux Infrared&lt;br /&gt;Remote Control的縮寫, 本來是在Linux下所發展出來的一個紅外線的遙控模組. 如果有喜歡Linux的大大可以到 &lt;a target='_blank' href='http://www.lirc.org/'&gt;http://www.lirc.org&lt;/a&gt;逛逛, 那裡面有一堆看都看不完的資料.&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;而因為我以Windows環璄為主, 所以當然就以WinLIRC為主要支援的對象了.&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;[為什麼是 WinLIRC]&lt;br/&gt;&lt;br /&gt;市面上有很多給PC用遙控器(上Y拍找可以找到一堆)...為什麼獨鍾WinLIRC呢..原因原簡單.&lt;br/&gt;&lt;br /&gt;1. 它是免費的.&lt;br/&gt;&lt;br /&gt;2. 它使用的線路及零件非常簡單, 不用花太多的金錢(基本上不會超過50元台幣)&lt;br/&gt;&lt;br /&gt;3. 它可以使用大部分的現有遙控器(你可以買一支300元的KTV專用遙控器也可以直接用你的電視遙控器來當WinLIRC的遙控器)&lt;br/&gt;&lt;br /&gt;4. 它可以記錄(學習)N支遙控器.&lt;br/&gt;&lt;br /&gt;5. 它可以用網路來遙控遠方的程式.&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;[線路]&lt;br/&gt;&lt;br /&gt;WinLIRC可以用很多不同的電路來達到遙控的目的(當然都要透過RS-232C), 而我們就找最簡單的電路來製作就可以用了, 零件非常少(比對岸的某的電路都要少很多).&lt;br/&gt;&lt;br /&gt;現在就來看看電路圖(電路不是我設計的, 是由 LIRC.org來的, 我只是重繪了一下而已)&lt;br/&gt;&lt;br /&gt;右方RS-232C 對應D9 的接腳是&lt;br/&gt;&lt;br /&gt;&lt;font color='#ff0000'&gt;DCD ------- Pin 1  信號輸入&lt;br/&gt;&lt;br /&gt;RTS ------- Pin 7 電源供應 Vcc&lt;br/&gt;&lt;br /&gt;GND ------ Pin 5 接地 &lt;/font&gt; &lt;br/&gt;&lt;br /&gt;&lt;img onload='checkimagesize(this.id,this.width,this.height)' id='http://attach.mobile01.com/attach/200601/mobile01-24f9a25be60335f636eb7ca552dd69b3.gif' src='http://attach.mobile01.com/attach/200601/mobile01-24f9a25be60335f636eb7ca552dd69b3.gif'/&gt;&lt;br/&gt;&lt;br /&gt;註: 圖面上的紅外線接收器我已經改成台灣比較容易買到的6038LM-5A了, 當然如果你有其它接收能力更好的相容接收器, 也可以使用.&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;零件如下, 我會把我買的價格(光華價)標上去:&lt;br/&gt;&lt;br /&gt;1. 6038LM-5A 紅外線接收....... 我買28元1個&lt;br/&gt;&lt;br /&gt;&lt;img onload='checkimagesize(this.id,this.width,this.height)' id='http://attach.mobile01.com/attach/200601/mobile01-b9b77e057037b638cdde683cf6f16e4c.jpg' src='http://attach.mobile01.com/attach/200601/mobile01-b9b77e057037b638cdde683cf6f16e4c.jpg'/&gt;&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;2. 電解電容 4.7uF/50V ...... 5元可以買一堆&lt;br/&gt;&lt;br /&gt;3. 1N4148 二極體 ............. 10元可以買一堆&lt;br/&gt;&lt;br /&gt;4. 電阻 1/4W 4.7K歐姆 ...... 5元可以買一堆&lt;br/&gt;&lt;br /&gt;5. LM78L05 100mA穩壓IC.. 忘了多少錢...但不到15元&lt;br/&gt;&lt;br /&gt;&lt;img onload='checkimagesize(this.id,this.width,this.height)' id='http://attach.mobile01.com/attach/200601/mobile01-29bcc267fca20dc19d0424971b38e834.jpg' src='http://attach.mobile01.com/attach/200601/mobile01-29bcc267fca20dc19d0424971b38e834.jpg'/&gt;&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;6. RS-232 D9 母頭一個 &lt;br/&gt;&lt;br /&gt;&lt;img onload='checkimagesize(this.id,this.width,this.height)' id='http://attach.mobile01.com/attach/200601/mobile01-0438cb9cfa1c9de66a25030b44bc9358.jpg' src='http://attach.mobile01.com/attach/200601/mobile01-0438cb9cfa1c9de66a25030b44bc9358.jpg'/&gt;&lt;br/&gt;&lt;br /&gt;接頭上有標明第幾Pin, 因為我們只用到 &lt;b&gt;1, 5, 7&lt;/b&gt; 3個支腳, 焊的時候要小心&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;7. D9接頭外殼一個&lt;br/&gt;&lt;br /&gt;&lt;img onload='checkimagesize(this.id,this.width,this.height)' id='http://attach.mobile01.com/attach/200601/mobile01-91041986a979ef6ab4f2a72703890b8e.jpg' src='http://attach.mobile01.com/attach/200601/mobile01-91041986a979ef6ab4f2a72703890b8e.jpg'/&gt;&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;8. 網路線一小段(其實只要3Pin的線即可..只是我手頭上別的沒有網路線一堆...所以就剪了條網路線來用)&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;以上零件總會不會超過新台幣50元, 只是有些一次要買一堆, 不過可以留著以後可以用&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;其中 6038LM 找一下DataSheet (咕狗大神真方便...)得知腳位為:&lt;br/&gt;&lt;br /&gt;Pin1 : Vout .... 信號輸出&lt;br/&gt;&lt;br /&gt;Pin2 : GND .... 接地&lt;br/&gt;&lt;br /&gt;Pin3 : Vcc ..... +5V&lt;br/&gt;&lt;br /&gt;&lt;img onload='checkimagesize(this.id,this.width,this.height)' id='http://attach.mobile01.com/attach/200601/mobile01-b7fa20b7e8413c274e9b58189f6eefc1.gif' src='http://attach.mobile01.com/attach/200601/mobile01-b7fa20b7e8413c274e9b58189f6eefc1.gif'/&gt;&lt;br/&gt;&lt;br /&gt;來源: &lt;a target='_blank' href='http://www.100y.com.tw/pdf_file/FM-6038LM-5A.pdf'&gt;6038LM-5A DataSheet&lt;/a&gt;&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;而 78L05 是所謂 TO-92封裝, 腳位說明如下圖:&lt;br/&gt;&lt;br /&gt;&lt;img onload='checkimagesize(this.id,this.width,this.height)' id='http://attach.mobile01.com/attach/200601/mobile01-7dab93e3e69c2a40bacc983d21207502.gif' src='http://attach.mobile01.com/attach/200601/mobile01-7dab93e3e69c2a40bacc983d21207502.gif'/&gt;&lt;br/&gt;&lt;br /&gt;來源 : &lt;a target='_blank' href='http://www.national.com/ds/LM/LM78L05.pdf'&gt;LM78L05 DataSheet&lt;/a&gt;&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;因為零件沒有多少..所以連萬用板都省起來..如果有經驗的大大可以直接焊在RS-232 D9 接頭內. &lt;br/&gt;&lt;br /&gt;&lt;img onload='checkimagesize(this.id,this.width,this.height)' id='http://attach.mobile01.com/attach/200601/mobile01-fa42d3205d99432f1d77845aa358397c.jpg' src='http://attach.mobile01.com/attach/200601/mobile01-fa42d3205d99432f1d77845aa358397c.jpg'/&gt;&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;或者...像這樣&lt;br/&gt;&lt;br /&gt;&lt;img onload='checkimagesize(this.id,this.width,this.height)' id='http://attach.mobile01.com/attach/200601/mobile01-d4c13f0a5e832f05a85363992cbfa985.jpg' src='http://attach.mobile01.com/attach/200601/mobile01-d4c13f0a5e832f05a85363992cbfa985.jpg'/&gt;&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;因為我剛好兩種都各做了一個...所以才有圖可看..&lt;img alt='勝利' src='http://attach2.mobile01.com/image/smile/smile047.gif'/&gt;&lt;img alt='勝利' src='http://attach2.mobile01.com/image/smile/smile047.gif'/&gt;&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;注意事項:&lt;br/&gt;&lt;br /&gt;1. 6038LM 和 78L05 腳位不要弄錯了.&lt;br/&gt;&lt;br /&gt;2. 1N4147 二極體和 4.7uF電解電容都有極性不要焊反了.&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;等到萬事俱備後...我們就要開始WinLIRC的使用了...&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;啊~~~~~~我的NB沒有RS-232C怎麼辦呢...有些大大可能要用在NB上但, NB通常沒有RS-232的接頭..那要怎麼辦...那就真的沒辦法了&lt;img alt='害羞' src='http://attach2.mobile01.com/image/smile/smile048.gif'/&gt;&lt;img alt='害羞' src='http://attach2.mobile01.com/image/smile/smile048.gif'/&gt;&lt;img alt='害羞' src='http://attach2.mobile01.com/image/smile/smile048.gif'/&gt;&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;目前LIRC官方也還對USB Serial說目前是不行的.....&lt;img alt='鬱卒' src='http://attach2.mobile01.com/image/smile/smile026.gif'/&gt;&lt;img alt='鬱卒' src='http://attach2.mobile01.com/image/smile/smile026.gif'/&gt;&lt;img alt='鬱卒' src='http://attach2.mobile01.com/image/smile/smile026.gif'/&gt;)&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;=======================================================&lt;br/&gt;&lt;br /&gt;硬體的部分解決了...現在就是軟體的部分了... 首先請到 WinLIRC的首頁去下載WinLIRC的程式&lt;br/&gt;&lt;br /&gt;目前最新的版本是 0.6.5&lt;br/&gt;&lt;br /&gt;下載點: &lt;a target='_blank' href='http://prdownloads.sourceforge.net/winlirc/winlirc-0.6.5.zip?download'&gt;http://prdownloads.sourceforge.net/winlirc/winlirc-0.6.5.zip?download&lt;/a&gt;&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;解壓縮後你會發現一拖拉庫的檔案...不要被嚇到.. 幾乎都是 Source Code. 我們需要的只有 &lt;img onload='checkimagesize(this.id,this.width,this.height)' id='http://attach.mobile01.com/attach/200601/mobile01-0640854df2e1a7bfe35d9ceca88458f1.gif' src='http://attach.mobile01.com/attach/200601/mobile01-0640854df2e1a7bfe35d9ceca88458f1.gif'/&gt; 及 一個 Sample.cf 這兩個檔而已...不要懷疑..它是綠色軟體..免安裝直接執行.&lt;br/&gt;&lt;br /&gt;可以的話把這兩個檔獨立開個資料夾(如c:\WinLIRC)來放&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;首先把我們剛剛的硬體裝上去..要知道裝在那個Com埠喔.. 如果不知道是COM幾. 請找 "好人" 處理.&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;現在直接執行 WinLirc.exe , 哇..怎麼出現&lt;br/&gt;&lt;br /&gt;&lt;img onload='checkimagesize(this.id,this.width,this.height)' id='http://attach.mobile01.com/attach/200601/mobile01-7c87a6f879d942ed5f3fd2e668be5106.gif' src='http://attach.mobile01.com/attach/200601/mobile01-7c87a6f879d942ed5f3fd2e668be5106.gif'/&gt;&lt;br/&gt;&lt;br /&gt;沒關係...因為它是一個Winsock的 Service所以會被XP的防火牆給檔下來, 請按解除封鎖繼續&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;哇..又來一個&lt;br/&gt;&lt;br /&gt;&lt;img onload='checkimagesize(this.id,this.width,this.height)' id='http://attach.mobile01.com/attach/200601/mobile01-6dc0b61c269d5935880fd9a727e6b881.gif' src='http://attach.mobile01.com/attach/200601/mobile01-6dc0b61c269d5935880fd9a727e6b881.gif'/&gt;&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;沒關係第一次一定會這樣..按確定即可, 然後會看到下面的畫面&lt;br/&gt;&lt;br /&gt;&lt;img onload='checkimagesize(this.id,this.width,this.height)' id='http://attach.mobile01.com/attach/200601/mobile01-9196dbfe95a4445f4aa481fc8ddb7c29.gif' src='http://attach.mobile01.com/attach/200601/mobile01-9196dbfe95a4445f4aa481fc8ddb7c29.gif'/&gt;&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;首先把Port欄位設定成你的COM埠, 下拉式選單可以選到COM8, 如果超過, 可以直接輸入即可不用理會選單. &lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;[硬體測試] &lt;br/&gt;&lt;br /&gt;怎麼知道硬體工作正不正常.....當然要測試一下了, 設定好COM埠後&lt;br/&gt;&lt;br /&gt;按下下方 Config 右方的 Browse... 鈕. 選擇 Sample.cf 檔&lt;br/&gt;&lt;br /&gt;再按下右方的 Raw Code鈕 會出現一個叫 Learn Rmote的視窗. 然後隨便拿著一個遙控器對著 6038LM的接收窗按按看. 如果&lt;br /&gt;那個 視窗會隨著按鈕而出現一堆pulse , space...(如下圖) 那麼硬體己測試成功..請關閉這個視窗, 接下來可以開始學習遙控器了.&lt;br/&gt;&lt;br /&gt;&lt;img onload='checkimagesize(this.id,this.width,this.height)' id='http://attach.mobile01.com/attach/200601/mobile01-b5c4eb212851e0ec322da6a8e2a03544.gif' src='http://attach.mobile01.com/attach/200601/mobile01-b5c4eb212851e0ec322da6a8e2a03544.gif'/&gt;&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;[學習遙控器]&lt;br/&gt;&lt;br /&gt;好..回到主視窗後..我們要開始學習了.. &lt;br/&gt;&lt;br /&gt;首先我們要開一個新的檔案來學習, 在下方 Config 的檔名處改個檔名 (如 Test.cf)&lt;br/&gt;&lt;br /&gt;&lt;img onload='checkimagesize(this.id,this.width,this.height)' id='http://attach.mobile01.com/attach/200601/mobile01-35e0ddc6fcd7c5ad2b5323388ff76461.gif' src='http://attach.mobile01.com/attach/200601/mobile01-35e0ddc6fcd7c5ad2b5323388ff76461.gif'/&gt;&lt;br/&gt;&lt;br /&gt;再按下 Learn 鈕 &lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;學習步驟&lt;br/&gt;&lt;br /&gt;1. 按下 Learn之後出現下面的畫面, 請輸入遙控器的名稱後按 Enter鈕&lt;br/&gt;&lt;br /&gt;&lt;img onload='checkimagesize(this.id,this.width,this.height)' id='http://attach.mobile01.com/attach/200601/mobile01-783653e12587cf92fbb36354db359e8d.gif' src='http://attach.mobile01.com/attach/200601/mobile01-783653e12587cf92fbb36354db359e8d.gif'/&gt;&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;2. 接下來有2個畫面, 要輸入遙控器的特性, 因為我們並不知道..所以我們都直接按Enter讓WinLIRC自行檢查&lt;br/&gt;&lt;br /&gt;&lt;img onload='checkimagesize(this.id,this.width,this.height)' id='http://attach.mobile01.com/attach/200601/mobile01-e39253fb610f6f2a1570842e7713785e.gif' src='http://attach.mobile01.com/attach/200601/mobile01-e39253fb610f6f2a1570842e7713785e.gif'/&gt;&lt;br/&gt;&lt;br /&gt;&lt;img onload='checkimagesize(this.id,this.width,this.height)' id='http://attach.mobile01.com/attach/200601/mobile01-460f546e475c9680bd3240c8c34d1599.gif' src='http://attach.mobile01.com/attach/200601/mobile01-460f546e475c9680bd3240c8c34d1599.gif'/&gt;&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;3. 接下來這個畫面, 請按下想學習的遙控器上的某一鍵, 然後按照上面的指示需要按10次左右&lt;br/&gt;&lt;br /&gt;按了鍵, 系統抓到, 請你再按一次&lt;br/&gt;&lt;br /&gt;&lt;img onload='checkimagesize(this.id,this.width,this.height)' id='http://attach.mobile01.com/attach/200601/mobile01-56dd5946b4d270c3d5766c891d619810.gif' src='http://attach.mobile01.com/attach/200601/mobile01-56dd5946b4d270c3d5766c891d619810.gif'/&gt;&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;有沒有看到中間有句 "Did not get....." 表示這次按的不成功, 還要再按一次直到出現10Left&lt;br/&gt;&lt;br /&gt;&lt;img onload='checkimagesize(this.id,this.width,this.height)' id='http://attach.mobile01.com/attach/200601/mobile01-dc6178e6f5ade7e526409b2f2cc9cf17.gif' src='http://attach.mobile01.com/attach/200601/mobile01-dc6178e6f5ade7e526409b2f2cc9cf17.gif'/&gt;&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;出現10Left表示要再記錄10次..那麼..就按吧..10.9.8.7.6.5.哇失敗..4.3.2.1. 成功了&lt;br/&gt;&lt;br /&gt;&lt;img onload='checkimagesize(this.id,this.width,this.height)' id='http://attach.mobile01.com/attach/200601/mobile01-e3d116b699c2992effc9c63bb8fe678e.gif' src='http://attach.mobile01.com/attach/200601/mobile01-e3d116b699c2992effc9c63bb8fe678e.gif'/&gt;&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;這個步驟主要是讓WinLIRC了解這支遙控器的特性, 如果一直不成功..可能是你的遙控器碼太複雜(通常有些日本的遙控器會有這個現象), 換一支吧. 如果錯誤太多..系統可是會出現錯誤太多訊息, 而回到主選單的喔. &lt;br/&gt;&lt;br /&gt;撇步：按鍵時可以稍稍按久一點..成功率會高一點.&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;4. 再來開始要學習按鍵了喔. &lt;br/&gt;&lt;br /&gt;先輸入想學習的按鍵名&lt;br/&gt;&lt;br /&gt;&lt;img onload='checkimagesize(this.id,this.width,this.height)' id='http://attach.mobile01.com/attach/200601/mobile01-b3d71b9b1ebe6f3502e5ce133943fb8a.gif' src='http://attach.mobile01.com/attach/200601/mobile01-b3d71b9b1ebe6f3502e5ce133943fb8a.gif'/&gt;&lt;br/&gt;&lt;br /&gt;再來按下想學習的按鈕..會出下圖的畫面, 其中有個 matches=?, faults=? &lt;br/&gt;&lt;br /&gt;也就是說要每個按鈕要按到matches=7 才行..所以要多按幾次&lt;br/&gt;&lt;br /&gt;&lt;img onload='checkimagesize(this.id,this.width,this.height)' id='http://attach.mobile01.com/attach/200601/mobile01-fa39bf761e38b5df8721283911eae842.gif' src='http://attach.mobile01.com/attach/200601/mobile01-fa39bf761e38b5df8721283911eae842.gif'/&gt;&lt;br/&gt;&lt;br /&gt;經過7次成功match後..出現是否要Keep這個按鍵, 當然是按 &lt;b&gt;是&lt;/b&gt; 囉&lt;br/&gt;&lt;br /&gt;&lt;img onload='checkimagesize(this.id,this.width,this.height)' id='http://attach.mobile01.com/attach/200601/mobile01-0158bb3b417aeefc65e841d9784cd774.gif' src='http://attach.mobile01.com/attach/200601/mobile01-0158bb3b417aeefc65e841d9784cd774.gif'/&gt;&lt;br/&gt;&lt;br /&gt;接下來又回到第4的步驟開始, 輸入第2個鍵的按鍵名..&lt;br/&gt;&lt;br /&gt;依此類推把所有的接鍵全都學習完為止.&lt;br/&gt;&lt;br /&gt;最後還是會回到輸入按鍵名稱的畫面, 如果已經學習完畢了, 則不需要輸入任何名稱直接按Enter即可&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;5. 當結束按鍵的學習後, 系統會請你不要忘了按 analyze 鈕 來整理剛剛學習的資料&lt;br/&gt;&lt;br /&gt;&lt;img onload='checkimagesize(this.id,this.width,this.height)' id='http://attach.mobile01.com/attach/200601/mobile01-a62c85e05fb3878f75b83274580a2724.gif' src='http://attach.mobile01.com/attach/200601/mobile01-a62c85e05fb3878f75b83274580a2724.gif'/&gt;&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;6. 所以我們當然照著作囉..一切成功的話&lt;br/&gt;&lt;br /&gt;&lt;img onload='checkimagesize(this.id,this.width,this.height)' id='http://attach.mobile01.com/attach/200601/mobile01-b70d869f0a0f67d3c63e9aee787d4976.gif' src='http://attach.mobile01.com/attach/200601/mobile01-b70d869f0a0f67d3c63e9aee787d4976.gif'/&gt;&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;至此..學習的動作已經完成&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;請在主畫面 按下 OK 鈕, 這時WinLIR會自動跑到右下方變成一個圓形圖示去, 此時如果按一剛剛學習的遙控器的鈕, 你會發現 WinLIR的圓形圖示會變綠色的. 這表示遙控接收正常.&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;接下來, 我們要來測試一下剛剛學習的按鍵了, 請按 開始鈕, 再選執行(如下圖), 輸入 telnet localhost 8765&lt;br/&gt;&lt;br /&gt;&lt;img onload='checkimagesize(this.id,this.width,this.height)' id='http://attach.mobile01.com/attach/200601/mobile01-15b9681e15e32d873b29be086ea2ea63.gif' src='http://attach.mobile01.com/attach/200601/mobile01-15b9681e15e32d873b29be086ea2ea63.gif'/&gt;&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;會出現一個 Telnet的視窗..現在按一下剛剛的按鍵看看. 你會發現Telnet視窗內會有 按鍵碼-按鍵名-遙控器名.....至此...大大的成功.&lt;br/&gt;&lt;br /&gt;&lt;img onload='checkimagesize(this.id,this.width,this.height)' id='http://attach.mobile01.com/attach/200601/mobile01-2b6223af1f82521e7ae58d341f3973f6.gif' src='http://attach.mobile01.com/attach/200601/mobile01-2b6223af1f82521e7ae58d341f3973f6.gif'/&gt;&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;現在我們已經完成一支遙控器了, 如果要再學習另一支遙控器那麼請重新再來一次即可&lt;br/&gt;&lt;br /&gt;但要注意的是. Config的檔名不能一樣, 不然原來的遙控器資料會被蓋掉.&lt;br/&gt;&lt;br /&gt;也就是說學習的時候是一個遙控器一個檔案.&lt;br/&gt;&lt;br /&gt;而是不是可以同時使用2個以上的遙控器呢, 答案當然也是可以的.&lt;br/&gt;&lt;br /&gt;其實所有的遙控器檔案都是文字檔, 所以你把副檔名設定成.txt也可以.&lt;br/&gt;&lt;br /&gt;你只要打開每個遙控器檔, 把從 begin remote 一直到 end remote 全部複製到另一個檔案內.&lt;br/&gt;&lt;br /&gt;然後把那個檔案存檔, 再執行WinLIRC, 用 browse... 鈕 選擇那個檔案即可.&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;當WinLIRC正確運作後..以後直接執行WinLIRC即會自動載入最後的那個Config檔, 並自動縮到右下方在背後默默的工作著. &lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;[在JetKTV使用 WinLIRC遙控器]&lt;br/&gt;&lt;br /&gt;首先請把JetKTV.ini 檔案內 [WinLirc]區中的 Enable 設為 Yes&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;b&gt;[WinLirc]&lt;br/&gt;&lt;br /&gt;Enable=Yes&lt;br/&gt;&lt;br /&gt;Host=localhost&lt;/b&gt;&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;存檔後執行JetConfig&lt;br/&gt;&lt;br /&gt;再到設定鍵盤及遙控器的功能內按下學習鈕, 即可一個一個按下遙控器鈕把功能給設定好了.&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;祝大家用的快樂....&lt;img alt='勝利' src='http://attach2.mobile01.com/image/smile/smile047.gif'/&gt;&lt;img alt='勝利' src='http://attach2.mobile01.com/image/smile/smile047.gif'/&gt;&lt;br/&gt;&lt;br /&gt;看看時間...又天亮了...補眠企~~~~~~~&lt;img alt='害羞' src='http://attach2.mobile01.com/image/smile/smile048.gif'/&gt;&lt;img alt='害羞' src='http://attach2.mobile01.com/image/smile/smile048.gif'/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3474577459886827247-606562992979246367?l=cwjen888.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cwjen888.blogspot.com/feeds/606562992979246367/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3474577459886827247&amp;postID=606562992979246367' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/606562992979246367'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/606562992979246367'/><link rel='alternate' type='text/html' href='http://cwjen888.blogspot.com/2008/11/diy-winlirc.html' title='[很好DIY] WinLIRC電腦萬用紅外線遙控器'/><author><name>David Chang</name><uri>http://www.blogger.com/profile/05943998889053147615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3474577459886827247.post-3136100346866125469</id><published>2008-11-12T19:36:00.001-08:00</published><updated>2008-11-12T19:36:53.408-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='家庭自動化'/><category scheme='http://www.blogger.com/atom/ns#' term='Arduino'/><title type='text'>Arduino扩展板使用之RS485接口篇</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;前面我们提到过串行接口按标准被分为RS-232、RS-422、RS-485。我们的A板扩展板就集成了RS485（MAX485）接口。&lt;br/&gt;      &lt;br /&gt;RS485采用差分信号负逻辑，＋2V～＋6V表示“0”，- 6V～-&lt;br /&gt;2V表示“1”。RS485有两线制和四线制两种接线，四线制只能实现点对点的通信方式，现很少采用，现在多采用的是两线制接线方式，这种接线方式为总线&lt;br /&gt;式拓朴结构在同一总线上最多可以挂接32个结点。在RS485通信网络中一般采用的是主从通信方式，即一个主机带多个从机。很多情况下，连接RS-485&lt;br /&gt;通信链路时只是简单地用一对双绞线将各个接口的“A”、“B”端连接起来。其理论的通讯距离是1200米，速率高达20Mbps，并可以用在强噪声的环境&lt;br /&gt;中正常工作，在工业通讯领域中被广泛应用。&lt;br/&gt;       RS485通讯的点对点接法和主从机接法如下图：&lt;br /&gt;&lt;p align='center'&gt;&lt;img onload='rsimg(this,500)' style='cursor: pointer;' onclick='javascript:window.open(this.src);' src='http://www.roboticfan.com/blog/UploadFiles/2008-11/112136322991.jpg'/&gt;&lt;/p&gt;&lt;br /&gt;&lt;p align='left'&gt;       以上2种接法建议都接上地线，以保证减小干扰。在主从网络中，通讯线必须手牵手地并联下去，不可以有星型连接或者分叉。&lt;br/&gt;      &lt;br /&gt;RS485协议只是把TTL的串口转换成差分方式的通讯接口，485芯片的端口还是接到Arduino的RX（PIN0）和TX（PIN1）端，两线制的&lt;br /&gt;RS485是属于半双工网络，则需要有个端口来控制AB差分线上何时收何时发，这就会用到Arduino上的PIN2。Arduino扩展板上需要插上&lt;br /&gt;485接口选择插针，红圈处的3个插针都要插上：&lt;/p&gt;&lt;br /&gt;&lt;p align='center'&gt;&lt;img onload='rsimg(this,500)' style='cursor: pointer;' onclick='javascript:window.open(this.src);' src='http://www.roboticfan.com/blog/UploadFiles/2008-11/102241429037.jpg'/&gt;&lt;/p&gt;&lt;br /&gt;&lt;p align='left'&gt;完成上面的操作，我们就可以玩代码了，2个简单的代码：&lt;/p&gt;&lt;br /&gt;&lt;p align='left'&gt;主机代码:&lt;br/&gt;int EN = 2;&lt;br/&gt;&lt;br/&gt;void setup() &lt;br/&gt;{&lt;br/&gt;  pinMode(EN, OUTPUT);&lt;br/&gt;  Serial.begin(19200);&lt;br/&gt;} &lt;br/&gt;&lt;br/&gt;void loop()&lt;br/&gt;{&lt;br/&gt;// send data &lt;br/&gt;  digitalWrite(EN, HIGH);//使能发送&lt;br/&gt;  Serial.print('A');&lt;br/&gt;  delay(1000);&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;从机代码:&lt;br/&gt;int ledPin = 13;&lt;br/&gt;int EN = 2;&lt;br/&gt;int val;&lt;br/&gt;&lt;br/&gt;void setup() &lt;br/&gt;{&lt;br/&gt;  pinMode(ledPin, OUTPUT);&lt;br/&gt;  pinMode(EN, OUTPUT);&lt;br/&gt;  Serial.begin(19200);&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;void loop()&lt;br/&gt;{&lt;br/&gt;  // receive data&lt;br/&gt; digitalWrite(EN, LOW);//使能接收&lt;br/&gt; val = Serial.read();&lt;br/&gt;  if (-1 != val) {&lt;br/&gt;    if ('A' == val) {&lt;br/&gt;      digitalWrite(ledPin, HIGH);&lt;br/&gt;      delay(500);&lt;br/&gt;      digitalWrite(ledPin, LOW);&lt;br/&gt;      delay(500);&lt;br/&gt;    }&lt;br/&gt; }&lt;br/&gt;}&lt;/p&gt;&lt;br /&gt;&lt;p align='left'&gt;代码编译后，分别下载到2个Arduino中（下载代码时请拔掉上图所示的485接口选择插针，因为它要占用串口，导致&lt;br /&gt;下载失败），然后连接2个扩展板上的485接口，A-A，B-B，GND-GND。主机Arduino模块会向从机不停的发送字母A，然后从机接收到字母&lt;br /&gt;A，并使数字PIN13上的发光二极管闪烁。&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3474577459886827247-3136100346866125469?l=cwjen888.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cwjen888.blogspot.com/feeds/3136100346866125469/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3474577459886827247&amp;postID=3136100346866125469' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/3136100346866125469'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/3136100346866125469'/><link rel='alternate' type='text/html' href='http://cwjen888.blogspot.com/2008/11/arduinors485.html' title='Arduino扩展板使用之RS485接口篇'/><author><name>David Chang</name><uri>http://www.blogger.com/profile/05943998889053147615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3474577459886827247.post-1112263995573022662</id><published>2008-11-12T19:32:00.001-08:00</published><updated>2008-11-12T19:32:46.173-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='家庭自動化'/><category scheme='http://www.blogger.com/atom/ns#' term='Arduino'/><title type='text'>Arduino 及RS485</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;h2&gt;RS485 Cir&lt;a href='http://blog.reprap.org/2008/10/rs485-circuit-success.html' onblur='try {parent.deselectBloggerImageGracefully();} catch(e) {}'&gt;&lt;img border='0' alt='' src='http://farm4.static.flickr.com/3072/2932136569_df44d8f921.jpg?v=0' style='float: left; cursor: pointer; width: 320px; margin-top: 10px; margin-bottom: 10px; margin-right: 10px;'/&gt;&lt;/a&gt;cuit = Success&lt;/h2&gt;&lt;a href='http://blog.reprap.org/2008/10/rs485-circuit-success.html'/&gt;&lt;blockquote/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3474577459886827247-1112263995573022662?l=cwjen888.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cwjen888.blogspot.com/feeds/1112263995573022662/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3474577459886827247&amp;postID=1112263995573022662' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/1112263995573022662'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/1112263995573022662'/><link rel='alternate' type='text/html' href='http://cwjen888.blogspot.com/2008/11/arduino-rs485.html' title='Arduino 及RS485'/><author><name>David Chang</name><uri>http://www.blogger.com/profile/05943998889053147615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3474577459886827247.post-4194824775757871013</id><published>2008-11-12T11:21:00.001-08:00</published><updated>2008-11-12T11:21:23.426-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='家庭自動化'/><category scheme='http://www.blogger.com/atom/ns#' term='Arduino'/><title type='text'>自製紅外線接收及發射器</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;a href='http://swf.com.tw/?p=128'&gt;自製紅外線接收及發射器&lt;/a&gt;&lt;br/&gt;&lt;blockquote/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3474577459886827247-4194824775757871013?l=cwjen888.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cwjen888.blogspot.com/feeds/4194824775757871013/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3474577459886827247&amp;postID=4194824775757871013' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/4194824775757871013'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/4194824775757871013'/><link rel='alternate' type='text/html' href='http://cwjen888.blogspot.com/2008/11/blog-post_12.html' title='自製紅外線接收及發射器'/><author><name>David Chang</name><uri>http://www.blogger.com/profile/05943998889053147615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3474577459886827247.post-2848583319375329454</id><published>2008-11-12T02:57:00.001-08:00</published><updated>2008-11-12T02:57:21.761-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='家庭自動化'/><category scheme='http://www.blogger.com/atom/ns#' term='Arduino'/><title type='text'>Dallas Semiconductor's 1-Wire interface</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;a href='http://www.arduino.cc/playground/Learning/OneWire'&gt;Arduino playground - OneWire&lt;/a&gt;&lt;br/&gt;&lt;blockquote&gt;&lt;a href='http://www.arduino.cc/playground/Learning/OneWire'&gt;Dallas Semiconductor's 1-Wire interface&lt;br/&gt;DS18B20&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3474577459886827247-2848583319375329454?l=cwjen888.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cwjen888.blogspot.com/feeds/2848583319375329454/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3474577459886827247&amp;postID=2848583319375329454' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/2848583319375329454'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/2848583319375329454'/><link rel='alternate' type='text/html' href='http://cwjen888.blogspot.com/2008/11/dallas-semiconductor-1-wire-interface.html' title='Dallas Semiconductor&amp;#39;s 1-Wire interface'/><author><name>David Chang</name><uri>http://www.blogger.com/profile/05943998889053147615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3474577459886827247.post-1483286378707980398</id><published>2008-11-12T02:55:00.001-08:00</published><updated>2008-11-12T02:55:45.292-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Arduino'/><title type='text'>DS18B20</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;br/&gt;&lt;pre&gt;/* ds18B20_test&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;  Test utility to configure resolution and read temp from the Dallas Semi 18B20 &amp;lt;br /&amp;gt;  one-wire digital temp sensor.&amp;lt;br /&amp;gt;  &amp;lt;br /&amp;gt;  datasheet: http://datasheets.maxim-ic.com/en/ds/DS18B20.pdf&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;  Derived from sample code at http://www.arduino.cc/playground/Learning/OneWire&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;*/&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;#include &amp;lt;OneWire.h&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;#define BAUDRATE 9600&amp;lt;br /&amp;gt;#define TEMPSENSOR 3  // arduino i/o port connected to the ds18B20&amp;lt;br /&amp;gt;//#define DEBUG         // uncomment for verbose output&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;/* some defines to make more legible checks into data read from the device &amp;lt;br /&amp;gt; *   (see the DS18B20 datasheet for more detail)&amp;lt;br /&amp;gt; */ &amp;lt;br /&amp;gt;#define TEMP_LSB 0&amp;lt;br /&amp;gt;#define TEMP_MSB 1&amp;lt;br /&amp;gt;#define TH_REG 2&amp;lt;br /&amp;gt;#define USERBYTE_1 2&amp;lt;br /&amp;gt;#define TL_REG 3&amp;lt;br /&amp;gt;#define USERBYTE_2 3&amp;lt;br /&amp;gt;#define CONFIG_REG 4&amp;lt;br /&amp;gt;#define CRC 8&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;OneWire ds(TEMPSENSOR); &amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;void setup() {&amp;lt;br /&amp;gt;  Serial.begin(BAUDRATE);&amp;lt;br /&amp;gt;}&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;/* convert celsius to fahrenheit&amp;lt;br /&amp;gt; *&amp;lt;br /&amp;gt; *   takes: float&amp;lt;br /&amp;gt; * returns: float&amp;lt;br /&amp;gt; */&amp;lt;br /&amp;gt;float c2f(float cel) {&amp;lt;br /&amp;gt;  return (cel * (9.0/5.0)) + (float)32;&amp;lt;br /&amp;gt;}&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;/* read temp from DS18B20 sensor using one-wire protocol */&amp;lt;br /&amp;gt;void loop() {&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;  byte i;&amp;lt;br /&amp;gt;  byte present = 0;&amp;lt;br /&amp;gt;  byte data[12];&amp;lt;br /&amp;gt;  byte addr[8];&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;  int temp_c_int;&amp;lt;br /&amp;gt;  float temp_c_frac;&amp;lt;br /&amp;gt;  float temp_c;&amp;lt;br /&amp;gt;  float temp_f;&amp;lt;br /&amp;gt;  int test_bit;&amp;lt;br /&amp;gt;  int set_bit;&amp;lt;br /&amp;gt;  int resolution_floor;&amp;lt;br /&amp;gt;  float expon;&amp;lt;br /&amp;gt;  &amp;lt;br /&amp;gt;  if ( !ds.search(addr)) {&amp;lt;br /&amp;gt;      ds.reset_search();&amp;lt;br /&amp;gt;      return;&amp;lt;br /&amp;gt;  }&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;  /* print the address - might be useful for non-debug mode if you have&amp;lt;br /&amp;gt;   *   &amp;gt;1 devices on the bus&amp;lt;br /&amp;gt;   */&amp;lt;br /&amp;gt;#ifdef DEBUG&amp;lt;br /&amp;gt;  Serial.print("R=");&amp;lt;br /&amp;gt;  for( i = 0; i &amp;lt; 8; i++) {&amp;lt;br /&amp;gt;    Serial.print(addr[i], HEX);&amp;lt;br /&amp;gt;    Serial.print(" ");&amp;lt;br /&amp;gt;  }&amp;lt;br /&amp;gt;#endif&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;  if ( OneWire::crc8( addr, 7) != addr[7]) {&amp;lt;br /&amp;gt;      Serial.print("CRC is not valid!\n");&amp;lt;br /&amp;gt;      return;&amp;lt;br /&amp;gt;  }&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;  if ( addr[0] != 0x28) {&amp;lt;br /&amp;gt;      Serial.print("Device is not a DS18B20 family device.\n");&amp;lt;br /&amp;gt;      return;&amp;lt;br /&amp;gt;  }&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;  /* modify scratchpad register to set temp sampling resolution */&amp;lt;br /&amp;gt;  ds.reset();&amp;lt;br /&amp;gt;  ds.select(addr);    &amp;lt;br /&amp;gt;  ds.write(0x4E);          // write scratchpad (starts at byte 2)&amp;lt;br /&amp;gt;  // note:  set high/low temp alarms by changing the next two values &amp;lt;br /&amp;gt;  ds.write(0x4B);    // default value of TH reg (user byte 1)&amp;lt;br /&amp;gt;  ds.write(0x46);    // default value of TL reg (user byte 2)&amp;lt;br /&amp;gt;  // uncomment one of the following&amp;lt;br /&amp;gt;  //ds.write(0x7F);    // 12-bit sampling resolution (default)&amp;lt;br /&amp;gt;  //ds.write(0x5F);    // 11-bit&amp;lt;br /&amp;gt;  //ds.write(0x3F);    // 10-bit&amp;lt;br /&amp;gt;  ds.write(0x1F);    // 9-bit&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;  ds.reset();&amp;lt;br /&amp;gt;  ds.select(addr);&amp;lt;br /&amp;gt;  ds.write(0x44,1);    // start conversion, with parasite power on at the end&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;  delay(1000);     // maybe 750ms is enough, maybe not&amp;lt;br /&amp;gt;  // we might do a ds.depower() here, but the reset will take care of it.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;  present = ds.reset();&amp;lt;br /&amp;gt;  ds.select(addr);    &amp;lt;br /&amp;gt;  ds.write(0xBE);          // Read Scratchpad&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;  if (!present) {&amp;lt;br /&amp;gt;    Serial.print("ERROR: selected device not present\n");&amp;lt;br /&amp;gt;    return;&amp;lt;br /&amp;gt;  }&amp;lt;br /&amp;gt;  &amp;lt;br /&amp;gt;  for ( i = 0; i &amp;lt; 9; i++) {           // we need 9 bytes&amp;lt;br /&amp;gt;    data[i] = ds.read();&amp;lt;br /&amp;gt;#ifdef DEBUG&amp;lt;br /&amp;gt;    Serial.print(data[i], HEX);&amp;lt;br /&amp;gt;    Serial.print(" ");&amp;lt;br /&amp;gt;#endif&amp;lt;br /&amp;gt;  }&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;  if (data[8] != OneWire::crc8(data,8)) {&amp;lt;br /&amp;gt;    Serial.print("ERROR: CRC didn't match\n");&amp;lt;br /&amp;gt;    return;&amp;lt;br /&amp;gt;  }&amp;lt;br /&amp;gt;  &amp;lt;br /&amp;gt;  /* print raw bytes from which we'll extract temp data */&amp;lt;br /&amp;gt;#ifdef DEBUG &amp;lt;br /&amp;gt;  Serial.print("[MSB:");&amp;lt;br /&amp;gt;  Serial.print(data[TEMP_MSB],BIN);&amp;lt;br /&amp;gt;  Serial.print(" LSB:");&amp;lt;br /&amp;gt;  Serial.print(data[TEMP_LSB],BIN);&amp;lt;br /&amp;gt;  Serial.print("] ");&amp;lt;br /&amp;gt;#endif&amp;lt;br /&amp;gt;  &amp;lt;br /&amp;gt;  /* compute the degrees in celcius / integer part */&amp;lt;br /&amp;gt;  temp_c_int = 0;&amp;lt;br /&amp;gt;  &amp;lt;br /&amp;gt;  /* The measured temp is spread across two bytes of the returned data.&amp;lt;br /&amp;gt;   *  The integer part of the temp value is spread across the least 3 significant&amp;lt;br /&amp;gt;   *  bits of the most significant byte (MSB) and the most significant 4 of &amp;lt;br /&amp;gt;   *  the LSB.  Here we shift those 7 bits into their proper place in our&amp;lt;br /&amp;gt;   *  result byte. &amp;lt;br /&amp;gt;   *&amp;lt;br /&amp;gt;   * note: could do this with 2 bit-shift / mask operations, alternatively&amp;lt;br /&amp;gt;   */&amp;lt;br /&amp;gt;  set_bit = 6;&amp;lt;br /&amp;gt;  for (test_bit = 2; test_bit &amp;gt;= 0; test_bit--) {&amp;lt;br /&amp;gt;    temp_c_int |= ( ((data[TEMP_MSB] &amp;amp; (1 &amp;lt;&amp;lt; test_bit)) &amp;gt;&amp;gt; test_bit) &amp;lt;&amp;lt; set_bit );&amp;lt;br /&amp;gt;    set_bit--;&amp;lt;br /&amp;gt;  }&amp;lt;br /&amp;gt;  for (test_bit = 7; test_bit &amp;gt;= 4; test_bit--) {&amp;lt;br /&amp;gt;    temp_c_int |= ( ((data[TEMP_LSB] &amp;amp; (1 &amp;lt;&amp;lt; test_bit)) &amp;gt;&amp;gt; test_bit) &amp;lt;&amp;lt; set_bit );&amp;lt;br /&amp;gt;    set_bit--;&amp;lt;br /&amp;gt;  }&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;#ifdef DEBUG&amp;lt;br /&amp;gt;  Serial.print(temp_c_int,DEC);&amp;lt;br /&amp;gt;#endif&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;  /* compute the fractional part */&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;  /*  first figure out what resolution we're measuring in - varies between 1 and 4 bits&amp;lt;br /&amp;gt;   *    after the decimal (based on the contents of the CONFIG_REG byte):&amp;lt;br /&amp;gt;   *        bit 6 == 0 &amp;amp;&amp;amp; bit 5 == 0 --&amp;gt; 9-bit resolution (ignore 3 least sig bits)&amp;lt;br /&amp;gt;   *        bit 6 == 0 &amp;amp;&amp;amp; bit 5 == 1 --&amp;gt; 10-bit resolution (ignore 2 least sig bits)&amp;lt;br /&amp;gt;   *        bit 6 == 1 &amp;amp;&amp;amp; bit 5 == 0 --&amp;gt; 11-bit resolution (ignore 1 least sig bits)&amp;lt;br /&amp;gt;   *        bit 6 == 1 &amp;amp;&amp;amp; bit 5 == 1 --&amp;gt; 12-bit resolution   &amp;lt;br /&amp;gt;   */&amp;lt;br /&amp;gt;  if ((data[CONFIG_REG] &amp;amp; (1 &amp;lt;&amp;lt; 5)) &amp;gt; 0) {        &amp;lt;br /&amp;gt;    if ((data[CONFIG_REG] &amp;amp; (1 &amp;lt;&amp;lt; 4)) &amp;gt; 0) {      // bits 6 and 5 are set&amp;lt;br /&amp;gt;      resolution_floor = 0;&amp;lt;br /&amp;gt;    } else {                                      // bit 6 is set, 5 is clear&amp;lt;br /&amp;gt;      resolution_floor = 1;&amp;lt;br /&amp;gt;    }&amp;lt;br /&amp;gt;  } else {&amp;lt;br /&amp;gt;    if ((data[CONFIG_REG] &amp;amp; (1 &amp;lt;&amp;lt; 4)) &amp;gt; 0) {      // bits 6 is clear, 5 is set&amp;lt;br /&amp;gt;      resolution_floor = 2;&amp;lt;br /&amp;gt;    } else {                                      // bit 6 and 5 are clear&amp;lt;br /&amp;gt;      resolution_floor = 3;&amp;lt;br /&amp;gt;    }&amp;lt;br /&amp;gt;  }    &amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;  temp_c_frac = 0;&amp;lt;br /&amp;gt;  for (test_bit = 3; test_bit &amp;gt;= resolution_floor; test_bit--) {&amp;lt;br /&amp;gt;    if ((data[TEMP_LSB] &amp;amp; (1 &amp;lt;&amp;lt; test_bit)) &amp;gt; 0) {&amp;lt;br /&amp;gt;      expon = test_bit - 4; // will be negative&amp;lt;br /&amp;gt;      temp_c_frac += pow(2,expon);&amp;lt;br /&amp;gt;    }&amp;lt;br /&amp;gt;  }&amp;lt;br /&amp;gt;#ifdef DEBUG&amp;lt;br /&amp;gt;  Serial.print(" ");&amp;lt;br /&amp;gt;  Serial.print(temp_c_frac * 10000,DEC);&amp;lt;br /&amp;gt;#endif&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;  /* put it all together */&amp;lt;br /&amp;gt;  temp_c = (float)temp_c_int + temp_c_frac;  &amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;  if ((data[TEMP_MSB] &amp;amp; (1 &amp;lt;&amp;lt; 7)) &amp;gt; 0) {   // the temp is negative&amp;lt;br /&amp;gt;    temp_c *= -1;&amp;lt;br /&amp;gt;  }&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;  temp_f = c2f(temp_c);&amp;lt;br /&amp;gt;  &amp;lt;br /&amp;gt;  Serial.print(" Cx10k=");&amp;lt;br /&amp;gt;  Serial.print(temp_c * 10000,DEC); // Serial.print truncates after the decimal pt&amp;lt;br /&amp;gt;  Serial.print(" Fx10k=");&amp;lt;br /&amp;gt;  Serial.print(temp_f * 10000,DEC);&amp;lt;br /&amp;gt;  &amp;lt;br /&amp;gt;  Serial.print("\n");  &amp;lt;br /&amp;gt;}&amp;lt;br /&amp;gt;&lt;/pre&gt;&lt;blockquote/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3474577459886827247-1483286378707980398?l=cwjen888.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cwjen888.blogspot.com/feeds/1483286378707980398/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3474577459886827247&amp;postID=1483286378707980398' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/1483286378707980398'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/1483286378707980398'/><link rel='alternate' type='text/html' href='http://cwjen888.blogspot.com/2008/11/ds18b20.html' title='DS18B20'/><author><name>David Chang</name><uri>http://www.blogger.com/profile/05943998889053147615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3474577459886827247.post-122985954012523049</id><published>2008-11-10T20:30:00.001-08:00</published><updated>2008-11-10T20:30:50.486-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Arduino'/><title type='text'>ProtoLab Wiki</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;a href='http://protolab.pbwiki.com/'&gt;protolab wiki&lt;/a&gt;&lt;br/&gt;&lt;blockquote&gt;&lt;a href='http://protolab.pbwiki.com/'&gt;ProtoLab Wiki&lt;/a&gt;.&lt;/blockquote&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3474577459886827247-122985954012523049?l=cwjen888.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cwjen888.blogspot.com/feeds/122985954012523049/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3474577459886827247&amp;postID=122985954012523049' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/122985954012523049'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/122985954012523049'/><link rel='alternate' type='text/html' href='http://cwjen888.blogspot.com/2008/11/protolab-wiki.html' title='ProtoLab Wiki'/><author><name>David Chang</name><uri>http://www.blogger.com/profile/05943998889053147615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3474577459886827247.post-2417864283862353795</id><published>2008-11-10T03:08:00.001-08:00</published><updated>2008-11-10T03:08:29.673-08:00</updated><title type='text'>realtime clock, microseconds, etc.</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;a href='http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1226267355/3'&gt;Arduino Forum - realtime clock, microseconds, etc.&lt;/a&gt;&lt;br/&gt;&lt;blockquote&gt;realtime clock, microseconds, etc.&lt;/blockquote&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3474577459886827247-2417864283862353795?l=cwjen888.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cwjen888.blogspot.com/feeds/2417864283862353795/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3474577459886827247&amp;postID=2417864283862353795' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/2417864283862353795'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/2417864283862353795'/><link rel='alternate' type='text/html' href='http://cwjen888.blogspot.com/2008/11/realtime-clock-microseconds-etc.html' title='realtime clock, microseconds, etc.'/><author><name>David Chang</name><uri>http://www.blogger.com/profile/05943998889053147615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3474577459886827247.post-5088030991697357135</id><published>2008-11-10T03:05:00.001-08:00</published><updated>2008-11-10T03:05:49.565-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='家庭自動化'/><category scheme='http://www.blogger.com/atom/ns#' term='Arduino'/><title type='text'>presice timing with arduino</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;a href='http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1224687834'&gt;Arduino Forum - presice timing with arduino&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;int analogPin = 3;     // potentiometer wiper (middle terminal) connected to analog pin 3&lt;br/&gt;                       // outside leads to ground and +5V&lt;br/&gt;int val = 0;           // variable to store the value read&lt;br/&gt;int sta = 0;           // sta 0 =low 1 = high;&lt;br/&gt;int counter = 0 ;        // conter&lt;br/&gt;int time = 0 ;      &lt;br/&gt;int i = 1;&lt;br/&gt;int ii = 0;&lt;br/&gt;int sample = 50;&lt;br/&gt;void setup()&lt;br/&gt;{&lt;br/&gt;  Serial.begin(115200);          //  setup serial&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;void loop()&lt;br/&gt;{&lt;br/&gt; //  Serial.print(i);&lt;br/&gt;   val = analogRead(analogPin);    // read the input pin  &lt;br/&gt;   &lt;br/&gt;   if (val &amp;gt;= 400){&lt;br/&gt;     if((i-ii) &amp;gt;= 5){&lt;br/&gt;  //   Serial.print(" ");&lt;br/&gt;  //   Serial.print(val);    // debug value   &lt;br/&gt;   ii = i ;  &lt;br/&gt;   counter++ ; &lt;br/&gt;   }&lt;br/&gt;&lt;br/&gt;  // sta = 1;&lt;br/&gt;   &lt;br/&gt;   }else{&lt;br/&gt; // Serial.println(10);&lt;br/&gt;  // sta = 0;&lt;br/&gt;   //  delay(1000);  1 sec&lt;br/&gt;}&lt;br/&gt;//Serial.println();&lt;br/&gt;delay(50); // delay 0.05 sec&lt;br/&gt;&lt;br/&gt;if (i &amp;gt;= 400) {        // passs 20 sec;&lt;br/&gt; time = counter * 3 ;&lt;br/&gt; Serial.println(time);&lt;br/&gt;  i = 1;&lt;br/&gt;  ii = 1;&lt;br/&gt;  counter = 0;&lt;br/&gt; }&lt;br/&gt;i++;&lt;br/&gt;}&lt;br/&gt;&lt;blockquote/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3474577459886827247-5088030991697357135?l=cwjen888.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cwjen888.blogspot.com/feeds/5088030991697357135/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3474577459886827247&amp;postID=5088030991697357135' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/5088030991697357135'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/5088030991697357135'/><link rel='alternate' type='text/html' href='http://cwjen888.blogspot.com/2008/11/presice-timing-with-arduino.html' title='presice timing with arduino'/><author><name>David Chang</name><uri>http://www.blogger.com/profile/05943998889053147615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3474577459886827247.post-3493779141899596692</id><published>2008-11-10T03:00:00.001-08:00</published><updated>2008-11-10T03:00:12.482-08:00</updated><title type='text'>A Simple Moving Average Algorithm</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;a href='http://www.codeproject.com/KB/recipes/SimpleMovingAverage.aspx'&gt;CodeProject: A Simple Moving Average Algorithm. Free source code and programming help&lt;/a&gt;&lt;br/&gt;&lt;blockquote&gt;&lt;a href='http://www.codeproject.com/KB/recipes/SimpleMovingAverage.aspx'&gt;A Simple Moving Average Algorithm&lt;/a&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3474577459886827247-3493779141899596692?l=cwjen888.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cwjen888.blogspot.com/feeds/3493779141899596692/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3474577459886827247&amp;postID=3493779141899596692' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/3493779141899596692'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/3493779141899596692'/><link rel='alternate' type='text/html' href='http://cwjen888.blogspot.com/2008/11/simple-moving-average-algorithm.html' title='A Simple Moving Average Algorithm'/><author><name>David Chang</name><uri>http://www.blogger.com/profile/05943998889053147615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3474577459886827247.post-1262616563011370101</id><published>2008-11-09T20:03:00.001-08:00</published><updated>2008-11-09T20:03:46.319-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Arduino'/><title type='text'>Arduino Pulse Width Modulation</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;div class='entrytitle'&gt;&lt;br /&gt;			&lt;h2&gt;&lt;a title='Permanent Link to Arduino Pulse Width Modulation' rel='bookmark' href='http://principialabs.com/arduino-pulse-width-modulation/'&gt;Arduino Pulse Width Modulation&lt;/a&gt;&lt;/h2&gt; &lt;br /&gt;			&lt;h3&gt;December 8th, 2007&lt;/h3&gt;&lt;br /&gt;		&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;		&lt;br /&gt;			&lt;div class='video'&gt;&lt;br /&gt;&lt;embed height='300' width='380' allowfullscreen='true' allowscriptaccess='always' type='application/x-shockwave-flash' src='http://blip.tv/play/wkegzGEA'&gt; &lt;/embed&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;The digital pins on the Arduino board can be set (with code) to&lt;br /&gt;output either HIGH (5V) or LOW (0V) — essentially ON or OFF. This is&lt;br /&gt;great for applications like blinking LEDs or activating relays.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;But what if we wanted an output voltage somewhere &lt;em&gt;in between&lt;/em&gt; 0V and 5V?  This might be useful in applications like controlling the speed of a DC motor, or “dimming” an LED.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Well, the digital pins cannot directly produce an analog voltage; as&lt;br /&gt;we’ve said, they’re either HIGH or LOW. But it turns out we can &lt;em&gt;simulate&lt;/em&gt; these “in-between” voltages using a technique called Pulse Width Modulation, or PWM.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;span id='more-37'/&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;First off, &lt;em&gt;don’t panic&lt;/em&gt;. PWM sounds complicated, but as&lt;br /&gt;we’ll see, the concept is very simple, and the implementation is even&lt;br /&gt;easier, especially on the Arduino.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Let’s say we want to make an LED shine with half of its normal&lt;br /&gt;intensity when supplied with 5 volts. Since we can’t use the Arduino’s&lt;br /&gt;digital pins to &lt;em&gt;directly&lt;/em&gt; supply 2.5V, we’ll “pulse” the&lt;br /&gt;output pin on and off — really fast. You may have noticed this effect&lt;br /&gt;when you played with the Arduino’s “Blink” sketch. If you blink an LED&lt;br /&gt;fast enough — that is, if the delay between blinks is &lt;em&gt;short enough&lt;/em&gt; — the LED will appear to be lit continuously, but just a little bit dimmer than it was originally.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;It’s easy to visualize this concept using the graphs below. When you&lt;br /&gt;plot voltage over time, you can see that the pin is pulsing between&lt;br /&gt;HIGH and LOW at regular intervals. Since this on-off pulsing is&lt;br /&gt;happening so quickly, the connected LED will “see” the result as a 50%&lt;br /&gt;reduction in the normal voltage (in this example), and will glow at&lt;br /&gt;roughly half its normal intensity.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style='text-align: center;'&gt;&lt;img alt='PWM graph' src='http://principialabs.com/files/pwm-graph1.gif'/&gt;&lt;br/&gt;&lt;small&gt;Image credit: &lt;a alt='' href='http://www.tigoe.net/pcomp/analogout.shtml'&gt;Tom Igoe&lt;/a&gt;&lt;/small&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;We can vary the output voltage percentage (the “effective voltage”)&lt;br /&gt;by regulating — or “modulating” — the width of the pulse. For example,&lt;br /&gt;if we make the HIGH pulse 25% as “wide” (in time) as the LOW pulse, the&lt;br /&gt;LED will appear to glow with 25% intensity.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style='text-align: center;'&gt;&lt;img alt='PWM graph' src='http://principialabs.com/files/pwm-graph2.gif'/&gt;&lt;br/&gt;&lt;small&gt;Image credit: &lt;a alt='' href='http://www.tigoe.net/pcomp/analogout.shtml'&gt;Tom Igoe&lt;/a&gt;&lt;/small&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;“Okay, great,” you’re saying, “But how do I do this on the Arduino?”&lt;br /&gt;Well, there are a couple of ways. First, you could write a sketch that&lt;br /&gt;blinks the LED between HIGH and LOW really fast, as we discussed above.&lt;br /&gt;However, this approach requires the full attention of the Arduino all&lt;br /&gt;the time; that is, if you want the Arduino to do anything else, you’ll&lt;br /&gt;be interrupting the pulse loop.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Luckily, the Arduino designers have already solved this problem for us with three dedicated pins and the &lt;code&gt;analogWrite()&lt;/code&gt; command.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Notice on the Arduino board there are three digital pins (9-11)&lt;br /&gt;which are labeled PWM. Devices (like LEDs) connected to these pins can&lt;br /&gt;employ continuous pulse width modulation using only the &lt;code&gt;analogWrite()&lt;/code&gt; command like so:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class='dp-highlighter'&gt;&lt;div class='bar'&gt;&lt;div class='tools'&gt;&lt;a onclick='dp.sh.Toolbar.Command(&amp;apos;ViewSource&amp;apos;,this);return false;' href='http://principialabs.com/arduino-pulse-width-modulation/#'&gt;view plain&lt;/a&gt;&lt;a onclick='dp.sh.Toolbar.Command(&amp;apos;CopyToClipboard&amp;apos;,this);return false;' href='http://principialabs.com/arduino-pulse-width-modulation/#'&gt;copy to clipboard&lt;/a&gt;&lt;a onclick='dp.sh.Toolbar.Command(&amp;apos;PrintSource&amp;apos;,this);return false;' href='http://principialabs.com/arduino-pulse-width-modulation/#'&gt;print&lt;/a&gt;&lt;a onclick='dp.sh.Toolbar.Command(&amp;apos;About&amp;apos;,this);return false;' href='http://principialabs.com/arduino-pulse-width-modulation/#'&gt;?&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;ol start='1' class='dp-cpp'&gt;&lt;li class='alt'&gt;&lt;span&gt;&lt;span class='comment'&gt;/*&lt;/span&gt; &lt;/span&gt;&lt;/li&gt;&lt;li class=''&gt;&lt;span&gt;&lt;span class='comment'&gt; * A simple PWM example&lt;/span&gt; &lt;/span&gt;&lt;/li&gt;&lt;li class='alt'&gt;&lt;span&gt;&lt;span class='comment'&gt; */&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=''&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;&lt;li class='alt'&gt;&lt;span&gt;&lt;span class='datatypes'&gt;int&lt;/span&gt;&lt;span&gt; pin         =  11;     &lt;/span&gt;&lt;span class='comment'&gt;// LED connected to PWM pin 11&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=''&gt;&lt;span&gt;&lt;span class='datatypes'&gt;int&lt;/span&gt;&lt;span&gt; pulsewidth  =  127;    &lt;/span&gt;&lt;span class='comment'&gt;// Any value between 0 and 255&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class='alt'&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;&lt;li class=''&gt;&lt;span&gt;&lt;span class='keyword'&gt;void&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class='func'&gt;setup&lt;/span&gt;&lt;span&gt;() {  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class='alt'&gt;&lt;span&gt;  &lt;span class='comment'&gt;// None required for analogWrite!&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=''&gt;&lt;span&gt;}  &lt;/span&gt;&lt;/li&gt;&lt;li class='alt'&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;&lt;li class=''&gt;&lt;span&gt;&lt;span class='keyword'&gt;void&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class='func'&gt;loop&lt;/span&gt;&lt;span&gt;() {  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class='alt'&gt;&lt;span&gt;  &lt;span class='datatypes'&gt;analogWrite&lt;/span&gt;&lt;span&gt;(pin, pulsewidth);  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=''&gt;&lt;span&gt;}  &lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;pre class='arduino' name='code' style='display: none;'&gt;/*&lt;br /&gt; * A simple PWM example&lt;br /&gt; */&lt;br /&gt;&lt;br /&gt;int pin         =  11;     // LED connected to PWM pin 11&lt;br /&gt;int pulsewidth  =  127;    // Any value between 0 and 255&lt;br /&gt;&lt;br /&gt;void setup() {&lt;br /&gt;  // None required for analogWrite!&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void loop() {&lt;br /&gt;  analogWrite(pin, pulsewidth);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;The example above should cause the connected LED to glow at about&lt;br /&gt;50% intensity (255/2 = 127ish). Play around with the value of the &lt;code&gt;pulsewidth&lt;/code&gt; variable and note the changes in LED brightness.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Now, let’s take this concept one step further.  What if we &lt;em&gt;varied&lt;/em&gt; the effective voltage to the LED over time?  If we could devise a way to “fade” the &lt;code&gt;pulsewidth&lt;/code&gt;&lt;br /&gt;from zero to 255 and back again, then the LED would pulsate, as in the&lt;br /&gt;video above. Here’s the code for that, using three LEDs this time,&lt;br /&gt;connected to pins 9-11:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class='dp-highlighter'&gt;&lt;div class='bar'&gt;&lt;div class='tools'&gt;&lt;a onclick='dp.sh.Toolbar.Command(&amp;apos;ViewSource&amp;apos;,this);return false;' href='http://principialabs.com/arduino-pulse-width-modulation/#'&gt;view plain&lt;/a&gt;&lt;a onclick='dp.sh.Toolbar.Command(&amp;apos;CopyToClipboard&amp;apos;,this);return false;' href='http://principialabs.com/arduino-pulse-width-modulation/#'&gt;copy to clipboard&lt;/a&gt;&lt;a onclick='dp.sh.Toolbar.Command(&amp;apos;PrintSource&amp;apos;,this);return false;' href='http://principialabs.com/arduino-pulse-width-modulation/#'&gt;print&lt;/a&gt;&lt;a onclick='dp.sh.Toolbar.Command(&amp;apos;About&amp;apos;,this);return false;' href='http://principialabs.com/arduino-pulse-width-modulation/#'&gt;?&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;ol start='1' class='dp-cpp'&gt;&lt;li class='alt'&gt;&lt;span&gt;&lt;span class='comment'&gt;/*&lt;/span&gt; &lt;/span&gt;&lt;/li&gt;&lt;li class=''&gt;&lt;span&gt;&lt;span class='comment'&gt; * Pulsating LEDs with Pulse Width Modulation&lt;/span&gt; &lt;/span&gt;&lt;/li&gt;&lt;li class='alt'&gt;&lt;span&gt;&lt;span class='comment'&gt; */&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=''&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;&lt;li class='alt'&gt;&lt;span&gt;&lt;span class='datatypes'&gt;int&lt;/span&gt;&lt;span&gt; green   = 11;            &lt;/span&gt;&lt;span class='comment'&gt;// Digital pin 11 - Green LED&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=''&gt;&lt;span&gt;&lt;span class='datatypes'&gt;int&lt;/span&gt;&lt;span&gt; red     = 10;            &lt;/span&gt;&lt;span class='comment'&gt;// Digital pin 10 - Red LED&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class='alt'&gt;&lt;span&gt;&lt;span class='datatypes'&gt;int&lt;/span&gt;&lt;span&gt; blue    = 9;             &lt;/span&gt;&lt;span class='comment'&gt;// Digital pin 9  - Blue LED&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=''&gt;&lt;span&gt;&lt;span class='datatypes'&gt;int&lt;/span&gt;&lt;span&gt; time    = 5;             &lt;/span&gt;&lt;span class='comment'&gt;// define delay element&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class='alt'&gt;&lt;span&gt;&lt;span class='datatypes'&gt;int&lt;/span&gt;&lt;span&gt; pulsewidth;              &lt;/span&gt;&lt;span class='comment'&gt;// define pulsewidth (0-255)&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=''&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;&lt;li class='alt'&gt;&lt;span&gt;&lt;span class='keyword'&gt;void&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class='func'&gt;setup&lt;/span&gt;&lt;span&gt;() {  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=''&gt;&lt;span&gt;  &lt;span class='comment'&gt;// None required for analogWrite!&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class='alt'&gt;&lt;span&gt;}  &lt;/span&gt;&lt;/li&gt;&lt;li class=''&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;&lt;li class='alt'&gt;&lt;span&gt;&lt;span class='keyword'&gt;void&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class='func'&gt;loop&lt;/span&gt;&lt;span&gt;() {  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=''&gt;&lt;span&gt;  &lt;span class='comment'&gt;// slowly fade the LEDs to full brightness&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class='alt'&gt;&lt;span&gt;  &lt;span class='keyword'&gt;for&lt;/span&gt;&lt;span&gt; (pulsewidth=0; pulsewidth &amp;lt;= 255; pulsewidth++){  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=''&gt;&lt;span&gt;    &lt;span class='datatypes'&gt;analogWrite&lt;/span&gt;&lt;span&gt;(green, pulsewidth);  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class='alt'&gt;&lt;span&gt;    &lt;span class='datatypes'&gt;analogWrite&lt;/span&gt;&lt;span&gt;(red, pulsewidth);  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=''&gt;&lt;span&gt;    &lt;span class='datatypes'&gt;analogWrite&lt;/span&gt;&lt;span&gt;(blue, pulsewidth);  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class='alt'&gt;&lt;span&gt;    &lt;span class='datatypes'&gt;delay&lt;/span&gt;&lt;span&gt;(time);  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=''&gt;&lt;span&gt;  }  &lt;/span&gt;&lt;/li&gt;&lt;li class='alt'&gt;&lt;span&gt;  &lt;span class='comment'&gt;// slowly dim the LEDs&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=''&gt;&lt;span&gt;  &lt;span class='keyword'&gt;for&lt;/span&gt;&lt;span&gt; (pulsewidth=255; pulsewidth &amp;gt;= 0; pulsewidth--){  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class='alt'&gt;&lt;span&gt;    &lt;span class='datatypes'&gt;analogWrite&lt;/span&gt;&lt;span&gt;(green, pulsewidth);  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=''&gt;&lt;span&gt;    &lt;span class='datatypes'&gt;analogWrite&lt;/span&gt;&lt;span&gt;(red, pulsewidth);  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class='alt'&gt;&lt;span&gt;    &lt;span class='datatypes'&gt;analogWrite&lt;/span&gt;&lt;span&gt;(blue, pulsewidth);  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=''&gt;&lt;span&gt;    &lt;span class='datatypes'&gt;delay&lt;/span&gt;&lt;span&gt;(time);  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class='alt'&gt;&lt;span&gt;  }  &lt;/span&gt;&lt;/li&gt;&lt;li class=''&gt;&lt;span&gt;}  &lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;pre class='arduino' name='code' style='display: none;'&gt;/*&lt;br /&gt; * Pulsating LEDs with Pulse Width Modulation&lt;br /&gt; */&lt;br /&gt;&lt;br /&gt;int green   = 11;            // Digital pin 11 - Green LED&lt;br /&gt;int red     = 10;            // Digital pin 10 - Red LED&lt;br /&gt;int blue    = 9;             // Digital pin 9  - Blue LED&lt;br /&gt;int time    = 5;             // define delay element&lt;br /&gt;int pulsewidth;              // define pulsewidth (0-255)&lt;br /&gt;&lt;br /&gt;void setup() {&lt;br /&gt;  // None required for analogWrite!&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void loop() {&lt;br /&gt;  // slowly fade the LEDs to full brightness&lt;br /&gt;  for (pulsewidth=0; pulsewidth &amp;lt;= 255; pulsewidth++){&lt;br /&gt;    analogWrite(green, pulsewidth);&lt;br /&gt;    analogWrite(red, pulsewidth);&lt;br /&gt;    analogWrite(blue, pulsewidth);&lt;br /&gt;    delay(time);&lt;br /&gt;  }&lt;br /&gt;  // slowly dim the LEDs&lt;br /&gt;  for (pulsewidth=255; pulsewidth &amp;gt;= 0; pulsewidth--){&lt;br /&gt;    analogWrite(green, pulsewidth);&lt;br /&gt;    analogWrite(red, pulsewidth);&lt;br /&gt;    analogWrite(blue, pulsewidth);&lt;br /&gt;    delay(time);&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3474577459886827247-1262616563011370101?l=cwjen888.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cwjen888.blogspot.com/feeds/1262616563011370101/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3474577459886827247&amp;postID=1262616563011370101' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/1262616563011370101'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/1262616563011370101'/><link rel='alternate' type='text/html' href='http://cwjen888.blogspot.com/2008/11/arduino-pulse-width-modulation.html' title='Arduino Pulse Width Modulation'/><author><name>David Chang</name><uri>http://www.blogger.com/profile/05943998889053147615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3474577459886827247.post-6359650509839220445</id><published>2008-11-09T09:23:00.001-08:00</published><updated>2008-11-09T09:23:49.227-08:00</updated><title type='text'>Optical Heart Rate Monitor</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;a href='http://www.emant.com/694006.page'/&gt;&lt;h1&gt;Optical Heart Rate Monitor&lt;/h1&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Pulse Oximetry is a non invasive method of measuring a person's oxygenation&lt;br /&gt;level. It monitors the percentage of haemoglobin (Hb) which is&lt;br /&gt;saturated with oxygen. A probe is attached to the patient's finger or&lt;br /&gt;ear lobe comprising LEDs and photodetector. As the light from the two&lt;br /&gt;LEDs (red - 660 nm and infrared - 950 nm) pass through the body&lt;br /&gt;tissues to a photodetector, it is absorbed by blood and soft tissue.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;The light absorption rate at the two wavelengths by the hemoglobin is&lt;br /&gt;different and depends on the degree of oxygenation. The light level&lt;br /&gt;changes as the blood is pumped by the heart. As a consequence, the&lt;br /&gt;oximeter also measures the heart rate in beats per minute (BPM).&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;In this application note, we create a heart rate monitor by using one IR&lt;br /&gt;LED &amp;amp; phototransistor pair and observing the waveform at the&lt;br /&gt;phototransistor output. This is intended for illustrating a typical&lt;br /&gt;light sensor application and not intended for actual medical use. The&lt;br /&gt;accompanying video also shows the typical low level signals involved&lt;br /&gt;in this type of circuit and how the dynamic range from a 24 bit ADC (&lt;a href='http://www.emant.com/251004.page'&gt;EMANT300 USB DAQ&lt;/a&gt;)&lt;br /&gt;allows such signals to be observed without further signal&lt;br /&gt;conditioning.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;img height='96' width='123' border='0' align='left' name='graphics2' src='http://www.emant.com/image/HRM_html_4dcf63de.png'/&gt;The&lt;br /&gt;TCRT1010 have a compact construction where the emitting-light source&lt;br /&gt;and the detector are arranged in the same direction to sense the&lt;br /&gt;presence of an object by using the reflective IR-beam from the&lt;br /&gt;object. The operating wavelength is 950 nm. The detector is a&lt;br /&gt;phototransistor. Together with the &lt;a href='http://www.emant.com/251004.page'&gt;EMANT300 USB DAQ&lt;/a&gt;, they form a computerbased optical heart monitor&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;img height='316' width='336' border='0' name='graphics1' src='http://www.emant.com/image/HRM_html_4a0885a4.gif'/&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Fig 1 : Optical heart rate monitor schematic - Connections to the &lt;a href='http://www.emant.com/251004.page'&gt;EMANT300 USB DAQ&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;img height='209' width='471' border='0' name='graphics5' src='http://www.emant.com/image/HRM_html_6faa80c6.JPG'/&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;IR emitter and detector encased in velcro&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;The&lt;br /&gt;following C# .NET program uses the EmantHRM component. This component&lt;br /&gt;takes the voltage read at the emitter of the phototransistor and&lt;br /&gt;converts it to heart rate in BPM (beats per minute)&lt;br/&gt;&lt;br /&gt;&lt;img height='239' width='178' border='0' name='graphics4' src='http://www.emant.com/image/HRM_html_43d18b82.png'/&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p lang='' style='margin-bottom: 0in;' class='western'&gt;&lt;font color='#0000ff'&gt;&lt;font face='Courier New, monospace'&gt;&lt;font size='2' style='font-size: 9pt;'&gt;private&lt;br /&gt;void button1_Click(object sender, EventArgs e)&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;br /&gt;&lt;p lang='' style='margin-bottom: 0in;' class='western'&gt;&lt;font color='#0000ff'&gt;&lt;font face='Courier New, monospace'&gt;&lt;font size='2' style='font-size: 9pt;'&gt;{&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;br /&gt;&lt;p lang='' style='margin-bottom: 0in;' class='western'&gt;&lt;font color='#0000ff'&gt;&lt;br /&gt;   &lt;font face='Courier New, monospace'&gt;&lt;font size='2' style='font-size: 9pt;'&gt;hrm1.Open();&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;br /&gt;&lt;p lang='' style='margin-bottom: 0in;' class='western'&gt;&lt;font color='#0000ff'&gt;&lt;br /&gt;   &lt;font face='Courier New, monospace'&gt;&lt;font size='2' style='font-size: 9pt;'&gt;label2.Text&lt;br /&gt;= hrm1.HwId;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;br /&gt;&lt;p lang='' style='margin-bottom: 0in;' class='western'&gt;&lt;font color='#0000ff'&gt;&lt;font face='Courier New, monospace'&gt;&lt;font size='2' style='font-size: 9pt;'&gt;}&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;br /&gt;&lt;p lang='' style='margin-bottom: 0in;' class='western'&gt;&lt;br/&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p lang='' style='margin-bottom: 0in;' class='western'&gt;&lt;font color='#0000ff'&gt;&lt;font face='Courier New, monospace'&gt;&lt;font size='2' style='font-size: 9pt;'&gt;private&lt;br /&gt;void button2_Click(object sender, EventArgs e)&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;br /&gt;&lt;p lang='' style='margin-bottom: 0in;' class='western'&gt;&lt;font color='#0000ff'&gt;&lt;font face='Courier New, monospace'&gt;&lt;font size='2' style='font-size: 9pt;'&gt;{&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;br /&gt;&lt;p lang='' style='margin-bottom: 0in;' class='western'&gt;&lt;font color='#0000ff'&gt;&lt;br /&gt;   &lt;font face='Courier New, monospace'&gt;&lt;font size='2' style='font-size: 9pt;'&gt;hrm1.Close();&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;br /&gt;&lt;p lang='' style='margin-bottom: 0in;' class='western'&gt;&lt;font color='#0000ff'&gt;&lt;font face='Courier New, monospace'&gt;&lt;font size='2' style='font-size: 9pt;'&gt;}&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;br /&gt;&lt;p lang='' style='margin-bottom: 0in;' class='western'&gt;&lt;br/&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p lang='' style='margin-bottom: 0in;' class='western'&gt;&lt;font color='#0000ff'&gt;&lt;font face='Courier New, monospace'&gt;&lt;font size='2' style='font-size: 9pt;'&gt;private&lt;br /&gt;void hrm1_onValidHR(object sender, EventArgs e)&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;br /&gt;&lt;p lang='' style='margin-bottom: 0in;' class='western'&gt;&lt;font color='#0000ff'&gt;&lt;font face='Courier New, monospace'&gt;&lt;font size='2' style='font-size: 9pt;'&gt;{&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;br /&gt;&lt;p lang='' style='margin-bottom: 0in;' class='western'&gt;&lt;font color='#0000ff'&gt;&lt;br /&gt;   &lt;font face='Courier New, monospace'&gt;&lt;font size='2' style='font-size: 9pt;'&gt;label1.Text&lt;br /&gt;= hrm1.Value.ToString();&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;br /&gt;&lt;p lang='' style='margin-bottom: 0in;' class='western'&gt;&lt;font color='#0000ff'&gt;&lt;font face='Courier New, monospace'&gt;&lt;font size='2' style='font-size: 9pt;'&gt;}&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;br /&gt;&lt;p lang='' style='margin-bottom: 0in;' class='western'&gt;&lt;br/&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p lang='' style='margin-bottom: 0in;' class='western'&gt;&lt;font color='#0000ff'&gt;&lt;font face='Courier New, monospace'&gt;&lt;font size='2' style='font-size: 9pt;'&gt;private&lt;br /&gt;void button3_Click(object sender, EventArgs e)&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;br /&gt;&lt;p lang='' style='margin-bottom: 0in;' class='western'&gt;&lt;font color='#0000ff'&gt;&lt;font face='Courier New, monospace'&gt;&lt;font size='2' style='font-size: 9pt;'&gt;{&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;br /&gt;&lt;p lang='' style='margin-bottom: 0in;' class='western'&gt;&lt;font color='#0000ff'&gt;&lt;br /&gt;   &lt;font face='Courier New, monospace'&gt;&lt;font size='2' style='font-size: 9pt;'&gt;hrm1.Show();&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;br /&gt;&lt;p lang='' style='margin-bottom: 0in;' class='western'&gt;&lt;font color='#0000ff'&gt;&lt;font face='Courier New, monospace'&gt;&lt;font size='2' style='font-size: 9pt;'&gt;}&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;img height='136' width='177' border='0' align='right' name='graphics8' src='http://www.emant.com/image/HRM_html_m3f51b91f.JPG'/&gt;When the console program is first run, the user to place his/her finger on&lt;br /&gt;the sensor.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;When a finger is&lt;br /&gt;placed on the phototransistor, the voltage read rises above 0.3V. If&lt;br /&gt;a good contact is made, a sinusoidal type signal is observed. As the&lt;br /&gt;signal rides on a fluctuating DC signal, a simple differential signal&lt;br /&gt;is created. From maths, we know that when a max or min is reached,&lt;br /&gt;its differential value is zero. After this an autocorrelation&lt;br /&gt;function is applied and the peaks extracted to obtain the heart rate.&lt;br /&gt;When the signal is noisy, a wrong BPM will be calculated. Any count&lt;br /&gt;that is obviously wrong is ignored. This is all taken care of by the&lt;br /&gt;HRM class. The HRM class is written in C#. You can improve on it&lt;br /&gt;using the Visual C# 2005 Express.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Clicking on the &lt;a href='mms://205.178.152.122/1259965/hrm.wmv'&gt;Show&lt;br /&gt;Waveform button&lt;/a&gt; shows the filtered waveform seen at the&lt;br /&gt;phototransistor. You will achieve a good heart rate if your waveform&lt;br /&gt;is as seen below.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;img height='343' width='461' border='0' align='left' name='graphics3' src='http://www.emant.com/image/HRM_html_mfd942a5.png'/&gt;&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3474577459886827247-6359650509839220445?l=cwjen888.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cwjen888.blogspot.com/feeds/6359650509839220445/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3474577459886827247&amp;postID=6359650509839220445' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/6359650509839220445'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/6359650509839220445'/><link rel='alternate' type='text/html' href='http://cwjen888.blogspot.com/2008/11/optical-heart-rate-monitor.html' title='Optical Heart Rate Monitor'/><author><name>David Chang</name><uri>http://www.blogger.com/profile/05943998889053147615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3474577459886827247.post-8916273835837780508</id><published>2008-11-06T02:07:00.001-08:00</published><updated>2008-11-06T02:07:26.235-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='生活'/><title type='text'>无线型睡眠呼吸暂停症监视系统</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;h1&gt;&lt;strong&gt;前言&lt;br/&gt;&lt;/strong&gt;&lt;br/&gt;　　睡眠呼吸暂停症是一种很常见的睡眠呼吸疾病，根据研究调查，在美国约有24%的成年男性及9%成年女性或超过200万人口患有此疾病，在中国台湾至少有35万人也有此问题。&lt;br/&gt;&lt;br/&gt;　&lt;br /&gt;　一般在诊断患者是否罹患睡眠呼吸暂停症是指患者在睡眠中出现呼吸暂停和低通气的总次数超过每小时5次。其中呼吸暂停是指在睡眠中，出现10秒以上的呼吸&lt;br /&gt;气流消失，低通气是指呼吸气流并未完全停止，只是减少到原来的20%~50%，同时血氧浓度下降4%以上的呼吸紊乱。目前医生在诊断睡眠呼吸暂停症时常使&lt;br /&gt;用夜间睡眠呼吸多项生理监测仪，记录一整夜的睡眠周期，其中包括呼吸暂停以及呼吸变浅的次数、型态、缺氧指数、次数、心电图的变化、口鼻腔气流、胸腹部呼&lt;br /&gt;吸运动、耳垂血氧等信号的记录、打鼾次数等情形。使用夜间睡眠呼吸多项生理监测仪虽然精确，但需要在身上配戴多种仪器，也必须在特定的医院中由专业人士操&lt;br /&gt;作才能进行测量，非常不方便也容易影响患者的睡眠，所以不适合做长期的监测。因此一般患者除非到了非常严重的地步是不会走进医院进行这项检查。更何况睡眠&lt;br /&gt;呼吸多项生理监测仪是一项价格昂贵的仪器，一般患者不会购买在居家中自行测量，所以很难达到普遍性。本系统主要针对这些缺点发展出一套使用简单、察觉性更&lt;br /&gt;低、价格低廉及适合在居家睡眠环境下作长期监测的监测系统，达到帮助医师了解病患的病情，并提供医生追踪治疗过程的改善情形。&lt;br /&gt;&lt;/h1&gt;&lt;p&gt;&lt;strong&gt;　　研究方法与系统设计&lt;br/&gt;&lt;/strong&gt;&lt;br/&gt;　　图1为系统方块图。本系统是由(1)生理参数测量计及(2)生理参&lt;br /&gt;数分析器所构成。生理参数测量计包含有生理信号感测装置、微控制器。生理参数分析器则是利用蓝牙无线模块接收生理测量计所测量到的生理参数数据，加以分&lt;br /&gt;析，并以具亲和力的操作画面显示出来，提供病患睡眠生理变化情形。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;img height='310' border='0' width='500' src='http://www.eeworld.com.cn/uploadfile/medical_electronics/uploadfile/200807/20080713084545863.jpg' alt=''/&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;图1  无线型睡眠呼吸暂停症监视系统方块图&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;　　生理参数测量计&lt;br/&gt;&lt;/strong&gt;&lt;br/&gt;　　·生理信号感测装置&lt;br/&gt;　　心跳变化使用的感测组件为光传感器，主要利用人体心脏收缩时血管中的血流量及血氧浓度会因此而产生变化。本系统采用光耦合器(CNY70)利用光反射法侦测血管末端血流量的变化。图2为光耦合器CNY70内部架构及动作原理。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;img height='145' border='0' width='500' src='http://www.eeworld.com.cn/uploadfile/medical_electronics/uploadfile/200807/20080713084545268.jpg' alt=''/&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;图2  光耦合器CNY70内部架构及动作原理&lt;br/&gt;&lt;br/&gt;　　音频信号接收器主要是接收睡眠时因呼吸道阻塞所产生的鼾声，本系统采用电容式音&lt;br /&gt;频接收器作为信号接收的主要组件，利用接收音波压力改变振动膜的位移量，使振动膜与铝质外壳间的电容CT随着音波强弱改变电容量，再经FET完成阻抗的转&lt;br /&gt;换产生RECM，使REXT和RECM的分压改变，得到不同的输出。图3为音频接受器内部架构及动作原理。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;img height='480' border='0' width='408' src='http://www.eeworld.com.cn/uploadfile/medical_electronics/uploadfile/200807/20080713084546909.jpg' alt=''/&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;图3  音频接受器内部架构及动作原理&lt;br/&gt;&lt;br/&gt;　　呼吸传感器的工作原理是利用呼吸时胸腔会产生起伏而拉动卧式可变电阻因而产生电阻值的改变。&lt;br/&gt;　　&lt;br/&gt;·生理信号感测电路&lt;br/&gt;&lt;br/&gt;　　1.心跳感测电路&lt;br/&gt;　&lt;br /&gt;　图4为心跳感测电路方块图。心跳变化时，传感器所测量到的信号，包含有直流偏压(DC&lt;br /&gt;Offset)、心跳变化的信号、呼吸及肌肉颤动、60Hz及高频的噪声，其中心跳变化的信号为所需的信号，其它信号一律视为噪声，因此分别采用硬件的前&lt;br /&gt;置滤波电路及软件两种处理方式，以消除不同的噪声对测量所造成的影响。前置滤波电路主要特点是可以减轻软件程序进行数字信号处理所需的运算量及时间，避免&lt;br /&gt;造成信号处理过程中延迟情形。图5为心跳信号之波形。图6为将心跳信号转换成数字信号之波形。图7为心跳感测电路。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;　　图4  心跳感测电路方块图&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;img height='306' border='0' width='500' src='http://www.eeworld.com.cn/uploadfile/medical_electronics/uploadfile/200807/20080713084546695.jpg' alt=''/&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;6  心跳信号转换后波形                            图5  心跳信号转换前波形图&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;img height='273' border='0' width='500' src='http://www.eeworld.com.cn/uploadfile/medical_electronics/uploadfile/200807/20080713084546443.jpg' alt=''/&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;图7 心跳感测电路&lt;br/&gt;&lt;br/&gt;　　2.鼾声感测电路&lt;br/&gt;　　图8为鼾声感测电路方块图。以音频接收器测量到的鼾声信号包含很多噪声及背景&lt;br /&gt;杂音的影响，必须利用硬件滤波器去除高频、低频噪声只留下鼾声频带内的信号，Smithson[1995]研究中显示鼾声的频率大约在1~200Hz的声&lt;br /&gt;音频带内，其它声音的频率域则较广。首先由音频接收器从量得的信号，信号放大，再经由200Hz低通滤波器滤除其它声音所造成的噪声干扰。图10为将鼾声&lt;br /&gt;信号转换成数字信号之波形。图11为鼾声感测电路。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;　　图8  鼾声感测电路方块图&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;img height='297' border='0' width='500' src='http://www.eeworld.com.cn/uploadfile/medical_electronics/uploadfile/200807/20080713084546927.jpg' alt=''/&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;图10  鼾声信号转换后波形                  图9  鼾声信号转换前波形&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;img height='381' border='0' width='500' src='http://www.eeworld.com.cn/uploadfile/medical_electronics/uploadfile/200807/20080713084546948.jpg' alt=''/&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;图11  鼾声感测电路&lt;br/&gt;&lt;br/&gt;　　3.呼吸感测电路&lt;br/&gt;　　图12为呼吸感测电路方块图。利用呼吸时胸腔的起伏拉动卧式可变电阻改变电阻值因而产生的电压变化，经由信号放大电路、比较电路，即可判断呼吸的情形。图13为呼吸信号波形。图14为呼吸感测电路。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;　　图12  呼吸感测电路方块图&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;img height='324' border='0' width='500' src='http://www.eeworld.com.cn/uploadfile/medical_electronics/uploadfile/200807/20080713084546270.jpg' alt=''/&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;图13  呼吸信号波形&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;img height='242' border='0' width='500' src='http://www.eeworld.com.cn/uploadfile/medical_electronics/uploadfile/200807/20080713084546833.jpg' alt=''/&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;图14 呼吸感测电路&lt;br/&gt;&lt;br/&gt;　　·CPU及显示电路 &lt;br/&gt;　　图15所示为本系统CPU及显示电路。CPU是使用盛群半导体股份有限&lt;br /&gt;公司所生产的HT46R24微控制器，其中由Port A 及Port C驱动15*4中文显示型LCD，作为生理参数数据的显示，Port&lt;br /&gt;B为生理参数及定时器的输入端，而Port D则经过MAX232准位转换做串行传输。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;img height='294' border='0' width='500' src='http://www.eeworld.com.cn/uploadfile/medical_electronics/uploadfile/200807/20080713084546248.jpg' alt=''/&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;　　图15 CPU及显示电路&lt;br/&gt;&lt;br/&gt;　　·固件程序&lt;br/&gt;　　生理参数测量计之程序如下：在生理参数测量时为了避免读取到身体翻转时的&lt;br /&gt;错误信号，利用多重读取的方式加以避免，在信号变化时连续读取，且每次读取间加入一段时间延迟，再经过比对读取的信号是否相同，此方式可降低信号读取时的&lt;br /&gt;错误率。处理完成后的生理参数资料存放于微控制器的缓存器，并通过中文型LCD显示所测量到的生理参数。蓝牙无线模块传输方面，主要将储存在微控制器内部&lt;br /&gt;缓存器的生理参数数据通过RS-232串行传输与个人计算机间做数据通讯。&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;　　生理参数分析器&lt;br/&gt;&lt;/strong&gt;&lt;br/&gt;　&lt;br /&gt;　以Visual&lt;br /&gt;Basic6.0为开发工具，通过蓝牙无线模块接收由生理参数测量计所传输的生理参数数据，储存于数据库中，并将每个时间点的生理参数进行分析，连接&lt;br /&gt;Excel将每个时间点所测量的生理参数资料进行分析及统合以曲线图的方式显示每个时间点的生理变化状况，让医师在诊断上更加方便。 &lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;　　结果&lt;br/&gt;&lt;/strong&gt;&lt;br/&gt;　　图16为由医院所取得正确的数据经过本系统实际仿真测量所得之曲线分析图。本系统提供一组一般正常睡眠时的呼吸生理参数数据及曲线图，增加医师在比对及判断的方便性。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;img height='290' border='0' width='500' src='http://www.eeworld.com.cn/uploadfile/medical_electronics/uploadfile/200807/20080713084547935.jpg' alt=''/&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;图16 生理参数经过帕线分析后结果显示&lt;br/&gt;&lt;br/&gt;　　图16上方为未罹患睡眠呼吸暂停症的睡眠呼吸生理变化情形；下方则为罹患睡眠呼吸暂停症患者睡眠时的睡眠生理变化情形。&lt;br/&gt;&lt;br/&gt;　　表1为图16各个颜色曲线所代表的意义。&lt;br/&gt;&lt;br/&gt;　&lt;br /&gt;　图16曲线分析及比对可以发现，睡眠呼吸暂停症的患者睡眠时呼吸通常伴随着鼾声，当有睡眠呼吸暂停的情况发生，心跳次数在同一时间域内有非常明显的下降&lt;br /&gt;情形，因此能判断罹患睡眠呼吸暂停症的患者在长期未接受有关睡眠呼吸暂停症治疗的情况下，心脏长期在睡眠时未有规律的跳动而容易罹患有关心血管方面的疾&lt;br /&gt;病。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;　　结语&lt;br/&gt;&lt;/strong&gt;&lt;br/&gt;　　在设计单芯片微控制器的软件时，必须以时间轴为基准，测量各项生理参数，才能于重&lt;br /&gt;建时找出各个生理参数间的关系。为了使生理参数测量计的体积小型化，必须选择低消耗电量及体积较小的组件，并使用微控制器使整体电源消耗最小化。蓝牙无线&lt;br /&gt;传输模块为低功率消耗且高安全性的无线数据传输设备。&lt;br/&gt;&lt;br/&gt;　　在生理参数测量时，必须将生理信号感测装置固定于患者身体上，因为睡觉时头部、&lt;br /&gt;身体移动和翻转，容易造成测量设备的脱落及不正确的测量数据，此时不正确的测量多少会影响医师对症状的评估。所以生理参数测量计的传感器体积必须要很小，&lt;br /&gt;固定容易、不易脱落及避免影响患者的睡眠，处理生理参数的数据时，必须要先利用滤波器，将其噪声除去，只显示真正的睡眠呼吸的生理参数的波形，这样才更容&lt;br /&gt;易得到准确的生理参数，进而提高医师诊断上的正确性。&lt;br/&gt;&lt;br/&gt;　　另外，要配合生理参数测量计内各个电路模块，系统的电源供应就显得很重要。传统&lt;br /&gt;电源处理方式是由电力公司所提供110V&lt;br /&gt;60Hz(编者注：此指标为台湾电力)的电源经由一个重量、体积不小的变压器，经过不断的整流及稳压才能得到系统所需的电压，而此过程所产生温度容易因为&lt;br /&gt;散热不完全而导致组件容易损毁。为了要让生理参数测量计体积小、重量轻、且不会产生高温，因此生理参数测量计采用市面上110V 60Hz转换成5V&lt;br /&gt;1A的电源转换器，提供微控制器使用，再通过直流转直流-双组-电源转换器转成感测电路模块所需的±5V电源，相较于以往不但降低电源设计的难度，使得携&lt;br /&gt;带更加的方便。&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3474577459886827247-8916273835837780508?l=cwjen888.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cwjen888.blogspot.com/feeds/8916273835837780508/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3474577459886827247&amp;postID=8916273835837780508' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/8916273835837780508'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/8916273835837780508'/><link rel='alternate' type='text/html' href='http://cwjen888.blogspot.com/2008/11/blog-post_06.html' title='无线型睡眠呼吸暂停症监视系统'/><author><name>David Chang</name><uri>http://www.blogger.com/profile/05943998889053147615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3474577459886827247.post-8974333178150413932</id><published>2008-11-04T22:40:00.001-08:00</published><updated>2008-11-17T19:22:03.891-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='生活'/><title type='text'>慶餘堂枇杷膏</title><content type='html'>&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3474577459886827247-8974333178150413932?l=cwjen888.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cwjen888.blogspot.com/feeds/8974333178150413932/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3474577459886827247&amp;postID=8974333178150413932' title='2 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/8974333178150413932'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/8974333178150413932'/><link rel='alternate' type='text/html' href='http://cwjen888.blogspot.com/2008/11/blog-post.html' title='慶餘堂枇杷膏'/><author><name>David Chang</name><uri>http://www.blogger.com/profile/05943998889053147615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3474577459886827247.post-8545751864213410318</id><published>2008-10-30T10:17:00.001-07:00</published><updated>2008-10-30T10:17:04.137-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='家庭自動化'/><category scheme='http://www.blogger.com/atom/ns#' term='Arduino'/><title type='text'>方案網</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;a href='http://www.myesw.cn/'&gt;http://www.myesw.cn/&lt;/a&gt;&lt;br/&gt;&lt;blockquote/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3474577459886827247-8545751864213410318?l=cwjen888.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cwjen888.blogspot.com/feeds/8545751864213410318/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3474577459886827247&amp;postID=8545751864213410318' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/8545751864213410318'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/8545751864213410318'/><link rel='alternate' type='text/html' href='http://cwjen888.blogspot.com/2008/10/blog-post_30.html' title='方案網'/><author><name>David Chang</name><uri>http://www.blogger.com/profile/05943998889053147615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3474577459886827247.post-6066474500459788428</id><published>2008-10-30T10:06:00.001-07:00</published><updated>2008-10-30T10:06:50.094-07:00</updated><title type='text'>RFID的全面介紹和資料</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;a href='http://www.haifeng.idv.tw/leo/cgi-bin/topic.cgi?forum=110&amp;amp;topic=1989&amp;amp;show=0'&gt;&lt;span style='color: rgb(122, 31, 122); font-size: 12px;' id='post1'&gt;一、RFID的全面介紹和資料&lt;br/&gt;&lt;br/&gt;如何管理比澳洲人口多得的袋鼠？人類發射到太空中的東西如何追蹤？病人不到醫院去，醫生如何檢測並得出第一手的腦電波、心電圖資料資料?超市中條碼大量的破舊、損害怎麼辦？……這些問題似乎困難而且沒有必然聯繫，但是用RFID技術可以解決上述的所用問題。 &lt;br/&gt;&lt;br/&gt;RFID是英文“Radio Frequency Identification”的縮寫，中文稱為無線射頻身份識別、感應式電子晶片或是近接卡、感應卡、非接觸卡...等等，是非接觸式自動識別技術的一種。&lt;br/&gt;&lt;br/&gt;1、起源&lt;br/&gt;RFID最早曾在第二次世界大戰中用來在空中作戰行動中進行敵我識別：當時英國用以確認進機場的是否為己方的飛機，以免遭誤擊。&lt;br/&gt;&lt;br/&gt;20&lt;br /&gt;世紀90年代起，這項技術被美國軍方廣泛使用在武器和後勤管理系統上。美國在“伊拉克戰爭”中利用RFID對武器和物資進行了非常準確地調配，保證了前線&lt;br /&gt;彈藥和物資的準確供應。和以往的“充足”供應有所不同，現代化的管理強調的是準確供應，也就是需要多少就提供多少，因為多餘的供應會增加不必要的管理成&lt;br /&gt;本。&lt;br/&gt;&lt;br/&gt;許多歐美國家高速公路有電子收費站，只要憑著黏在車上的RFID辨識卡片，就可直接通過收費道、自動扣款，不須停車。&lt;br/&gt;&lt;br/&gt;2、RFID原理&lt;br/&gt;1. 標籤(Tag，即射頻卡)：由耦合元件及晶片組成，標籤含有內置天線，用於和射頻天線間進行通信。 &lt;br/&gt;2. 閱讀器（Reader）：讀取(在讀寫卡中還可以寫入)標籤資訊的設備。&lt;br/&gt;3. 天線（Antenna）：在標籤和讀取器間傳遞射頻信號。&lt;br/&gt;&lt;br/&gt;系&lt;br /&gt;統的基本工作流程是：閱讀器通過發射天線發送一定頻率的射頻信號，當射頻卡進入發射天線工作區域時產生感應電流，射頻卡獲得能量被啟動；射頻卡將自身編碼&lt;br /&gt;等資訊通過卡內置發送天線發送出去；系統接收天線接收到從射頻卡發送來的載波信號，經天線調節器傳送到閱讀器，閱讀器對接收的信號進行解調和解碼然後送到&lt;br /&gt;後臺主系統進行相關處理；主系統根據邏輯運算判斷該卡的合法性，針對不同的設定做出相應的處理和控制，發出指令信號控制執行機構動作。&lt;br/&gt;以往使用條碼，由於長度的限制，物流行業只能給每一類產品定義一個類碼，就是說，一批牛奶，不管保質期是哪一天，他們在商場的代碼都是一樣的，商場無法通過代碼判斷每一件產品的準確庫存週期。&lt;br/&gt;&lt;br/&gt;根&lt;br /&gt;據EPC網路計畫，每一實際電子產品都會有一個96位元長的產品標籤，或叫“牌照”。該標籤將標明製造商、描述產品種類並為該物品指定一個獨特的序號。其&lt;br /&gt;結果就是，任何產品，哪怕是一盒牛奶都將有自己的身份。從數學上講，96位長的標籤足以為地球上的每一個物體都指定一個唯一的身份。 &lt;br/&gt;&lt;br/&gt;毫不誇張地說“RFID能將物體一個個編排造冊，以致於打造飛機的一釘一鉚都能被鑒別出來。” 由於RFID標籤的存儲容量是2的96次方以上，所以他們可以將世界上所有的產品每一個都以惟一的代碼表示。&lt;br/&gt;&lt;br/&gt;3、RFID飛入尋常百姓家&lt;br/&gt;在香港，這一技術最為普遍的應用就是公共汽車、火車和渡船上使用的“無接觸”Octopus卡，主要方便小型貨物存放和自動售貨等。RFID晶片也是北京市一卡通工程中所採用的主要技術。&lt;br/&gt;&lt;br/&gt;RFID&lt;br /&gt;技術能夠被廣泛應用在民用領域得益於兩個推動力量：第一就是晶片製造成本被大幅度降低，從起初的幾十美元降低到幾個美分，使得RFID電子標籤可以為超市&lt;br /&gt;的管理者接受；第二就是用戶對RFID技術的廣泛接受，歐洲最大的超市麥德龍和美國最大的超市沃爾瑪在2003年和2004年試用RFID的決定加速了&lt;br /&gt;RFID技術的普及。尤其是美國零售業巨頭沃爾瑪特要求其主要供應商於明年初使用RFID標籤，對RFID技術的推動功不可沒。沃爾瑪特有70%的貨物都&lt;br /&gt;源自中國。沃爾瑪前100位供應商和美國國防部今年花費在RFID技術和服務的資金將達到5.15億到38億美元的水準。這些錢很多將用於把RFID資料&lt;br /&gt;編碼和資料捕捉系統整合進入資訊網路之中，為供應商的生產和分配活動提供支持。&lt;br/&gt;&lt;br/&gt;RFID的驅動力量是市場，這一點和其他的IT技術有所不同。但是由於普通的消費者還沒有一個清楚的印象，超市和管理機構的關注讓民眾也產生了興趣。&lt;br/&gt;&lt;br/&gt;4、RFID更加奇妙的應用&lt;br/&gt;可穿戴醫療設備&lt;br/&gt;RFID除了在超市的種種應用外，醫學研究人員也正在研製各種可穿戴的晶片。“許多公司都投入了大筆資金來開發所需的底層硬體。”哈佛大學醫學院Spaulding Rehabilitation醫院的運動分析實驗室主任Paolo Bonato指出。 &lt;br/&gt;&lt;br/&gt;Bonato在2003年5/6月刊發的IEEE Engineering醫學和生物學卷上撰寫了多篇關於可穿戴醫療設備的論文。 &lt;br/&gt;&lt;br/&gt;其中的一篇論文寫道：“最終的目標是實現一個外部供電的帶智慧MEMS感測器的單晶片，它可以是一次性使用的, 尺寸差不多為普通‘創可帖’般大小。”&lt;br/&gt;&lt;br/&gt;在商業應用上，一些新興公司正在開發帶有嵌入式感測器的襯衫、手錶、臂章和戒指，它們可使身患各種小毛病的普通老百姓隨時跟蹤自己的心臟、肺、體溫和運動情況，當然它們也可以用在運動員和軍事人員身上。 &lt;br/&gt;&lt;br/&gt;在實驗室中，大多數此類裝置都需要通過有線連接至PDA或者PC。研究人員面臨的挑戰是集成更複雜的感測器和廉價的無線通信功能。 &lt;br/&gt;&lt;br/&gt;“可穿戴裝置正從臨床實驗進入廣泛的應用領域, 雖然現在還很難確定可穿戴醫療保健裝置的增長情況，但是通過研究我們認為，今後5年將呈指數增長。”Bonato補充說。 &lt;br/&gt;&lt;br/&gt;T恤衫監控呼吸&lt;br/&gt;VivoMetrics&lt;br /&gt;公司就是該領域的少數新興公司之一。該公司的LifeShirt就是一件帶很多感測器的T恤衫，目前主要用於監測像睡眠呼吸暫停症這樣的病人的呼吸。該公&lt;br /&gt;司瞄準的市場是用它的產品來同步管理5個藥物試驗的資料收集。VivoMetrics創始人和首席運營官Andrew&lt;br /&gt;Behar將其視為一個重要的增長市場，因為在任何時候都有大約500個臨床試驗在進行。 &lt;br/&gt;&lt;br/&gt;在義大利，醫生使用LifeShirt作為&lt;br /&gt;工具來監視家裏的中風病人，以減少住院時間。“它可以在衛生保健方面獲得廣泛的應用，5到10年內，將使病人無需到醫院去。”Behar稱。但是要想使大&lt;br /&gt;量普通消費者能用上LifeShirt則還不現實。“醫生們並不十分清除如何利用所有的資料。”他認為。&lt;br/&gt;&lt;br/&gt;該公司當前的首要工作是將更複雜&lt;br /&gt;的感測器嵌入到LifeShirt中，用於測量心率、腦波及其他關鍵因素。Vivo正與一家公司合作研製一種可以通過衣服跟蹤心率的輕便感測器。&lt;br /&gt;BodyMedia瞄準了用它的SenseWear收發器來實現這種產品的市場。Roche&lt;br /&gt;Diagnostics公司在今年夏天開始以300到400美元的價格銷售採用了這種收發器的臂章式監控器。 &lt;br/&gt;&lt;br/&gt;BodyMedia首席執行官Astro Teller希望，每年都能夠獲得一兩個新的收發器用戶以提高公司的收益。Medtronic和Audi公司已經在各自的某些試驗中使用了該器件。&lt;br/&gt;&lt;br/&gt;應用戶市場的要求，Zigbee聯盟正在研製用於可穿戴醫療裝置的低成本無線鏈結技術。該組織於2004年推出一項用於醫療設備的低成本、低帶寬無線技術。 &lt;br/&gt;&lt;br/&gt;數字軍事裝備&lt;br/&gt;美&lt;br /&gt;國軍方仍將繼續支持該領域的關鍵研究工作。作為研究的一部分，Objective Force&lt;br /&gt;Warrior專案的目的是重新定義2010年士兵戰鬥裝備，為此美國陸軍正在研究可以用來紡織複合天線、電源和資料匯流排的未來軍服所需要的新型材料。&lt;br /&gt;他們的目標是將士兵變成戰場系統上的一個節點，並將他們的裝備重量從現在的120磅降低到50磅。 &lt;br/&gt;&lt;br/&gt;美國陸軍正致力於覆蓋各種頻率的複合天線設計。其電源和資料匯流排將具備與FireWire和USB介面相類似的能力，以連接可擕式電腦、電池、智慧顯示器以及士兵佩帶的感測器。 &lt;br/&gt;&lt;br/&gt;“我們現在研究的是基於纖維的半導體。我們認為，它也可以用於開發商業領域的可穿戴系統。”美國陸軍研究與開發中心電子工程師James Fairneny說。&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;二、涉足RFID&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;在&lt;br /&gt;市場需求方面，世界上最頂尖的零售業巨頭沃爾瑪、塔斯科(Tesco)、麥德龍(Metro)要求其供應商提供的商品必須有RFID標籤；在中間軟體發展&lt;br /&gt;上，有微軟、甲骨文(Oracle)、sun等IT巨擎宣佈進軍RFID的軟體發展；在硬體設備供應上，Alien、飛利浦、德州儀器、IBM等宣佈針對&lt;br /&gt;日益成熟的RFID智慧卡市場進行戰略聯盟；在技術標準方面，總部設在美國麻省理工學院(MIT)的Auto－ID&lt;br /&gt;Center和日本Ubiquitous ID Center也相繼提出獨立適用的RFID技術標準。&lt;br/&gt;&lt;br/&gt;RFID發展最強勁的領域：物流和生產方面的工業應用&lt;br/&gt;在&lt;br /&gt;供應鏈管理和物流管理中，資訊的準確性和及時性是關鍵，這恰恰就是電子標籤的最大優點之一。電子標籤可以放置到物品的任何位置，只要在閱讀器可以讀到的範&lt;br /&gt;圍（從幾釐米到幾米不等），就可以迅速地讀出其中的資料。借助電子標籤，可以實現商品對原料、半成品、成品、運輸、倉儲、配送、上架、最終銷售，甚至退貨&lt;br /&gt;處理等環節進行即時監控。這樣不僅能提高自動化程度，而且可以降低差錯率，從而顯著提高供應鏈的透明度和管理效率。&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;電子標籤的出現，使得合理的產品庫存控制和智慧物流技術成為可能。一些分析家認為，物流和生產方面的工業應用是RFID晶片市場發展最強勁的領域。&lt;br/&gt;&lt;br/&gt;RFID&lt;br /&gt;對製造業將有現實促進意義。對製造業常用軟體ERP和SCM系統來說是一種革命性的突破，過去的物料編號無法實現對單一部件的跟蹤，而今天，物料的精確化&lt;br /&gt;管理卻將觸角伸到了每一個環節的每一個部件，無論是品質控制、自動化管理、產品的生命週期管理都將面對過去無法想像的便利。例如，對產品次品率的分析可以&lt;br /&gt;將次品來源定位在某一點，而倉庫中的某一個產品也不會因為同一類產品的數量過多而被單獨過久放置。&lt;br/&gt;&lt;br/&gt;1、RFID在物流領域&lt;br/&gt;德國麥德龍集團(METRO)在其最新建立的“RFID創新中心”安裝了一台NCR的自助結帳系統，它不僅可以讀取條碼，還能讀取無線射頻識別(RFID)標籤。&lt;br/&gt;&lt;br/&gt;麥德龍集團建立的“創新中心”位於德國諾伊斯，目的是為了與合作夥伴共同發展RFID技術在零售領域的應用。&lt;br/&gt;&lt;br/&gt;安裝在“創新中心”的NCR FastLane? 是全球首個集成了RFID讀取器的自助結帳解決方案。在其目前的應用中，混合型自助結帳系統在掃描過程中同時解除了RFID標籤在商品中設置的安全功能，這樣顧客在結完帳離開商店時就不會引發安全警報。&lt;br/&gt;&lt;br/&gt;“RFID&lt;br /&gt;創新中心”是麥德龍集團“非凡未來商店”計畫的專案之一。在該計畫中，為了促進創新技術在國內乃至國際零售行業的廣泛應用，麥德龍集團和來自IT、消費產&lt;br /&gt;品和服務行業的45名著名合作夥伴，在真實的環境下共同測試各種新技術的在零售業的應用和相互作用。這一計畫成為零售業相關技術和流程發展和創新的有效平&lt;br /&gt;臺。在麥德龍集團“非凡未來商店”計畫中，眾多技術和先進系統在實踐中獲測試和進一步發展。長遠來說，該計畫的目標乃為零售業制訂一套能夠在國際範圍內實&lt;br /&gt;施的標準。&lt;br/&gt;&lt;br/&gt;2、RFID在工業生產中&lt;br/&gt;2003年，作為日益國際化的家電企業，海爾集團就開始跟蹤RFID技術。海爾希望發揮&lt;br /&gt;RFID技術自動識別讀寫、群讀及遠距離讀取的作用，代替原來的近距離人工條碼讀取方式，提高工作效率；並在更長遠的未來，在一些可能的業務流程中，通過&lt;br /&gt;RFID標籤捕獲資料，從而顯著提高供應鏈管理的水準。一旦晶片技術發展到成本顯著降低、存儲容量足夠大的時候，海爾還期望在家電產品中嵌入晶片標籤——&lt;br /&gt;既記錄製造過程中的資料，還可以記錄顧客和電器保修的有關資訊。這樣在提供維修服務時，海爾員工便能通過系統自動讀取標籤中的資料，從而對產品資訊和維修&lt;br /&gt;記錄了然於胸。&lt;br/&gt;&lt;br/&gt;海爾在實施RFID技術上懷有緊迫感：一方面企業需要不斷提高工作效率、降低成本；另一方面，來自經營大環境的壓力，如像&lt;br /&gt;沃爾瑪等一些零售巨頭對供應商們施予的壓力。除了醉心於技術革新的領先企業，目前關注RFID的企業多是迫於類似的環境壓力。2003年5月中旬，海爾計&lt;br /&gt;畫在其一處倉庫中率先使用RFID技術。&lt;br/&gt;&lt;br/&gt;戴爾在產品零部件上也安裝了RFID標籤。它可以使網上訂單迅速轉化為無線射頻信號。這些信號可&lt;br /&gt;以指示戴爾公司的自動零部件選取機為每台PC收集所需要的零部件；它還能把產品組裝圖傳給工人，並補充成品的出貨量。戴爾的經理可以在網上監控產品在生產&lt;br /&gt;過程中所處的位置。RFID被看作戴爾勝出同行的絕招之一。&lt;br/&gt;&lt;br/&gt;3、RFID在車輛跟蹤與管理系統領域&lt;br/&gt;無線定位與通信公司&lt;br /&gt;WhereNet將WhereSoft Vehicle。這種VTMS（車輛跟蹤與管理系統&lt;br /&gt;）將首次將RFID與業務規則結合在一起，實現工作流自動化。定位於汽車行業、車輛處理中心和汽車租賃公司的VTMS，採用WhereNet主動RFID&lt;br /&gt;標籤和WherePort技術。&lt;br/&gt;&lt;br/&gt;WherePort是一種在帶來RFID標籤的物品進入或離開特定區域時，觸發RFID標籤發射信號的技&lt;br /&gt;術。與被動RFID標籤不同，主動標籤具有1,000英尺的發射距離，定位精度在半徑10英尺內。當汽車還在生產線上製造時，一種叫做WhereTag的&lt;br /&gt;RFID標籤被分配給每一台車輛，並且與VIN（車輛身份號）建立聯繫。WhereNet VTMS發貨價格在25萬到100萬美元之間。&lt;br/&gt;&lt;br/&gt;三、RFID晶片&lt;br/&gt;1、世界最小的晶片&lt;br/&gt;2001年6月，日立發表這種微晶片時便稱該部件是世界上最小的RFID晶片。2003年11月，日立已開發出將天線嵌入到RFID晶片上的方法，日立自豪地表示，該器件是帶有嵌入式天線的最小IC。&lt;br/&gt;&lt;br/&gt;常規RFID晶片需要用一個外部天線來實現它們與外部讀取器的通信，而微晶片的片載天線使它能夠接收來自讀取器的無線信號並將ID號回送。因此，這種晶片無需附加任何外部器件即可自行進行工作。&lt;br/&gt;&lt;br/&gt;2、符合全球規格的晶片&lt;br/&gt;飛&lt;br /&gt;利浦電子公司2004年5月推出了業界第一個符合全球規則的&lt;br /&gt;RFID晶片——UCODEEPC1.19，支援UHF全球產品電子代碼（EPCglobal）標準化運動。該新晶片用於貨盤和包裝箱識別，支援96位元&lt;br /&gt;EPCglobal編碼標準化，能很好地幫助零售商和供應商在最短時間內符合G2類EPCglobal標準的要求。隨著沃爾瑪、Metro、Tesco、&lt;br /&gt;Target以及國防部要求物流和供應鏈系統在2005年以實現非接觸式射頻識別（RFID）技術的規定，全球廠商都在尋找可以快速有效地為其供應鏈部署&lt;br /&gt;RFID技術的方法。 &lt;br/&gt;&lt;br/&gt;該晶片的零售和供應鏈行業用戶在需要的時候可以充分利用256位元讀/寫記憶體將附加的資訊存儲在晶片上。有了這種功能的單晶片，EPC架構可以在全球範圍內的物流及供應鏈等行業得到廣泛應用。&lt;br/&gt;&lt;br/&gt;現已投入使用的UCODEEPC1.19可分別在美國標準5.7米（寫）/8.2米（讀）和歐洲標準5.2米（寫）/7.4米（讀）的範圍內運行。該晶片具有每秒150標籤的無衝突速度。&lt;br/&gt;&lt;br/&gt;RFID的解決方案&lt;br/&gt;SSA Global為沃爾瑪以及美國國防部（DoD）提供的SSA倉庫管理射頻身份識別（RFID）解決方案現已初現客戶成效。 &lt;br/&gt;&lt;br/&gt;RFID&lt;br /&gt;技術是幫助客戶提高供應鏈可視性的基礎，也是SSA Global供應鏈管理（SCM）解決方案的基石。SSA&lt;br /&gt;Global的RFID產品將幫助製造企業和分銷商提高物料處理效率，以便更高效地管理和跟蹤物料的流通。SSA RFID for&lt;br /&gt;Distribution是面向倉庫管理與製造領域的最初幾種RFID解決方案之一。&lt;br/&gt;&lt;br/&gt;目前，RFID已在某些領域體現出合理價值，如資產&lt;br /&gt;跟蹤、汽車牌照和安全性等。例如DC Logistics公司，在其達拉斯RFID部署中心運行SSA RFID for&lt;br /&gt;Distribution中，公司的自動資料收集與分析功能得到了極大的提升。而沃爾瑪運用RFID試驗配送中心派遣貨輪則是為了回應客戶的要求，促進沃&lt;br /&gt;爾瑪以及DoD等機構的制度遵從。另外，其他功能包括標記服務以及跨碼頭合併服務等，也將使該解決方案成為第一種全能產品。&lt;br/&gt;&lt;br/&gt;SSA&lt;br /&gt;RFID for Distribution構建用於滿足消費品和直接倉儲配送公司的行業需求。SSA Global現正與IBM、Sun&lt;br /&gt;Microsystems、R4 Global Services和SIS Technologies,&lt;br /&gt;ltd.等多家主要業務夥伴合作，構建旨在全面挖掘RFID潛能的解決方案。&lt;br/&gt;&lt;br/&gt;甲骨文公司也推出包含有RFID技術的最新版本的供應鏈管理&lt;br /&gt;軟體——Oracle 供應鏈管理11i.10（Oracle Supply Chain Management&lt;br /&gt;11i.10）。RFID化交易，自動跟蹤整個供應鏈中的庫存流動，以改善透明度、安全性和決策制訂能力。&lt;br/&gt;&lt;br/&gt;優派（ViewSonic）公&lt;br /&gt;司首席資訊官兼資訊服務部副總裁羅伯特.穆恩(Robert&lt;br /&gt;Moon)表示：“我們的供應鏈影響公司日常經營的方方面面，因而最終影響到公司各項目標的實現，如提供無與倫比的客戶服務、增加收入增長的機會、簡化主&lt;br /&gt;要的供需流程，等等。我們對最新版Oracle供應鏈管理很感興趣，相信它在我們為實現公司各項總體目標而實施RFID庫存管理、全球訂單履行流程和新客&lt;br /&gt;戶關係及合作夥伴關係管理等一些更高級的業務計畫的過程中，會起到至關重要的作用。”&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;三、從條碼到RFID&lt;br/&gt;&lt;br/&gt;　　條碼的起源、發展與歷史&lt;br/&gt;　　在美國華盛頓史密森（Smithsonian）美國歷史博物館中，陳列著一包箭牌果汁口香糖。1974年6月26日，這包口香糖在俄亥俄州特羅伊城的瑪西超市賣67美分。你可能會說，這有什麼稀罕的？但它卻是全世界第一件通過條碼掃描售出的商品。&lt;br/&gt;　　起源&lt;br/&gt;　&lt;br /&gt;　早在40年代，美國喬?伍德蘭德(Joe Wood Land)和伯尼?西爾沃(Berny&lt;br /&gt;Silver)兩位工程師就開始研究用代碼表示食品項目及相應的自動識別設備，於1949年獲得了美國專利。該圖案很像微型射箭靶，被叫做“公牛眼”代&lt;br /&gt;碼。靶式的同心圓是由圓條和空繪成圓環形。在原理上，“公牛眼”代碼與後來的條碼很相近，遺憾的是當時的工藝和商品經濟還沒有能力印製出這種碼..&lt;br/&gt;&lt;br/&gt;然&lt;br /&gt;而，10年後喬?伍德 蘭德作為IBM公司的工程師成為北美統一代碼UPC碼的奠基人。以吉拉德?費伊塞爾(Girard&lt;br /&gt;Fessel)為代表的幾名發明家，于1959年提請了一項專利，描述了數字0-9中每個數字可由七段平行條組成。但是這種碼使機器難以識讀，使人讀起來&lt;br /&gt;也不方便。不過這一構想的確促進了後來條碼的產生於發展。 &lt;br/&gt;&lt;br/&gt;　　發展&lt;br/&gt;　　1973年美國統一編碼協會（簡稱UCC）建立了&lt;br /&gt;UPC條碼系統，實現了該碼制標準化。同年，食品雜貨業把UPC碼作為該行業的通用標準碼制，為條碼技術在商業流通銷售領域裏的廣泛應用，起到了積極的推&lt;br /&gt;動作用。1974年Inte&lt;br /&gt;rmec公司的大衛?阿利爾（Davide?Allair)博士研製出39碼，很快被美國國防部所採納，作為軍用條碼碼制。39碼是第一個字母、數位式想&lt;br /&gt;結合的條碼，後來廣泛應用於工業領域。&lt;br/&gt;&lt;br/&gt;　　1976年在美國和加拿大超級市場上，UPC碼的成功應用給人們以很大的鼓舞，尤其是歐洲人對&lt;br /&gt;此產生了極大興趣。次年，歐洲共同體在UPC-A碼基礎上制定出歐洲物品編碼EAN-13和EAN-8碼，簽署了“歐洲物品編碼”協定備忘錄，並正式成立&lt;br /&gt;了歐洲物品編碼協會（簡稱EAN）。到了1981年由於EAN已經發展成為一個國際性組織，故改名為“國際物品編碼協會”，簡IAN。但由於歷史原因和習&lt;br /&gt;慣，至今仍稱為EAN。（後改為EAN-international）&lt;br/&gt;&lt;br/&gt;　　日本從1974年開始著手建立POS系統，研究標準化以及資訊&lt;br /&gt;輸入方式、印製技術等。並在EAN基礎上，於1978年&lt;br /&gt;制定出日本物品編碼JAN。同年加入了國際物品編碼協會，開始進行廠家登記註冊，並全面轉入條碼技術及其系&lt;br /&gt;列產品的開發工作，10年之後成為EAN最大的用戶。&lt;br/&gt;&lt;br/&gt;　　應用&lt;br/&gt;　　此後不久，隨著LED(發光二極體)、微處理器和鐳射二極體的&lt;br /&gt;不斷發展，迎來了新的識別字號(象徵學)和其應用的大爆炸，人們稱之為“條碼工業”。今天很少能找到沒有直接接觸過即快又准的條碼技術的公司或個人。由於&lt;br /&gt;在這一領域的技術進步與發展非常迅速，並且每天都有越來越多的應用領域被開發，用不了多久條碼就會象燈泡和半導體收音機一樣普及，使我們每一個人的生活都&lt;br /&gt;變得更加輕鬆和方便。&lt;br/&gt;&lt;br/&gt;　　RFID與條碼的比較&lt;br/&gt;　　目前全球以千億計的大小商品，都靠著產品上一條條粗細不一的線條（條碼）來辨&lt;br /&gt;別身分。但是條碼只能記載著產品簡單的背景，例如生產商和品項名稱，而且還得透過紅外線接觸掃瞄才能讀取資料。更重要的是目前全世界每年生產超過五億種商&lt;br /&gt;品，而全球通用的商品條碼，由十二位排列出來的條碼號碼已經快要用光了。條碼是唯讀的、需要對準標的、一次只能讀一個、且容易破損；而RFID是可讀寫&lt;br /&gt;的、使用時不需對準標的、同時可讀取多個、堅固全天候使用，可不需人工參與操作。&lt;br/&gt;&lt;br/&gt;　　首先，條碼依靠被動式的手工讀取方式，工作人員需要手持讀取設備一個一個掃描，而RFID讀取設備利用無線電波，可以全自動瞬間讀取大量標籤的資訊；&lt;br/&gt;　　其次，條碼屬於易碎標籤，由於物理、化學的原因很容易退色、被撕毀，RFID屬於電子產品，可以在條件苛刻的環境下使用；&lt;br/&gt;　　第三，條碼的存儲量很小，而RFID標籤內部嵌有存儲設備，信息量巨大；當然，條碼的問題在於它永遠是一次性的，不可改變的，而RFID可以任意書寫，也可以進行修改。 &lt;br/&gt;&lt;br/&gt;四——展望RFID以及RFID的標準&lt;br/&gt;&lt;br/&gt;如何管理比澳洲人口多得的袋鼠？人類發射到太空中的東西如何追蹤？病人不到醫院去，醫生如何檢測並得出第一手的腦電波、心電圖資料資料?超市中條碼大量的破舊、損害怎麼辦？……這些問題似乎困難而且沒有必然聯繫，但是用RFID技術可以解決上述的所用問題。 &lt;br/&gt;　　 &lt;br/&gt;RFID的前景&lt;br/&gt;當&lt;br /&gt;然RFID技術的新奇應用也在源源不斷地湧現出來。比如，日本電信最近開始給公司中的工人配備帶有RFID讀取器的PDA，用以讀取電話上的RFID標&lt;br /&gt;籤，這樣總部就可以根據從工人PDA中收集上來的資訊，繪製工人當前位置的地圖，從而調度離某部電話最近的工人前去工作。&lt;br/&gt;&lt;br/&gt;　　 在醫療領域中，RFID技術也大有可為，比如將每件醫療器械中裝入RFID，這樣就可以避免在已經被縫合的身體裏留下剪子、鉗子；或者用RFID標籤標注每個將要接受手術的患者，以確保他們的身份與所實施的手術過程相符。&lt;br/&gt;&lt;br/&gt;　&lt;br /&gt;　&lt;br /&gt;在日本，某社團提出了一項計畫，準備用RFID標籤跟蹤兒童上學和放學的情況，來滿足對在校兒童安全越來越高的關注需求。根據大阪電信局介紹，RFID標&lt;br /&gt;籤將被發放到小學，縫到學生的衣服或者學生卡、書包等私人用品上；而RFID標籤讀取器將被安裝到學校大門，以及其他一些家長和教師認為比較危險的地方。&lt;br /&gt;每天，RFID標籤上的資料通過無線連接發送到中心資料庫，這樣攜帶RFID標籤的孩子的行動就可以被即時地或者准即時地予以跟蹤。從RFID標籤得到的&lt;br /&gt;資料將會以多種形式的圖示顯示出來，除了記錄位置以外，以後還會用更加智慧的標籤記錄伴隨發生的事件。 &lt;br/&gt;&lt;br/&gt;　　&lt;br /&gt;7月初，幾家主要的手機製造商計畫推出內嵌RFID技術的通訊設備，它們希望由此改變消費者購買商品以及使用信用卡的方式——在近距離通訊（NFC）技術&lt;br /&gt;的幫助下，比如把你的手機向海報或者廣告宣傳欄晃動一下（範圍在20釐米之內）就可完成交易，無論購買音樂會的門票、預定酒店的客房還是其他需要信用卡帳&lt;br /&gt;號資訊的業務，都可以用手機之類的手提設備搞定。根據ABI研究機構的調查顯示，幾年內將有50%的手機集成RFID晶片，用來進行近距離的交流。這些交&lt;br /&gt;易是傻瓜化的，不需要用戶進行配置，也就是說，通過無線通訊網絡、帶有NFC功能的Wi-Fi網路或者藍牙技術，手持設備內的RFID標籤會自動的連接到&lt;br /&gt;對應的站點上，讓消費者瞭解有關產品和服務的資訊，傳遞視頻、音頻檔，或者達成一筆交易。 &lt;br/&gt;　　 RFID有如此貼近生活的應用，可見前景是不可估量的。&lt;br/&gt;&lt;br/&gt;　　 RFID的現實問題&lt;br/&gt;&lt;br/&gt;　　但是RFID的現實問題我們也不能忽視：&lt;br/&gt;　　 高風險&lt;br/&gt;　　 RFID所需的高額費用和技術上的不成熟，使實施RFID仍是高風險的舉動。甚至有人認為，如今所謂的RFID應用熱潮是一項缺乏投入回報證明的瘋狂技術冒進。&lt;br/&gt;&lt;br/&gt;　&lt;br /&gt;　&lt;br /&gt;雖然業界對RFID長期的前景仍堅持肯定的態度，但是，Gartner表示，應用這個技術的商業性的基本戰略還需要許多年才能成熟。企業開始在經營管理和&lt;br /&gt;供應鏈中有效地使用條碼技術用了20年的時間。RFID技術的普及雖然不會用那樣長的時間，但是，企業需要不斷地對採用這項技術的戰略進行檢查，並且要認&lt;br /&gt;識到RFID不可能在一個晚上成為主流的技術。&lt;br/&gt;&lt;br/&gt;　　 價格過高&lt;br/&gt;　　&lt;br /&gt;價格問題也是關於RFID爭論的一大焦點。專家認為，要想實施這項技術，就必須把標籤的價格從現在的每個45美分降低到每個10美分。價格必須便宜到讓更&lt;br /&gt;多的公司使用的起，而現在產業正在朝著這個趨勢發展。而很多人現在仍在關注這個價格最終將降到多低，什麼時候將達到這個最低點。&lt;br/&gt;&lt;br/&gt;　　 標準不統一&lt;br/&gt;　&lt;br /&gt;　&lt;br /&gt;目前，很多RFID解決方案廠商提供的軟硬體技術還處於實驗室和模擬應用階段，尚不能適用現實應用的需要。如果企業採用專用技術，所使用的頻率、編碼、存&lt;br /&gt;儲規則以及資料內容等都不盡相同，一旦RFID解讀器和標籤不能通用，企業間就無法順利進行資料交換和協同工作，只得將RFID技術局限在企業內部。&lt;br/&gt;&lt;br/&gt;　　 正是由於缺乏一套廣泛通用的標準，才使得RFID技術一直未能廣泛地應用於供應鏈管理上。當供應鏈其中一環的資料不能在下一環節再用時，就會使技術開發成本大幅增加。可見，一個詳細、統一規範且開放的技術標準是RFID技術發展需要解決的頭等大事。&lt;br/&gt;&lt;br/&gt;　　 失業&lt;br/&gt;　　 市場調研公司Yankee Group最近公佈的研究報告顯示，未來三年企業將投資數十億美元安裝庫存追蹤(inventory-tracking)系統，這將使它們因供應鏈效率提高而節省成本，但數百萬工人卻將因此丟掉飯碗。 &lt;br/&gt;&lt;br/&gt;　　 Yankee Group表示，製造商在未來三年將在與射頻標識(RFID)相關的硬體、軟體和服務方面投入50億美元。但是，佈署RFID，僅在美國一地就可能導致400萬個工作崗位消失。 &lt;br/&gt;&lt;br/&gt;　　 健康影響&lt;br/&gt;　&lt;br /&gt;　&lt;br /&gt;目前有很多人對RFID遍佈未來世界充滿擔心，因為RFID磁條所使用的800~900MHz已經屬於甚高頻範圍，很多人擔心長期生活在RFID磁條包圍&lt;br /&gt;中會受到高頻射線影響，免疫力下降和導致癌症都引發了很多人對RFID的疑問。而且RFID所使用的頻率也受到國際電信聯合會頻率資源的限制。&lt;br/&gt;&lt;br/&gt;　　 隱私問題&lt;br/&gt;　　 隱私保護團體也對RFID可能造成生產商長期跟蹤用戶抱有強烈的意見。而一旦使用一次性自毀RFID，顧客又很有可能在召回和折扣返款等服務上無法參與。&lt;br/&gt;&lt;br/&gt;　　 RFID標準&lt;br/&gt;　&lt;br /&gt;　 各國都在積極制定自己的RFID標準。國際上的ISO/IEC18000，美國的 EPC Global，日本的 Ubiquitous&lt;br /&gt;ID三項國際標準，已形成三足鼎立局面。沃爾瑪去年已正式宣佈，從2005年起，在全球前100家供應商中強制實行所有產品加貼“電子標籤”。美國國防部&lt;br /&gt;也正在推進全面導入電子標籤的計畫。法國政府已在食品領域全面推行原產地分類標誌制度。德國的麥德龍公司宣佈跟進。&lt;br/&gt;&lt;br/&gt;　　&lt;br /&gt;我國電子標籤RFID技術的生產和應用領域僅有一些行業標準，各廠家自主開發的電子標籤產品千差萬別，在容量、資訊格式等方面不一致，不同類型的產品也不&lt;br /&gt;能夠互相相容。因而，必須加快制定統一國家標準的步伐。中國國家標準化管理委員會近日宣佈正式成立“電子標籤”國家標準工作組，負責起草、制定中國有關“&lt;br /&gt;電子標籤”國家標準，使其既具有中國的自主知識產權，同時和目前國際的相關標準互通相容，促進中國的“電子標籤”發展納入標準化、規範化的軌道。&lt;br/&gt;&lt;br/&gt;　中國國家標準化管理局副局長王忠敏表示：“中國將在EPC國際標準的制定中扮演重要角色。”&lt;br/&gt;&lt;br/&gt;&lt;br/&gt; 射頻技術相關知識!! &lt;br/&gt;電子標籤基本工作原理&lt;br/&gt;&lt;br/&gt;電&lt;br /&gt;子標籤是射頻識別(RFID)的通俗叫法,它由標籤、解讀器和資料傳輸和處理系統三部分組成。&lt;br /&gt;標籤也被稱為電子標籤或智慧標籤，它是記憶體帶有天線的晶片，晶片中存儲有能夠識別目標的資訊。RFID標籤具有持久性，資訊接收傳播穿透性強，存儲資訊&lt;br /&gt;容量大、種類多等特點。有些RFID標籤支援讀寫功能，目標物體的資訊能隨時被更新。&lt;br/&gt;解讀器分為手持和固定兩種，由發送器，接收儀、控制模組和收發器組成。收發器和控制電腦或可編程邏輯控制器（PLC）連接從而實現它的溝通功能。解讀器也有天線接收和傳輸資訊。&lt;br/&gt;資&lt;br /&gt;料傳輸和處理系統：解讀器通過接收標籤發出的無線電波接收讀取資料。最常見的是被動射頻系統，當解讀器遇見RFID標籤時，發出電磁波，周圍形成電磁場，&lt;br /&gt;標籤從電磁場中獲得能量啟動標籤中的微晶片電路，晶片轉換電磁波，然後發送給解讀器，解讀器把它轉換成相關資料。控制計算器就可以處理這些資料從而進行管&lt;br /&gt;理控制。在主動射頻系統中，標籤中裝有電池在有效範圍內活動。 &lt;br/&gt;&lt;br/&gt;電子標籤與條碼&lt;br/&gt;&lt;br/&gt;射頻技術和條碼有什麼不同？從概念上來&lt;br /&gt;說，兩者很相似，目的都是快速準確地確認追蹤目標物體。主要的區別如下：有無寫入資訊或更新記憶體的能力。條碼的記憶體不能更改。射頻標籤不像條碼，它特&lt;br /&gt;有的辨識器不能被複製。標籤的作用不僅僅局限於視野之內，因為資訊是由無線電波傳輸，而條碼必須在視野之內。由於條碼成本較低，有完善的標準體系，已在全&lt;br /&gt;球散播，所以已經被普遍接受，從總體來看，射頻技術只被局限在有限的市場份額之內。目前，多種條碼控制模版已經在使用之中，在獲取資訊管道方面，射頻也有&lt;br /&gt;不同的標準。 &lt;br/&gt;&lt;br/&gt;射頻技術與條碼是兩種不同的技術，有不同的適用範圍，有時會有重疊。兩者之間最大的區別是條碼是"可視技術"，掃描器在&lt;br /&gt;人的指導下工作，只能接收它視野範圍內的條碼。相比之下，射頻識別不要求看見目標。射頻標籤只要在接受器的作用範圍內就可以被讀取。條碼本身還具有其他缺&lt;br /&gt;點，如果標籤被劃破，污染或是脫落，掃描器就無法辨認目標。條碼只能識別生產者和產品，並不能辨認具體的商品，貼在所有同一種產品包裝上的條碼都一樣，無&lt;br /&gt;法辨認哪些產品先過期。&lt;br/&gt;&lt;br/&gt;目前，在成本方面，由於組成部分不同，智慧標籤要比條碼貴得多，條碼的成本就是條碼紙張和油墨成本，而有記憶體晶&lt;br /&gt;片的主動射頻標籤價格在2美元以上，被動射頻標籤的成本也在1美元以上。但是沒有內置晶片的標籤價格只有幾美分，它可以用於對資料資訊要求不那麼高的情&lt;br /&gt;況，同時又具有條碼不具備的防偽功能。&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;電子標籤中的射頻標籤&lt;br/&gt;&lt;br/&gt;射頻標籤就是含有物品唯一標識體系的編碼的標籤。這種唯一標識體系包括產品電子代碼EPC、泛在識別號UCODE、車輛識別代碼VIN、國際證券標識號ISIN、以及IPv6等等。 &lt;br/&gt;&lt;br/&gt;其&lt;br /&gt;中，產品電子代碼(EPC)是全球產品代碼的一個分支，它可以識別視野之外的目標。電子產品代碼並不僅僅是一個無線電波條碼，它包含著一系列的資料和資&lt;br /&gt;訊，象產地，日期代碼和其他關鍵的供應資訊，這些資訊儲存在一個小的矽片中，利用標籤，解讀器和電腦的聯網，生產者和零售商就可以隨時瞭解精確的產品和庫&lt;br /&gt;存資訊。&lt;br/&gt;射頻標籤根據商家種類的不同能儲存從512位元組到4兆不等的資料。標籤中儲存的資料是由系統的應用和相應的標準決定的。例如，標籤能夠&lt;br /&gt;提供產品生產，運輸，存儲情況，也可以辨別機器，動物和個體的身份。這些類似於條碼中存儲的資訊。標籤還可以連接到資料庫，存儲產品庫存編號，當前位置，&lt;br /&gt;狀態，售價，批號的資訊。相應的，射頻標籤在讀取資料時不用參照資料庫可以直接確定代碼的含義。&lt;br/&gt;目前，射頻標籤價格根據標籤種類和應用價格從30美分到50美元不等，總的來說，用在高檔產品中的智慧標籤在50美分以上，主動標籤要貴的多，帶有複雜靈敏元件的價格在100美元以上。&lt;br/&gt;射頻標籤的目的是使用一種統一標準的電子產品代碼，使產品在不同領域都能被辨識。 &lt;br/&gt;&lt;br/&gt;&lt;br/&gt;電子標籤中的射頻卡&lt;br/&gt;&lt;br/&gt;目&lt;br /&gt;前生產RFID產品的很多公司都採用自己的標準，但國際上還沒有形成統一的標準。現在，可供射頻卡使用的幾種標準有ISO10536、ISO14443、&lt;br /&gt;ISO15693和ISO18OOO。應用最多的是ISO14443和ISO15693，這兩個標準都由物理特性、射頻功率和信號介面、初始化和反碰撞以&lt;br /&gt;及傳輸協定四部分組成。 &lt;br/&gt;&lt;br/&gt;按照不同得方式，射頻卡有以下幾種分類：&lt;br/&gt;&lt;br/&gt;1.按供電方式分為有源卡和無源卡。有源是指卡內有&lt;br /&gt;電池提供電源，其作用距離較遠，但壽命有限、體積較大、成本高，且不適合在惡劣環境下工作；無源卡內無電池，它利用波束供電技術將接收到的射頻能量轉化為&lt;br /&gt;直流電源為卡內電路供電，其作用距離相對有源卡短，但壽命長且對工作環境要求不高。&lt;br/&gt;&lt;br/&gt;2.按載波頻率分為低頻射頻卡、中頻射頻卡和高頻射頻&lt;br /&gt;卡。低頻射頻卡主要有125kHz和134.2kHz兩種，中頻射頻卡頻率主要為13.56MHz，高頻射頻卡主要為433MHz、915MHz、&lt;br /&gt;2.45GHz、5.8GHz等。低頻系統主要用於短距離、低成本的應用中，如多數的門禁控制、校園卡、動物監管、貨物跟蹤等。中頻系統用於門禁控制和需&lt;br /&gt;傳送大量資料的應用系統；高頻系統應用於需要較長的讀寫距離和高讀寫速度的場合，其天線波束方向較窄且價格較高，在火車監控、高速公路收費等系統中應用。&lt;br /&gt;&lt;br/&gt;&lt;br/&gt;3.按調製方式的不同可分為主動式和被動式。主動式射頻卡用自身的射頻能量主動地發送資料給讀寫器；被動式射頻卡使用調製散射方式發射資&lt;br /&gt;料，它必須利用讀寫器的載波來調製自己的信號，該類技術適合用在門禁或交通應用中，因為讀寫器可以確保只啟動一定範圍之內的射頻卡。在有障礙物的情況下，&lt;br /&gt;用調製散射方式，讀寫器的能量必須來去穿過障礙物兩次。而主動方式的射頻卡發射的信號僅穿過障礙物一次，因此主動方式工作的射頻卡主要用於有障礙物的應用&lt;br /&gt;中，距離更遠(可達30米)。 &lt;br/&gt;&lt;br/&gt;4.按作用距離可分為密耦合卡(作用距離小於1釐米)、近耦合卡(作用距離小於15釐米)、疏耦合卡(作用距離約1米)和遠距離卡(作用距離從1米到10米，甚至更遠)。 &lt;br/&gt;&lt;br/&gt;5. 按晶片分為唯讀卡、讀寫卡和CPU卡。&lt;br/&gt;&lt;br/&gt;電子標籤中的射頻閱讀器&lt;br/&gt;&lt;br/&gt;在RFID系統中，信號接收設備一般叫做閱讀器（或讀卡器）。閱讀器的基本功能就是提供與標籤進行資料傳輸的介面。 &lt;br/&gt;&lt;br/&gt;電子標籤中的射頻天線&lt;br/&gt;&lt;br/&gt;在&lt;br /&gt;RF裝置中，工作頻率增加到微波區域的時候，天線與標籤晶片之間的匹配問題變得更加嚴峻。天線的目標是傳輸最大的能量進出標籤晶片。這需要仔細的設計天線&lt;br /&gt;和自由空間以及其相連的標籤晶片的匹配。本文考慮的頻帶是435MHz, 2.45 GHz 和 5.8 GHz，在零售商品中使用。 &lt;br/&gt;&lt;br/&gt;天線必須：&lt;br/&gt;足夠的小以至於能夠貼到需要的物品上；&lt;br/&gt;有全向或半球覆蓋的方向性；&lt;br/&gt;提供最大可能的信號給標籤的晶片；&lt;br/&gt;無論物品什麼方向，天線的極化都能與讀卡機的詢問信號相匹配；&lt;br/&gt;具有魯棒性；&lt;br/&gt;非常便宜。&lt;br/&gt;在選擇天線的時候的主要考慮是：&lt;br/&gt;天線的類型；&lt;br/&gt;天線的阻抗：&lt;br/&gt;在應用到物品上的RF的性能；&lt;br/&gt;在有其他的物品圍繞貼標籤物品時的RF性能。&lt;br/&gt;&lt;br/&gt;可能的選擇&lt;br/&gt;這裏有兩種使用方式：一）貼標籤的物品被放在倉庫中，有一個便攜裝置，可能是掌上型，詢問所有的物品，並且需要它們給予資訊回饋資訊；二）在倉庫的門口安裝讀卡設配，詢問並記錄進出物品。還有一個主要的選擇是有源標籤還是無源標籤[1],[2]。&lt;br/&gt;&lt;br/&gt;可選的天線&lt;br/&gt;在435&lt;br /&gt;MHz, 2.45 GHz 和 5.8&lt;br /&gt;GHz頻率是用的RFID系統中，可選的天線有幾種，見下表，它們重點考慮了天線的尺寸。這樣的小天線的增益是有限的，增益的大小取決於輻射模式的類型，&lt;br /&gt;全向的天線具有峰值增益0到2dBi；方向性的天線的增益可以達到6dBi。增益大小影響天線的作用距離。下表中的前三個種類的天線是線極化的，但是微帶&lt;br /&gt;面天線可以使圓極化的，對數螺旋天線僅僅是圓極化的。由於RFID標籤的方向性是不可控的，所以讀卡機必須是圓極化的。一個圓極化的標籤天線可以產生&lt;br /&gt;3dB 以強的信號。&lt;br/&gt;&lt;br/&gt;阻抗問題&lt;br/&gt;為了最大功率傳輸，天線後的晶片的輸入阻抗必須和天線的輸出阻抗匹配。幾十年來，設計天線與50&lt;br /&gt;或70歐姆的阻抗匹配，但是可能設計天線具有其他的特性阻抗。例如，一個縫隙天線可以設計具有幾百歐姆的阻抗。一個折疊偶極子的阻抗可以是一做個標準半波&lt;br /&gt;偶極子阻抗的20倍。印刷貼片天線的引出點能夠提供一個很寬範圍的阻抗(通常是40&lt;br /&gt;到100歐姆)。選擇天線的類型，以至於它的阻抗能夠和標籤晶片的輸入阻抗匹配是十分關鍵的。另一個問題是其他的與天線接近的物體可以降低天線的返回損&lt;br /&gt;耗。對於全向天線，例如雙偶極子天線，這個影響是顯著的。改變雙偶極子天線和一聽番茄醬的間距做了一些實際測量，顯示了一些變化，見圖4和圖5。其他的物&lt;br /&gt;體也有相似的影響。此外是物體的介電常數，而不是金屬，改變了諧振頻率。一塑膠瓶子水降低了最小返回損耗頻率16%。當物體與天線的距離小於62.5mm&lt;br /&gt;的時候，返回損耗將導致一個3.0&lt;br /&gt;dB的插入損耗，而天線的自由空間插入損耗才0.2dB。可以設計天線使它與接近物體的情況相匹配，但是天線的行為對於不同的物體和不同的物體距離而不&lt;br /&gt;同。對於全向天線是不可行的，所以設計方向性強的天線，它們不受這個問題的影響。&lt;br/&gt;&lt;br/&gt;輻射模式&lt;br/&gt;在一個無反射的環境中測試了天線的模&lt;br /&gt;式，包括了各種需要貼標籤的物體，在使用全向天線的時候性能嚴重下降。圓柱金屬聽引起的性能下降是最嚴重的，在它與天線距離50mm的時候，反回的信號下&lt;br /&gt;降大於20dB (見圖6)。天線與物體的中心距離分開到100—150mm的時候，反回信號下降約10&lt;br /&gt;到12dB。在與天線距離100mm的時候，測量了幾瓶水（塑膠和玻璃），見圖7，反回信號降低大於10dB。&lt;br /&gt;在蠟紙盒的液體，甚至蘋果上做試驗得到了類似的結果。&lt;br/&gt;&lt;br/&gt;局部結構的影響&lt;br/&gt;在使用手持的儀器的時候，大量的其他臨近物體的使讀卡機天線&lt;br /&gt;和標籤天線的輻射模式嚴重失真。這可以對於2.45GHz的工作頻率計算，假設一個代表性的幾何形狀，見圖8,9,10，和自由空間相比，顯示返回信號降&lt;br /&gt;低了10dB，在雙天線同時使用的時候，比預料的模式下降的更多。圖11和圖12是在一個天線前的一個橫截平面的接收信號等高線圖，顯示了嚴重的失真。在&lt;br /&gt;倉庫的使用環境下，一個物品盒子具有一個標籤會有問題，幾個標籤貼在一個盒子上以確保所有時候都有一個標籤是可以看見的。便攜系統的使用有幾個天線的問&lt;br /&gt;題。每個盒子兩個天線足夠適合門禁裝置探測，這樣局部結構的影響變得不再重要，因為門禁裝置的讀卡機天線被固定在倉庫的出入，並且直接指向貼標籤的物體。&lt;br/&gt;&lt;br/&gt;距 離&lt;br/&gt;RFID&lt;br /&gt;天線的增益和是否使用有源的標籤晶片將影響系統的使用距離。樂觀的考慮，在電磁場的輻射強度符合UK的相關標準時，2.45GHz&lt;br /&gt;的無源情況下，全波整流，驅動電壓不  於3伏，優化的RFID天線阻抗環境(阻抗 200&lt;br /&gt;或300歐姆)，使用距離大約是1米[3]。如果使用WHO限制[4]則更適合於全球範圍的使用，但是作用距離下降了一半。這些限制了讀卡機到標籤的電磁&lt;br /&gt;場功率。作用距離隨著頻率升高而下降。如果使用有源晶片作用距離可以達到5到10米。&lt;br/&gt;&lt;br/&gt;總 結&lt;br/&gt;全向天線應該避免在標籤中使用，然而&lt;br /&gt;是可以使用方向性天線，它具有更少的輻射模式和返回損耗的干擾。天線類型的選擇必須使它的阻抗與自由空間和ASIC匹配。在一個倉庫中使用天線好像是不可&lt;br /&gt;行的，除非使用有源標籤，但是在任何情況下，倉庫內的天線輻射模式將嚴重失真。一個門禁系統的使用將是好的選擇，可以使用短作用距離的無源標籤。當然門禁&lt;br /&gt;系統比手持的儀器昂貴，但是手持儀器工作人員需要使用它到倉庫搜尋物品，人員費用同樣昂貴。在門禁系統中，每一個物品盒子，僅需要2個而不是4個或6個&lt;br /&gt;RFID標籤。&lt;br/&gt;&lt;br/&gt;電子標籤中的射頻頻率&lt;br/&gt;&lt;br/&gt;RFID的解讀器的接收範圍受到很多因素的影響，如電波頻率，標籤的尺寸形狀，解讀&lt;br /&gt;器的能量，金屬物體的干擾，和其他射頻裝置等。總的說來，低頻被動標籤的有效接收距離在一英尺以內，對於高頻被動標籤的接收距離在三英尺左右，對於超高頻&lt;br /&gt;標籤的接收距離在十到二十英尺。對於使用電池的半主動和主動標籤，解讀器可以接收到三百英尺甚至更遠的信號。對於低頻和高頻射頻，如果標籤和解讀器天線的&lt;br /&gt;尺寸一樣，接收距離可以用天線的直徑乘以1.4來計算。在直徑在三十釐米以內，這條規律都適用。 &lt;br/&gt;和我們聽的收音機道理一樣，射頻標籤和解讀器也要調製到相同的頻率才能工作。LF、HF、UHF就對應著不同頻率的射頻。LF代表低頻射頻，在125KHz左右，HF代表高頻射頻，在13.54MHz左右，UHF代表超高頻射頻，在850至910MHz範圍之內。 &lt;br/&gt;&lt;br/&gt;在操作中有4種波段的頻率，低頻（125KHz），高頻（13.54MHz），超高頻（850-910MFz），微波（2.45GHz）.每一種頻率都有它的特點，被用在不同的領域，因此要正確使用就要先選擇合適的頻率。&lt;br/&gt;&lt;br/&gt;目&lt;br /&gt;前，不同的國家使用的同頻率，也不相同。現在，歐洲使用的超高頻是868MHz,美國的則是915MHz.日本目前不允許將超高頻用到射頻技術中。政府也&lt;br /&gt;通過調整解讀器的電源來限制它對其他器械的影響。有些組織例如全球商務促進委員會正鼓勵政府取消限制。標籤和解讀器生產廠商也正在開發能使用不同頻率系統&lt;br /&gt;避免這些問題。&lt;br/&gt;&lt;br/&gt;不同的頻率有不同的特點，因此他們的用途也就形形色色。例如，低頻標籤比超高頻標籤便宜，節省能量，穿透廢金屬物體力強，&lt;br /&gt;他們最適合用於含水成分較高的物體，例如水果等。超高頻作用範圍廣，傳送資料速度快，但是他們比較耗能，穿透力較弱，作業區域不能有太多干擾，適合用於監&lt;br /&gt;測從海港運到倉庫的物品。&lt;br/&gt;&lt;br/&gt;射頻技術遇到的一個問題就是解讀器衝突，就是一個解讀器接收到的資訊和另外一個解讀器接收到的資訊發生衝突，產&lt;br /&gt;生重疊。解決這個問題的一種方法是使用TDMA技術，簡單來說就是解讀器被指揮在不同時間接收信號，而不是同時，這樣就保證瞭解讀器不會互相干擾。但是在&lt;br /&gt;同一區域的物品就會被讀取兩次，因此就要建立相應的系統去避免這種情況的發生。&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3474577459886827247-6066474500459788428?l=cwjen888.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cwjen888.blogspot.com/feeds/6066474500459788428/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3474577459886827247&amp;postID=6066474500459788428' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/6066474500459788428'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/6066474500459788428'/><link rel='alternate' type='text/html' href='http://cwjen888.blogspot.com/2008/10/rfid.html' title='RFID的全面介紹和資料'/><author><name>David Chang</name><uri>http://www.blogger.com/profile/05943998889053147615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3474577459886827247.post-4593366625358067616</id><published>2008-10-30T09:38:00.001-07:00</published><updated>2008-10-30T09:38:46.583-07:00</updated><title type='text'>89C51 與 RF 發射模組的問題</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;br/&gt;&lt;br /&gt;&lt;font face='Arial'&gt;&amp;gt; 我想請問 如果我用 89C51 的 txd 的串列傳輸&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;&amp;gt; 送出一各 8 bit 的串列訊號 如後&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;&amp;gt; 給 RF 的發射模組 (TG-11 303Mhz) 發射出去&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;&amp;gt; 然後 在 接收模組上 接到 RS232 送給PC&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;&amp;gt; 然後 用 VB MSCOMM 顯示出來&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;&amp;gt; 但市不知道為什麼 接收的訊後 都一直不對 會亂跳&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;&amp;gt; 如果不接發射模組 8051 直接接到 RS232&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;&amp;gt; 一切正常  想請問 這是什麼原因...&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;&amp;gt; 我們老師不讓我們用 編解碼 IC HT12E&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;&lt;font face='Arial'&gt;  空中最好不要直接用 UART , 因為裡面的訊號中會有太長的定態, 也就是在資料中, 常常會有連&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;  續的 0 , 或連續的 1.&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;&lt;font face='Arial'&gt;  在連續的期間, 只要有一丁點的干擾, 你的資料就完蛋了! 有空可以參考一下各種軟碟機的低階&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;  讀寫原理, 若你要用那些的編碼最好!&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;&lt;font face='Arial'&gt;  有一個 PCM  的飛機遙控器, 就是用 APPLE ][ 軟碟的編碼方式...&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;&lt;font face='Arial'&gt;  若你要直接用 UART, 最好編碼後, 使之沒有連續的 1 (或 0) , 再用.  傳送資料時, 定態不要超&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;  過三個 bit 的時間.&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;&lt;font face='Arial'&gt;  所以你可能要把一個 byte 的資料, 拆成兩 byte, 編碼插一些 bit  後, 再來送. 對方接到後, 再&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;  組合回來.&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;&lt;font face='Arial'&gt;  同步碼, 前導碼....等等控制碼, 用資料編碼沒有用到的, 這樣接收的程式比較好寫.&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;&lt;font face='Arial'&gt;  當然, 無線通訊中, 由於失誤率遠大於有線, 故一定要有檢查碼 (有線幾乎都有在核對, 更何況是無&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;  線呢? ) ; 以便讓收方要求重送, 還是丟棄.&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;&lt;font face='Arial'&gt;  另外 51 會干擾接收模組. 可的話, 用頻譜儀看一下在接收頻率附近的那幾根諧波, 有沒有很大根,&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;  有沒有命中接收頻率.&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;&lt;font face='Arial'&gt;  注意 RF 模組的頻寬, 以便規化適合的鮑率.&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;  ~~~~~~&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;很精闢的見解，一針見血，佩服，這位仁兄所說得情形與敝人先行實驗的結果完全吻合，實為值得參考&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;的文章，好好研究個中道理，就會明白問題來源，編碼與通訊協定是重要的考慮與必要的措施..&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;Good luck....&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;--&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;Free Tech (Win32Asm, Electronics..)&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;http://freetech.hypermart.net/&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;Updated: May-9, 2001 / 20:15&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;以前的 post (2)&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;=========================&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;&lt;font face='Arial'&gt;Re:使用無線模組(類似tg11)與rs232連接，做無線單向的資料傳輸遇到的問題 &lt;/font&gt;&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;&lt;font face='Arial'&gt;&amp;gt;&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;&amp;gt;TG11 模組..基本上是用來傳送簡單的命令而已..類似機車的遙控發動器...&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;&amp;gt;加上編解碼 IC,可以傳送的距離非常遠..我有測試過..可達到 50 幾公尺..再遠沒測過了..&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;&amp;gt;&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;&amp;gt;至於你說的這個架構..&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;&amp;gt;基本上我也是有嘗試過...&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;&amp;gt;只不過我的架構是...&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;&amp;gt;PC-&amp;gt;RS-232-&amp;gt;HIN232(電壓準位轉換)-&amp;gt;無線發射模組 ~~ 無線接收模組-&amp;gt;8051 的 RS-232 埠&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;&amp;gt;但是..可以傳送的距離很短..二~三公尺左右..&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;&amp;gt;&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;&amp;gt;因此..基本上你的架構應該是可行的..&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;&amp;gt;只是有些地方可能你可以嘗試一下...&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;&amp;gt;我傳送資料時..大概每秒要傳送 30 幾筆左右...每筆大約 10Byte 左右..&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;&amp;gt;8051 才能穩定的接收到資料...&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;&amp;gt;我的 Baud Rate = 4800 bps...8N1...&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;&amp;gt;給你參考...希望對你有幫助...^^&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;&amp;gt;&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;&amp;gt;另外..你可以到 Google 用 "RWS-434" 關鍵字應該可以查到很多資料..&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;&amp;gt;還有..元智大學也有相關的文件..&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;&amp;gt;http://designer.mech.yzu.edu.tw/article/articles/technical/(2001-08-30) &lt;br/&gt;&lt;br/&gt;&lt;br /&gt;&amp;gt;無線電收發模組電路製作介紹.htm&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;&amp;gt;&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;&amp;gt;&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;&lt;font face='Arial'&gt;你可能要嘗試著將傳送資料的"頻率"提高...&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;&lt;font face='Arial'&gt;例如..每秒傳送字串"123456789"...30-40次...&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;也就是說..每隔 30mS 左右..就將字串"123456789"傳送過去...&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;這樣可以提高資料傳送時的穩定度...&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;&lt;font face='Arial'&gt;另外..二個模組不要擺太遠..一開始最好離近一點...模組需要加上天線..會比較好..&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;&lt;font face='Arial'&gt;嗯..是的..接收端會一直接收到雜訊..若要排除接收到雜訊..則可以自定接收的格式...&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;例如..若你要傳送"ABC"這三個字元過去...則你的格式可能可以類似寫成這樣子...&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;&lt;font face='Arial'&gt;$ABCk@&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;$--&amp;gt;表示前導符號...&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;ABC--&amp;gt;表示欲傳送的資料..&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;k--&amp;gt;表示檢查碼..Check Sum&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;@--&amp;gt;表示結束符號...&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;&lt;font face='Arial'&gt;程式可以寫成...&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;當接收到的字元..是 '$' 時..&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;則開始接收資料..並同時儲入 Buffer..&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;一直接收到..結束字元 '@' 出現...或資料長度大於某個值..才結束接收..&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;當字串接收完成後, 再比對 Check Sum 與傳送的資料是否符合..&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;若符合..則表示資料接收正確...&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;&lt;font face='Arial'&gt;給你參考..希望有幫助..^^&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;&lt;font face='Arial'&gt;呵呵~~~看來有人碰到跟我一樣的問題喔~~我之前有做一個題目,其中也是需要無線傳輸,&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;於是我用的架構跟你們討論的一樣(因為這是最方便的),但是我發現,這需要將傳送的包率&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;達到 115200 才能夠比較容易接收到,而且為了增加傳輸的可信度,使用了&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;handshake+boardbast+packet 的 Protocol,因為我這是一個 server 對很多的 client 做控制,&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;但都是使用一樣的頻率,所以我是用 TDM 方式來做,但還是不穩,有時不到 1 秒就可以控制&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;有時要等一分鐘?!@@a....這種通訊系統實在是太爛了....當下我也找不出方法可以解決就畢業了....&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;但是現在我知道問題所在了&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;&lt;font face='Arial'&gt;原因是 "0","1" 分別要用不同的狀態來表示,不能直接把 "O" 當成電位 0V 送給模組,&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;這樣會變成接收段無法判斷現在是什麼狀態,這麼說好了,如果是送 1 出來的話還沒什麼錯誤,&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;但 RS232 是 狀態0 就是 0電位,這時接收端就會接收到雜訊,運氣好的話若雜訊是在 TTL 的&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;0準位以下,就收到 0,但雜訊一個過大,就變成 1 了,那這時就會出錯&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;&lt;font face='Arial'&gt;所以很不幸的...不能直接送 RS232 訊號給模組....所以別偷懶了~~~自己寫個 protocol 來傳吧,&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;我建議可以遵循紅外線的傳送方式來送,因為 PT2262 這個無線遙控器 IC 就是用這樣的方式來傳,&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;大家可以去 GOOGLE 找這個 SPEC.裡面有 PROTOCOL 的詳細解說或是使用 Manchester 編碼&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;也是可以的~~不管是用什麼方法,反正原則就是千萬不要用電位 0 來代表有意義的資料&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;送到無線模組~~說完了&amp;gt;_&amp;lt;||&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;&lt;blockquote/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3474577459886827247-4593366625358067616?l=cwjen888.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cwjen888.blogspot.com/feeds/4593366625358067616/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3474577459886827247&amp;postID=4593366625358067616' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/4593366625358067616'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/4593366625358067616'/><link rel='alternate' type='text/html' href='http://cwjen888.blogspot.com/2008/10/89c51-rf.html' title='89C51 與 RF 發射模組的問題'/><author><name>David Chang</name><uri>http://www.blogger.com/profile/05943998889053147615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3474577459886827247.post-6514757199270611416</id><published>2008-10-30T04:27:00.001-07:00</published><updated>2008-10-30T04:27:41.718-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='家庭自動化'/><category scheme='http://www.blogger.com/atom/ns#' term='Arduino'/><title type='text'>8051動手做做看- [實作班]</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;不錯的 Blog..&lt;br/&gt;&lt;br/&gt;有無線 module 的使用&lt;br/&gt;&lt;br/&gt;http://tw.myblog.yahoo.com/jl0821/article?mid=305&amp;amp;sc=1&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3474577459886827247-6514757199270611416?l=cwjen888.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cwjen888.blogspot.com/feeds/6514757199270611416/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3474577459886827247&amp;postID=6514757199270611416' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/6514757199270611416'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3474577459886827247/posts/default/6514757199270611416'/><link rel='alternate' type='text/html' href='http://cwjen888.blogspot.com/2008/10/8051_30.html' title='8051動手做做看- [實作班]'/><author><name>David Chang</name><uri>http://www.blogger.com/profile/05943998889053147615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3474577459886827247.post-235468958283034989</id><published>2008-10-29T03:33:00.001-07:00</published><updated>2008-10-29T03:33:25.928-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='家庭自動化'/><category scheme='http://www.blogger.com/atom/ns#' term='機器人(Robot)'/><category scheme='http://www.blogger.com/atom/ns#' term='Arduino'/><title type='text'>Arduino 連接 LCD1602</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;div class='topic'&gt;Arduino&amp;amp;LCD1602　&lt;img src='http://www.roboticfan.com/blog/images/jhinfo.gif'/&gt;&lt;/div&gt;&lt;br /&gt;			&lt;div class='loginfo'&gt;wxxmickey 发表于 - 2008-5-9 21:34:00&lt;/div&gt;&lt;br /&gt;			&lt;span id='ob_logd6008'&gt;&lt;div style='margin: 0pt 10px 5px 0pt; background: transparent url(/blog/Images/digg.gif) no-repeat scroll left top; float: right; display: inline; width: 45px; height: 55px; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; text-align: center;' class='digg_list'&gt;	&lt;div style='padding: 10px 0pt 11px; width: 45px; font-size: 18px; font-weight: 600; color: rgb(51, 51, 51); font-family: tahoma,Arial,Helvetica,sans-serif; line-height: 1;' class='digg_number'&gt;1&lt;/div&gt;	&lt;div style='padding: 3px 0pt 0pt 6px; line-height: 1; letter-spacing: 6px;' class='digg_submit'&gt;&lt;a style='font-size: 12px; line-height: 1;' onclick='diggit(6008);' href='javascript:void(null)'&gt;推荐&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt; &lt;p&gt;      Arduino我已经接触一段时间了，由于工作原因，不能天天玩这个，所以只能隔三岔五的搞点实验，现在把一些心得给大家分享一下。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;     今天玩的是字符液晶1602，有玩过1602字符液晶的朋友都知道，这个液晶分4总线和8总线2种驱动方式（关于该液晶的详细资料，大家&lt;br /&gt;可以自己搜索，这里就不做详细说明了）。我们用单片机驱动1602液晶，使用并口操作很容易就驱动起来了，但使用&lt;br /&gt;Arduino板驱动1602液晶，还真有点费劲，因为他只能位操作。根据官方网站提供的例程，很容易看出他们使用的是最常用的8总线驱动方式，然而他巧&lt;br /&gt;妙的使用for循环语句完成了位操作的赋值。我们来看看官方的工程代码：&lt;/p&gt;&lt;br /&gt;&lt;p&gt;int DI = 12;&lt;br/&gt;int RW = 11;&lt;br/&gt;int DB[] = {3, 4, 5, 6, 7, 8, 9, 10};//使用数组来定义总线需要的管脚&lt;br/&gt;int Enable = 2;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;void LcdCommandWrite(int value) {&lt;br/&gt; // poll all the pins&lt;br/&gt; int i = 0;&lt;br/&gt; for (i=DB[0]; i &amp;lt;= DI; i++) //总线赋值&lt;br/&gt;{&lt;br/&gt;   digitalWrite(i,value &amp;amp; 01);&lt;br/&gt;   value &amp;gt;&amp;gt;= 1;&lt;br/&gt; }&lt;br/&gt; digitalWrite(Enable,LOW);&lt;br/&gt; delayMicroseconds(1);&lt;br/&gt; // send a pulse to enable&lt;br/&gt; digitalWrite(Enable,HIGH);&lt;br/&gt; delayMicroseconds(1);  // pause 1 ms according to datasheet&lt;br/&gt; digitalWrite(Enable,LOW);&lt;br/&gt; delayMicroseconds(1);  // pause 1 ms according to datasheet&lt;br/&gt;}&lt;/p&gt;&lt;br /&gt;&lt;p&gt;void LcdDataWrite(int value) {&lt;br/&gt; // poll all the pins&lt;br/&gt; int i = 0;&lt;br/&gt; digitalWrite(DI, HIGH);&lt;br/&gt; digitalWrite(RW, LOW);&lt;br/&gt; for (i=DB[0]; i &amp;lt;= DB[7]; i++) {&lt;br/&gt;   digitalWrite(i,value &amp;amp; 01);&lt;br/&gt;   value &amp;gt;&amp;gt;= 1;&lt;br/&gt; }&lt;br/&gt; digitalWrite(Enable,LOW);&lt;br/&gt; delayMicroseconds(1);&lt;br/&gt; // send a pulse to enable&lt;br/&gt; digitalWrite(Enable,HIGH);&lt;br/&gt; delayMicroseconds(1);&lt;br/&gt; digitalWrite(Enable,LOW);&lt;br/&gt; delayMicroseconds(1);  // pause 1 ms according to datasheet&lt;br/&gt;}&lt;/p&gt;&lt;br /&gt;&lt;p&gt;void setup (void) {&lt;br/&gt; int i = 0;&lt;br/&gt; for (i=Enable; i &amp;lt;= DI; i++) {&lt;br/&gt;   pinMode(i,OUTPUT);&lt;br/&gt; }&lt;br/&gt; delay(100);&lt;br/&gt; // initiatize lcd after a short pause&lt;br/&gt; // needed by the LCDs controller&lt;br/&gt; LcdCommandWrite(0x30);  // set:&lt;br/&gt;                         // 8-bit interface, 1 display lines, 5x7 font&lt;br/&gt; delay(64);                      &lt;br/&gt; LcdCommandWrite(0x30);  // set:&lt;br/&gt;                         // 8-bit interface, 1 display lines, 5x7 font&lt;br/&gt; delay(50);                      &lt;br/&gt; LcdCommandWrite(0x30);  // set:&lt;br/&gt;                         // 8-bit interface, 1 display lines, 5x7 font&lt;br/&gt; delay(20);                      &lt;br/&gt; LcdCommandWrite(0x06);  // entry mode set:&lt;br/&gt;                         // increment automatically, no display shift&lt;br/&gt; delay(20);                      &lt;br/&gt; LcdCommandWrite(0x0E);  // display control:&lt;br/&gt;                         // turn display on, cursor on, no blinking&lt;br/&gt; delay(20);                      &lt;br/&gt; LcdCommandWrite(0x01);  // clear display, set cursor position to zero  &lt;br/&gt; delay(100);                      &lt;br/&gt; LcdCommandWrite(0x80);  // display control:&lt;br/&gt;                         // turn display on, cursor on, no blinking&lt;br/&gt; delay(20);                      &lt;br/&gt;}&lt;/p&gt;&lt;br /&gt;&lt;p&gt;void loop (void) {&lt;br/&gt;  LcdCommandWrite(0x02);  // set cursor position to zero  &lt;br/&gt;  delay(10);                     &lt;br/&gt;  // Write the welcome message &lt;br/&gt;  LcdDataWrite('H');&lt;br/&gt;  LcdDataWrite('o');&lt;br/&gt;  LcdDataWrite('l');&lt;br/&gt;  LcdDataWrite('a');&lt;br/&gt;  LcdDataWrite(' ');&lt;br/&gt;  LcdDataWrite('C');&lt;br/&gt;  LcdDataWrite('a');&lt;br/&gt;  LcdDataWrite('r');&lt;br/&gt;  LcdDataWrite('a');&lt;br/&gt;  LcdDataWrite('c');&lt;br/&gt;  LcdDataWrite('o');&lt;br/&gt;  LcdDataWrite('l');&lt;br/&gt;  LcdDataWrite('a');&lt;br/&gt;  delay(500);&lt;br/&gt;}&lt;/p&gt;&lt;br /&gt;&lt;p&gt;实验器材：Arduino DM 一个，USB电缆一根，LCD1602一个，单芯杜邦线若干。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;根据例程定义接线图如下：&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;img onload='rsimg(this,500)' style='cursor: pointer;' onclick='javascript:window.open(this.src);' src='http://www.roboticfan.com/blog/UploadFiles/2008-5/92122570513.jpg'/&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;大家需要注意的是，液晶根据不同的颜色不同的型号，对比度（VEE）调节电压也不同，一般都需要接个电位器进行调节，本人使用的是灰膜液晶，VEE直接接到地即可。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;img onload='rsimg(this,500)' style='cursor: pointer;' onclick='javascript:window.open(this.src);' src='http://www.roboticfan.com/blog/UploadFiles/2008-5/92120160119.jpg'/&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;例程编译后，下载进Arduino，显示居然不正常，如图：&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;img onload='rsimg(this,500)' style='cursor: pointer;' onclick='javascript:window.open(this.src);' src='http://www.roboticfan.com/blog/UploadFiles/2008-5/92120302364.jpg'/&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;一般这种液晶上电或没有正常初始化就会出现一排黑块，但我仔细检查了程序和电路连线，也没有看出什么问题，难道液晶坏了？我又把液晶拆到我的51实验板上验证是好的，我开始怀疑是对比度调节的问题，于是把液晶拿起来一看，果然是对比度不对。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;img onload='rsimg(this,500)' style='cursor: pointer;' onclick='javascript:window.open(this.src);' src='http://www.roboticfan.com/blog/UploadFiles/2008-5/92121553155.jpg'/&gt; &lt;/p&gt;&lt;br /&gt;&lt;p&gt;斜着看，就能看见“Hola&lt;br /&gt;Caracila”的字样，也就是我们实验需要显示的内容。这款灰膜液晶我使用很多次，对比度调节端都是直接接地，没有任何问题，怎么用这个程序就出现这&lt;br /&gt;样的问题，于是我又找到官方网站仔细探头究竟，终于被我发现问题的所在，官方网站使用的是2001的液晶（好象是这个型号），是单排显示的一排显示20个&lt;br /&gt;字符， 因此这个问题就出在液晶的功能初始化设置上了，我开始没有注意，所以就直接套用程序了。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;根据我们使用的液晶更改功能初始化设置，指令集如下表：&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;img height='220' width='500' onload='rsimg(this,500)' style='cursor: pointer;' onclick='javascript:window.open(this.src);' src='http://www.roboticfan.com/blog/UploadFiles/2008-5/92122198516.jpg'/&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;img height='155' width='500' onload='rsimg(this,500)' style='cursor: pointer;' onclick='javascript:window.open(this.src);' src='http://www.roboticfan.com/blog/UploadFiles/2008-5/92258762486.jpg'/&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;根据指令6，将官方提供的代码初始化部分：&lt;/p&gt;&lt;br /&gt;&lt;p&gt; LcdCommandWrite(0x30);  // set:&lt;br/&gt;                         // 8-bit interface, 1 display lines, 5x7 font&lt;br/&gt; delay(64);                      &lt;br/&gt; LcdCommandWrite(0x30);  // set:&lt;br/&gt;                         // 8-bit interface, 1 display lines, 5x7 font&lt;br/&gt; delay(50);                      &lt;br/&gt; LcdCommandWrite(0x30);  // set:&lt;br/&gt;                         // 8-bit interface, 1 display lines, 5x7 font&lt;/p&gt;&lt;br /&gt;&lt;p&gt;更改为8总线、双行显示、5x7：&lt;/p&gt;&lt;br /&gt;&lt;p&gt; LcdCommandWrite(0x38);  // set:&lt;br/&gt;                         // 8-bit interface, 2 display lines, 5x7 font&lt;br/&gt; delay(64);                      &lt;br/&gt; LcdCommandWrite(0x38);  // set:&lt;br/&gt;                         // 8-bit interface, 2 display lines, 5x7 font&lt;br/&gt; delay(50);                      &lt;br/&gt; LcdCommandWrite(0x38);  // set:&lt;br/&gt;                         // 8-bit interface, 2 display lines, 5x7 font&lt;/p&gt;&lt;br /&gt;&lt;p&gt;更改后编译、下载，显示结果如下：&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;img onload='rsimg(this,500)' style='cursor: pointer;' onclick='javascript:window.open(this.src);' src='http://www.roboticfan.com/blog/UploadFiles/2008-5/92120363943.jpg'/&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;是不是能够很清楚的看见“Hola Caracila”的字样了。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Arduino DM的数字端口只有13个，那么LCD1602就占用了10个，浪费了不少资源，对我们以后的电路扩展带来了极大的不便。于是我就可以使用该液晶的4总线驱动方式，可以节省3个数字端口出来作其他扩展。本人编写的工程代码如下：&lt;/p&gt;&lt;br /&gt;&lt;p&gt;/********************************************************************/&lt;br/&gt; &lt;br/&gt;int LCD1602_RS=12;   &lt;/p&gt;&lt;br /&gt;&lt;p&gt;int LCD1602_RW=11;   &lt;/p&gt;&lt;br /&gt;&lt;p&gt;int LCD1602_EN=10;   &lt;/p&gt;&lt;br /&gt;&lt;p&gt;int DB[] = { 6, 7, 8, 9};&lt;/p&gt;&lt;br /&gt;&lt;p&gt;char str1[]="Welcome to";&lt;/p&gt;&lt;br /&gt;&lt;p&gt;char str2[]="&lt;a href='http://www.dfrobot.cn/'&gt;www.DFRobot.cn&lt;/a&gt;";&lt;br/&gt;/********************************************************************/&lt;/p&gt;&lt;br /&gt;&lt;p&gt; &lt;/p&gt;&lt;br /&gt;&lt;p&gt;/********************************************************************/  &lt;br/&gt;void LCD_Command_Write(int command)&lt;br/&gt;{&lt;br/&gt; int i,temp;&lt;br/&gt; digitalWrite( LCD1602_RS,LOW);&lt;br/&gt; digitalWrite( LCD1602_RW,LOW);&lt;br/&gt; digitalWrite( LCD1602_EN,LOW);&lt;/p&gt;&lt;br /&gt;&lt;p&gt; temp=command &amp;amp; 0xf0;&lt;br/&gt; for (i=DB[0]; i &amp;lt;= 9; i++)&lt;br/&gt; {&lt;br/&gt;   digitalWrite(i,temp &amp;amp; 0x80);&lt;br/&gt;   temp &amp;lt;&amp;lt;= 1;&lt;br/&gt; }&lt;br/&gt; &lt;br/&gt; digitalWrite( LCD1602_EN,HIGH);&lt;br/&gt; delayMicroseconds(1);&lt;br/&gt; digitalWrite( LCD1602_EN,LOW);&lt;/p&gt;&lt;br /&gt;&lt;p&gt; temp=(command &amp;amp; 0x0f)&amp;lt;&amp;lt;4;&lt;br/&gt; for (i=DB[0]; i &amp;lt;= 10; i++)&lt;br/&gt; {&lt;br/&gt;   digitalWrite(i,temp &amp;amp; 0x80);&lt;br/&gt;   temp &amp;lt;&amp;lt;= 1;&lt;br/&gt; }&lt;/p&gt;&lt;br /&gt;&lt;p&gt; digitalWrite( LCD1602_EN,HIGH);&lt;br/&gt; delayMicroseconds(1); &lt;br/&gt; digitalWrite( LCD1602_EN,LOW);&lt;br/&gt;}&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br/&gt;/********************************************************************/&lt;br/&gt;void LCD_Data_Write(int dat)&lt;br/&gt;{&lt;br/&gt;  &lt;br/&gt; int i=0,temp;&lt;br/&gt; digitalWrite( LCD1602_RS,HIGH);&lt;br/&gt; digitalWrite( LCD1602_RW,LOW);&lt;br/&gt; digitalWrite( LCD1602_EN,LOW);&lt;/p&gt;&lt;br /&gt;&lt;p&gt; temp=dat &amp;amp; 0xf0;&lt;br/&gt; for (i=DB[0]; i &amp;lt;= 9; i++)&lt;br/&gt; {&lt;br/&gt;   digitalWrite(i,temp &amp;amp; 0x80);&lt;br/&gt;   temp &amp;lt;&amp;lt;= 1;&lt;br/&gt; }&lt;/p&gt;&lt;br /&gt;&lt;p&gt; digitalWrite( LCD1602_EN,HIGH);&lt;br/&gt; delayMicroseconds(1);&lt;br/&gt; digitalWrite( LCD1602_EN,LOW);&lt;/p&gt;&lt;br /&gt;&lt;p&gt; temp=(dat &amp;amp; 0x0f)&amp;lt;&amp;lt;4;&lt;br/&gt; for (i=DB[0]; i &amp;lt;= 10; i++)&lt;br/&gt; {&lt;br/&gt;   digitalWrite(i,temp &amp;amp; 0x80);&lt;br/&gt;   temp &amp;lt;&amp;lt;= 1;&lt;br/&gt; }&lt;/p&gt;&lt;br /&gt;&lt;p&gt; digitalWrite( LCD1602_EN,HIGH);&lt;br/&gt; delayMicroseconds(1); &lt;br/&gt; digitalWrite( LCD1602_EN,LOW);&lt;br/&gt;}&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br/&gt;/********************************************************************/&lt;br/&gt;void LCD_SET_XY( int x, int y )&lt;br/&gt;{&lt;br/&gt;  int address;&lt;br/&gt;  if (y ==0)    address = 0x80 + x;&lt;br/&gt;  else          address = 0xC0 + x;&lt;br/&gt;  LCD_Command_Write(address); &lt;br/&gt;}&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br/&gt;/**********************
