1、单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,单击此处编辑母版标题样式,*,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,单击此处编辑母版标题样式,*,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,单击此处编辑母版标题样式,*,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,单击此处编辑母版标题样式,*,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,单击此处编辑母版标题样式,*,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,单击此处编辑
2、母版标题样式,*,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,单击此处编辑母版标题样式,*,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,单击此处编辑母版标题样式,*,C8051F410,单片机的端口配置,1,端口输入,/,输出,C8051F410,单片机共有,24,个,I/O,端口可以使用,即,P0.0 P2.7,。这些,I/O,端口可以用作通用,I/O,,或者模拟输入,/,输出。,P0.0 P2.7,可以被分配给内部数字资源。设计者完全控制数字功能的引脚分配,只受物理,I/O,引脚数的限制。,2,端口输入,/,输出,3,端口输入,/,输出,从图,18.1,可以看出
3、C8051F410,单片机之所以可以实现内部数字资源的灵活分配,是通过优先级交叉开关译码器实现,即图中的,Priority Crossbar Decoder,。,4,和普通单片机,I/O,的不同,那么,C8051F410,单片机的,I/O,配置和普通的单片机差别在哪里呢?我们用一个例子说明。,比如要对一个单片机外的脉冲进行计数,普通的单片机会有一个端口作为脉冲的输入端口,假设是,P1.0,,这个引脚是固定的,但由于某种原因(比如,PCB,布线),我们希望这个外部脉冲可以接到,P2.3,引脚,这时普通单片机就做不到了,而,C8051F410,单片机就可以做到。,5,和普通单片机,I/O,的不
4、同,此外,,C8051F410,单片机的,I/O,端口在使用前都要进行输入,/,输出的设置。,设置输入方式:模拟输入还是数字输入。,设置输出方式:漏极开路(,open-drain,)输出还是推挽输出,(push-pull),。,6,优先权交叉开关译码器,优先权交叉开关译码器为每个,I/O,功能分配优先权,从优先权最高的,UART0,开始。当一个数字资源被选择时,尚未分配的端口引脚中的最低位被分配给该资源(,UART0,除外,它总是被分配到引脚,P0.4,和,P0.5,)。,7,优先权交叉开关译码器,如果一个端口引脚已经被分配,则交叉开关在为下一个被选择的资源分配引脚时将跳过该引脚。此外,交叉开
5、关还将跳过在,PnSKIP,寄存器中被置,1,的那些位所对应的引脚。,PnSKIP,寄存器允许软件跳过那些被用作模拟输入、特殊功能或,GPIO,的引脚。,8,优先权交叉开关译码器,注意:如果一个端口引脚被一个外设使用而不经过交叉开关,则该引脚在,PnSKIP,寄存器中的对应位应被置,1,。,9,优先权交叉开关译码器,这种情况适用于,P1.0,和,/,或,P1.1,(如果外部振荡器电路被使能)、,P1.2,(如果使用,VREF,)、,P0.6,(如果使用外部转换启动信号,NVSTR,)、,P0.0,(如果使用,IDA0,)、,P0.1,(如果使用,IDA1,)、以及任何被选择为,ADC,或比较器
6、输入的引脚。交叉开关跳过那些被选择的引脚(如同将它们已分配),移向下一个未被分配的引脚。,10,优先权交叉开关译码器,11,优先权交叉开关译码器,12,优先权交叉开关译码器,说了这么多,到底什么意思呢?我们一条一条的讲。,假设你要将,P0.1,和,P0.2,用作接外部晶振,或者,P1.2,用于,Vref,,或者,P0.6,用作外部,cnvstr,信号,或者,P0.0,用作,IDA0,,或者,P0.1,用作,IDA1,,或者某个端口(比如,P1.3,)用作,ADC,或者比较器的输入,则应在,PnSKIP,中将相应的位置,1,,即让交叉开关跳过这些端口。,13,优先权交叉开关译码器,此外,假如你希
7、望某个端口用作普通的,I/O,端口(至于干什么,由你自己决定),而不是特殊的功能,比如,PCA,,,SPI,等,你也可以将,PnSKIP,中相应的位置,1,,这样交叉开关译码器在为内部数字资源(比如,SPI,ECI,PCA,登)分配端口时,就会跳过这些端口,傻呼呼的认为这些端口已经有某种用途了。,14,端口初始化的步骤,1.,选择输入模式,模拟还是数字,在,PnMDIN,寄存器中设置。,2.,选择输出模式,漏极开路(,open-drain,)还是推挽输出(,push-pull,),在,PnMDOUT,寄存器中设置。,3.,选择被交叉开关译码器跳过的端口,在,PnSKIP,寄存器中设置。,15,
8、端口初始化的步骤,4.,用,XBRn,寄存器将引脚分配给要使用的外设。,5.,使能交叉开关(,XBARE=1,)。,16,端口初始化步骤的注意事项,对于端口初始化的第三步,被交叉开关译码器跳过的端口包括2种情况:,1)将P0.1和P0.2用作接外部晶振,或者P1.2用于Vref,或者P0.6用作外部cnvstr信号,或者P0.0用作IDA0,或者P0.1用作IDA1,或者某个端口(比如P1.3)用作ADC或者比较器的输入。,17,端口初始化步骤的注意事项,2,)某个端口使用者有特殊的用处(而不是希望用做,PCA,UART,ECI,等用途),比如你想将,P1.3,用来驱动一个,LED,,此时你就
9、要让交叉开关译码器跳过,P1.3,,这样,CrossBar,在为内部数字资源(比如,PCA,UART,ECI,等)分配端口时,就会跳过,P1.3,。,18,端口初始化步骤的注意事项,对于端口初始化中的第,4,步,其实就是把你需要的功能模块激活。比如,你希望,PCA,的,CEX0,输出到,P0.0,,而且交叉开关译码器已经把,CEX0,分配到,P0.0,,这时候千万记得将,XBR1,中的相应位设置好,即激活这个功能。,19,Example 1,说了这么多,还是通过例子来说明吧!,这里我们假设所有的端口都没有被跳过(,skip,),此时我们可以参考图,18.3,(,ppt,第,11,页)。,第一个
10、例子,我们驱动一个,LED,。,20,Example 1,21,Example 1,P2MDIN|=0 x02;/,设置,P2.1,为数字输入,P2MDOUT|=0 x02;/,设置,P2.1,为推挽输出,P2SKIP|=0 x02;/CrossBar,跳过,P2.1,22,Example 1,其实这里,P2SKIP|=0 x02,可以不要,因为我们这里只用了一个端口,但最好加上。,23,Example 2,P2.1,接一外部的模拟信号,对其进行,AD,转换。,24,Example 2,P2MDIN /,设置,P2.1,为模拟输入,/,这时,P2MDOUT,不用设置,因为用作模拟输入的端口,其
11、对应位在,PnMDOUT,中的设置会被忽略,P2SKIP|=0 x02;/CrossBar,跳过,P2.1,25,Example 3,设置,P2.1,为,PCA,的,CEX0,的输出,26,Example 3,P2MDIN|=0 x02;/P2.1,为数字输入,P2MDOUT|=0 x02;/P2.1,为推挽输出,P0SKIP=0 xFF;/,跳过,P0,的所以端口,P1SKIP=0 xFF;/,跳过,P1,的所以端口,P2SKIP|=0 x01;/,跳过,P2.0,端口,XBR1,XBR1|=0 x01;/CEX0,输出到,P2.1,XBR0|=0 x40;/,使能,CrossBar,27,Example 4,P0.0,用作模拟信号输入,进而进行,AD,转换。,P0.1,用来驱动一个,led,。,P0.4,和,P0.5,用作,UART,。,PCA,的,CEX0,输出到,P0.7,。,28,Example 4,P0SKIP=0 x4F;,XBR0|=0 x01;,XBR1|=0 x41;,端口的输入,/,输出设置前面已经讲过,这里不再叙述。,29,






