嵌入式系统GPIO输入输出实验报告.docx

上传人:b****1 文档编号:23013505 上传时间:2023-04-30 格式:DOCX 页数:19 大小:489.23KB
下载 相关 举报
嵌入式系统GPIO输入输出实验报告.docx_第1页
第1页 / 共19页
嵌入式系统GPIO输入输出实验报告.docx_第2页
第2页 / 共19页
嵌入式系统GPIO输入输出实验报告.docx_第3页
第3页 / 共19页
嵌入式系统GPIO输入输出实验报告.docx_第4页
第4页 / 共19页
嵌入式系统GPIO输入输出实验报告.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

嵌入式系统GPIO输入输出实验报告.docx

《嵌入式系统GPIO输入输出实验报告.docx》由会员分享,可在线阅读,更多相关《嵌入式系统GPIO输入输出实验报告.docx(19页珍藏版)》请在冰豆网上搜索。

嵌入式系统GPIO输入输出实验报告.docx

嵌入式系统GPIO输入输出实验报告

实验四GPIO输入实验

一、实验目的

1、能够使用GPIO的输入模式读取开关信号。

2、掌握GPIO相关寄存器的用法和设置。

3、掌握用C语言编写程序控制GPIO。

二、实验环境

PC机一台

ADS1.2集成开发环境一套

EasyARM2131教学实验平台一套

三、实验内容

1.实验通过跳线JP8连接KEY1与P0.16,程序检测按键KEY1的状态,控制蜂鸣器BEEP的鸣叫。

按下KEY1,蜂鸣器鸣叫,松开后停止蜂鸣。

(调通实验后,改为KEY3键进行输入)。

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所示,低电平时灯亮。

图4.3蜂鸣器控制电路

图4.4LED控制电路

程序首先设置管脚连接寄存器PINSEL0和PINSEL1,设置P0.16为输入,设置P0.7,P1.21为输出。

然后检测端口P0.16的电平,对P0.7,P1.21进行相应的控制,流程图如图4.5所示,实现程序见程序清单4.1。

图4.5按键输入实验流程图

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

内容1

实验步骤

①启动ADS1.2IDE集成开发环境,选择ARMExecutableImageforlpc2131工程模板建立一个工程BEEP_key。

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

③选用DebugInFLASH生成目标,然后编译链接工程。

④将EasyARM教学实验开发平台上的相应管脚跳线短接gde台ngthengXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX。

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

⑥全速运行程序,程序将会在main.c的主函数中停止。

如下图所示:

⑦单击ContextVariable图标按钮(或者选择ProcessorViews->Variables)打开变量观察窗口,通过此窗口可以观察局部变量和全局变量。

选择SystemViews->DebuggerInternals即可打开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时,P0.16管脚输出电平由1变为0,寄存器值变化,蜂鸣器响,说明控制是正确的。

现象描述:

按下KEY1,蜂鸣器鸣叫,松开后停止蜂鸣。

源代码:

#include"config.h"

constuint32BEEP=1<<7;//P0.7控制蜂鸣器

constuint32KEY1=1<<16;//P0.16连接KEY1

(改为KEY3时,只需“constuint32KEY1=1<<16”改为“constuint32KEY3=1<<18”,其余不变。

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

**函数名称:

main()

**函数功能:

GPIO输入实验测试。

**检测按键KEY1。

KEY1按下,蜂鸣器蜂鸣,松开后停止蜂鸣。

**跳线说明:

把JP8的KEY1跳线短接,JP11连接蜂鸣器。

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

intmain(void)

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

PINSEL1=0x00000000;

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

while

(1)

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

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

}

return0;

}

 

内容二

实验步骤

①启动ADS1.2IDE集成开发环境,选择ARMExecutableImageforlpc2131工程模板建立一个工程BEEP_key。

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

③选用DebugInFLASH生成目标,然后编译链接工程。

④将EasyARM教学实验开发平台上的相应管脚跳线短接gde台ngthengXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX。

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

⑥全速运行程序,程序将会在main.c的主函数中停止。

如下图所示:

⑦单击ContextVariable图标按钮(或者选择ProcessorViews->Variables)打开变量观察窗口,通过此窗口可以观察局部变量和全局变量。

选择SystemViews->DebuggerInternals即可打开LPC2000系列ARM7微控制器的片内外寄存器窗口。

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

如下图所示:

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

 

图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的控制是对的。

现象描述:

当按下KEY1时,蜂鸣器鸣响,LED4亮;当松开KEY1后,蜂鸣器静音,LED4灭。

源代码如下:

#include"config.h"

constuint32BEEP=1<<7;//P0.7控制蜂鸣器

constuint32KEY1=1<<16;//P0.16连接KEY1

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

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

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

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

**函数名称:

main()

**函数功能:

GPIO输入实验测试。

**检测按键KEY1。

KEY1按下,蜂鸣器蜂鸣,松开后停止蜂鸣。

**跳线说明:

把JP8的KEY1跳线短接,JP11连接蜂鸣器。

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

intmain(void)

{

Uint32i;

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灯灭

}

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

}

return0;

}

 

内容三

实验步骤

①启动ADS1.2IDE集成开发环境,选择ARMExecutableImageforlpc2131工程模板建立一个工程BEEP_key。

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

③选用DebugInFLASH生成目标,然后编译链接工程。

④将EasyARM教学实验开发平台上的相应管脚跳线短接gde台ngthengXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX。

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

⑥全速运行程序,程序将会在main.c的主函数中停止。

如下图所示:

⑦单击ContextVariable图标按钮(或者选择ProcessorViews->Variables)打开变量观察窗口,通过此窗口可以观察局部变量和全局变量。

选择SystemViews->DebuggerInternals即可打开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时,蜂鸣器鸣响,流水灯亮;松开后,蜂鸣器静音,流水灯灭。

 

源代码如下:

#include"config.h"

constuint32BEEP=1<<7;//P0.7控制蜂鸣器

constuint32KEY=1<<16;//P0.16连接KEY1

constuint32LEDS8=0xFF<<18;//P1[25:

18]控制LED8~LED1,低电平点亮

 

voidDelayNS(uint32dly)

{uint32i;

for(;dly>0;dly--)

{

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

}

}

 

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

**函数名称:

liushuideng()

**函数功能:

流水灯显示实验。

**调试说明:

连接跳线JP12至LED8~LED1。

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

/*流水灯花样,低电平点亮,注意调用时候用了取反操作*/

constuint32LED_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//从两边叠加后递减

};

intliushuideng(void)

{uint8i;

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);

}

}

return0;

}

//主函数

 

intmain(void)

{

uint32i;

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++);//软件延时

}

return0;

}

 

六、思考题

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

或者是不确定?

当管脚悬空时,该管脚有可能是高电平也有可能是低电平。

读取IO0PIN的值并不能确定管教的值。

有时管脚是高电平,读取到的不一定是高电平。

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

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

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 工程科技 > 纺织轻工业

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1