您好,欢迎来到微智科技网。
搜索
您的当前位置:首页嵌入式系统GPIO 输入输出实验报告之欧阳化创编

嵌入式系统GPIO 输入输出实验报告之欧阳化创编

来源:微智科技网
欧阳化创编 2021.02.06

实验四

GPIO 输入实验

时间:2021.02.06 创作:欧阳化 一、实验目的

1、能够使用GPIO的输入模式读取开关信号。 2、掌握GPIO相关寄存器的用法和设置。 3、掌握用C语言编写程序控制GPIO。 二、实验环境 PC机 一台

ADS 1.2集成开发环境 一套 EasyARM2131教学实验平台 一套

三、实验内容

1.实验通过跳线 JP8 连接KEY1与P0.16,程序检测按键KEY1 的状态,控制蜂鸣器BEEP 的鸣叫。按下KEY1,蜂鸣器鸣叫,松开后停止蜂鸣。(调通实验后,改为KEY3键进行输入)。

欧阳化创编 2021.02.06

欧阳化创编 2021.02.06

2.当检测到KEY1有按键输入时点亮发光二极管LED4并控制蜂鸣器响,软件延时后关掉发光管并停止蜂鸣,然后循环这一过程直到检测按键没有输入。(键输入改为键KEY4,发光管改为LED6)。

3.结合实验三,当按下按键Key1时,启动跑马灯程序并控制蜂鸣器响,软件延时后关掉发光管并停止蜂鸣,然后循环这一过程直到检测按键再次按下。 四、实验原理

当P0 口用于GPIO输入时(如按键输入),内部无上拉电阻,需要加上拉电阻,电路图参见图 4.2。

进行 GPIO 输入实验时,先要设置IODIR 使接口线成为输入方式,然后读取IOPIN 的值即可。

图 4.2按键电路原理图

实验通过跳线 JP8 连接KEY1_P0.16,程序检测按键KEY1 的状态,控制蜂鸣器BEEP 的鸣叫。按下KEY1,蜂鸣器鸣叫,松开后停止蜂鸣。

在这个实验中,需要将按键KEY1 输入口P0.16 设为输入口而蜂鸣器控制口P0.7 设置为输出口。蜂鸣器电路如图 4.3所示,当跳线JP6 连接蜂鸣器时,P0.7 控制蜂鸣器,低电平时蜂鸣器鸣叫。LED灯电路如图4.4所示,低电平时灯亮。

欧阳化创编 2021.02.06

欧阳化创编 2021.02.06

图 4.3蜂鸣器控制电路 图 4.4 LED 控制电路

程序首先设置管脚连接寄存器PINSEL0 和PINSEL1,设置P0.16 为输入,设置P0.7,P1.21为输出。然后检测端口P0.16 的电平,对P0.7, P1.21进行相应的控制,流程图如图 4.5所示,实现程序见程序清单 4.1。

图 4.5按键输入实验流程图

五、实验步骤、源代码及调试结果

内容1 实验步骤

① 启动ADS1.2IDE集成开发环境,选择ARM Executable

Image for lpc2131工程模板建立一个工程BEEP_key。

② 在user组里编写主程序代码main.c。

③ 选用DebugInFLASH生成目标,然后编译链接工程。 ④ 将EasyARM教学实验开发平台上的相应管脚跳线短接。

⑤ 选择Project->Debug,启动AXD进行JLINK仿真调试。

欧阳化创编 2021.02.06

欧阳化创编 2021.02.06

⑥ 全速运行程序,程序将会在main.c的主函数中停止。如下图所示:

⑦ 单击Context Variable图标按钮(或者选择Processor

Views->Variables)打开变量观察窗口,通过此窗口可以观察局部变量和全局变量。选择System Views->Debugger Internals 即可打开LPC2000系列ARM7微控制器的片内外寄存器窗口。

通过变量窗口可以观察变量BEEP、KEY1等的值和ARM7微控制器的片内外寄存器窗口。如下图所示:

⑧ 可以单步运行程序,先按下Key1,观察IO0PIN寄存器的值,然后断开Key1,观察IO0PIN寄存器的值。可以

设置/取消断点;或者全速运行程序,停止程序运行,观察变量的值,判断蜂鸣器控制是否正确。如下图所示:

图4.6 未按下Key1时IO0PIN

的值 图4.7 按下Key1时IO0PIN的值

由上两图可知,当按下Key1时,IO0PIN寄存器的第16位由1变为0(F变为E),key1与P0.16相连,按下Key1时,

欧阳化创编 2021.02.06

欧阳化创编 2021.02.06

P0.16管脚输出电平由1变为0,寄存器值变化,蜂鸣器响,说明控制是正确的。

现象描述:按下KEY1,蜂鸣器鸣叫,松开后停止蜂鸣。 源代码:

#include \"config.h\"

const uint32 BEEP = 1 << 7; // P0.7 控制蜂鸣器 const uint32 KEY1 = 1 << 16; // P0.16 连接KEY1

(改为KEY3时,只需“const uint32 KEY1 = 1 << 16”改为“const uint32 KEY3 = 1 << 18”,其余不变。)

/******************************************************************************************* ** 函数名称:main()

** 函数功能:GPIO 输入实验测试。

** 检测按键KEY1。KEY1 按下,蜂鸣器蜂鸣,松开后停止蜂鸣。

** 跳线说明:把 JP8 的KEY1 跳线短接,JP11 连接蜂鸣器。 *******************************************************************************************/ int main (void)

{ PINSEL0 = 0x00000000; // 所有管脚连接GPIO

欧阳化创编 2021.02.06

欧阳化创编 2021.02.06

PINSEL1 = 0x00000000;

IO0DIR = BEEP; // 蜂鸣器控制口输出,其余输入 while (1)

{ if ((IO0PIN & KEY1) == 0) IO0CLR = BEEP; // 如果KEY1 按下,蜂鸣器鸣叫

else IO0SET = BEEP; // 松开则停止蜂鸣 }

return 0; }

内容二 实验步骤

① 启动ADS1.2IDE集成开发环境,选择ARM Executable

Image for lpc2131工程模板建立一个工程BEEP_key。

② 在user组里编写主程序代码main.c。

③ 选用DebugInFLASH生成目标,然后编译链接工程。 ④ 将EasyARM教学实验开发平台上的相应管脚跳线短接。

⑤ 选择Project->Debug,启动AXD进行JLINK仿真调试。

欧阳化创编 2021.02.06

欧阳化创编 2021.02.06

⑥ 全速运行程序,程序将会在main.c的主函数中停止。如下图所示:

⑦ 单击Context Variable图标按钮(或者选择Processor Views->Variables)打开变量观察窗口,通过此窗口可以观察局部变量和全局变量。选择System Views->Debugger Internals 即可打开LPC2000系列ARM7微控制器的片内外寄存器窗口。

通过变量窗口可以观察变量BEEP、KEY1等全局变量、i等本地变量和ARM7微控制器的片内外寄存器窗口。如下图所示:

左图所示为ARM7微控制器的片内寄存器窗口。

欧阳化创编 2021.02.06

欧阳化创编 2021.02.06

图4.9 本地变量

图4.8 全局变量

⑧ 可以单步运行程序,先按下Key1,观察IO0PIN寄存器的值,然后断开

Key1,观察IO0PIN寄存器的值。可以设置/取消断点;或者全速运行程序,停止程序运行,观察变量的值,判断蜂鸣器控制是否正确。如下图所示:

.

图4.10 未按下KEY1时IO0PIN的值图4.11 按下KEY1后IO0PIN的值

对比图4.10和4.11,发现按下KEY1后,IO0PIN寄存器的第16位由1变为0;而KEY1对应管脚P0.16,当按下时输入低电平,这说明KEY1的控制是正确的。

上图所示为运行“IO0CLR = BEEP”后IO0PIN寄存器的值,与图4.10对比,发现第8位由1变为0,BEEP对应P0.7管脚,这说明BEEP的控制是对的。 欧阳化创编 2021.02.06

欧阳化创编 2021.02.06

现象描述:当按下KEY1时,蜂鸣器鸣响,LED4亮;当松开

KEY1后,蜂鸣器静音,LED4灭。

源代码如下: #include \"config.h\"

const uint32 BEEP = 1 << 7; // P0.7 控制蜂鸣器 const uint32 KEY1 = 1 << 16; // P0.16 连接KEY1

(改为KEY4按键时,只需把上句代码改为“const uint32 KEY4=1<<19”,其余不变)

const uint32 LEDS4= 1 << 21; // P1[21]控制LED4,低电平点亮

(改为LED6时,只需把上句代码改为“const uint32 LED6=1<<23”,其余不变。)

/***************************************************************************

** 函数名称:main()

** 函数功能:GPIO 输入实验测试。

** 检测按键KEY1。KEY1 按下,蜂鸣器蜂鸣,松开后停止蜂鸣。

** 跳线说明:把 JP8 的KEY1 跳线短接,JP11 连接蜂鸣器。

欧阳化创编 2021.02.06

欧阳化创编 2021.02.06

*******************************************************************************************/ int main (void) {

Uint32 i;

PINSEL0 = 0x00000000; // 所有管脚连接GPIO PINSEL1 = 0x00000000;

IO0DIR = BEEP; // 蜂鸣器控制口输出0 IO1DIR = LEDS4; // 设置LED4灯亮 while (1)

{ if ((IO0PIN & KEY1) == 0)

for(i=0; i<1000; i++); // 软件延时

{

IO0CLR = BEEP; // 如果KEY1 按下,蜂鸣器鸣叫 IO1DCLR = LEDS4; // 设置LED4灯亮 }

else

{

IO0SET = BEEP; // 松开则停止蜂鸣

IO1SET= LEDS4; // 设置LED4灯灭

欧阳化创编 2021.02.06

欧阳化创编 2021.02.06

}

for(i=0; i<1000; i++); // 软件延时 }

return 0; }

内容三 实验步骤

① 启动ADS1.2IDE集成开发环境,选择ARM Executable

Image for lpc2131工程模板建立一个工程BEEP_key。

② 在user组里编写主程序代码main.c。

③ 选用DebugInFLASH生成目标,然后编译链接工程。 ④ 将EasyARM教学实验开发平台上的相应管脚跳线短接。

⑤ 选择Project->Debug,启动AXD进行JLINK仿真调试。

⑥ 全速运行程序,程序将会在main.c的主函数中停止。如下图所示:

⑦ 单击Context Variable图标按钮(或者选择Processor

Views->Variables)打开变量观察窗口,通过此窗口

欧阳化创编 2021.02.06

欧阳化创编 2021.02.06

可以观察局部变量和全局变量。选择System Views->Debugger Internals 即可打开LPC2000系列ARM7微控制器的片内外寄存器窗口。

通过变量窗口可以观察变量BEEP、KEY1等的值和ARM7微控制器的片内外寄存器窗口。如下图所示:

⑧ 可以单步运行程序,先按下Key1,观察IO0PIN寄存器的值,然后断开Key1,观察IO0PIN寄存器的值。可以

设置/取消断点;或者全速运行程序,停止程序运行,观察变量的值,判断蜂鸣器控制是否正确。如下图所示:

图4.12未按下Key1时

IO0PIN的值 图4.13按下Key1时IO0PIN的值

由上两图可知,当按下Key1时,IO0PIN寄存器的第16位由1变为0(F变为E),key1与P0.16相连,按下Key1时,P0.16管脚输出电平由1变为0,寄存器值变化,蜂鸣器响,流水灯亮,说明控制是正确的。

现象描述:当按下按键KEY1时,蜂鸣器鸣响,流水灯亮;松开后,蜂鸣器静音,流水灯灭。 源代码如下:

欧阳化创编 2021.02.06

欧阳化创编 2021.02.06

#include \"config.h\"

const uint32 BEEP = 1 << 7; // P0.7 控制蜂鸣器 const uint32 KEY = 1 << 16; // P0.16 连接KEY1

const uint32 LEDS8 = 0xFF << 18; // P1[25:18]控制LED8~LED1,低电平点亮 void DelayNS(uint32 dly) { uint32 i;

for(; dly>0; dly--) {

for(i=0; i<50000; i++); } }

/******************************************************************************************* ** 函数名称:liushuideng() ** 函数功能:流水灯显示实验。

** 调试说明:连接跳线 JP12 至LED8~LED1。

欧阳化创编 2021.02.06

欧阳化创编 2021.02.06

*******************************************************************************************/

/* 流水灯花样,低电平点亮,注意调用时候用了取反操作 */ const uint32 LED_TBL[] = {

0x00, 0xFF, // 全部熄灭后,再全部点亮

0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, // 依次逐个点亮

0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, 0xFF, // 依次逐个叠加

0xFF, 0x7F, 0x3F, 0x1F, 0x0F, 0x07, 0x03, 0x01, // 依次逐个递减

0x81, 0x42, 0x24, 0x18, 0x18, 0x24, 0x42, 0x81, // 两个靠拢后分开

0x81, 0xC3, 0xE7, 0xFF, 0xFF, 0xE7, 0xC3, 0x81 // 从两边叠加后递减 };

int liushuideng(void)

欧阳化创编 2021.02.06

欧阳化创编 2021.02.06

{ uint8 i;

PINSEL1 = 0x00000000; // 设置管脚连接GPIO IO1DIR = LEDS8; // 设置LED 控制口为输出 while (1) {

for (i=0; i<42; i++) { /* 流水灯花样显示 */

IO1SET = ~((LED_TBL[i]) << 18); DelayNS(20);

IO1CLR = ((LED_TBL[i]) << 18); DelayNS(20); } }

return 0; }

//主函数 int main(void) {

欧阳化创编 2021.02.06

欧阳化创编 2021.02.06

uint32 i;

PINSEL0 = 0x00000000; // 所有管脚连接GPIO PINSEL1 = 0x00000000;

IO0DIR = BEEP; // 蜂鸣器控制口输出0 while (1)

{ if ((IO0PIN & KEY) == 0)

{for(i=0; i<1000; i++); // 软件延时 {

IO0CLR = BEEP; // 如果KEY 按下,蜂鸣器鸣叫 liushuideng(); } } else {

IO0SET = BEEP; // 松开则停止蜂鸣 IO1SET= LEDS8; }

for(i=0; i<100; i++); // 软件延时

欧阳化创编 2021.02.06

欧阳化创编 2021.02.06

}

return 0; }

六、思考题

1、如果将P0.30设置为GPIO输入模式,且管脚悬空,那么读取P0.30得到的值是0还是1?或者是不确定?

当管脚悬空时,该管脚有可能是高电平也有可能是低电平。读取IO0PIN的值并不能确定管教的值。有时管脚是高电平,读取到的不一定是高电平。

2、如果需要读取当前P0.7的输出值(不是管脚上的电平),如何实现?

将该管脚与一个LED连接,若LED亮,则输出值为0,否则为1.

时间:2021.02.06 创作:欧阳化 欧阳化创编 2021.02.06

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- 7swz.com 版权所有 赣ICP备2024042798号-8

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务