资源预览内容
第1页 / 共140页
第2页 / 共140页
第3页 / 共140页
第4页 / 共140页
第5页 / 共140页
第6页 / 共140页
第7页 / 共140页
第8页 / 共140页
第9页 / 共140页
第10页 / 共140页
亲,该文档总共140页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第4章 SPCE061A硬件系统,4.1 并行输入/输出端口 4.2 系统时钟与复位电路 4.3 定时器/计数器 4.4 A/D(模/数)转换器 4.5 DAC音频输出 4.6 串行设备输入/输出端口SIO 4.7 通用异步串行通信口UART 4.8 工作方式 思考题,4.1 并行输入/输出端口,4.1.1 I/O端口结构 SPCE061A提供了位控制结构的I/O端口,每一位都可以单独定义为输入或输出方式,通常对某一位的设定包括三个基本项:数据向量Data、属性向量Attribution和方向控制向量Direction,如图4.1所示。三个向量的每个对应位组合在一起形成一个控制字,用来定义相应I/O口位的输入、输出状态和工作方式,如表4.1所示。,图4.1 并行I/O端口结构,表4.1 I/O端口控制器设置,4.1.2 端口设置寄存器 (1) P_IOA_Data(读/写)(7000H) A口数据单元:用于向A口写入或从A口读出数据。当A口处于输入状态时,读A口管脚电平状态,写入数据将写到A口的数据寄存器;当A口处于输出状态时,写入输出数据到A口的数据寄存器。 (2) P_IOA_Buffer (读/写) (7001H) A口数据向量单元:用于向数据向量寄存器写入或从该寄存器读出数据。当A口处于输入状态时,写入是将A口的数据向量写入A口的数据寄存器,读出是从A口数据寄存器内读数据;当A口处于输出状态时,写入输出数据到A口的数据寄存器。,(3) P_IOA_Dir(读/写) (7002H) A口方向向量单元:用来设置A口是输入还是输出。该方向控制向量寄存器可以写入或从该寄存器内读出方向控制向量,Dir位决定了端口位的输入/输出方向,即0为输入,1为输出。 (4) P_IOA_Attrib(读/写)(7003H) A口属性向量单元:用于A口属性向量的设置。 (5) P_IOA_Latch(读)(7004H) A口数据锁存单元:读该单元以锁存A口上的输入数据,用于进入睡眠状态前,触键唤醒功能的启动(参见睡眠/唤醒部分)。,(6) P_IOB_Data(读/写)(7005H) B口数据单元:用于向B口写入或从B口读出数据。当B口处于输入状态时,读的是B口管脚电平状态,写入是将数据写入B口的数据寄存器;当B口处于输出状态时,写入数据到B口的数据寄存器。 (7) P_IOB_Buffer(读/写)(7006H) B口数据向量单元:用于向数据寄存器写入或从该寄存器读出数据。当B口处于输入状态时,写入是将数据写入B口的数据寄存器,读出则是从B口数据寄存器里读数据;当B口处于输出状态时,写入数据到B口的数据寄存器。 (8) P_IOB_Dir(读/写)(7007H) B口方向向量单元:用于设置IOB口的状态,0为输入,1为输出。,(9) P_IOB_Attrib(读/写)(7008H) B口属性向量单元:用于设置IOB口的属性。 例如:假设需要IOA0是下拉输入管脚,则相应的Data、Attribution和Direction对应位的值被置为000;如果需要IOA1是带唤醒功能的悬浮式输入管脚,则Attribution、Data和Direction的值被置为010,见表4.1。 与其它的单片机相比,除了每个I/O 端口可以单独定义其状态外,每个对应状态下的I/O 端口电路都是内置的,实际应用中不需要外接电阻(见图4.1)。例如,设A口为带下拉电阻的输入口,在连接硬件时不需在片外接下拉电阻,只需将三个向量的对应位设为000即可。,4.1.3 工作方式设置 1. 控制组合 方向向量_Dir、属性向量_Attr和数据向量_Data分别代表三个控制口,这三个口中每个对应位组合在一起形成一个控制字,定义相应I/O口位的工作方式。 Dir位决定端口位的输入/输出方向,0为输入,1为输出。 Attr位决定在端口位的工作方式。在输入状态下是悬浮式输入还是非悬浮式输入,0为带上拉或下拉电阻式输入,1为悬浮式输入。在输出状态下,决定其输出是反相输出还是同相输出,0为反相输出,1为同相输出。, Data位在端口位的输入状态下被写入时,与Attr位组合在一起形成输入方式的控制字(Attr Data)00 01 10 11,以决定输入口是带唤醒功能的下拉电阻式、带唤醒功能的上拉电阻式、带唤醒功能的悬浮式、不带唤醒功能的悬浮式输入等。Data位在端口位的输出状态下写入的是输出数据,不过数据是经过反相器输出还是经过同相缓存器输出,则由Attr位来决定。 例如:假设要把A口的b0位定义成下拉电阻式的输入口,则A口_Dir、_Attr 和_Data 向量的三个相应的b0位应组合为000。 如果要将A口的b1位定义成悬浮式并具有唤醒功能的输入口,则只需将_Dir、_Attr和_Data向量中相应的b1位组合设置为010 即可。,例1 设置IOA15IOA12为带数据缓存器的低电平输出口,IOA11IOA8为带数据缓存器的高电平输出口,IOA7IOA4为带上拉电阻的输入口,IOA3IOA0为带下拉电阻的输入口。 解:设置端口功能只需对相关的寄存器进行相应的设置即可。 IOA15IOA12 IOA11IOA8 IOA7IOA4 IOA3IOA0 Dir: 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 FF00H Attr: 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 FF00H Data: 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0FF0H,编程: R1 = 0xFF00 P_IOA_Dir=R1 /设置A口的属性向量 P_IOA_Attrib=R1 /设置A口的属性向量 R1 = 0x0FF0 /设置A口的数据向量 P_IOA_Data=R1 由此可见,SPCE061A端口设置是非常方便灵活的。,2. 睡眠与唤醒 A口的IOA0IOA7作为唤醒源常用于键盘输入,要激活IOA0IOA7唤醒功能,必须读P_IOA_Latch单元,以此来锁存IOA0IOA7管脚上的键状态,随后系统才可通过指令进入低功耗的睡眠状态。当有键按下时,IOA0IOA7的输入状态将不同于其在进入睡眠前被锁存的状态,从而唤醒系统。,3. 端口操作 当作为输入口时,所读的数值来自不同地方,读P_IOA_Data是A口的管脚上的当前状态,读P_IOA_Buffer是来自数据寄存器的值。 当A口作为输出口时,数据都是写到A口的数据寄存器,这种读写方式可以节省许多用于存放端口数据的RAM空间。 注意:如果直接读引脚的数据,有时会发生错误。如用某端口驱动三极管的基极,当引脚输出为1时,三极管导通,引脚的电平比拉到低电平(0.7 V左右),若从引脚直接读取数据,则读为0,发生了错误。此时,从Buffer读寄存器的状态就不会有错误。,例2 在单步运行程序期间将A口的任意管脚接VDD,通过观察寄存器表中的R2、R3的值可观察到P_IOA_Data、P_IOA_Buffer二者的不同。 程序: .include hadware.inc /包含头文件 .code .public _main /主程序 _main: R1=0x0000 /设置A口为带下拉电阻的输入口,P_IOA_Data=r1 /设置A口的数据向量 P_IOA_Attrib=r1 /设置A口的属性向量 P_IOA_Dir=r1 /设置A口的方向向量 /此时将A口的任一端口接高电平/ R3=P_IOA_Data /把P_IOA_Data中的值送到寄存器R3 R2=P_IOA_Buffer/把P_IOA_Buffer中的值送到寄存器R2 WAIT: NOP JMP WAIT /主程序循环,例3 读端口与读Buffer的区别。 _main: R1=0xFFFF /设置B口为带反向器的低电平输出 P_IOB_Dir=R1 P_IOB_Data=R1 R1=0x0000 P_IOB_ Attrib=R1 R1=0x0000 /向寄存器写入0x0000 P_IOB_Data=R1 /此时检测B口的电平为高/ R3=P_IOB_Buffer /读回Buffer的值为0x0000 LOOP: NOP JMP LOOP /主程序循环,例4 设置A口低8位为带上拉电阻的输入口用来输入按键信号,B口低8位为带数据缓存器的高电平输出口,外接发光二极管。当有键按下时,对应的灯点亮,key1按下,B0口LED点亮依此类推。硬件电路如图4.2所示。,图4.2 例4硬件连接图,程序如下: R1=0x0000 P_IOA_Dir=R1 /设置A口的方向向量 P_IOA_Attr=R1 /设置A口的属性向量 P_IOA_Data=R1 /设置A口为下拉输入 R2=0x00FF /R2的值为0x00FF P_IOB_Dir=R2 /设置B口的方向向量 P_IOB_Attr=R2 /设置B口的属性向量 P_IOB_Data=R2 /设置B口低8位为同相输出 /设已经取到键值在keycode单元,判断键值并输出显示的程序/,LOOP7: R2=P_IOA_Data /是第七键按下,IOB6口输出高电平 R2&=0x0040 /确保只有IOB6口输出高电平 P_IOB_Data=R2 JMP _MAIN,4.1.4 B口的特殊功能 1. 特殊功能,表4.2 B口的特殊功能,2. 寄存器设置 (1) 单个IOB2或IOB3口可设置为外部中断输入口。 (2) 设置P_FeedBack单元,再将IOB2(IOB3)和IOB4(IOB5)之间接一个电阻和电容,电路连接如图4.3所示。形成反馈电路以产生振荡信号,此信号可作为外部中断源EXT1 或EXT2输入,当然此时所得到的中断频率为RC振荡器的频率。由于该频率较高,所以通常情况下都是通过(1)获得外部中断信号。此特殊功能仅运用于当外部电路需要用到一定频率的振荡信号时,可以在IOB2(IOB3)端获得。,当P_FeedBack(写)(7009H)单元的FBKEN2(FBKEN3)位被置为“1”时,IOB2、IOB4或IOB3、IOB5之间的反馈结构如表4.3所示。,表4.3 P_FeedBack(7009H)设置,IOB8的控制向量TAON的设置如下: TAON为0:IOB8是普通I/O 端口。 TAON为1:IOB8是APWMO端口。 注意: (1) TAON TimerA脉宽调制输出APWMO的允许信号,详见4.3节。 (2) APWMO TimerA脉宽调制的输出信号,详见4.3节。,例5 以下程序说明如何编程使得通过在IOB2和IOB4之间连接一个RC电路形成反馈回路,以获得振荡源频率。 /将IOB4设置成悬浮式输入口,IOB2设置成反相输出口 R1=0x0004 /R1=0000 0000 0000 0100B P_IOB_Dir=R1 R1=0x0010 P_IOB_Attrib=R1 P_IOB_Data=R1 R1=0x0004 /设定IOB2、IOB4为特殊功能 P_FeedBack=R1,4.2 系统时钟与复位电路,4.2.1 时钟电路 SPCE061A单片机的时钟电路采用外接时钟源方式,推荐使用晶体振荡器,频率采用32 768 Hz。电路如图4.3所示。,图4.3 SPCE061A 时钟电路,4.2.2 锁相环PLL(Phase Lock Loop)振荡器 PLL电路的作用是将系统提供的实时时钟基频(32 768Hz)进行倍频调整至49.152 MHz、40.960 MHz、32.
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号