﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-昨夜西风凋碧树，独上高楼，望尽天涯路！-随笔分类-单片机</title><link>http://www.cppblog.com/guojingjia2006/category/14334.html</link><description>Welcome To My Blog ------ XiaoGuoZi</description><language>zh-cn</language><lastBuildDate>Tue, 03 Aug 2010 00:17:06 GMT</lastBuildDate><pubDate>Tue, 03 Aug 2010 00:17:06 GMT</pubDate><ttl>60</ttl><item><title>51串口通信</title><link>http://www.cppblog.com/guojingjia2006/archive/2010/08/01/121871.html</link><dc:creator>小果子</dc:creator><author>小果子</author><pubDate>Sun, 01 Aug 2010 08:11:00 GMT</pubDate><guid>http://www.cppblog.com/guojingjia2006/archive/2010/08/01/121871.html</guid><wfw:comment>http://www.cppblog.com/guojingjia2006/comments/121871.html</wfw:comment><comments>http://www.cppblog.com/guojingjia2006/archive/2010/08/01/121871.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/guojingjia2006/comments/commentRss/121871.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/guojingjia2006/services/trackbacks/121871.html</trackback:ping><description><![CDATA[<span style="font-family: courier new;">//网上看了下资料,借鉴了别人的一些好的东西，同时自己封装了下</span><br style="font-family: courier new;">
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; font-family: courier new;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">#ifndef&nbsp;__mycom__h__<br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;__mycon__h__</span><span style="color: #000000;"><br>#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #008000;">//</span><span style="color: #008000;">数据格式<br></span><span style="color: #008000;">//</span><span style="color: #008000;">W&nbsp;8&nbsp;&nbsp;</span><span style="color: #008000;"><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;SUCCESS&nbsp;1</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;ERROR&nbsp;&nbsp;&nbsp;0</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;uchar&nbsp;unsigned&nbsp;char</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;uint&nbsp;&nbsp;unsinged&nbsp;int</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;BUF_LEN&nbsp;30&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">传冲区大小</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;RECIEVED_MAX_DATA_LEN&nbsp;16</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;SEND_MAX_DATA_LEN&nbsp;25</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;END_NUM&nbsp;4&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">结束符长度</span><span style="color: #000000;"><br><br><br>typedef&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">*</span><span style="color: #000000;">PTRFUN)(uchar</span><span style="color: #000000;">*</span><span style="color: #000000;">,uchar);<br>PTRFUN&nbsp;ptrFun;<br>&nbsp;<br>uchar&nbsp;END_CODE[</span><span style="color: #000000;">4</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">#end</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br>uchar&nbsp;end_num</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>uchar&nbsp;data_num</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">接受数据个数</span><span style="color: #008000;"><br></span><span style="color: #000000;">uchar&nbsp;data_buf[BUF_LEN];</span><span style="color: #008000;">//</span><span style="color: #008000;">缓冲区大小</span><span style="color: #008000;"><br></span><span style="color: #000000;">uchar&nbsp;data_addr</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">数据在data_buf位置</span><span style="color: #008000;"><br></span><span style="color: #000000;">bit&nbsp;isComplete</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">处理</span><span style="color: #008000;"><br></span><span style="color: #000000;"><br>typedef&nbsp;&nbsp;</span><span style="color: #0000ff;">struct</span><span style="color: #000000;"><br>{<br></span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;name[</span><span style="color: #000000;">10</span><span style="color: #000000;">];&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">姓名</span><span style="color: #008000;"><br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;age;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">年龄</span><span style="color: #008000;"><br></span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;sex[</span><span style="color: #000000;">5</span><span style="color: #000000;">];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">性别</span><span style="color: #008000;"><br></span><span style="color: #000000;">}st;<br><br>st&nbsp;b;<br><br></span><span style="color: #008000;">//</span><span style="color: #008000;">初始化</span><span style="color: #008000;"><br></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;init_serialcomm(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;SCON&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0x50</span><span style="color: #000000;">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">SCON:&nbsp;serail&nbsp;mode&nbsp;1,&nbsp;8-bit&nbsp;UART,&nbsp;enable&nbsp;ucvr</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;TMOD&nbsp;</span><span style="color: #000000;">|=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0x20</span><span style="color: #000000;">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">TMOD:&nbsp;timer&nbsp;1,&nbsp;mode&nbsp;2,&nbsp;8-bit&nbsp;reload</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;PCON&nbsp;</span><span style="color: #000000;">|=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0x80</span><span style="color: #000000;">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">SMOD=1;</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;TH1&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0xF4</span><span style="color: #000000;">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">Baud:4800&nbsp;fosc=11.0592MHz</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;IE&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">|=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0x90</span><span style="color: #000000;">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">Enable&nbsp;Serial&nbsp;Interrupt</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;TR1&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;timer&nbsp;1&nbsp;run<br>&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;TI=1;</span><span style="color: #008000;"><br></span><span style="color: #000000;">}<br><br></span><span style="color: #008000;">//</span><span style="color: #008000;">*******数据转换*********************</span><span style="color: #008000;"><br></span><span style="color: #000000;">uchar&nbsp;decoderData(){<br>&nbsp;&nbsp;&nbsp;&nbsp;uchar&nbsp;state,i;<br>&nbsp;&nbsp;&nbsp;&nbsp;state</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;i</span><span style="color: #000000;">=</span><span style="color: #000000;">2</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">-----------------------计算地址-------------------------------</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">(</span><span style="color: #000000;">1</span><span style="color: #000000;">){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(&nbsp;(data_buf[i]</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">47</span><span style="color: #000000;">)</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">(data_buf[i]</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">58</span><span style="color: #000000;">)&nbsp;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;是&#8216;0&#8217;-&#8216;9&#8217;？</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;state&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(state</span><span style="color: #000000;">*</span><span style="color: #000000;">10</span><span style="color: #000000;">)</span><span style="color: #000000;">+</span><span style="color: #000000;">(data_buf[i]</span><span style="color: #000000;">-</span><span style="color: #000000;">48</span><span style="color: #000000;">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;计算</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(&nbsp;data_buf[i]</span><span style="color: #000000;">==</span><span style="color: #000000;">'</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">&nbsp;)&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;是空格,跳出</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;非'0'-'9'和'&nbsp;'</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;ERROR;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;返回错误</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(&nbsp;i</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">4</span><span style="color: #000000;">&nbsp;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;输入数字过大</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;ERROR;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;data_buf[</span><span style="color: #000000;">1</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">state;</span><span style="color: #008000;">//</span><span style="color: #008000;">数据个数</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;data_addr</span><span style="color: #000000;">=++</span><span style="color: #000000;">i;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;SUCCESS;<br>}<br></span><span style="color: #008000;">//</span><span style="color: #008000;">***************************接收处理**************************************</span><span style="color: #008000;"><br></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;afterRecived(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(&nbsp;decoderData()</span><span style="color: #000000;">==</span><span style="color: #000000;">ERROR&nbsp;)&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;错误，返回</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(&nbsp;data_buf[</span><span style="color: #000000;">1</span><span style="color: #000000;">]</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">RECIEVED_MAX_DATA_LEN&nbsp;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;写入个数判断</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;数据个数太多，返回</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;ptrFun(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">data_buf[data_addr],data_buf[</span><span style="color: #000000;">1</span><span style="color: #000000;">]);<br>}<br><br></span><span style="color: #008000;">//</span><span style="color: #008000;">向串口发送一个字符</span><span style="color: #008000;"><br></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;send_char_com(unsigned&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;ch)&nbsp;&nbsp;<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;SBUF</span><span style="color: #000000;">=</span><span style="color: #000000;">ch;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">(TI</span><span style="color: #000000;">==</span><span style="color: #000000;">0</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;TI</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>}<br><br></span><span style="color: #008000;">//</span><span style="color: #008000;">向串口发送一个字符串，strlen为该字符串长度</span><span style="color: #008000;"><br></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;send_string_com(unsigned&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">str,uchar&nbsp;len)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;k</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">do</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;send_char_com(</span><span style="color: #000000;">*</span><span style="color: #000000;">(str&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;k));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;k</span><span style="color: #000000;">++</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">(k&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;len);<br>}<br></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;sendBefore(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;p){<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;m</span><span style="color: #000000;">=</span><span style="color: #000000;">(</span><span style="color: #0000ff;">char</span><span style="color: #000000;">*</span><span style="color: #000000;">)p;<br>&nbsp;&nbsp;&nbsp;&nbsp;uchar&nbsp;len</span><span style="color: #000000;">=</span><span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(st);<br>&nbsp;&nbsp;&nbsp;&nbsp;send_string_com(m,len);<br>}<br></span><span style="color: #008000;">//</span><span style="color: #008000;">串口接收中断函数</span><span style="color: #008000;"><br></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;serial&nbsp;()&nbsp;interrupt&nbsp;</span><span style="color: #000000;">4</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">using</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;"><br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;state;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(&nbsp;RI</span><span style="color: #000000;">==</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;state&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;SBUF;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;缓存接收到的数据</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RI&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;接收标志清零<br></span><span style="color: #008000;">//</span><span style="color: #008000;">---------------------检测结束命令#end---------------------------</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(&nbsp;state</span><span style="color: #000000;">==</span><span style="color: #000000;">END_CODE[end_num]&nbsp;)&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end_num</span><span style="color: #000000;">++</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(&nbsp;end_num</span><span style="color: #000000;">==</span><span style="color: #000000;">END_NUM&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end_num&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;isComplete&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ES</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;end_num&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br></span><span style="color: #008000;">//</span><span style="color: #008000;">---------------------串口数据处理-------------------------------</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(&nbsp;data_num</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">SEND_MAX_DATA_LEN&nbsp;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data_num&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">ERROR&nbsp;接受数据过长</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data_buf[data_num</span><span style="color: #000000;">++</span><span style="color: #000000;">]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;state;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br><br><br></span><span style="color: #0000ff;">#endif</span><span style="color: #000000;"><br></span></div>
<br>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">REGX52.H</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>#include&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">51com.h</span><span style="color: #000000;">"</span><span style="color: #000000;"><br>#include&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">util.h</span><span style="color: #000000;">"</span><span style="color: #000000;"><br><br>unsigned&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;key_map[]</span><span style="color: #000000;">=</span><span style="color: #000000;">{</span><span style="color: #000000;">0</span><span style="color: #000000;">,</span><span style="color: #000000;">7</span><span style="color: #000000;">,</span><span style="color: #000000;">8</span><span style="color: #000000;">,</span><span style="color: #000000;">9</span><span style="color: #000000;">,</span><span style="color: #000000;">'</span><span style="color: #000000;">/</span><span style="color: #000000;">'</span><span style="color: #000000;">,</span><span style="color: #000000;">4</span><span style="color: #000000;">,</span><span style="color: #000000;">5</span><span style="color: #000000;">,</span><span style="color: #000000;">6</span><span style="color: #000000;">,</span><span style="color: #000000;">'</span><span style="color: #000000;">*</span><span style="color: #000000;">'</span><span style="color: #000000;">,</span><span style="color: #000000;">1</span><span style="color: #000000;">,</span><span style="color: #000000;">2</span><span style="color: #000000;">,</span><span style="color: #000000;">3</span><span style="color: #000000;">,</span><span style="color: #000000;">'</span><span style="color: #000000;">-</span><span style="color: #000000;">'</span><span style="color: #000000;">,</span><span style="color: #000000;">'</span><span style="color: #000000;">c</span><span style="color: #000000;">'</span><span style="color: #000000;">,</span><span style="color: #000000;">0</span><span style="color: #000000;">,</span><span style="color: #000000;">'</span><span style="color: #000000;">=</span><span style="color: #000000;">'</span><span style="color: #000000;">,</span><span style="color: #000000;">'</span><span style="color: #000000;">+</span><span style="color: #000000;">'</span><span style="color: #000000;">};<br>unsigned&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;tab[]</span><span style="color: #000000;">=</span><span style="color: #000000;">{</span><span style="color: #000000;">0xFE</span><span style="color: #000000;">,</span><span style="color: #000000;">0x30</span><span style="color: #000000;">,</span><span style="color: #000000;">0x6d</span><span style="color: #000000;">,</span><span style="color: #000000;">0x79</span><span style="color: #000000;">,</span><span style="color: #000000;">0x33</span><span style="color: #000000;">,</span><span style="color: #000000;">0x5b</span><span style="color: #000000;">,</span><span style="color: #000000;">0x5f</span><span style="color: #000000;">,</span><span style="color: #000000;">0x70</span><span style="color: #000000;">,</span><span style="color: #000000;">0x7f</span><span style="color: #000000;">,</span><span style="color: #000000;">0x7b</span><span style="color: #000000;">};<br><br></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;process(uchar</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;p,len){<br>&nbsp;&nbsp;&nbsp;&nbsp;P1</span><span style="color: #000000;">=</span><span style="color: #000000;">tab[string_to_int(p,len)];<br>}<br><br></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;main(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">)<br>{&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;init_serialcomm();&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">初始化串口</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;ptrFun</span><span style="color: #000000;">=</span><span style="color: #000000;">process;<br><br></span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;b.age</span><span style="color: #000000;">=</span><span style="color: #000000;">10</span><span style="color: #000000;">;<br>&nbsp; </span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;sendBefore(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">b);<br><br>&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">send_string_com("b",1);</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">(</span><span style="color: #000000;">1</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(&nbsp;isComplete</span><span style="color: #000000;">==</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;串口接收到一串数据</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;isComplete&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;标志清零</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(&nbsp;data_buf[</span><span style="color: #000000;">0</span><span style="color: #000000;">]</span><span style="color: #000000;">==</span><span style="color: #000000;">'</span><span style="color: #000000;">R</span><span style="color: #000000;">'</span><span style="color: #000000;">&nbsp;)afterRecived();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(&nbsp;data_buf[</span><span style="color: #000000;">0</span><span style="color: #000000;">]</span><span style="color: #000000;">==</span><span style="color: #000000;">'</span><span style="color: #000000;">S</span><span style="color: #000000;">'</span><span style="color: #000000;">&nbsp;)send_string_com(</span><span style="color: #000000;">"</span><span style="color: #000000;">b</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">1</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data_num&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;重新开始接收数据</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ES&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;允许串口中断</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}</span></div>
<br style="font-family: courier new;"><br>  <img src ="http://www.cppblog.com/guojingjia2006/aggbug/121871.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/guojingjia2006/" target="_blank">小果子</a> 2010-08-01 16:11 <a href="http://www.cppblog.com/guojingjia2006/archive/2010/08/01/121871.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>crc 原理及实现</title><link>http://www.cppblog.com/guojingjia2006/archive/2010/07/30/121711.html</link><dc:creator>小果子</dc:creator><author>小果子</author><pubDate>Fri, 30 Jul 2010 09:34:00 GMT</pubDate><guid>http://www.cppblog.com/guojingjia2006/archive/2010/07/30/121711.html</guid><wfw:comment>http://www.cppblog.com/guojingjia2006/comments/121711.html</wfw:comment><comments>http://www.cppblog.com/guojingjia2006/archive/2010/07/30/121711.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/guojingjia2006/comments/commentRss/121711.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/guojingjia2006/services/trackbacks/121711.html</trackback:ping><description><![CDATA[<font size="3" face="宋体">
<table id="table4" border="0" cellpadding="0" cellspacing="0" width="605">
    <tbody>
        <tr>
            <td valign="top"><strong>引言</strong>
            <p align="left">CRC的全称为Cyclic Redundancy
            Check，中文名称为循环冗余校验。它是一类重要的线性分组码，编码和解码方法简单，检错和纠错能力强，在通信领域广泛地用于实现差错控制。实际上，除
            数据通信外，CRC在其它很多领域也是大有用武之地的。例如我们读软盘上的文件，以及解压一个ZIP文件时，偶尔会碰到&#8220;Bad
            CRC&#8221;错误，由此它在数据存储方面的应用可略见一斑。</p>
            <p align="left">差错控制理论是在代数理论基础上建立起来的。这里我们着眼于介绍CRC的算法与实现，对原理只能捎带说明一下。若需要进一步了解线性码、分组码、循环码、纠错编码等方面的原理，可以阅读有关资料。</p>
            <p align="left">利用CRC进行检错的过程可简单描述为：在发送端根据要传送的k位二进制码序列，以一定的规则产生一个校验用的r位监督
            码(CRC码)，附在原始信息后边，构成一个新的二进制码序列数共k+r位，然后发送出去。在接收端，根据信息码和CRC码之间所遵循的规则进行检验，以
            确定传送中是否出错。这个规则，在差错控制理论中称为&#8220;生成多项式&#8221;。</p>
            <p align="left"><br>　</p>
            <p align="left"><strong>1 代数学的一般性算法</strong></p>
            <p align="left">在代数编码理论中，将一个码组表示为一个多项式，码组中各码元当作多项式的系数。例如 1100101 表示为<br>1&#183;x<sup>6</sup>+1&#183;x<sup>5</sup>+0&#183;x<sup>4</sup>+0&#183;x<sup>3</sup>+1&#183;x<sup>2</sup>+0&#183;x+1，即 x<sup>6</sup>+x<sup>5</sup>+x<sup>2</sup>+1。</p>
            <p align="left">设编码前的原始信息多项式为P(x)，P(x)的最高幂次加1等于k；生成多项式为G(x)，G(x)的最高幂次等于r；CRC多项式为R(x)；编码后的带CRC的信息多项式为T(x)。</p>
            <p align="left">发送方编码方法：将P(x)乘以xr(即对应的二进制码序列左移r位)，再除以G(x)，所得余式即为R(x)。用公式表示为<br>T(x)=x<sup>r</sup>P(x)+R(x)</p>
            <p align="left">接收方解码方法：将T(x)除以G(x)，如果余数为0，则说明传输中无错误发生，否则说明传输有误。</p>
            <p align="left">举例来说，设信息码为1100，生成多项式为1011，即P(x)=x<sup>3</sup>+x<sup>2</sup>，G(x)=x<sup>3</sup>+x+1，计算CRC的过程为</p>
            <div align="left">
            <pre>      x<sup>r</sup>P(x)     x<sup>3</sup>(x<sup>3</sup>+x<sup>2</sup>)     x<sup>6</sup>+x<sup>5</sup>                    x<br>     -------- = ---------- = -------- = (x<sup>3</sup>+x<sup>2</sup>+x) + --------<br>       G(x)       x<sup>3</sup>+x+1      x<sup>3</sup>+x+1                 x<sup>3</sup>+x+1<br></pre>
            </div>
            <p align="left">即 R(x)=x。注意到G(x)最高幂次r=3，得出CRC为010。</p>
            <p align="left">如果用竖式除法，计算过程为</p>
            <div align="left">
            <pre>               1110<br>            -------   <br>      1011 /1100000     (1100左移3位)<br>            1011<br>            ----<br>             1110<br>             1011<br>             -----<br>              1010<br>              1011<br>              -----<br>               0010<br>               0000<br>               ----<br>                010<br></pre>
            </div>
            <p align="left">因此，T(x)=(x<sup>6</sup>+x<sup>5</sup>)+(x)=x<sup>6</sup>+x<sup>5</sup>+x, 即 1100000+010=1100010</p>
            <p align="left">如果传输无误，</p>
            <div align="left">
            <pre>       T(x)     x<sup>6</sup>+x<sup>5</sup>+x<br>      ------ = --------- = x<sup>3</sup>+x<sup>2</sup>+x,<br>       G(x)     x<sup>3</sup>+x+1<br></pre>
            </div>
            <p align="left">无余式。回头看一下上面的竖式除法，如果被除数是1100010，显然在商第三个1时，就能除尽。</p>
            <p align="left">上述推算过程，有助于我们理解CRC的概念。但直接编程来实现上面的算法，不仅繁琐，效率也不高。实际上在工程中不会直接这样去计算和验证CRC。</p>
            <p align="left">下表中列出了一些见于标准的CRC资料：</p>
            <table id="table9" align="center" border="1" cellpadding="1" cellspacing="1" width="396">
                <tbody>
                    <tr>
                        <td style="font-size: 9pt;" width="58">
                        <p align="left">&nbsp;名称&nbsp;</p>
                        </td>
                        <td style="font-size: 9pt;" width="136">
                        <p align="left">&nbsp;生成多项式&nbsp;</p>
                        </td>
                        <td style="font-size: 9pt;" width="54">
                        <p align="left">&nbsp;简记式<sup>*</sup>&nbsp;</p>
                        </td>
                        <td style="font-size: 9pt;" width="120">
                        <p align="left">&nbsp;应用举例&nbsp;</p>
                        </td>
                    </tr>
                    <tr>
                        <td style="font-size: 9pt;" width="58">
                        <p align="left">&nbsp;CRC-4&nbsp;</p>
                        </td>
                        <td style="font-size: 9pt;" width="136">
                        <p align="left">&nbsp;x<sup>4</sup>+x+1&nbsp;</p>
                        </td>
                        <td style="font-size: 9pt;" width="54">
                        <p align="left">&nbsp;&nbsp;</p>
                        </td>
                        <td style="font-size: 9pt;" width="120">
                        <p align="left">&nbsp;ITU G.704&nbsp;</p>
                        </td>
                    </tr>
                    <tr>
                        <td style="font-size: 9pt;" width="58">
                        <p align="left">&nbsp;CRC-12&nbsp;</p>
                        </td>
                        <td style="font-size: 9pt;" width="136">
                        <p align="left">&nbsp;x<sup>12</sup>+x<sup>11</sup>+x<sup>3</sup>+x+1&nbsp;</p>
                        </td>
                        <td style="font-size: 9pt;" width="54">
                        <p align="left">&nbsp;&nbsp;</p>
                        </td>
                        <td style="font-size: 9pt;" width="120">
                        <p align="left">&nbsp;&nbsp;</p>
                        </td>
                    </tr>
                    <tr>
                        <td style="font-size: 9pt;" width="58">
                        <p align="left">&nbsp;CRC-16&nbsp;</p>
                        </td>
                        <td style="font-size: 9pt;" width="136">
                        <p align="left">&nbsp;x<sup>16</sup>+x<sup>12</sup>+x<sup>2</sup>+1&nbsp;</p>
                        </td>
                        <td style="font-size: 9pt;" width="54">
                        <p align="left">&nbsp;1005&nbsp;</p>
                        </td>
                        <td style="font-size: 9pt;" width="120">
                        <p align="left">&nbsp;IBM SDLC&nbsp;</p>
                        </td>
                    </tr>
                    <tr>
                        <td style="font-size: 9pt;" width="58">
                        <p align="left">&nbsp;CRC-ITU<sup>**</sup>&nbsp;</p>
                        </td>
                        <td style="font-size: 9pt;" width="136">
                        <p align="left">&nbsp;x<sup>16</sup>+x<sup>12</sup>+x<sup>5</sup>+1&nbsp;</p>
                        </td>
                        <td style="font-size: 9pt;" width="54">
                        <p align="left">&nbsp;1021&nbsp;</p>
                        </td>
                        <td style="font-size: 9pt;" width="120">
                        <p align="left">&nbsp;ISO HDLC, ITU X.25, V.34/V.41/V.42, PPP-FCS&nbsp;</p>
                        </td>
                    </tr>
                    <tr>
                        <td style="font-size: 9pt;" width="58">
                        <p align="left">&nbsp;CRC-32&nbsp;</p>
                        </td>
                        <td style="font-size: 9pt;" width="136">
                        <p align="left">&nbsp;x<sup>32</sup>+x<sup>26</sup>+x<sup>23</sup>+...+x<sup>2</sup>+x+1&nbsp;</p>
                        </td>
                        <td style="font-size: 9pt;" width="54">
                        <p align="left">&nbsp;04C11DB7&nbsp;</p>
                        </td>
                        <td style="font-size: 9pt;" width="120">
                        <p align="left">&nbsp;ZIP, RAR, IEEE 802 LAN/FDDI, IEEE 1394, PPP-FCS&nbsp;</p>
                        </td>
                    </tr>
                    <tr>
                        <td style="font-size: 9pt;" width="58">
                        <p align="left">&nbsp;CRC-32c&nbsp;</p>
                        </td>
                        <td style="font-size: 9pt;" width="136">
                        <p align="left">&nbsp;x<sup>32</sup>+x<sup>28</sup>+x<sup>27</sup>+...+x<sup>8</sup>+x<sup>6</sup>+1&nbsp;</p>
                        </td>
                        <td style="font-size: 9pt;" width="54">
                        <p align="left">&nbsp;1EDC6F41&nbsp;</p>
                        </td>
                        <td style="font-size: 9pt;" width="120">
                        <p align="left">&nbsp;SCTP&nbsp;</p>
                        </td>
                    </tr>
                </tbody>
            </table>
            <div align="left">
            <pre>    *  生成多项式的最高幂次项系数是固定的1，故在简记式中，将最高的1统一去掉了，如04C11DB7实际上是104C11DB7。<br>    ** 前称CRC-CCITT。ITU的前身是CCITT。</pre>
            </div>
            </td>
        </tr>
    </tbody>
</table>
</font>
<p><br><font size="3" face="宋体">4.CRC算法的实现<br>---------------<br>要用程序实现CRC算法，考虑对第2节的长除法做一下变换，依然是M = 11100110，G = 1011，<br>其系数r为3。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 11001100&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 11100110000&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -------------&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1011&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; 1011 )11100110000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -----------<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1011.......&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1010110000&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ----.......&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1010110000<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1010......&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1011<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1011......&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ===&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -----------<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ----......&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 001110000&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1110...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1110000<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1011...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1011<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ----...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -----------<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1010..&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 101000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1011..&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 101000<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ----&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1011<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 100&nbsp; &lt;---校验码&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -----------<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 00100&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 100&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;---校验码<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>程序可以如下实现：<br>&nbsp;&nbsp;&nbsp; 1)将Mx^r的前r位放入一个长度为r的寄存器；<br>&nbsp;&nbsp;&nbsp; 2)如果寄存器的首位为1，将寄存器左移1位(将Mx^r剩下部分的MSB移入寄存器的LSB)，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 再与G的后r位异或，否则仅将寄存器左移1位(将Mx^r剩下部分的MSB移入寄存器的LSB)；<br>&nbsp;&nbsp;&nbsp; 3)重复第2步，直到M全部Mx^r移入寄存器；<br>&nbsp;&nbsp;&nbsp; 4)寄存器中的值则为校验码。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></p>
<p><font size="3" face="宋体">用CRC16-CCITT的生成多项式0x1021，其C代码(本文所有代码假定系统为32位，且都在VC6上<br>编译通过)如下：</font></p>
<p><font size="3" face="宋体">unsigned short do_crc(unsigned char *message, unsigned int len)<br>{<br>&nbsp;&nbsp;&nbsp; int i, j;<br>&nbsp;&nbsp;&nbsp; unsigned short crc_reg;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; crc_reg = (message[0] &lt;&lt; 8) + message[1];<br>&nbsp;&nbsp;&nbsp; for (i = 0; i &lt; len; i++) <br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (i &lt; len - 2)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (j = 0; j &lt;= 7; j++) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((short)crc_reg &lt; 0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; crc_reg = ((crc_reg &lt;&lt; 1) + (message[i + 2] &gt;&gt; (7 - i))) ^ 0x1021;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; crc_reg = (crc_reg &lt;&lt; 1) + (message[i + 2] &gt;&gt; (7 - i));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (j = 0; j &lt;= 7; j++) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((short)crc_reg &lt; 0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; crc_reg = (crc_reg &lt;&lt; 1) ^ 0x1021;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; crc_reg &lt;&lt;= 1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; return crc_reg;<br>}&nbsp; </font></p>
<p><font size="3" face="宋体">显然，每次内循环的行为取决于寄存器首位。由于异或运算满足交换率和结合律，以及与0异<br>或无影响，消息可以不移入寄存器，而在每次内循环的时候，寄存器首位再与对应的消息位<br>异或。改进的代码如下：</font></p>
<p><font size="3" face="宋体">unsigned short do_crc(unsigned char *message, unsigned int len) <br>{<br>&nbsp;&nbsp;&nbsp; int i, j;<br>&nbsp;&nbsp;&nbsp; unsigned short crc_reg = 0;<br>&nbsp;&nbsp;&nbsp; unsigned short current;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; for (i = 0; i &lt; len; i++) <br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; current = message[i] &lt;&lt; 8;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (j = 0; j &lt; 8; j++) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((short)(crc_reg ^ current) &lt; 0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; crc_reg = (crc_reg &lt;&lt; 1) ^ 0x1021;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; crc_reg &lt;&lt;= 1; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; current &lt;&lt;= 1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; return crc_reg;<br>} </font></p>
<p><font size="3" face="宋体">以上的讨论中，消息的每个字节都是先传输MSB，CRC16-CCITT标准却是按照先传输LSB，消息<br>右移进寄存器来计算的。只需将代码改成判断寄存器的LSB，将0x1021按位颠倒后(0x8408)与<br>寄存器异或即可，如下所示：</font></p>
<p><font size="3" face="宋体">unsigned short do_crc(unsigned char *message, unsigned int len) <br>{<br>&nbsp;&nbsp;&nbsp; int i, j;<br>&nbsp;&nbsp;&nbsp; unsigned short crc_reg = 0;<br>&nbsp;&nbsp;&nbsp; unsigned short current;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; for (i = 0; i &lt; len; i++) <br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; current = message[i];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (j = 0; j &lt; 8; j++) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((crc_reg ^ current) &amp; 0x0001)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; crc_reg = (crc_reg &gt;&gt; 1) ^ 0x8408;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; crc_reg &gt;&gt;= 1; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; current &gt;&gt;= 1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; return crc_reg;<br>}&nbsp;&nbsp;&nbsp; </font></p>
<p><font size="3" face="宋体">该算法使用了两层循环，对消息逐位进行处理，这样效率是很低的。为了提高时间效率，通<br>常的思想是以空间换时间。考虑到内循环只与当前的消息字节和crc_reg的低字节有关，对该<br>算法做以下等效转换：</font></p>
<p><font size="3" face="宋体">unsigned short do_crc(unsigned char *message, unsigned int len) <br>{<br>&nbsp;&nbsp;&nbsp; int i, j;<br>&nbsp;&nbsp;&nbsp; unsigned short crc_reg = 0;<br>&nbsp;&nbsp;&nbsp; unsigned char&nbsp; index;<br>&nbsp;&nbsp;&nbsp; unsigned short to_xor;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; for (i = 0; i &lt; len; i++) <br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; index = (crc_reg ^ message[i]) &amp; 0xff; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; to_xor = index;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (j = 0; j &lt; 8; j++) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (to_xor &amp; 0x0001)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; to_xor = (to_xor &gt;&gt; 1) ^ 0x8408;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; to_xor &gt;&gt;= 1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; crc_reg = (crc_reg &gt;&gt; 8) ^ to_xor;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; return crc_reg;<br>} </font></p>
<p><font size="3" face="宋体">现在内循环只与index相关了，可以事先以数组形式生成一个表crc16_ccitt_table，使得<br>to_xor = crc16_ccitt_table[index]，于是可以简化为：</font></p>
<p><font size="3" face="宋体">unsigned short do_crc(unsigned char *message, unsigned int len) <br>{<br>&nbsp;&nbsp;&nbsp; unsigned short crc_reg = 0; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; while (len--) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; crc_reg = (crc_reg &gt;&gt; 8) ^ crc16_ccitt_table[(crc_reg ^ *message++) &amp; 0xff];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; return crc_reg;<br>}&nbsp;&nbsp; </font></p>
<p><font size="3" face="宋体">crc16_ccitt_table通过以下代码生成：</font></p>
<p><font size="3" face="宋体">int main()<br>{<br>&nbsp;&nbsp;&nbsp; unsigned char index = 0;<br>&nbsp;&nbsp;&nbsp; unsigned short to_xor;<br>&nbsp;&nbsp;&nbsp; int i;</font></p>
<p><font size="3" face="宋体">&nbsp;&nbsp;&nbsp; printf("unsigned short crc16_ccitt_table[256] =\n{");<br>&nbsp;&nbsp;&nbsp; while (1) <br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!(index % 8))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("\n");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; to_xor = index;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (i = 0; i &lt; 8; i++) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (to_xor &amp; 0x0001)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; to_xor = (to_xor &gt;&gt; 1) ^ 0x8408;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; to_xor &gt;&gt;= 1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("0x%04x", to_xor);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (index == 255)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("\n");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf(", ");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; index++;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; printf("};");<br>&nbsp;&nbsp;&nbsp; return 0;<br>}</font></p>
<p><font size="3" face="宋体">生成的表如下：</font></p>
<p><font size="3" face="宋体">unsigned short crc16_ccitt_table[256] =<br>{<br>0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf,<br>0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7,<br>0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e,<br>0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876,<br>0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd,<br>0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5,<br>0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c,<br>0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974,<br>0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb,<br>0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3,<br>0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a,<br>0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72,<br>0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9,<br>0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1,<br>0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738,<br>0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70,<br>0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7,<br>0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff,<br>0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036,<br>0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e,<br>0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5,<br>0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd,<br>0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134,<br>0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c,<br>0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3,<br>0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb,<br>0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232,<br>0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a,<br>0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1,<br>0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9,<br>0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330,<br>0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78<br>};</font></p>
<p><font size="3" face="宋体">这样对于消息unsigned char message[len]，校验码为：<br>&nbsp;&nbsp;&nbsp; unsigned short code = do_crc(message, len);<br>并且按以下方式发送出去：<br>&nbsp;&nbsp;&nbsp; message[len] = code &amp; 0x00ff;<br>&nbsp;&nbsp;&nbsp; message[len + 1] = (code &gt;&gt; 8) &amp; 0x00ff; <br>&nbsp;&nbsp;&nbsp; <br>接收端对收到的len + 2字节执行do_crc，如果没有差错发生则结果应为0。</font></p>
<p><font size="3" face="宋体">在一些传输协议中，发送端并不指出消息长度，而是采用结束标志，考虑以下几种差错：<br>&nbsp;&nbsp;&nbsp; 1)在消息之前，增加1个或多个0字节；<br>&nbsp;&nbsp;&nbsp; 2)消息以1个或多个连续的0字节开始，丢掉1个或多个0；<br>&nbsp;&nbsp;&nbsp; 3)在消息(包括校验码)之后，增加1个或多个0字节； <br>&nbsp;&nbsp;&nbsp; 4)消息(包括校验码)以1个或多个连续的0字节结尾，丢掉1个或多个0； <br>&nbsp;&nbsp;&nbsp; <br>显然，这几种差错都检测不出来，其原因就是如果寄存器值为0，处理0消息字节(或位)，寄<br>存器值不变。为了解决前2个问题，只需寄存器的初值非0即可，对do_crc作以下改进：<br>&nbsp;<br>unsigned short do_crc(unsigned short reg_init, unsigned char *message, unsigned int len) <br>{<br>&nbsp;&nbsp;&nbsp; unsigned short crc_reg = reg_init; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; while (len--) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; crc_reg = (crc_reg &gt;&gt; 8) ^ crc16_ccitt_table[(crc_reg ^ *message++) &amp; 0xff];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; return crc_reg;<br>} </font></p>
<p><font size="3" face="宋体">在CRC16-CCITT标准中reg_init = 0xffff，为了解决后2个问题，在CRC16-CCITT标准中将计<br>算出的校验码与0xffff进行异或，即：<br>&nbsp;&nbsp;&nbsp; unsigned short code = do_crc(0xffff, message, len);<br>&nbsp;&nbsp;&nbsp; code ^= 0xffff;<br>&nbsp;&nbsp;&nbsp; message[len] = code &amp; 0x00ff;<br>&nbsp;&nbsp;&nbsp; message[len + 1] = (code &gt;&gt; 8) &amp; 0x00ff;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>显然，现在接收端对收到的所有字节执行do_crc，如果没有差错发生则结果应为某一常值<br>GOOD_CRC。其满足以下关系：<br>&nbsp;&nbsp;&nbsp; unsigned char p[]= {0xff, 0xff}; <br>&nbsp;&nbsp;&nbsp; GOOD_CRC = do_crc(0, p, 2); <br>其结果为GOOD_CRC = 0xf0b8。</font></p><img src ="http://www.cppblog.com/guojingjia2006/aggbug/121711.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/guojingjia2006/" target="_blank">小果子</a> 2010-07-30 17:34 <a href="http://www.cppblog.com/guojingjia2006/archive/2010/07/30/121711.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c51 串口 理解(转)</title><link>http://www.cppblog.com/guojingjia2006/archive/2010/07/30/121689.html</link><dc:creator>小果子</dc:creator><author>小果子</author><pubDate>Fri, 30 Jul 2010 05:38:00 GMT</pubDate><guid>http://www.cppblog.com/guojingjia2006/archive/2010/07/30/121689.html</guid><wfw:comment>http://www.cppblog.com/guojingjia2006/comments/121689.html</wfw:comment><comments>http://www.cppblog.com/guojingjia2006/archive/2010/07/30/121689.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/guojingjia2006/comments/commentRss/121689.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/guojingjia2006/services/trackbacks/121689.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 串行接口            8051单片机的通讯方式有两种：            并行通讯:数据的各位同时发送或接收。            串行通讯:数据一位一位顺序发送或接收。                                                    串行通讯的方式：                           ...&nbsp;&nbsp;<a href='http://www.cppblog.com/guojingjia2006/archive/2010/07/30/121689.html'>阅读全文</a><img src ="http://www.cppblog.com/guojingjia2006/aggbug/121689.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/guojingjia2006/" target="_blank">小果子</a> 2010-07-30 13:38 <a href="http://www.cppblog.com/guojingjia2006/archive/2010/07/30/121689.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c51 串口 波特率的计算</title><link>http://www.cppblog.com/guojingjia2006/archive/2010/07/30/121688.html</link><dc:creator>小果子</dc:creator><author>小果子</author><pubDate>Fri, 30 Jul 2010 05:32:00 GMT</pubDate><guid>http://www.cppblog.com/guojingjia2006/archive/2010/07/30/121688.html</guid><wfw:comment>http://www.cppblog.com/guojingjia2006/comments/121688.html</wfw:comment><comments>http://www.cppblog.com/guojingjia2006/archive/2010/07/30/121688.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/guojingjia2006/comments/commentRss/121688.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/guojingjia2006/services/trackbacks/121688.html</trackback:ping><description><![CDATA[<table class="center_tdbgall fck__showtableborders" style="width: 760px;" align="center" border="0" cellpadding="0" cellspacing="0">
    <tbody>
        <tr align="center" valign="middle">
            <td class="main_ArticleTitle" colspan="1" height="50">波特率计算</td>
            <td style="vertical-align: top;"><br></td>
        </tr>
        <tr align="center" valign="middle">
            <td class="main_ArticleSubheading" colspan="1" height="20"><br></td>
            <td style="vertical-align: top;"><br></td>
        </tr>
        <tr class="left_tdbgall" align="center">
            <td colspan="1"><br></td>
            <td style="vertical-align: top;"><br></td>
        </tr>
        <tr>
            <td class="main_tdbg_760" colspan="1" height="300" valign="top">
            <p>在串行通信中,收发双方对发送或接收的数据速率要有一定的约定，我们通过软件对MCS—51串行口编程可约定四种工作方式。其中，方式0和方式2的波特率是固定的，而方式1和方式3的波特率是可变的，由定时器T1的溢出率决定。<br>
            串行口的四种工作方式对应着三种波特率。由于输人的移位时钟的来源不同，所以，各种方式的波特率计算公式也不同。 <br>
            一、方式0的波特率<br>
            方式0时，移位时钟脉冲由56(即第6个状态周期，第12个节拍)给出，即每个机器周期产生一个移位时钟，发送或接收一位数据。所以，波特率为振荡频率的十二分之一，并不受 PCON寄存器中SMOD的影响，即：</p>
            <p>方式0的波特率＝fosc／12</p>
            <p><br></p>
            <p><img alt=""  src="http://www.cppblog.com/images/cppblog_com/guojingjia2006/20050412215233558.gif.jpg" height="131" width="505"></p>
            <p><br></p>
            <p><br></p>
            <p>三、方式l和方式3的波特率 <br>
            <br>
            <br>
            方式1和方式3的移位时钟脉冲由定时器T1的溢出率决定，故波特宰由定时器T1的<br>
            溢出率与SMOD值同时决定，即：<br>
            方式1和方式3的波特率＝2SMOD/32&#183;T1溢出率<br>
            其中，溢出率取决于计数速率和定时器的预置值。计数速率与TMOD寄存器中C／T的状态有关。当C／T＝0时，计数速率＝fosc／2；当C／T＝1时，计数速率取决于外部输入时钟频率。<br>
            当定时器Tl作波特率发生器使用时，通常选用可自动装入初值模式(工作方式2)，在<br>
            工作方式2中，TLl作为计数用，而自动装入的初值放在THl中，设计数初值为x，则每过&#8220;256一x&#8221;个机器周期，定时器T1就会产生一次溢出。为了避免因溢出而引起中断，此时应禁止T1中断。这时，溢出周期为：</p>
            <p><br></p>
            <p><img alt=""  src="http://www.cppblog.com/images/cppblog_com/guojingjia2006/20050412215236159.gif.jpg" height="257" width="542"></p>
            <p><br></p>
            <p>系统晶振频率选为11．0592MHZ就是为了使初值为整数，从而产生精确的波特率。<br>
            如果串行通信选用很低的波特率，可将定时器Tl置于工作方式0或工作方式1，但在<br>
            这种情况下，T1溢出时，需用中断服务程序重装初值。中断响应时间和执行指令时间会使波特率产生一定的误差，可用改变初值的办法加以调整。<br>
            表6—2列出了各种常用的波特率及其初值。</p>
            <p><br></p>
            <p><img alt=""  src="http://www.cppblog.com/images/cppblog_com/guojingjia2006/20050412215238498.gif.jpg"><br></p>
            </td>
            <td style="vertical-align: top;"><br></td>
        </tr>
    </tbody>
</table><img src ="http://www.cppblog.com/guojingjia2006/aggbug/121688.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/guojingjia2006/" target="_blank">小果子</a> 2010-07-30 13:32 <a href="http://www.cppblog.com/guojingjia2006/archive/2010/07/30/121688.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>键盘扫描之终结者一</title><link>http://www.cppblog.com/guojingjia2006/archive/2010/07/29/121585.html</link><dc:creator>小果子</dc:creator><author>小果子</author><pubDate>Thu, 29 Jul 2010 07:42:00 GMT</pubDate><guid>http://www.cppblog.com/guojingjia2006/archive/2010/07/29/121585.html</guid><wfw:comment>http://www.cppblog.com/guojingjia2006/comments/121585.html</wfw:comment><comments>http://www.cppblog.com/guojingjia2006/archive/2010/07/29/121585.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/guojingjia2006/comments/commentRss/121585.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/guojingjia2006/services/trackbacks/121585.html</trackback:ping><description><![CDATA[<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; font-family: courier new;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;bit&nbsp;isKeyDown(){<br>&nbsp;&nbsp;&nbsp;&nbsp;KEY</span><span style="color: #000000;">=</span><span style="color: #000000;">0x0f</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">((KEY</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">0x0f</span><span style="color: #000000;">)</span><span style="color: #000000;">!=</span><span style="color: #000000;">0x0f</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>}<br></span><span style="color: #008000;">//</span><span style="color: #008000;">线反转法&nbsp;返回键盘索引</span><span style="color: #008000;"><br></span><span style="color: #000000;">unsigned&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;KeyScan_XF(){<br>&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;r</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">,c</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(isKeyDown()){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delayms(</span><span style="color: #000000;">20</span><span style="color: #000000;">);&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">去抖动</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(isKeyDown()){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;KEY</span><span style="color: #000000;">=</span><span style="color: #000000;">0x0f</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">switch</span><span style="color: #000000;">(KEY){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">case</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0x0e</span><span style="color: #000000;">:c</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">第一列</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">case</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0x0d</span><span style="color: #000000;">:c</span><span style="color: #000000;">=</span><span style="color: #000000;">1</span><span style="color: #000000;">;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">第二列</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">case</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0x0b</span><span style="color: #000000;">:c</span><span style="color: #000000;">=</span><span style="color: #000000;">2</span><span style="color: #000000;">;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">第三列</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">case</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0x07</span><span style="color: #000000;">:c</span><span style="color: #000000;">=</span><span style="color: #000000;">3</span><span style="color: #000000;">;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">第四列</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">default</span><span style="color: #000000;">:&nbsp;&nbsp;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;KEY</span><span style="color: #000000;">=</span><span style="color: #000000;">0xf0</span><span style="color: #000000;">;</span><span style="color: #008000;">//</span><span style="color: #008000;">电平反向</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">switch</span><span style="color: #000000;">(KEY){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">case</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0xe0</span><span style="color: #000000;">:r</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">第一行</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">case</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0xd0</span><span style="color: #000000;">:r</span><span style="color: #000000;">=</span><span style="color: #000000;">1</span><span style="color: #000000;">;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">第二行</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">case</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0xb0</span><span style="color: #000000;">:r</span><span style="color: #000000;">=</span><span style="color: #000000;">2</span><span style="color: #000000;">;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">第三行</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">case</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0x70</span><span style="color: #000000;">:r</span><span style="color: #000000;">=</span><span style="color: #000000;">3</span><span style="color: #000000;">;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">第四行</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">default</span><span style="color: #000000;">:&nbsp;&nbsp;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">(</span><span style="color: #000000;">!</span><span style="color: #000000;">isKeyDown());</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;按键释放，处理长按</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;&nbsp;r</span><span style="color: #000000;">*</span><span style="color: #000000;">4</span><span style="color: #000000;">+</span><span style="color: #000000;">c</span><span style="color: #000000;">+</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>}<br><br></span><span style="color: #008000;">//</span><span style="color: #008000;">查询法&nbsp;返回键盘索引</span><span style="color: #008000;"><br></span><span style="color: #000000;">unsigned&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;getRorC(){<br>&nbsp;&nbsp;&nbsp;&nbsp;KEY</span><span style="color: #000000;">&amp;=</span><span style="color: #000000;">0x0F</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;KEY</span><span style="color: #000000;">|=</span><span style="color: #000000;">0x70</span><span style="color: #000000;">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">0111</span><span style="color: #008000;"><br></span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">((KEY</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">0x0f</span><span style="color: #000000;">)</span><span style="color: #000000;">!=</span><span style="color: #000000;">0x0f</span><span style="color: #000000;">){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;KEY</span><span style="color: #000000;">&amp;=</span><span style="color: #000000;">0x0f</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;KEY</span><span style="color: #000000;">|=</span><span style="color: #000000;">0xB0</span><span style="color: #000000;">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">1011</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">((KEY</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">0x0f</span><span style="color: #000000;">)</span><span style="color: #000000;">!=</span><span style="color: #000000;">0x0f</span><span style="color: #000000;">){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;KEY</span><span style="color: #000000;">&amp;=</span><span style="color: #000000;">0x0f</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;KEY</span><span style="color: #000000;">|=</span><span style="color: #000000;">0xD0</span><span style="color: #000000;">;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">1101</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">((KEY</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">0x0f</span><span style="color: #000000;">)</span><span style="color: #000000;">!=</span><span style="color: #000000;">0x0f</span><span style="color: #000000;">){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;KEY</span><span style="color: #000000;">&amp;=</span><span style="color: #000000;">0x0f</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;KEY</span><span style="color: #000000;">|=</span><span style="color: #000000;">0xE0</span><span style="color: #000000;">;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">1110</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">((KEY</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">0x0f</span><span style="color: #000000;">)</span><span style="color: #000000;">!=</span><span style="color: #000000;">0x0f</span><span style="color: #000000;">){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">;</span><span style="color: #008000;">//</span><span style="color: #008000;">impossible</span><span style="color: #008000;"><br></span><span style="color: #000000;">}<br>unsigned&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;KeyScan_CS(){<br>&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;r</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">,c</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(isKeyDown()){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delayms(</span><span style="color: #000000;">20</span><span style="color: #000000;">);&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">去抖动</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(isKeyDown()){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">switch</span><span style="color: #000000;">(KEY){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">case</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0x0e</span><span style="color: #000000;">:c</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;</span><span style="color: #008000;">//</span><span style="color: #008000;">第一列</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">case</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0x0d</span><span style="color: #000000;">:c</span><span style="color: #000000;">=</span><span style="color: #000000;">1</span><span style="color: #000000;">;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;</span><span style="color: #008000;">//</span><span style="color: #008000;">第二列</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">case</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0x0b</span><span style="color: #000000;">:c</span><span style="color: #000000;">=</span><span style="color: #000000;">2</span><span style="color: #000000;">;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;</span><span style="color: #008000;">//</span><span style="color: #008000;">第三列</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">case</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0x07</span><span style="color: #000000;">:c</span><span style="color: #000000;">=</span><span style="color: #000000;">3</span><span style="color: #000000;">;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;</span><span style="color: #008000;">//</span><span style="color: #008000;">第四列</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">default</span><span style="color: #000000;">:</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r</span><span style="color: #000000;">=</span><span style="color: #000000;">getRorC();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;r</span><span style="color: #000000;">*</span><span style="color: #000000;">4</span><span style="color: #000000;">+</span><span style="color: #000000;">c</span><span style="color: #000000;">+</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;KEY</span><span style="color: #000000;">=</span><span style="color: #000000;">0x0f</span><span style="color: #000000;">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>}</span></div>
<br><img src ="http://www.cppblog.com/guojingjia2006/aggbug/121585.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/guojingjia2006/" target="_blank">小果子</a> 2010-07-29 15:42 <a href="http://www.cppblog.com/guojingjia2006/archive/2010/07/29/121585.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c51 外部中断触发经验(转)</title><link>http://www.cppblog.com/guojingjia2006/archive/2010/07/29/121583.html</link><dc:creator>小果子</dc:creator><author>小果子</author><pubDate>Thu, 29 Jul 2010 07:37:00 GMT</pubDate><guid>http://www.cppblog.com/guojingjia2006/archive/2010/07/29/121583.html</guid><wfw:comment>http://www.cppblog.com/guojingjia2006/comments/121583.html</wfw:comment><comments>http://www.cppblog.com/guojingjia2006/archive/2010/07/29/121583.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/guojingjia2006/comments/commentRss/121583.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/guojingjia2006/services/trackbacks/121583.html</trackback:ping><description><![CDATA[<h1 style="float: left;">
<a  href="http://blog.ednchina.com/wayside/51348/message.aspx#">
关于51单片机&#8220;外部中断触发方式&#8221;的经验总结</a></h1>
<span style="float: right; margin-right: 10px;"></span>
<p style="clear: both; line-height: 0px;">
</p>
<p>
下面是本人使用51单片机的一点经验，写出来分享，请批评指正。<br>
</p>
<p style="margin: 0pt; text-indent: 21pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">51</font></span><span style="font-family: 宋体;">单片机的外部中断有两种触发方式可选：电平触发和边沿触发。选择电平触发时，单片机在每个机器周期检查中断源口线，检测到低电平，即置位中断请求标志，向</span><span lang="EN-US"><font face="Times New Roman">CPU</font></span><span style="font-family: 宋体;">请求中断。选择边沿触发方式时，单片机在上一个机器周期检测到中断源口线为高电平，下一个机器周期检测到低电平，即置位中断标志，请求中断。</span></font><br>
</p>
<p style="margin: 0pt; text-indent: 21pt;"><span style="font-family: 宋体;"><font size="3">这个原理很好理解。但应用时需要特别注意的几点：</font></span><br>
</p>
<p style="text-indent: -21pt;"><span lang="EN-US"><span><font face="Times New Roman"><font size="3">1)</font><span style="font-weight: normal; font-size: 7pt; line-height: normal; font-style: normal; font-variant: normal;" times="" new="" roman??="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span></span><font size="3"><span style="font-family: 宋体;">电平触发方式时，中断标志寄存器不锁存中断请求信号。也就是说，单片机把每个机器周期的</span><span lang="EN-US"><font face="Times New Roman">S<sub>5</sub>P<sub>2</sub></font></span><span style="font-family: 宋体;">采样到的外部中断源口线的电平逻辑直接赋值到中断标志寄存器。标志寄存器对于请求信号来说是透明的。这样当中断请求被阻塞而没有得到及时响应时，将被丢失。换句话说，<span style="color: red;">要使电平触发的中断被</span></span><span style="color: red;" lang="EN-US"><font face="Times New Roman">CPU</font></span><span style="color: red; font-family: 宋体;">响应并执行，必须保证外部中断源口线的低电平维持到中断被执行为止。</span><span style="font-family: 宋体;">因此当</span><span lang="EN-US"><font face="Times New Roman">CPU</font></span><span style="font-family: 宋体;">正在执行同级中断或更高级中断期间，产生的外部中断源（产生低电平）如果在该中断执行完毕之前撤销（变为高电平）了，那么将得不到响应，就如同没发生一样。同样，当</span><span lang="EN-US"><font face="Times New Roman">CPU</font></span><span style="font-family: 宋体;">在执行不可被中断的指令（如</span><span lang="EN-US"><font face="Times New Roman">RETI</font></span><span style="font-family: 宋体;">）时，产生的电平触发中断如果时间太短，也得不到执行。</span></font><br>
</p>
<p style="text-indent: -21pt;"><span lang="EN-US"><span><font face="Times New Roman"><font size="3">2)</font><span style="font-weight: normal; font-size: 7pt; line-height: normal; font-style: normal; font-variant: normal;" times="" new="" roman??="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span></span><font size="3"><span style="font-family: 宋体;">边沿触发方式时，中断标志寄存器锁存了中断请求。中断口线上一个从高到低的跳变将记录在标志寄存器中，直到</span><span lang="EN-US"><font face="Times New Roman">CPU</font></span><span style="font-family: 宋体;">响应并转向该中断服务程序时，由硬件自动清除。因此当</span><span lang="EN-US"><font face="Times New Roman">CPU</font></span><span style="font-family: 宋体;">正在执行同级中断（甚至是外部中断本身）或高级中断时，产生的外部中断（负跳变）同样将被记录在中断标志寄存器中。在该中断退出后，将被响应执行。如果你不希望这样，必须在中断退出之前，手工清除外部中断标志。</span></font><br>
</p>
<p style="text-indent: -21pt;"><span lang="EN-US"><span><font face="Times New Roman"><font size="3">3)</font><span style="font-weight: normal; font-size: 7pt; line-height: normal; font-style: normal; font-variant: normal;" times="" new="" roman??="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span></span><font size="3"><span style="font-family: 宋体;">中断标志可以手工清除。一个中断如果在没有得到响应之前就已经被手工清除，则该中断将被</span><span lang="EN-US"><font face="Times New Roman">CPU</font></span><span style="font-family: 宋体;">忽略。就如同没有发生一样。</span></font><br>
</p>
<p style="text-indent: -21pt;"><span lang="EN-US"><span><font face="Times New Roman"><font size="3">4)</font><span style="font-weight: normal; font-size: 7pt; line-height: normal; font-style: normal; font-variant: normal;" times="" new="" roman??="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span></span><font size="3"><span style="font-family: 宋体;">选择电平触发还是边沿触发方式应从系统<span style="color: red;">使用外部中断的目的</span>上去考虑，而不是如许多资料上说的根据中断源信号的特性来取舍。比如，有的书上说（《</span><span lang="EN-US"><font face="Times New Roman">Keil C51</font></span><span style="font-family: 宋体;">使用技巧及实战》），就有类似的观点。</span></font></p><img src ="http://www.cppblog.com/guojingjia2006/aggbug/121583.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/guojingjia2006/" target="_blank">小果子</a> 2010-07-29 15:37 <a href="http://www.cppblog.com/guojingjia2006/archive/2010/07/29/121583.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>89c51 存储结构</title><link>http://www.cppblog.com/guojingjia2006/archive/2010/07/28/121454.html</link><dc:creator>小果子</dc:creator><author>小果子</author><pubDate>Wed, 28 Jul 2010 05:25:00 GMT</pubDate><guid>http://www.cppblog.com/guojingjia2006/archive/2010/07/28/121454.html</guid><wfw:comment>http://www.cppblog.com/guojingjia2006/comments/121454.html</wfw:comment><comments>http://www.cppblog.com/guojingjia2006/archive/2010/07/28/121454.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/guojingjia2006/comments/commentRss/121454.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/guojingjia2006/services/trackbacks/121454.html</trackback:ping><description><![CDATA[<span style="font-size: 14pt;"><span style="color: red;">ROM区:</span><br><span style="color: red;"></span></span>Flash ROM,寻址范围000h-fffh=2^12=4k,存放程序代码<br><span style="color: red;">RAM区:</span><br>00h-1fh,32个字节,分4组工作寄存器，每组8个字节,r0-r7,psw寄存器RS0,RS1 2位控制使用哪组;<br>20h-2fh,16个字节除了一般RAM功能外,可以对每个字节进行位寻址,从20h的第一位到2fh的最后一位，总共128位,有固定的位地址;<br>30h-7fh,80个字节,普通的RAM区<br>80h-ffh,SPR区,共用21个特殊寄存器,每个寄存器8位<br><br><span style="color: red;">寻址引脚p0,p2,p0低8位，p2高8位</span><br><img src ="http://www.cppblog.com/guojingjia2006/aggbug/121454.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/guojingjia2006/" target="_blank">小果子</a> 2010-07-28 13:25 <a href="http://www.cppblog.com/guojingjia2006/archive/2010/07/28/121454.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>proteus中英文元件对照表</title><link>http://www.cppblog.com/guojingjia2006/archive/2010/07/28/121445.html</link><dc:creator>小果子</dc:creator><author>小果子</author><pubDate>Wed, 28 Jul 2010 03:56:00 GMT</pubDate><guid>http://www.cppblog.com/guojingjia2006/archive/2010/07/28/121445.html</guid><wfw:comment>http://www.cppblog.com/guojingjia2006/comments/121445.html</wfw:comment><comments>http://www.cppblog.com/guojingjia2006/archive/2010/07/28/121445.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/guojingjia2006/comments/commentRss/121445.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/guojingjia2006/services/trackbacks/121445.html</trackback:ping><description><![CDATA[<table class="seyle4" border="0" cellpadding="0" cellspacing="0" width="100%">
    <tbody>
        <tr>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td id="content9" valign="middle"><strong style="font-size: 14px;">Proteus&nbsp;isis&nbsp;的元件库中英对照</strong></td>
        </tr>
        <tr>
            <td>
            <div align="right"><span class="textbox-label">[ 2009-12-2 8:29:00 | By: <span class="style3">zydlyq</span> ]</span></div>
            </td>
        </tr>
    </tbody>
</table>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
    <tbody>
        <tr>
            <td height="3">&nbsp;</td>
        </tr>
    </tbody>
</table>
<span class="oblog_text"><span id="ob_logd65054"></span> Proteus 元件名称对照1<br>元件名称 中文名 说明 <br>7407&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 驱动门&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>1N914&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 二极管&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>74Ls00&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 与非门&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>74LS04&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 非门&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>74LS08&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 与门&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>74LS390&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TTL 双十进制计数器&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>7SEG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4针BCD-LED 输出从0-9 对应于4根线的BCD码 <br>7SEG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3-8译码器电路BCD-7SEG[size=+0]转换电路&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>ALTERNATOR 交流发电机&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>AMMETER-MILLI mA安培计&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>AND&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 与门&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>BATTERY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 电池/电池组&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>BUS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 总线&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>CAP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 电容&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>CAPACITOR 电容器&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>CLOCK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 时钟信号源&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>CRYSTAL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 晶振&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>D-FLIPFLOP D触发器&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>FUSE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 保险丝&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>GROUND&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 地&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>LAMP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 灯&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>LED-RED&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 红色发光二极管&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>LM016L&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2行16列液晶 可显示2行16列英文字符，有8位数据总线D0-D7，RS，R/W，EN三个控制端口（共14线），工作电压为5V。没背光，和常用的1602B功能和引脚一样（除了调背光的二个线脚）<br>LOGIC ANALYSER 逻辑分析器&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>LOGICPROBE 逻辑探针&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>LOGICPROBE[BIG] 逻辑探针 用来显示连接位置的逻辑状态 <br>LOGICSTATE 逻辑状态 用鼠标点击,可改变该方框连接位置的逻辑状态 <br>LOGICTOGGLE 逻辑触发&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>MASTERSWITCH 按钮 手动闭合,立即自动打开 <br>MOTOR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 马达&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>OR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 或门&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>POT-LIN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 三引线可变电阻器&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>POWER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 电源<br>RES&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 电阻&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>RESISTOR 电阻器&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>SWITCH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 按钮 手动按一下一个状态 <br>SWITCH-SPDT 二选通一按钮&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>VOLTMETER 伏特计&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>VOLTMETER-MILLI mV伏特计&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>VTERM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 串行口终端&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>Electromechanical 电机&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>Inductors 变压器&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>Laplace Primitives 拉普拉斯变换&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>Memory Ics&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>Microprocessor Ics&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>Miscellaneous 各种器件 AERIAL-天线；ATAHDD；ATMEGA64；BATTERY；CELL；CRYSTAL-晶振；FUSE；METER-仪表； <br>Modelling Primitives 各种仿真器件 是典型的基本元器模拟，不表示具体型号，只用于仿真，没有PCB <br>Optoelectronics 各种发光器件 发光二极管，LED，液晶等等 <br>PLDs &amp; FPGAs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>Resistors 各种电阻&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>Simulator Primitives 常用的器件&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>Speakers &amp; Sounders&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>Switches &amp; Relays 开关，继电器，键盘&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>Switching Devices 晶阊管 <br>Transistors 晶体管（三极管，场效应管）<br>TTL 74 series&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>TTL 74ALS series&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>TTL 74AS series&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>TTL 74F series&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>TTL 74HC series&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>TTL 74HCT series&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>TTL 74LS series&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>TTL 74S series&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>Analog Ics 模拟电路集成芯片<br>Capacitors 电容集合<br>CMOS 4000 series&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>Connectors 排座，排插<br>Data Converters ADC,DAC<br>Debugging Tools 调试工具<br>ECL 10000 Series<br>------------------------------------------------------------<br><br>PROTEUS元件库元件名称及中英对照<br>AND 与门 <br>ANTENNA 天线 <br>BATTERY 直流电源 <br>BELL 铃,钟 <br>BVC 同轴电缆接插件 <br>BRIDEG 1 整流桥(二极管) <br>BRIDEG 2 整流桥(集成块) <br>BUFFER 缓冲器 <br>BUZZER 蜂鸣器 <br>CAP 电容 <br>CAPACITOR 电容 <br>CAPACITOR POL 有极性电容 <br>CAPVAR 可调电容 <br>CIRCUIT BREAKER 熔断丝 <br>COAX 同轴电缆 <br>CON 插口 <br>CRYSTAL 晶体整荡器 <br>DB 并行插口 <br>DIODE 二极管 <br>DIODE SCHOTTKY 稳压二极管 <br>DIODE VARACTOR 变容二极管 <br>DPY_3-SEG 3段LED <br>DPY_7-SEG 7段LED <br>DPY_7-SEG_DP 7段LED(带小数点) <br>ELECTRO 电解电容 <br>FUSE 熔断器 <br>INDUCTOR 电感 <br>INDUCTOR IRON 带铁芯电感 <br>INDUCTOR3 可调电感 <br>JFET N N沟道场效应管 <br>JFET P P沟道场效应管 <br>LAMP 灯泡 <br>LAMP NEDN 起辉器 <br>LED 发光二极管 <br>METER 仪表 <br>MICROPHONE 麦克风 <br>MOSFET MOS管 <br>MOTOR AC 交流电机 <br>MOTOR SERVO 伺服电机 <br>NAND 与非门 <br>NOR 或非门 <br>NOT 非门 <br>NPN NPN三极管 <br>NPN-PHOTO 感光三极管 <br>OPAMP 运放 <br>OR 或门 <br>PHOTO 感光二极管 <br>PNP 三极管 <br>NPN DAR NPN三极管 <br>PNP DAR PNP三极管 <br>POT 滑线变阻器 <br>PELAY-DPDT 双刀双掷继电器 <br>RES1.2 电阻 <br>RES3.4 可变电阻 <br>RESISTOR BRIDGE ? 桥式电阻 <br>RESPACK ? 电阻 <br>SCR 晶闸管 <br>PLUG ? 插头 <br>PLUG AC FEMALE 三相交流插头 <br>SOCKET ? 插座 <br>SOURCE CURRENT 电流源 <br>SOURCE VOLTAGE 电压源 <br>SPEAKER 扬声器 <br>SW ? 开关 <br>SW-DPDY ? 双刀双掷开关 <br>SW-SPST ? 单刀单掷开关 <br>SW-PB 按钮 <br>THERMISTOR 电热调节器 <br>TRANS1 变压器 <br>TRANS2 可调变压器 <br>TRIAC ? 三端双向可控硅 <br>TRIODE ? 三极真空管 <br>VARISTOR 变阻器 <br>ZENER ? 齐纳二极管 <br>DPY_7-SEG_DP 数码管 <br>SW-PB 开关&nbsp; <br>----------------------------------------------------------------------<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PROTEUS原理图元器件库详细说明 <br>Device.lib&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 包括电阻、电容、二极管、三极管和PCB的连接器符号<br>ACTIVE.LIB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 包括虚拟仪器和有源器件<br>DIODE.LIB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 包括二极管和整流桥<br>DISPLAY.LIB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 包括LCD、LED<br>BIPOLAR.LIB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 包括三极管<br>FET.LIB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 包括场效应管<br>ASIMMDLS.LIB&nbsp;&nbsp;&nbsp; 包括模拟元器件<br>VALVES .LIB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 包括电子管<br>ANALOG.LIB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 包括电源调节器、运放和数据采样IC<br>CAPACITORS.LIB 包括电容<br>COMS.LIB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 包括&nbsp;&nbsp; 4000系列<br>ECL.LIB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 包括ECL10000系列<br>MICRO.LIB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 包括 通用微处理器<br>OPAMP.LIB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 包括 运算放大器<br>RESISTORS.LIB&nbsp;&nbsp;&nbsp; 包括 电阻<br>FAIRCHLD .LIB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 包括FAIRCHLD 半导体公司的分立器件<br>LINTEC.LIB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 包括 LINTEC公司的运算放大器<br>NATDAC.LIB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 包括 国家半导体公司的数字采样器件<br>NATOA.LIB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 包括 国家半导体公司 的运算放大器<br>TECOOR.LIB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 包括TECOOR公司的 SCR 和TRIAC<br>TEXOAC.LIB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 包括 德州仪器公司的运算放大器和比较器<br>ZETEX .LIB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 包括ZETEX 公司的分立器件 </span><img src ="http://www.cppblog.com/guojingjia2006/aggbug/121445.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/guojingjia2006/" target="_blank">小果子</a> 2010-07-28 11:56 <a href="http://www.cppblog.com/guojingjia2006/archive/2010/07/28/121445.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>keil c51 延时(转)</title><link>http://www.cppblog.com/guojingjia2006/archive/2010/07/28/121439.html</link><dc:creator>小果子</dc:creator><author>小果子</author><pubDate>Wed, 28 Jul 2010 02:58:00 GMT</pubDate><guid>http://www.cppblog.com/guojingjia2006/archive/2010/07/28/121439.html</guid><wfw:comment>http://www.cppblog.com/guojingjia2006/comments/121439.html</wfw:comment><comments>http://www.cppblog.com/guojingjia2006/archive/2010/07/28/121439.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/guojingjia2006/comments/commentRss/121439.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/guojingjia2006/services/trackbacks/121439.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: EDN博客精华文章&nbsp;&nbsp;作者：mycaiboKeil C51程序设计中几种精确延时方法摘要 实际的单片机应用系统开发过程中，由于程序功能的需要，经常编写各种延时程序，延时时间从数微秒到数秒不等，对于许多C51开发者特别是初学者编制非常精确的延时程序有一定难度。本文从实际应用出发，讨论几种实用的编制精确延时程序和计算程序执行时间的方法，并给出各种方法使用的详细步骤，以便...&nbsp;&nbsp;<a href='http://www.cppblog.com/guojingjia2006/archive/2010/07/28/121439.html'>阅读全文</a><img src ="http://www.cppblog.com/guojingjia2006/aggbug/121439.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/guojingjia2006/" target="_blank">小果子</a> 2010-07-28 10:58 <a href="http://www.cppblog.com/guojingjia2006/archive/2010/07/28/121439.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>51单片机之-跑马灯</title><link>http://www.cppblog.com/guojingjia2006/archive/2010/07/28/121437.html</link><dc:creator>小果子</dc:creator><author>小果子</author><pubDate>Wed, 28 Jul 2010 02:45:00 GMT</pubDate><guid>http://www.cppblog.com/guojingjia2006/archive/2010/07/28/121437.html</guid><wfw:comment>http://www.cppblog.com/guojingjia2006/comments/121437.html</wfw:comment><comments>http://www.cppblog.com/guojingjia2006/archive/2010/07/28/121437.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/guojingjia2006/comments/commentRss/121437.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/guojingjia2006/services/trackbacks/121437.html</trackback:ping><description><![CDATA[<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; font-family: courier new;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">#include</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">reg52.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">52系列单片机头文件</span><span style="color: #008000;"><br></span><span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">intrins.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #008000;">//</span><span style="color: #008000;">初始化</span><span style="color: #008000;"><br></span><span style="color: #000000;"><br></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;init(){<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">中断初始化<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">IE</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;EA</span><span style="color: #000000;">=</span><span style="color: #000000;">1</span><span style="color: #000000;">;</span><span style="color: #008000;">//</span><span style="color: #008000;">中断总开关</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;ET0</span><span style="color: #000000;">=</span><span style="color: #000000;">1</span><span style="color: #000000;">;</span><span style="color: #008000;">//</span><span style="color: #008000;">定时器0开关<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">TCON</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;TF0</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;TR0</span><span style="color: #000000;">=</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">TMOD</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;TMOD</span><span style="color: #000000;">=</span><span style="color: #000000;">0x01</span><span style="color: #000000;">;</span><span style="color: #008000;">//</span><span style="color: #008000;">定时器0使用,工作方式1<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">初始化预置值</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;TH0</span><span style="color: #000000;">=</span><span style="color: #000000;">0x3C</span><span style="color: #000000;">;</span><span style="color: #008000;">//</span><span style="color: #008000;">预值为3c+b0=15536</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;TL0</span><span style="color: #000000;">=</span><span style="color: #000000;">0xB0</span><span style="color: #000000;">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//<br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;P1</span><span style="color: #000000;">=</span><span style="color: #000000;">0x01</span><span style="color: #000000;">;<br>}<br></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;delay1s(){<br>&nbsp;&nbsp;&nbsp;&nbsp;#pragma&nbsp;asm<br>&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r5,#08h&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;</span><span style="color: #008000;">//</span><span style="color: #008000;">1001.401ms&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;time1s_1:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r6,#0f4h&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;</span><span style="color: #008000;">//</span><span style="color: #008000;">125.173ms&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;time1s_2:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r7,#0ffh&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;</span><span style="color: #008000;">//</span><span style="color: #008000;">511us&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;djnz&nbsp;&nbsp;&nbsp;r7,$&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;djnz&nbsp;&nbsp;&nbsp;r6,time1s_2&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;djnz&nbsp;&nbsp;&nbsp;r5,time1s_1<br>&nbsp;&nbsp;&nbsp;&nbsp;#pragma&nbsp;endasm<br>}<br></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;time0(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">)&nbsp;interrupt&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">using</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delay1s();<br>&nbsp;&nbsp;&nbsp;&nbsp;#pragma&nbsp;asm<br>&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;a,p1<br>&nbsp;&nbsp;&nbsp;&nbsp;rl&nbsp;a<br>&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;p1,a<br>&nbsp;&nbsp;&nbsp;&nbsp;#pragma&nbsp;endasm<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>}<br><br></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;main(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">){<br>&nbsp;&nbsp;&nbsp;&nbsp;init();<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">(</span><span style="color: #000000;">1</span><span style="color: #000000;">){};<br>}</span></div>
初学单片机,记下学习路程<br>跑灯闪的时间间隔不是1s<br>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008000;">//</span><span style="color: #008000;">头文件intrins.h介绍</span><span style="color: #008000;"><br></span><span style="color: #000000;">内部函数&nbsp;描述<br>_crol_&nbsp;字符循环左移<br>_cror_&nbsp;字符循环右移<br>_irol_&nbsp;整数循环左移<br>_iror_&nbsp;整数循环右移<br>_lrol_&nbsp;长整数循环左移<br>_lror_&nbsp;长整数循环右移<br>_nop_&nbsp;空操作8051&nbsp;NOP&nbsp;指令<br>_testbit_&nbsp;测试并清零位8051&nbsp;JBC&nbsp;指令&nbsp;</span></div>
DSN:<a  href="http://www.cppblog.com/Files/guojingjia2006/keil/main.DSN.rar">http://www.cppblog.com/Files/guojingjia2006/keil/main.DSN.rar</a><br>  <img src ="http://www.cppblog.com/guojingjia2006/aggbug/121437.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/guojingjia2006/" target="_blank">小果子</a> 2010-07-28 10:45 <a href="http://www.cppblog.com/guojingjia2006/archive/2010/07/28/121437.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Keil编译模式的选择</title><link>http://www.cppblog.com/guojingjia2006/archive/2010/07/27/121393.html</link><dc:creator>小果子</dc:creator><author>小果子</author><pubDate>Tue, 27 Jul 2010 06:43:00 GMT</pubDate><guid>http://www.cppblog.com/guojingjia2006/archive/2010/07/27/121393.html</guid><wfw:comment>http://www.cppblog.com/guojingjia2006/comments/121393.html</wfw:comment><comments>http://www.cppblog.com/guojingjia2006/archive/2010/07/27/121393.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/guojingjia2006/comments/commentRss/121393.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/guojingjia2006/services/trackbacks/121393.html</trackback:ping><description><![CDATA[Keil Cx51编译器提供三条编译模式控制命令：SMALL,COMPACT,LARGE，它们对变量存储器空间的影响如下。<br>
SMALL：所有变量都被定义在8051单片机的片内RAM中，对这种变量的访问速度最快。另外，堆栈也必须位于片内RAM中，而堆栈的长度是很重要的，实际栈长取决与不同函数的嵌套深度。采用SMALL编译模式与定义变量时指定data存储器类型具有相同效果。<br>
<br>
COMPACT：所有变量被定义在分页寻址的片外XRAM中，每一页片外XRAM的长度为256字节。这时对变量的访问是通过寄存器间接寻址（MOVX
@R0,MOVX
@R1）进行的，变量的低8位地址由R0和R1确定，变量的高8位地址由P2口确定。采用这种模式时，必须适当改变配置文件STARTUP.A51中的参
数：PDATASTART和PDATALEN；同时还必须对uVision2的&#8220;Options选项/BL51 Locator
标签页/Pdata框&#8221;中键入合适的地址参数，以确保P2口能输出所需要的高8位地址。采用COMPACT编译模式与定义变量时指定pdata存储器类型
具有相同效果。<br>
<br>
LARGE：所有变量被定义在片外XRAM中（最大可达64KB），使用数据指针DPTR来间接访问变量（MOVX
@DPTR），这种编译模式对数据访问的效率最低，而且将增加程序的代码长度。采用LARGE编译模式与定义变量时指定xdata存储器类型具有相同效
果。&#8221;<br>
摘自《Keil Cx51 V7.0单片机高级语言编程与uVision2应用实践》<img src ="http://www.cppblog.com/guojingjia2006/aggbug/121393.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/guojingjia2006/" target="_blank">小果子</a> 2010-07-27 14:43 <a href="http://www.cppblog.com/guojingjia2006/archive/2010/07/27/121393.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>