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

📄 pic16cxxx-1-3.htm

📁 PIC单片机C语言教程!绝对经典
💻 HTM
📖 第 1 页 / 共 2 页
字号:
            RB&lt;7:4&gt;和RB&lt;3:0&gt;的结构图如下:<br> <div align="center"> 
              <p><img src="image/a46.gif" width="567" height="255"> </p>
              <p><img src="image/a47.gif" width="422" height="258"> </div>
            <p>§1.8.3 PORTC和TRISC 
            <p align="center"><img src="image/a48.gif" width="294" height="73"></p>
            PORTC是一个8位双向I/O口。它的方向由TRISC定义。PORTC 口有输入斯密特触发器缓<br>
            冲。如下图所示:<br> <p align="center"> <img src="image/a49.gif" width="333" height="361"> 
            <p align="center"><img src="image/a50.gif" width="573" height="337"> 
            </p>
            <p>§1.8.4 PORTD和TRISD</p>
            <p> 
            <p align="center"><img src="image/a51.gif" width="291" height="79"></p>
            &nbsp;&nbsp;&nbsp;&nbsp;PORTD是一个8位双向I/O口,具有斯密特输入特性,由TRISD控制输入/输出方向。<br> 
            &nbsp;&nbsp;&nbsp;&nbsp;另外PORTD还可以用作并行口,这在相应章节介绍。<br> <p align="center"> 
              <img src="image/a52.gif" width="269" height="307"> 
            <p align="center"><img src="image/a53.gif" width="545" height="187"></p>
            <p>§1.8.5 PORTE和TRISE</p>
            <p><img src="image/a54.gif" width="181" height="83" hspace="50"></p>
            <p> &nbsp;&nbsp;&nbsp;&nbsp;PORTE只有三根双向I/O线,其方向由TRISE寄存器控制。仅PORTE的这三根I/O线还可以<br>
              &nbsp;&nbsp;&nbsp;&nbsp;作为并行口控制线,这在§1.8.7介绍,请参考。</p>
            <p> 
            <p align="center"><img src="image/a55.gif" width="266" height="294"></p>
            <p align="center">图1.21 PORTE结构图</p>
            <p align="center">TRISE除三位&lt;0:2&gt;用于PORTE方向控制外,另外还有五位&lt;3:7&gt;用于其他功能的控制, 
              见下图。</p>
            <p align="center"><img src="image/a56.gif" width="565" height="728"></p>
            §1.8.6 I/O编程注意事项 
            <p>I/O口使用注意事项:<br>
              一、I/O方向转置的问题<br>
              &nbsp;&nbsp;&nbsp;&nbsp;有的时候我们可能需要一个I/O口一会做输入,一会又做输出,这就是I/O方向的转置。在编写这种I/O转置程序时你必须注意,有些指令写I/O口时先从I/O读入其状态, 
              修改后再重新写回I/O当前状态读入CPU, 执行位操作后再将结果写回去覆盖原来的内容(输出的结果放在I/O口的数据锁存器)。举个例说:BSF6,5这条指令的目的是要把B口的第6位置为高电平&quot;1&quot;。执行这条指令时,先把整个B口当前的状态内容读入到CPU,把第6位置成&quot;1&quot;后再把结果(8个位)重新输出到B口。如果B口中的有一个I/O腿是需要方向转置的(比如说bit1),而这时是处于输入态,那么B口的状态值重新写入后,B口的数据锁存器1(见图1.15相对于B口bit1的锁存器)的锁存值就是当前B口Bit1的状态。这可能和先前Bit1 
              作为输出时所锁存的值不同,所以当Bit1再转置成输出态时,出现在bit1 端的状态就可能和先前的输出态不同了。<br>
              二、I/O的&quot;线或&quot;和&quot;线与&quot;<br>
              &nbsp;&nbsp;&nbsp;&nbsp;从图1.15看出:PIC I/O脚输出电路为CMOS互补推挽输出电路。因此与其他这类电路一样,当某个PIC 
              I/O脚设置为输出状态时,不能与其他电路的输出脚接成&quot;线或&quot;或&quot;线与&quot;的形式,否则可能引起输出电流过载,烧坏PIC。如需要与其他电路接成&quot;线或&quot;电路时,PIC 
              I/O必须置于&quot;0&quot;状态或输入状态并外接上拉电阻。如需要接成&quot;线与&quot;电路时,则PIC I/O必须置于&quot;1&quot;状态或输入状态, 
              并外接下拉电阻,电阻的阻值根据实际电路和PIC I/O脚最大电流来选定。<br>
              三、I/O口的连续操作<br>
              &nbsp;&nbsp;&nbsp;&nbsp;一条写I/O的指令,对I/O真正写操作是发生在指令的后半周期。而读I/O的指令却是在指令的周期开始就读取I/O端状态。所以当你连续对一个I/O端写入再读出时, 
              必须要让I/O端上的写入电平有一个稳定的时间,否则读入的可能是前一个状态,而不是最新的状态值。一般推荐在两条连续的写, 读指令间至少加一条NOP指令。</p>
            <p><img src="image/a57.gif" width="259" height="65" hspace="50"></p>
            <p>四、噪声环境下的I/O操作<br>
              &nbsp;&nbsp;&nbsp;&nbsp;在噪声环境下(如静电火花),I/O控制寄存器可能因受干扰而变化。比如I/O 口可能会从输入态自己变成输出态,对于这种情形,WDT也是无法检测出来的。因此如果你的应用环境是较恶劣的,建议你每隔一定的间隔,都重新定义一下I/O控制寄存器。</p>
            <p>§1.8.7 并行口</p>
            <p><img src="image/a58.gif" width="178" height="73" hspace="50"></p>
            &nbsp;&nbsp;&nbsp;&nbsp;在PIC64/65中,PORTD除作为一般的双向I/O口,还可以用作8位的并行口。把PSPMODE位(TRISE&lt;4&gt;)置为&quot;1&quot;,则PORTD工作在并行口方式,它可以由外部控制器进行异步读写。并行口PORTD可直接和外部的8位微控制器的数据线相连,这时该微控制器即可把PORRTD作为一个数据锁存器来读写。PIC64/65的这个特性使它可以方便地和别的8位微控制器进行并行通讯。<br> 
            &nbsp;&nbsp;&nbsp;&nbsp;当PSPMODE置为&quot;1&quot;后,PORTE的三根I/O线即分别成为并行口PORTD的三根控制线:RE0作为读控制线RD,RE1作为写控制线WE,RE2则作为片选线CS。这时TRISE&lt;O:2&gt; 
            还必须置为&quot;111&quot;以使RE0~RE2成为输入线。<br> &nbsp;&nbsp;&nbsp;&nbsp;并行口中实际上有二个8位锁存器,分别对应于数据进(写入PIC)和数据出(从PIC读出),<br>
            如图示。<br> <p align="center"><img src="image/a59.gif" width="272" height="334"></p>
            <p align="center">图1.23 并行口结构</p>
            <br> &nbsp;&nbsp;&nbsp;&nbsp;对于PIC单片机这方面来说,当写操作时,是把8位数据写入到PORTD数据锁存器,读操作则是从PORTD管脚锁存器读入数据。 
            但这二个物理上不同的寄存器在逻辑地址上是一样的,实际的操作对象则取决于RD(读)和WR(写)信号线的状态。在PORTD作为并行口操作时,TRISD对PORTD的方向控制则不再起作用, 
            此时由外部的微控制器通过RD和WR来控制数据的方向。<br> &nbsp;&nbsp;&nbsp;&nbsp;当PORTD从外部接收到一个字节数据并等待PIC的CPU来读取时,IFB标志位(TRISE&lt;7&gt;)被置为&quot;1&quot;,一旦这个数据被CPU读取后,IBF位即清为&quot;0&quot;。IBF是一个只读状态位, 
            当数据被CPU写入到PORTD等待外部控制器读取时,OBF标志位(TRISE&lt;6&gt;)被硬件置为&quot;1&quot;, 
            一旦这个数据被外部控制器读取后,OBF位即被清为&quot;0&quot;。当PORTD 从外部控制器接收到一个数据,CPU还未读取前外部控制器又置入一个数据,则原先的数据会被新数据复盖,并且IOBV 
            标志位(TRISE&lt;5&gt;)被置为&quot;1&quot;。IOBV是一个可读/写的位,必须由程序方能将其清为&quot;0&quot;。当PORTD不作为并行口时(PSPMODEQ=&quot;0&quot;),IBF和OBF都保持为&quot;0&quot;。此时如果IBOV之前被置为&quot;1&quot;,则应由软件将其清为&quot;0&quot;。当PORTD并行口完成一个读/写操作后,就有一个中断请求产生。 
            这时其相应的中断标志位PSPIF(PIP1&lt;7&gt;)被置为&quot;1&quot;,PSPIF位须由软件来清&quot;0&quot;。PSPIE(PIE1&lt;7&gt;) 
            为该中断的屏蔽位,置PSPIE=&quot;0&quot;可以屏蔽该中断。<br> <p>下表为和并行口有关的寄存器:<BR>
            <p><img src="image/a60.gif" width="409" height="180"></p>
            <p>注: -=未用,X=不定 表1.9 并行口相关寄存器<br>
              §1.9 定时器/计数器</p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;PIC16C61有一个定时器TIMER0,其余PIC16C6X则有3个定时器TIMER0,TIMER1,TIMER2。每个定时器都可以产生中断请求,另外定时器也和一些别的模块配合来完成捕捉/PWM等功能。</p>
            <p>§1.9.1 TIMER0定时器/计数器</p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;PIC16C6X都有定时器/计数器TIMER0(在PIC15C5X中被称为RTCC),具有如下特点:<br>
                ·8位,可循环溢出的定时器/计数器。<br>
                ·用户可读/写。<br>
                ·具8位可编程预分频器。</p>
            <p> 
            <p align="center"><img src="image/a61.gif" width="573" height="423"></p>
            <p align="center">图1.25 TIMER0/WDT预分频器方块图</p>
            &nbsp;&nbsp;&nbsp;&nbsp;从上图可看出,该预分频器为TIMER0和WDT所共用, 但某一时刻只能分配给其中之一使 
            用,这完全由程序控制。你可以在程序中变换预分频器的分配对象, 下面两段程序是推荐的 转换程序。<br> <p align="center"><img src="image/a62.gif" width="360" height="298"></p>
            &nbsp;&nbsp;&nbsp;&nbsp; <p>当预分频器给TIMER0时,任何操作到TIMER0的指令(如CLRF1,MOVWF1等) 
              都会清零预分 频器。同理,当预分频器给WDT时,一条清WDT指令(CLRWDT)将会同时清零其预分频器。 这里 应注意,指的是预分频器,而不是别的(如OPTION寄存器) 
              即分频倍率和其分配对象并不会改变。<br>
              &nbsp;&nbsp;&nbsp;&nbsp;预分频器不能由软件读/写。<br>
              <img src="image/a63.gif" width="690" height="172"></p>
            <p>注: X=不定, u=不变, -=未用, 阴影部分为TIMER0无关位。<br>
              (1) TRISA&lt;5&gt;和PEIE位在16C61中未用。<br>
            <p align="center">表1.12 TIMER0相关寄存器 </p>
            <p>§1.9.2 TIMER1定时器/计数器 </p>
            <p><img src="image/a65.gif" width="286" height="75" hspace="50"></p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;TIMER1为16位宽,分别由 2个8位可读/写的寄存器TIMER1H和时TIMER1L组成。<br>
              &nbsp;&nbsp;&nbsp;&nbsp;TIMER1可从0000增1计数到FFFFh,并且溢出回到0。当溢出发生后,置TIMER1IF(PIR1&lt;0&gt;)<br>
              &nbsp;&nbsp;&nbsp;&nbsp;为1,并产生中断请求,其中断屏蔽位为TIMER1IE(PIE1&lt;0&gt;),详见PIE1寄存器描述。</p>
            <p align="center"><img src="image/a66.gif" width="576" height="257"></p>
            <p align="center">图1.26 TIMER1方块图</p>
            <p align="center"><img src="image/a67.gif" width="268" height="253"><br>
              <br>
              表1.14 TIMER1振荡参数表 </p>
            <p align="center">由于TIMER1振荡是低频振荡(LP),用户程序应考虑一定的延时以便让TIMER1 建立起稳 定的振荡。<br>
            </p>
            <p align="right"> <a href="PIC16Cxxx-1-2.htm">上一页</a> <a href="PIC16Cxxx-1-4.htm"> 
              下一页</a><br>
            </p>
            <p><a href="PIC16Cxxx-1.htm">第一章</a> <a href="PIC16Cxxx-2.htm">第二章</a> 
              <a href="PIC16Cxxx-3.htm">第三章</a> <a href="PIC16Cxxx-4.htm">第四章</a> 
              <a href="PIC16Cxxx-5.htm">第五章</a> <a href="PIC16Cxxx-6.htm">第六章</a> 
              <a href="PIC16Cxxx-7.htm">第七章</a> <a href="PIC16Cxxx-8.htm">第八章</a> 
              <a href="PIC16Cxxx-9.htm">第九章</a> <a href="PIC16Cxxx-10.htm">第十章</a></p></td>
        </tr>
      </table>
      <table width="700" border="0" cellspacing="0" cellpadding="0">
        <tr> 
          <td width="20">&nbsp;</td>
          <td>&nbsp;</td>
        </tr>
      </table>
      <table width="700" border="0" cellspacing="0" cellpadding="0">
        <tr bgcolor="#990000"> 
          <td height="1" width="634"></td>
        </tr>
        <tr align="right"> 
          <td height="6"></td>
        </tr>
        <tr align="right"> 
          <td><font color="#990000" size="2">[ <a href="index.htm">返回</a> ]</font> 
          </td>
        </tr>
        <tr> 
          <td>&nbsp;</td>
        </tr>
        <tr> 
          <td>&nbsp;</td>
        </tr>
      </table></td>
  </tr>
</table> 
 
</body> 
</html>

⌨️ 快捷键说明

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