嵌入式系统GPIO 输入输出实验报告.docx
- 文档编号:29788817
- 上传时间:2023-07-26
- 格式:DOCX
- 页数:12
- 大小:92.10KB
嵌入式系统GPIO 输入输出实验报告.docx
《嵌入式系统GPIO 输入输出实验报告.docx》由会员分享,可在线阅读,更多相关《嵌入式系统GPIO 输入输出实验报告.docx(12页珍藏版)》请在冰豆网上搜索。
嵌入式系统GPIO输入输出实验报告
实验四GPIO输入实验之五兆芳芳创作
一、实验目的
1、能够使用GPIO的输入模式读取开关信号.
2、掌握GPIO相关存放器的用法和设置.
3、掌握用C语言编写程序控制GPIO.
二、实验情况
PC机一台
ADS1.2集成开发情况一套
EasyARM2131教学实验平台一套
三、实验内容
1.实验通过跳线JP8连接,程序检测按键KEY1的状态,控制蜂鸣器BEEP的鸣叫.按下KEY1,蜂鸣器鸣叫,松开后停止蜂鸣.(调通实验后,改成KEY3键进行输入).
2.当检测到KEY1有按键输入时点亮发光二极管LED4并控制蜂鸣器响,软件延时后关掉发光管并停止蜂鸣,然后循环这一进程直到检测按键没有输入.(键输入改成键KEY4,发光管改成LED6).
3.结合实验三,当按下按键Key1时,启动跑马灯程序并控制蜂鸣器响,软件延时后关掉发光管并停止蜂鸣,然后循环这一进程直到检测按键再次按下.
四、实验原理
当P0口用于GPIO输入时(如按键输入),内部无上拉电阻,需要加上拉电阻,电路图拜见图4.2.
进行GPIO输入实验时,先要设置IODIR使接口线成为输入方法,然后读取IOPIN的值便可.
图4.2按键电路原理图
实验通过跳线JP8连接,程序检测按键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.16的电平,对进行相应的控制,流程图如图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与P,按下Key1时,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存放器的值.可以设置/取消断点;或全速运行程序,停止程序运行,不雅察变量的值,判断蜂鸣器控制是否正确.如下图所示:
.
图未按下KEY1时IO0PIN的值图4.11按下KEY1后IO0PIN的值
对比图4.10和4.11,发明按下KEY1后,IO0PIN存放器的第16位由1变成0;而KEY,当按下时输入低电平,这说明KEY1的控制是正确的.
上图所示为运行“IO0CLR=BEEP”后IO0PIN存放器的值,与图4.10对比,发明第8位由1变成0,BEEP对应P,这说明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存放器的值.可以设置/取消断点;或全速运行程序,停止程序运行,不雅察变量的值,判断蜂鸣器控制是否正确.如下图所示:
1时IO0PIN的值1时IO0PIN的值
由上两图可知,当按下Key1时,IO0PIN存放器的第16位由1变成0(F变成E),key1与P,按下Key1时,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.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式系统GPIO 输入输出实验报告 嵌入式 系统 GPIO 输入输出 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)