⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 4.htm

📁 单片机C语言教程 初学单片机的非常实用.
💻 HTM
📖 第 1 页 / 共 4 页
字号:
                  align=center><SPAN lang=EN-US 
                  style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">9位UART<O:P></O:P></SPAN></P></TD>
                <TD 
                style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 104.35pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt" 
                vAlign=top width=139>
                  <P class=MsoNormal style="TEXT-ALIGN: center" 
                  align=center><SPAN 
                  style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">可变<SPAN 
                  lang=EN-US><O:P></O:P></SPAN></SPAN></P></TD></TR></TBODY></TABLE>
            <P class=MsoNormal style="TEXT-ALIGN: center" align=center><SPAN 
            style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">表<SPAN 
            lang=EN-US>8-2 串行口工作模式设置<O:P></O:P></SPAN></SPAN></P>
            <P class=MsoNormal><SPAN lang=EN-US 
            style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><O:P></O:P></SPAN></P>
            <P class=MsoNormal><SPAN lang=EN-US 
            style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><SPAN 
            style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; 
            </SPAN>在这里只说明最常用的模式1,其它的模式也就一一略过,有兴趣的朋友可以找相关的硬件资料查看。表中的fosc代表振荡器的频率,<SPAN 
            class=GramE>也就是晶振的</SPAN>频率。UART为(Universal Asynchronous 
            Receiver<SPAN class=GramE>)</SPAN>的英文缩写。<O:P></O:P></SPAN></P>
            <P class=MsoNormal><SPAN lang=EN-US 
            style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><SPAN 
            style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; 
            </SPAN>SM2在模式2、模式3中为多处理机通信使能位。在模式0中要求该位为0。<O:P></O:P></SPAN></P>
            <P class=MsoNormal><SPAN lang=EN-US 
            style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><SPAN 
            style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; 
            </SPAN>REM为允许接收位,REM置1时串口允许接收,置0时禁止接收。REM是由软件置位或清零。如果在一个电路中接收和发送引脚P3.0,P3.1都和上位机相连,在软件上有串口中断处理程序,当要求在处理某个子程序时不允许串口被上位机来的控制字符产生中断,那么可以在这个子程序的开始<SPAN 
            class=GramE>处加入</SPAN>REM=0来禁止接收,在子程序结束<SPAN 
            class=GramE>处加入</SPAN>REM=1再次打开串口接收。大家也可以用上面的实际源码加入REM=0来进行实验。<O:P></O:P></SPAN></P>
            <P class=MsoNormal><SPAN lang=EN-US 
            style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><SPAN 
            style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; 
            </SPAN>TB8发送数据位8,在模式2和3是要发送的第9位。该<SPAN 
            class=GramE>位可以</SPAN>用软件根据需要置位或清除,通常这位在通信协议中做奇偶位,在多处理机通信中这一位则用于表示是地址<SPAN 
            class=GramE>帧</SPAN>还是数据帧。<O:P></O:P></SPAN></P>
            <P class=MsoNormal><SPAN lang=EN-US 
            style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><SPAN 
            style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; 
            </SPAN>RB8接收数据位8,在模式2和3是已接收数据的第9位。该<SPAN 
            class=GramE>位可能</SPAN>是奇偶位,地址/数据标识位。在模式0中,RB8为保留<SPAN 
            class=GramE>位没有</SPAN>被使用。在模式1中,当SM2=0,RB8是已接收数据的停止位。<O:P></O:P></SPAN></P>
            <P class=MsoNormal><SPAN lang=EN-US 
            style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><SPAN 
            style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; 
            </SPAN>TI发送中断标识位。在模式0,发送完第8位数据时,由硬件置位。其它模式中则是在发送停止位之初,由硬件置位。TI置位后,申请中断,CPU响应中断后,发送下一帧数据。在任何模式下,TI都必须由软件来清除,也就是说在数据写入到SBUF后,硬件发送数据,中断响应(如中断打开),这时TI=1,表明发送已完成,TI不会由硬件清除,所以这时必须用软件对其清零。<O:P></O:P></SPAN></P>
            <P class=MsoNormal><SPAN lang=EN-US 
            style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><SPAN 
            style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; 
            </SPAN>RI接收中断标识位。在模式0,接收第8位结束时,由硬件置位。其它模式中则是在接收停止位的半中间,由硬件置位。RI=1,申请中断,要求CPU取走数据。但在模式1中,SM2=1时,当未收到有效的停止位,则不会对RI置位。同样RI也必须要靠软件清除。<O:P></O:P></SPAN></P>
            <P class=MsoNormal><SPAN lang=EN-US 
            style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><SPAN 
            style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; 
            </SPAN>常用的串口模式1是传输10个位的,1位起始位为0,8位数据位,低位在先,1位停止位为1。它的波特率是可变的,其速率是取决于定时器1或定时器2的定时值(溢出速率)。AT89C51和AT89C2051等51系列芯片只有两个定时器,定时器0和定时器1,而定时器2是89C52系列芯片才有的。<O:P></O:P></SPAN></P>
            <P class=MsoNormal><SPAN lang=EN-US 
            style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><SPAN 
            style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; 
            </SPAN><B>波特率</B> 在使用串口做通讯时,一个很重要的参数就是波特率,只有上下位机的波特率一样时才可以进行正常通讯。波特率是指串行端口每秒内可以传输的波特位数。有一些初学的朋友认为波特率是指每秒传输的字节数,如标准9600会被误认为每秒<SPAN 
            class=GramE>种可以</SPAN>传送9600个字节,而实际上它是指每秒可以传送9600个二进位,而一个字节要8个二进位,如用串口模式1来传输那么加上起始位和停止位,每个数据字节就要占用10个二进位,9600波特率用模式1传输时,每秒传输的字节数是9600÷10=960字节。51芯片的串口工作模式0的波特率是固定的,为fosc/12,以一个12M的<SPAN 
            class=GramE>晶振来</SPAN>计算,那么它的波特率可以达到1M。模式2的波特率是固定在fosc/64或fosc/32,具体用那一种就取决于PCON寄存器中的SMOD位,如SMOD为0,波特率为focs/64,SMOD为1,波特率为focs/32。模式1和模式3的波特率是可变的,取决于定时器1或2(52芯片)的溢出速率。那么我们怎么去计算这两个模式的波特率设置时相关的寄存器<SPAN 
            class=GramE>的值呢</SPAN>?可以用以下的公式去计算。<O:P></O:P></SPAN></P>
            <P class=MsoNormal><SPAN lang=EN-US 
            style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><O:P></O:P></SPAN></P>
            <P class=MsoNormal 
            style="MARGIN-LEFT: 42pt; TEXT-INDENT: 21pt"><SPAN 
            style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">波特率=(<SPAN 
            lang=EN-US>2SMOD÷32)×定时器1溢出速率<O:P></O:P></SPAN></SPAN></P>
            <P class=MsoNormal><SPAN lang=EN-US 
            style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><O:P></O:P></SPAN></P>
            <P class=MsoNormal><SPAN lang=EN-US 
            style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><SPAN 
            style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; 
            </SPAN>上式中如设置了PCON寄存器中的SMOD位为1时就可以把波特率提升2倍。通常会使用定时器1工作在定时器工作模式2下,这时定时值中的TL1<SPAN 
            class=GramE>做为</SPAN>计数,TH1<SPAN class=GramE>做为</SPAN>自动<SPAN 
            class=GramE>重装值</SPAN> ,这个定时模式下,定时器溢出后,TH1的值会自动装载到TL1,再次开始计数,这样可以不用软件去干预,使得定时更准确。在这个定时模式2下定时器1溢出速率的计算公式如下:<O:P></O:P></SPAN></P>
            <P class=MsoNormal><SPAN lang=EN-US 
            style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><O:P></O:P></SPAN></P>
            <P class=MsoNormal><SPAN lang=EN-US 
            style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><SPAN 
            style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            </SPAN>溢出速率=(计数速率)/(256-TH1)<O:P></O:P></SPAN></P>
            <P class=MsoNormal><SPAN lang=EN-US 
            style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><O:P></O:P></SPAN></P>
            <P class=MsoNormal><SPAN lang=EN-US 
            style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><SPAN 
            style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; 
            </SPAN>上式中的“计数速率”与所使用的晶体振荡器频率有关,在51芯片中定时器启动后会在每一个机器周期使定时寄存器TH的值增加<SPAN 
            class=GramE>一</SPAN>,一个机器周期等于十二个振荡周期,所以可以得知51芯片的计数速率为晶体振荡器频率的1/12,一个12M<SPAN 
            class=GramE>的晶振用在</SPAN>51芯片上,那么51的计数速率就为1M。通常用11.0592M晶体是为了得到标准的无误差的波特率,那么<SPAN 
            class=GramE>为何呢</SPAN>?计算一下就知道了。如我们要得到9600的波特率,<SPAN 
            class=GramE>晶振为</SPAN>11.0592M和12M,定时器1为模式2,SMOD设为1,分别看看那所要求的TH1为何值。代入公式:<O:P></O:P></SPAN></P>
            <P class=MsoNormal><SPAN lang=EN-US 
            style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><SPAN 
            style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            </SPAN>11.0592M<O:P></O:P></SPAN></P>
            <P class=MsoNormal><SPAN lang=EN-US 
            style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><SPAN 
            style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            </SPAN>9600=(2÷32)×((11.0592M/12)/(256-TH1))<O:P></O:P></SPAN></P>
            <P class=MsoNormal><SPAN lang=EN-US 
            style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><SPAN 
            style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            </SPAN>TH1=250 //看看是不是和上面实例中的使用的数值一样?<O:P></O:P></SPAN></P>
            <P class=MsoNormal><SPAN lang=EN-US 
            style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><O:P></O:P></SPAN></P>
            <P class=MsoNormal><SPAN lang=EN-US 
            style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><SPAN 
            style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            </SPAN>12M<O:P></O:P></SPAN></P>
            <P class=MsoNormal><SPAN lang=EN-US 
            style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><SPAN 
            style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            </SPAN>9600=(2÷32)×((12M/12)/(256-TH1))<O:P></O:P></SPAN></P>
            <P class=MsoNormal><SPAN lang=EN-US 
            style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><SPAN 
            style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            </SPAN>TH1≈249.49<O:P></O:P></SPAN></P>
            <P class=MsoNormal><SPAN lang=EN-US 
            style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><SPAN 
            style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            </SPAN><O:P></O:P></SPAN></P>
            <P class=MsoNormal><SPAN lang=EN-US 
            style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><SPAN 
            style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; 
            </SPAN>上面的计算可以看出使用12M晶体的时候计算出来的TH1不为整数,而TH1的<SPAN 
            class=GramE>值只能</SPAN>取整数,这样它就会有一定的误差存在不能产生精确的9600波特率。当然一定的误差是可以在使用中被接受的,就算使用11.0592M的晶体振荡器也会因晶体本身所存在的误差使波特率产生误差,但晶体本身的误差对波特率的影响是十分之小的,可以忽略不计。<O:P></O:P></SPAN></P>
            <P class=MsoNormal><SPAN lang=EN-US 
            style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><SPAN 
            style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; 
            </SPAN>这一节借着学习开关语句的机会,简略说明了串行的一些相关内容,但串口的工作方式设定有好种同时也要涉及到其它的相关寄存器,内容十分多,在此也不能一一做实例说明,下面的章节也会加入一些硬件方面的东西。<O:P></O:P></SPAN></P></TD></TR>
        <TR>
          <TD>
            <P align=center><A class=T12_R4 
            href="http://www.hificat.com/study/c%20lesson/lesson8_4/p8_4.rar" 
            target=_blank><STRONG>示例程序下载</STRONG></A></P></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE>
<TABLE class=coast cellSpacing=0 cellPadding=0 width=736 border=0>
  <TBODY>
  <TR>
    <TD align=middle>
      <DIV align=center>联系地址:浙江省杭州市拱北小区永和坊9幢504室 徐玮 
      邮政编码:310015<BR>Email:xu169@sina.com QQ:12739176 联系电话:0571-85956028(小灵通) 
      手机:13185018567(短信)<BR>杭州电子&amp;计算机工作室 版权所有 <BR>COPYRIGHT2003 HangZhou 
      Electron&amp;Computer Studio. All rights reserved 
</DIV></TD></TR></TBODY></TABLE></BODY></HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -