📄 ——工作频率可动态调整的单片机系统设计.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 + -