?? ——工作頻率可動態調整的單片機系統設計.htm
字號:
<TD align=middle width="11%">0</TD>
<TD
width="68%">OUT0輸出選擇(CTR0=1時OUT0輸出MCLK/M,CTR0=輸出MCLK)</TD></TR>
<TR class=main>
<TD align=middle width="10%">1</TD>
<TD align=middle width="11%">0</TD>
<TD align=middle width="11%">0</TD>
<TD width="68%">OUT0輸出允許(CTR0=1時OUT0輸出高阻,CTR0=0輸出MCLK)</TD></TR>
<TR class=main>
<TD align=middle width="10%">1</TD>
<TD align=middle width="11%">1</TD>
<TD align=middle width="11%">0</TD>
<TD width="68%">OUT0輸出允許(CTR0=1時OUT0輸出高阻,CTR0=0輸出MCLK/M)</TD></TR>
<TR class=main>
<TD align=middle width="10%">X</TD>
<TD align=middle width="11%">0</TD>
<TD align=middle width="11%">1</TD>
<TD width="68%">掉電控制(CTR0=11進入掉電模式,CTR0=0時輸出MCLK)</TD></TR>
<TR class=main>
<TD align=middle width="10%">X</TD>
<TD align=middle width="11%">1</TD>
<TD align=middle width="11%">1</TD>
<TD
width="68%">掉電控制(CTR0=1進入掉電模式,CTR0=0時OUT0輸出MCLK/M)</TD></TR></TBODY></TABLE>
<P
style="TEXT-INDENT: 30px">其中,MCLK為內部振蕩器產生的主時鐘信號,MCLK/M為主時鐘信號經P0預定標器分頻后的時鐘信號。<BR><BR><B>表2
輸出OUT1的工作模式設定</B></P>
<TABLE borderColorDark=#ffffff width="100%" borderColorLight=#000000
border=1>
<TBODY>
<TR class=main>
<TD align=middle width="29%">PDN1</TD>
<TD width="71%">
<P align=center>CTRL1功能</P></TD></TR>
<TR class=main>
<TD align=middle width="29%">0</TD>
<TD width="71%">OUT1輸出允許(CTR1=1時OUT1輸出,CTR1=0輸出高阻)</TD></TR>
<TR class=main>
<TD align=middle width="29%">1</TD>
<TD
width="71%">掉電控制(CTR1=1進入掉電模式,CTR1=0時OUT1輸出)</TD></TR></TBODY></TABLE>
<P style="TEXT-INDENT: 0px"><B>表3 P0和P1的分頻比</B></P>
<TABLE borderColorDark=#ffffff width="100%" borderColorLight=#000000
border=1>
<TBODY>
<TR class=main>
<TD align=middle width="11%">0M1</TD>
<TD align=middle width="12%">0M0</TD>
<TD align=middle width="25%">P0預定標器分頻比</TD>
<TD align=middle width="15%">1M1</TD>
<TD align=middle width="13%">1M0</TD>
<TD align=middle width="24%">P1預定標器分頻比</TD></TR>
<TR class=main>
<TD align=middle width="11%">0</TD>
<TD align=middle width="12%">0</TD>
<TD align=middle width="25%">1</TD>
<TD align=middle width="15%">0</TD>
<TD align=middle width="13%">0</TD>
<TD align=middle width="24%">2</TD></TR>
<TR class=main>
<TD align=middle width="11%">0</TD>
<TD align=middle width="12%">1</TD>
<TD align=middle width="25%">2</TD>
<TD align=middle width="15%">0</TD>
<TD align=middle width="13%">1</TD>
<TD align=middle width="24%">4</TD></TR>
<TR class=main>
<TD align=middle width="11%">1</TD>
<TD align=middle width="12%">0</TD>
<TD align=middle width="25%">4</TD>
<TD align=middle width="15%">1</TD>
<TD align=middle width="13%">0</TD>
<TD align=middle width="24%">6</TD></TR>
<TR class=main>
<TD align=middle width="11%">1</TD>
<TD align=middle width="12%">1</TD>
<TD align=middle width="25%">8</TD>
<TD align=middle width="15%">1</TD>
<TD align=middle width="13%">1</TD>
<TD align=middle width="24%">8</TD></TR></TBODY></TABLE>
<P style="TEXT-INDENT: 30px">DIV寄存器(16位):</P>
<TABLE borderColorDark=#ffffff width="100%" borderColorLight=#000000
border=1>
<TBODY>
<TR class=main>
<TD align=middle width="6%">N9</TD>
<TD align=middle width="6%">N8</TD>
<TD align=middle width="6%">N7</TD>
<TD align=middle width="6%">N6</TD>
<TD align=middle width="6%">N5</TD>
<TD align=middle width="6%">N4</TD>
<TD align=middle width="6%">N3</TD>
<TD align=middle width="6%">N2</TD>
<TD align=middle width="6%">N1</TD>
<TD align=middle width="6%">N0</TD>
<TD align=middle width="6%">X</TD>
<TD align=middle width="6%">X</TD>
<TD align=middle width="7%">X</TD>
<TD align=middle width="7%">X</TD>
<TD align=middle width="7%">X</TD>
<TD align=middle width="7%">X</TD></TR></TBODY></TABLE>
<P
style="TEXT-INDENT: 30px">10位二進制數決定了除法寄存器的值N,10位二進制數的值加2就是N的值。例如:0000000000表示2分頻,1111111111表示1025分頻。</P>
<P style="TEXT-INDENT: 30px">BUS寄存器(8位):</P>
<TABLE borderColorDark=#ffffff width="100%" borderColorLight=#000000
border=1>
<TBODY>
<TR class=main>
<TD align=middle width="12%">-</TD>
<TD align=middle width="12%">-</TD>
<TD align=middle width="12%">-</TD>
<TD align=middle width="12%">-</TD>
<TD align=middle width="13%">WC</TD>
<TD align=middle width="13%">A2</TD>
<TD align=middle width="13%">A1</TD>
<TD align=middle width="13%">A0</TD></TR></TBODY></TABLE>
<P
style="TEXT-INDENT: 30px">如果WC=0,表示每次操作控制寄存器后自動保存到EEPROM中;如果WC=1表示只有對控制寄存器進行寫操作時才把值保存到EEPROM中。A3A2A1代表該DS1077芯片在總線操作中的地址。因此,同一系統中最多可接入8個DS1077。,</P>
<P style="TEXT-INDENT: 0px"><B>2 系統硬件電路及工作原理</B></P>
<P
style="TEXT-INDENT: 30px">可編程CMOS頻率合成器DS1077在單片機系統中的硬件電路如圖2所示。</P>
<P
style="TEXT-INDENT: 30px">在圖2中,可編程CMOS頻率合成器DS1077的輸出引腳OUT1接到單片機AT89C51的XTL1引腳,單片機的XTL2引腳不接,DS1077的輸出引腳OUT0不使用(在軟件中禁止),CRTL1和CTRL0接地。由于AT89C51單片機沒有二線串行接口,所以把DS1077的SCL和SDA接到單片機的P1.0和P1.1,用單片機的P1.0和P1.1模擬二線串行接口。</P>
<P
style="TEXT-INDENT: 30px">可編程CMOS頻率合成器DS1077設定為:引腳OUT0禁止使用;引腳OUT的輸出頻率略低于單片機的最高工作頻率;BUS寄存器的WC位置1(只有向頻率合成器DS1077發出寫命令時才把各個寄存器的值寫入EEPROM中)。這樣,在每次啟動單片機系統時,單片機總運行在較高的工作頻率;當完成了系統的初始化后,單片機就可以根據工作情況重新設置適合的工作頻率。在單片機工作過程中,最好不要向頻率合成器DS1077發出寫EEPROM命令。因為重新設置工作頻率即使超出了單片機的頻率范圍,造成單片機死機,由于寄存器的值沒有寫入EEROM中,當重新啟動時,單片機仍然能夠工作;如果把錯誤的工作頻率寫入EEPROM中,會造成系統不能重新啟動,此時只能取下DS1077芯片,用其他工具對它進行重新編程。</P>
<P style="TEXT-INDENT: 0px"><B>3
系統頻率改變對RS232串行通訊的影響及動態調整工作頻率時的解決辦法</B></P>
<P
style="TEXT-INDENT: 30px">在單片機系統中,時鐘頻率與RS232串行通訊有著密切的關系。例如,對于使用12MHz晶振的系統(早期的8051的最大工作頻率是12MHz),表4顯示了定時器1的自動重新載值與波特率之間的關系、與標準波特率的誤差。<BR><BR><B>表4
定時器1的自動重裝載值與波特率之間的關系、與標準波特率的誤差</B></P>
<TABLE borderColorDark=#ffffff width="100%" borderColorLight=#000000
border=1>
<TBODY>
<TR class=main>
<TD align=middle width="31%">定時器1自動重裝載值</TD>
<TD align=middle width="28%">實際波特率</TD>
<TD align=middle width="20%">理想值</TD>
<TD align=middle width="21%">波特率誤差(%)</TD></TR>
<TR class=main>
<TD align=middle width="31%">255</TD>
<TD align=middle width="28%">31250</TD>
<TD align=middle width="20%">28800</TD>
<TD align=middle width="21%">8.5</TD></TR>
<TR class=main>
<TD align=middle width="31%">254</TD>
<TD align=middle width="28%">15625</TD>
<TD align=middle width="20%">14400</TD>
<TD align=middle width="21%">8.5</TD></TR>
<TR class=main>
<TD align=middle width="31%">253</TD>
<TD align=middle width="28%">10417</TD>
<TD align=middle width="20%">9600</TD>
<TD align=middle width="21%">8.4</TD></TR>
<TR class=main>
<TD align=middle width="31%">249/250</TD>
<TD align=middle width="28%">4464</TD>
<TD align=middle width="20%">4800</TD>
<TD align=middle width="21%">7/88.5</TD></TR>
<TR class=main>
<TD align=middle width="31%">243</TD>
<TD align=middle width="28%">2404</TD>
<TD align=middle width="20%">2400</TD>
<TD align=middle width="21%">0.16</TD></TR></TBODY></TABLE>
<P style="TEXT-INDENT: 30px">波特率=2SMOD/32×{fosc/[12×(256-TH1)]}</P>
<P
style="TEXT-INDENT: 30px">其中,fosc為振蕩頻率,SMOD為單片機的波特率倍增位,TH1為定時器1的自動重裝載值。</P>
<P
style="TEXT-INDENT: 30px">在RS232串行通訊時,波特率發生器的誤差一般都不允許超過3%,否則就會造成通訊失敗,也就是說在采用12MHz晶振的51系統中只能夠使用2400波特率進行RS232通訊。顯然這在很多情況下都不能滿足系統需要。為了滿足RS232串行通訊的需要,通常選用少數特殊頻率的晶振,如11.059MHz和22.118MHz。這大大減小了波特率發生器的誤差(見表5),但也使得設計的靈活性大大降低。<BR><BR><B>表5
特殊頻率的晶振下波特率發生器的誤差</B></P>
<TABLE borderColorDark=#ffffff width="100%" borderColorLight=#000000
border=1>
<TBODY>
<TR class=main>
<TD align=middle width="29%" rowSpan=2>定時器1的自動重裝載值</TD>
<TD align=middle width="35%" colSpan=2>波特率(fosc=11.059MHz)</TD>
<TD align=middle width="36%"
colSpan=2>波特率(fosc=22.118MHz)</TD></TR>
<TR class=main>
<TD align=middle width="18%">實際波特率</TD>
<TD align=middle width="17%">理想值</TD>
<TD align=middle width="18%">實際波特率</TD>
<TD align=middle width="18%">理想值</TD></TR>
<TR class=main>
<TD align=middle
width="29%">255<BR>254<BR>253<BR>250<BR>244<BR>232<BR>208</TD>
<TD align=middle
width="18%">28799.5<BR>14399.7<BR>9599.8<BR>4799.91<BR>2399.95<BR>1199.98<BR>-</TD>
<TD align=middle
width="17%">28800<BR>14400<BR>9600<BR>4800<BR>2400<BR>1200<BR>-</TD>
<TD align=middle
width="18%">-<BR>28799.5<BR>14399.6<BR>9599.83<BR>4799.91<BR>2399.95<BR>1199.98</TD>
<TD align=middle
width="18%">-<BR>28800<BR>14400<BR>9600<BR>4800<BR>2400<BR>1200</TD></TR></TBODY></TABLE>
<P
style="TEXT-INDENT: 30px">在使用DS1077芯片的系統中,這個問題變得簡單了。DS1077芯片共有133MHz、125MHz、120MHz、100MHz、66.666MHz五種型號。下面以66.666MHz的DS1077x-66為例來介紹在各種工作頻率下進行RS232串行通訊的實現方案。</P>
<P
style="TEXT-INDENT: 30px">由于DS1077在整個溫度和電壓變化范圍內的頻率偏差小于1%,加上DS1077的輸出作為單片機時鐘所產生的波特率與理想值之間的誤差0.47%(66.666MHz除6即11.111MHz與理想頻率11.059MHz之間的誤差為0.47%),完全能夠滿足串行通訊3%的精度要求。表6列出了單片機系統工作在能夠滿足上述要求的各種頻率下的波特率及此時定時器1的自動重裝載值(該表由計算機模擬得出)。</P>
<P
style="TEXT-INDENT: 30px">如果單片機選用最高頻率為40MHz的89C51,則可以把DS1077的可編程除法器N設置為2,即讓單片機工作于33.333MHz。由表6可知,當定時器1的自動重裝載值設置不同進,單片機系統可以分別以28.8kbps、14.4kbps、9600bps、4800bps、2400bps進行可靠的串行通訊。系統對單片機速度要求不高時,單片機則可以把N設置成3、6、9、18、36,則系統分別工作于22.222MHz、11.111MHz、7.0473MHz、3.7037MHz和1.85183MHz。值得一提的是,當單片機工作頻率太低時,單片機只能以較低的波特率通訊。例如,當單片機工作在1.85183MHz時,串行通訊只能是2400bps或更低。當然,如果單片機不按這些標準波特率進行通訊或根本就不需要串行通訊,單片機系統的工作頻率的選擇范圍也就更寬了。<BR><BR><B>表6
單片機波特率及定時器1的自動重裝載值(波特率發生器誤差全部為0.47%)</B></P>
<TABLE borderColorDark=#ffffff width="100%" borderColorLight=#000000
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -