第四掌_STM8单片机的触角—IO口的应用

上传人:hs****ma 文档编号:561677026 上传时间:2023-02-09 格式:DOC 页数:23 大小:370.50KB
返回 下载 相关 举报
第四掌_STM8单片机的触角—IO口的应用_第1页
第1页 / 共23页
第四掌_STM8单片机的触角—IO口的应用_第2页
第2页 / 共23页
第四掌_STM8单片机的触角—IO口的应用_第3页
第3页 / 共23页
第四掌_STM8单片机的触角—IO口的应用_第4页
第4页 / 共23页
第四掌_STM8单片机的触角—IO口的应用_第5页
第5页 / 共23页
点击查看更多>>
资源描述

《第四掌_STM8单片机的触角—IO口的应用》由会员分享,可在线阅读,更多相关《第四掌_STM8单片机的触角—IO口的应用(23页珍藏版)》请在金锄头文库上搜索。

1、1234 STM8单片机的触角I/O口的应用4.1 玩转 I/O口必备的“五器”STM8S208RB单片机的I/O口分布情况如图41所示图41 STM8S208RB管脚分布图从图41中我们可以看到,STM8S208RB共有64个引脚,其中52个通用输入/输出口(GPIO),它们分别是PA1PA6、PB0PB7、PC1PC7、PD0PD7、PE0PE7、PF0、PF3PF7、PG0PG7、PI0。其中,每个端口都有一个输出数据寄存器(ODR),一个输入引脚寄存器(IDR),一个数据方向寄存器(DDR),一个控制寄存器1(CR1),一个控制寄存器2(CR2),这就是STM8单片机I/O的“五器”。

2、“五器”到手了,该如何使用,如表41。配置模式数据方向寄存器DDR控制寄存器1CR1控制寄存器2CR2配置模式输入000悬浮输入010上拉输入001中断悬浮输入011中断上拉输入输出100开漏输出110推挽输出1x1输出(最快速度10MHz)xxx真正的开漏输出(特定引脚)表41 I/O口配置表由表41中看出,当Px_DDRn为“1”,Pxn配置为输出,否则为输入。当配置为输入时,若Px_CR1为“1”,上拉电阻使能,否则为悬浮输入。而Px_CR2为“1”时,开启当前I/O口的外部中断功能,为“0”时关闭外部中断功能。若想读取该I/O引脚上的数据,只需读取相应的Px_IDR寄存器即可。当配置为

3、输出时,若Px_CR1为“1”,Pxn配置为推挽输出,否则为开漏输出。而Px_CR2为“1”时,当前I/O口的最大输出速率为10MHz,否则最大输出速率为2MHz。想要某个I/O口输出高电平,则向Px_ODR中写入0xff,否则写入0x00;注:针对STM8S208RB而言,x为A、B、C、D、E、F、G、I;n为07。下面的例子演示了如何设置PB口低四位为推挽输出,最快速度10MHz,并输出高电平,高四位为上拉输入。unsigned char i;/*设置输出高电平*/PB_ODR = (1 3) | (1 2) | (1 1) | (1 0);/*设置端口方向*/PB_DDR = (1 3

4、) | (1 2) | (1 1) | (1 0);/*设置推挽输出和定义上拉电阻*/PB_CR1 = 0xff;/*设置端口最大速度和关闭中断*/PB_CR2 = (1 3) | (1 2) | (1 1) | (1 0);/*读取端口输入数据*/i = PB_IDR & 0xf0;4.1.1 悬浮与上拉悬浮输入与上拉输入是两种输入方式,不同之处在于上拉输入时,引脚内部有个上拉电阻。当引脚悬空时,上拉输入的引脚电平是确定的,即高电平;而悬浮输入则不同,它的电平时不确定的,即使外部的一个很小的信号都会使其发生改变。上拉输入最典型的应用就是外部按键,当按键未按下时,我们要保证它是高电平,当按键按

5、下时才被拉低;而悬浮输入的典型应用就是模数转换,外部的任何一个小信号都要经过A/D采样转换为数字信号。4.1.2 开漏与推挽1. 开漏输出说开漏输出之前,我们先来看看什么是集电极开路输出。图42 集电极开路集电极开路输出的结构图如图42所示,三极管Q1的集电极就是单片机的I/O口,什么都不接,所以叫做集电极开路。当控制端输入为“0”时,三极管Q2截止,及集电极与发射机之间断开,所以5V电压通过R1接到Q1的基级,Q1导通,即相当于管脚直接接地;当控制端输入“1”时,三极管Q2导通,Q1截止,输出引脚与地之间断开。我们将图42简化为图43所示。图43 集电极开路简化图图43中的开关受软件控制,“

6、1”时断开,“0”时闭合。很明显可以看出,当开关闭合时,输出直接接地,所以输出低电平。而当开关断开时,则输出端悬空,即引脚为高阻态。这时电平状态未知,如果后面一个电阻负载(即使很轻的负载)到地,那么输出端的电平就被这个负载拉到低电平了,所以这个电路是不能输出高电平的。图44 带上拉电阻的开漏输出图44中的10K电阻即是上拉电阻。当开关闭合,输出管脚直接接地,输出为低电平,当开关断开,电流经过10K电阻流入负载,相当于管脚输出高电平。明白了集电极开路,那么开漏输出就简单了,只要把三极管换成场效应管即可,这样,集电极就变成了漏极,而原理分析是一样的。开漏输出有这么几个特点:(1) 利用外部电路的驱

7、动能力,减少IC内部的驱动。当IC内部MOSFET导通时,驱动电流是从外部的VCC流经上拉电阻到负载,IC内部仅需很小的栅极驱动电流。(2) 因为开漏引脚不连接外部的上拉电阻时,只能输出低电平,如果需要同时具备输出高电平的功能,则需要接上拉电阻,很好的一个优点是通过改变上拉电源的电压,便可以改变传输电平。比如加上上拉电阻就可以提供TTL/CMOS电平输出等。(上拉电阻的阻值决定了逻辑电平转换的沿的速度 。阻值越大,速度越低功耗越小,所以负载电阻的选择要兼顾功耗和速度。)(3) 开漏结构提供了灵活的输出方式,但是也有其弱点,就是带来上升沿的延时。因为上升沿是通过外接上拉无源电阻对负载充电,所以当

8、电阻选择小时延时就小,但功耗大;反之延时大功耗小。所以如果对延时有要求,则建议用下降沿输出。(4) 可以将多个开漏输出的引脚连接到一条线上。通过一只上拉电阻,在不增加任何器件的情况下,形成“与逻辑”关系。这也是I2C,SMBus等总线判断总线占用状态的原理。2. 推挽输出我们同样以三极管为例,来看看推挽输出的结构,如图45所示。图45 推挽输出输入端由软件控制,当软件写“1”时,输入高电平,三极管Q1导通,Q2截止;当软件写“0”时,输入低电平,三极管Q1截止,当输出端的电平高于0.7V时,Q2导通。我们可将上面电路图简化为图46所示。图46 推挽输出简化图当软件写“1”时,开关S1闭合,S2

9、断开,VCC连接到引脚上,输出高电平;当软件写“0”时,开关S1断开,S2闭合,引脚接到GND,输出低电平。4.2 LED孤独的闪着在点亮小灯之前我们先来了解一下LED的一些基础知识,图47是普通发光二极管的外形图及电路符号,长脚为阳极。我们其实也可以看二极管里面大片的一侧是阴极,但是也有些黄色LED是相反的。图47 LED硬件结构图48 闪烁LED电路图图48是闪烁LED的电路原理图,PB0口通过一个330电阻连接发光二极管的阴极,即低电平LED亮,高电平灭。程序代码如下。#include stm8s208r.h/*函数声明*/void delay(unsigned int time);/*

10、主函数*/int main(void)PB_DDR |= 0x01; /选择输出模式PB_CR1 |= 0x01; /推挽输出模式PB_CR2 |= 0x00; /低速输出模式while (1)PB_ODR &= 0xfe; / 小灯亮delay(50000); PB_ODR |= 0x01; /小灯灭delay(50000);/*延时子程序*/void delay(unsigned int time)while(time-);问:老大,这个程序不算难,原理我都懂.就是先把IO口的工作方式等都设置好,然后给小灯一个低电平,小灯就亮,然后延时一会,再给小灯一个高电平,小灯就灭,再延时.如此反复,

11、就会有闪烁的效果.但是问题是为什么给管脚赋值的时候要用”与等于”和”或等于”呢?我就是理解不了这个.答:放心,作为老大.我一定不会让你受苦!Relax.Everything is OK.这种赋值方法.无论是“与等于”或者“或等于”,目的都是在改变某一位或者某几位的电平的同时,保持剩余位置的电平不变.因为进行“与”运算的时候.无论1或者0“与”1后得到的结果没有发生改变(还是1或者0).当进行“或”运算的时候,无论1或者0“或”0后得到的结果也没有发生改变(还是1或者0).讲到这里.应该能明白其中的道理了吧?很简单.当你需要对某位置高的时候就“或”1,需要保持原来的电平的位置,则“或”0.当需要

12、对某位置低的时候就“与”0,需要保持就“与”1这就通过程序达到了“位操作”的效果. Come on baby.Go on reading the most important paragraph!1.注意,这里的位操作并不是真正意义的位操作.要注意区分两者的本质区别!2.虽然在本例中不使用这种赋值方法,直接赋值的话对程序不会造成任何影响.但是养成一个好的习惯对以后的进一步学习非常有好处,因为以后程序代码量增加之后,此类这种位操作,经常出现,如果不养成这种习惯,会很难以找出程序中的错误.对调试程序产生极大的影响.既费时又费力.所以极力推荐大家使用这种方法4.3 跑马灯是怎么跑的?4.3.1 应用

13、switch-case语句设计跑马灯大家在前面一节初步的接触了单个IO口寄存器设置及其使用方法,在本节我们来用PB的8个I/O口来进行跑马灯的程序设计。我们简单的回顾一下switch-case的用法。如图49所示,switch相当于开关的拨口,i选择被连端口,case相当于开关的被连端口,当i为某值时,则有且只导通该路case i。跑马灯的电路原理图如图410所示.图49 switch-case示例图图410 跑马灯电路原理图程序代码如下。#includestm8s208r.h / 开始时的头文件包含 /*函数声明*/void delay(unsigned int time); /声明延时函数

14、/*主函数*/Into main(void)unsigned char i = 0;PB_DDR = 0XFF; /设置IO口B为输出PB_CR1 = 0XFF; /设置IO口B为推挽方式 PB_CR1 = 0X00; /输出最快速度为2MHzPB_ODR = 0XFF; /设置输出寄存器的输出数值,初始化小灯全灭 while (1)switch (i) /让小灯从低位到高位依次亮case 0: PB_ODR = 0XFE; Delay(40000); /延时约20mS i+; /让i加1下次执行程序时进入到case 2 break; /跳出case 0,重新到switch处检查i值case 1: PB_ODR = 0XFD; Delay(40000); i+; break;case 2

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号