飞思卡尔16位单片机(三)——GPIO输出功能测试

一、GPIO介绍

        GPIO是单片机最常用的功能,XEP100单片机的并行I/O的资源很丰富,XEP100的IO有PORTA、PORTB、PORTH、PORTJ、PORTM、PORTP、PORTS、PORTT、PORTK和PORTE共10组IO。这些I/O口除了具有通用I/O功能外,还分别具有专用I/O的功能。可以根据需要进行设置,专用I/O功能启用后,通用I/O功能自动关闭。

        在使用单片机的并行I/O时要进行一些设置,主要的设置如下所示:

1功能设置
每个I/O子系统都有一个功能设置寄存器,其中的几个位用于部分或者全部引脚的功能设定,设定为专用功能后,方向设置功能可能自然禁止,但上拉、下拉及降功率驱动功能一般仍然有效,具体取决于I/O子系统的要求。通常复位后,各引脚默认为通用I/O输入功能,具体取决于MCU的工作模式。

2方向设置
当引脚设定为通用I/O后,通过方向寄存器指定引脚的输入/输出,一般复位后默认为输入。设定为输出后,上拉、下拉功能禁止,但降功率驱动功能允许,而设定为输入后,降功率驱动功能禁止,而上拉、下拉功能允许。

3上拉/下拉
输入引脚一般可以设定是否激活上拉/下拉功能,激活后可以保证浮空引脚的输入值固定,对于非浮空引脚有时可以提高响应速度,增强抗干扰能力。

4驱动能力
输出引脚可以选择是否降低驱动功率,如果激活可以使驱动能力降低至约50%,这样可以减小对其他部分的射频辐射干扰,同时降低功率消耗,但可能少量延长过渡时间、降低响应速度,因此必须根据引脚的外部负载情况确定是否采用。

二、蜂鸣器测试

        蜂鸣器分为有源蜂鸣器和无源蜂鸣器两种。有源蜂鸣器中自带震荡电路,而无源蜂鸣器中没有。普通电磁式的有源蜂鸣器由振荡器、电磁线圈、磁铁、振动膜片和外壳等组成,振动膜在电磁线圈和磁铁的相互作用下周期性的振动发声。而无源蜂鸣器中没有振荡器,必须由外部信号来提供震荡。本开发平台上配备的是有源蜂鸣器,只要接通电源,蜂鸣器就可以发声。

        在本实验中,蜂鸣器驱动电路的原理图如下图所示:

        驱动电路采用三极管对蜂鸣器进行驱动,当BUZZ输入高电平时,三极管导通,蜂鸣器响; 当BUZZ输入低电平时,三极管不导通,蜂鸣器不响。

单片机对蜂鸣器的控制引脚为

PORTK5——BUZZ

采用下面的代码对蜂鸣器进行测试,其中INIT_BUZZ();为蜂鸣器的初始化代码,它将蜂鸣器的控制IO设置为输出。

void main(void) {
  DisableInterrupts;   //禁止中断
  INIT_BUZZ();
  EnableInterrupts;    //允许中断
  LEDCPU = 0;

  for(;;) 
  {
   BUZZ = BUZZ_ON;     //蜂鸣器响
   delay();
   BUZZ = BUZZ_OFF;    //蜂鸣器不响
   delay();
  } 
}

这个实验的代码,可以从本文的资源中下载。

       将这个实验的代码烧写到单片机中,并运行,则蜂鸣器会滴滴的响。

三、发光二极管测试

        发光二极管是半导体二极管的一种,可以把电能转化成光能,常简写为LED。发光二极管与普通二极管一样是由一个PN结组成,也具有单向导电性。当给发光二极管加上正向电压时就会发光,光的强弱与工作电流成正比。一般情况下,LED的正向工作电流在10mA左右,如果电流过大就会烧坏LED,因此使用时必须串联限流电阻以控制通过二极管的电流。限流电阻R可用下式计算:

R=(U-UD)/ID

式中U为电源电压,UD为LED的正向压降,ID为LED的一般工作电流。

        普通发光二极管的正向饱和压降为1.6V~2.1V,正向工作电流为5~20mA。发光二极管的特点是:工作电压很低(有的仅一点几伏);工作电流很小(有的仅零点几毫安即可发光);抗冲击和抗震性能好,可靠性高,寿命长;通过调制通过的电流强弱可以方便地调制发光的强弱。由于有这些特点,发光二极管在一些光电控制设备中用作光源,并广泛应用于各种电子电路、家电、仪表等设备中,做电源或电平指示。

        在单片机的应用中,一般一个比较初级的入门实验就是流水灯实验。这个实验我们就来运行一个流水灯程序,实验对应的硬件电路如下图所示。

       上图中,PB0~PB7可以接5V或者悬空,也可以接地。以PB0为例,当PB0接5V或者悬空时,没有电流通过,LED灯的状态是熄灭的;当PB0接地时,两端压差是5V,所以LED灯被点亮。在数字电路中,接+5V为电平“1”,接地为“0”。通常“1”为高电平,“0”为低电平。

       所以在设计中,将LED连接到单片机的I/O口,此时我们只需要控制单片机的I/0口为“1”或者为“0”就可以控制LED灯的亮灭了。

        8个LED与单片机引脚的对应关系如下

PORTB0——LED1

PORTB1——LED2

PORTB2——LED3

PORTB3——LED4

PORTB4——LED5

PORTB5——LED6

PORTB6——LED7

PORTB7——LED8

        实验的主要代码如下所示

void main(void) {
	DisableInterrupts;
  LED_dir=0xff;       //设置为输出
  LED=~data;          //点亮LED1
	EnableInterrupts;


  for(;;) 
  {
      delay();
      data=data<<1;         //左移一位
      if(data==0)
          data=0x01;
      LED = ~data;
  } 
}

在这段代码中data为LED控制的码值,将它取反后赋值给PORTB,就可以对LED进行控制,修改data的值,可以改变LED的点亮情况。

       将上述代码烧写到单片机中,并运行,则发光二极管以流水灯方式闪烁。

这个实验的代码可以从本文的资源中下载

发布了78 篇原创文章 · 获赞 6 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/bhniunan/article/details/104200991