欢迎来到专业的新思文库网平台! 工作计划 工作总结 心得体会 事迹材料 述职报告 疫情防控 思想汇报 党课下载
当前位置:首页 > 范文大全 > 公文范文 > 正文

gpio输出控制实验报告9篇

时间:2022-09-30 17:15:38 来源:网友投稿

gpio输出控制实验报告9篇gpio输出控制实验报告 实验一STM32的GPIO控制一、实验目的1、学习并掌握STM32系列芯片的基本外设,熟悉嵌入式实验开发系统; 2、熟悉STM32GP下面是小编为大家整理的gpio输出控制实验报告9篇,供大家参考。

gpio输出控制实验报告9篇

篇一:gpio输出控制实验报告

验一 STM32 的 GPIO 控制 一、 实验目的 1、 学习并掌握 STM32 系列芯片的基本外设, 熟悉嵌入式实验开发系统;

 2、 熟悉 STM32 GPIO 的工作原理, 并掌握 LED 和按键的控制方法;

 3、 掌握 IAR 软件开发平台, 在此平台上完成本软件编程、 调试、 下载等工作。

 二、 实验仪器 1、 嵌入式实验开发系统一套;

 2、 XXX JTAG 仿真器一台;

 3、 安装有 IAR 软件的 PC 机一台。

 三、 实验要求 按键控制LED的亮灭:

 用轮询方式检测KEY1-8按键, 并控制相应序号的LED的亮灭。(例:

 第一次按下KEY1, 则LED1点亮; 第二次按下KEY1, 则LED1灭。

 以此类推。

 )

 四、 实验原理 根据数据手册中列出的每个I/O端口的特定硬件特征, GPIO端口的每个位可以由软件分别配置成多种模式。

 ─ 输入浮空 ─ 输入上拉 ─ 输入下拉 ─ 模拟输入 ─ 开漏输出 ─ 推挽式输出 ─ 推挽式复用功能 ─ 开漏复用功能

  图 1

 LED 管脚连接 管脚连接图如上, 从电路图中可以看到, LED是高电平驱动的, 因此对应的GPIO管脚输出“1”

 , LED亮, 输出“0”, LED灭。

 配置GPIO时, 将LED对应管脚配置为推挽输出模式。

  图 2

 按键开关管脚连接 按键开关管脚连接图如上, 从原理图中可以看出, 按下按键, 对应的KEY1-8得到低电平, 未按下的键得到高电平。

 配置GPIO时, 将按键对应管脚配置为输入上拉模式。

 应有防抖程序(代码短小)。

 五、 实验步骤 1、 打开工程:

 打开Stm32_GPIO文件夹—project文件夹—gprs工程。

  2、 配置GPIO:

 打开项目src目录下的BoardInit.c文件, 在GPIO_config函数中添加GPIO配置相关代码。

 3、 编写应用程序:

 在main.c文件编写用户程序, 实现实验要求中的内容。

 4、 编译下载调试:

 代码编写完成后编译并修改, 编译通过后连接硬件下载调试。

  5、 观察试验结果, 并记录试验结果。

 6、 撰写试验报告。

 需要更改的文件:

 boardinit.H, boardinit.C, main.C, main.H

 附录:

 在BoardInit.h文件中添加管脚定义, 代码如下:

 //LED相关 #define LED1

  GPIO_Pin_5 #define LED2

 GPIO_Pin_6 #define LED3

 GPIO_Pin_7 #define LED4

 GPIO_Pin_8 #define LED5

 GPIO_Pin_9 #define LED6

 GPIO_Pin_10 #define LED_1_6_GRP

  GPIOF

 #define LED7

 GPIO_Pin_6 #define LED8

 GPIO_Pin_7 #define LED_7_8_GRP

  GPIOA

 //KEY相关 #define KEY1

  GPIO_Pin_4 #define KEY2

 GPIO_Pin_3 #define KEY3

 GPIO_Pin_2 #define KEY4

 GPIO_Pin_1 #define KEY5

 GPIO_Pin_0 #define KEY_1_5_GRP

 GPIOF

 #define KEY6

 GPIO_Pin_6 #define KEY7

 GPIO_Pin_5 #define KEY8

 GPIO_Pin_4 #define KEY_6_8_GRP

 GPIOE

 BoardInit.c文件的GPIO_config函数中编写管脚配置, 代码如下:

 void GPIO_config() {

  GPIO_InitTypeDef GPIO_InitStructure;

 GPIO_InitStructure.GPIO_Pin = LED1 | LED2 | LED3 | LED4 | LED5 | LED6;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_Init(LED_1_6_GRP, &GPIO_InitStructure);

  GPIO_InitStructure.GPIO_Pin = LED7 | LED8 ;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_Init(LED_7_8_GRP, &GPIO_InitStructure);

  GPIO_InitStructure.GPIO_Pin = KEY1 | KEY2 | KEY3 | KEY4 | KEY5;

 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;

  GPIO_Init(KEY_1_5_GRP, &GPIO_InitStructure);

 GPIO_InitStructure.GPIO_Pin = KEY6 | KEY7 | KEY8;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;

  GPIO_Init(KEY_6_8_GRP, &GPIO_InitStructure); }

 Main.c文件中代码如下:

 /******************************************************************************* 函 数 名 :

 void main(void) * 描

 述 : main * 输入参数 : None. * 输出参数 : None. * 返

  回

 : None. ******************************************************************************/ void main(void) {

 /****************变量定义***************/

  u32 count1=0;

  u32 count2=0;

  u32 count3=0;

  u32 count4=0;

  u32 count5=0;

  u32 count6=0;

  u32 count7=0;

  u32 count8=0;

 /****************目标板初化*************/

  Target_Init();

  /****************主循环*****************/

  while(1)

  {

  if(GPIO_ReadInputDataBit(KEY_1_5_GRP, KEY1)==0)

  {

  delay_nus(5000);

  if(GPIO_ReadInputDataBit(KEY_1_5_GRP, KEY1)==0)

  {

  count1++;

  led_control(count1, LED_1_6_GRP, LED1 );

  }

 }

 if(GPIO_ReadInputDataBit(KEY_1_5_GRP, KEY2)==0)

  {

  delay_nus(5000);

  if(GPIO_ReadInputDataBit(KEY_1_5_GRP, KEY2)==0)

  {

  count2++;

  led_control(count2, LED_1_6_GRP, LED2 );

  }

 }

 if(GPIO_ReadInputDataBit(KEY_1_5_GRP, KEY3)==0)

  {

  delay_nus(5000);

  if(GPIO_ReadInputDataBit(KEY_1_5_GRP, KEY3)==0)

  {

  count3++;

  led_control(count3, LED_1_6_GRP, LED3 );

  }

 }

 if(GPIO_ReadInputDataBit(KEY_1_5_GRP, KEY4)==0)

  {

  delay_nus(5000);

  if(GPIO_ReadInputDataBit(KEY_1_5_GRP, KEY4)==0)

  {

  count4++;

  led_control(count4, LED_1_6_GRP, LED4 );

  }

 }

 if(GPIO_ReadInputDataBit(KEY_1_5_GRP, KEY5)==0)

  {

  delay_nus(5000);

  if(GPIO_ReadInputDataBit(KEY_1_5_GRP, KEY5)==0)

  {

  count5++;

  led_control(count5, LED_1_6_GRP, LED5 );

  }

 }

 if(GPIO_ReadInputDataBit(KEY_6_8_GRP, KEY6)==0)

  {

  delay_nus(5000);

  if(GPIO_ReadInputDataBit(KEY_6_8_GRP, KEY6)==0)

  {

  count6++;

  led_control(count6, LED_1_6_GRP, LED6 );

  }

 }

 if(GPIO_ReadInputDataBit(KEY_6_8_GRP, KEY7)==0)

  {

  delay_nus(5000);

  if(GPIO_ReadInputDataBit(KEY_6_8_GRP, KEY7)==0)

  {

  count7++;

  led_control(count7, LED_7_8_GRP, LED7 );

  }

 }

 if(GPIO_ReadInputDataBit(KEY_6_8_GRP, KEY8)==0)

  {

 delay_nus(5000);

  if(GPIO_ReadInputDataBit(KEY_6_8_GRP, KEY8)==0)

  {

  count8++;

  led_control(count8, LED_7_8_GRP, LED8 );

  }

 }

 }

 } /******************************************************************* 函数名称:

 void led_control(u32 count) 函数功能:

 led亮灭控制函数 输入参数:

 时长us 函数说明:

 经过示波器测试单独运行此函数其周期为1us 若改为i--,则i=7时约为1us *******************************************************************/ void led_control(u32 count, GPIO_TypeDef* led_crp, u16 led_pin ) {

 if(count%2)

  {

  GPIO_SetBits(led_crp, led_pin);

  }

 else

 {

  GPIO_ResetBits(led_crp, led_pin);

  }

 }

 在main.h文件中添加led_control函数的申明, 代码如下:

 void led_control(u32 count, GPIO_TypeDef* led_crp, u16 led_pin );

篇二:gpio输出控制实验报告

/p>

  院

 系:计算机科学学院

  专

 业:

  自动化

 年

 级:

 11 级

  学

 号:

 11064029

  姓

 名:

  杨胜提

 指导教师:

  刘科

 2013 年

 5 月

 8 日

 2 年级

 11 级 班级

 11 级自动化 一班

 学号

 11064029 专业 自动化

 姓名

 杨胜提 题目名称 实验一、GPIO 实验

 实验设计要求

  控制 EduKit-M3 实验平台的发光二极管 LED1、LED2、LED3、LED4,使它们有规律的点亮,具体顺序如下:

 LED1 亮->LED2 亮->LED3 亮->LED4 亮,如此反复,当按下 EduKit-M3 实验平台上的 Key 按钮时,灯全部熄灭, 2 秒钟后发光二极管全部点亮,再过一秒钟后返回被中断前的状态,有规律的依次点亮。

 实 验 设 计 思 路

 1、 硬件电路设计

 在 EduKit-M3 实验平台上,LED1、LED2、LED3、LED4 分别与 PC6、PC7、PC8、PC9 相连,按键 Key 与 PB9 相连。

  2、软件程序设计 (1) 配置 PB 口第 9 个引脚作为外部中断,下降延触发;

  (2) 读取端口数据输出寄存器 GPIOC_ODR[15:0]的值,因为 C 口[9:6]位和四个LED 灯连通。

  (3) 初始化时,LED 依次点亮,当按下 Key 键时产生中断;

 (4) 中断服务子程序内容:灯全部熄灭,2 秒钟后发光二极管全部点亮,再过 1秒钟后中断返回。整个工程包含 3 个源文件:STM32F10x.s、stm32f10x_it.c 和 main.c,其中 STM32F10x.s 为启动代码,所有中断服务子程序均在 stm32f10x_it.c 中,其它函数则在 main.c 中。

 3 实 验 步 骤 与 结 果 分 析

 运行过程

  (1) 使用 Keil uVision3 通过 ULINK 2 仿真器连接 EduKit-M3 实验平台,打开实验例程目录 GPIO_TEST 子目录下的 GPIO.Uv2 例程,编译链接工程;

  (2) 选择软件调试模式,点击 MDK 的 Debug 菜单,选择 Start/Stop Debug Session项或 Ctrl+F5 键, 在逻辑分析仪中添加 GPIOC_ODR.6、GPIOC_ODR.7、GPIOC_ODR.8、GPIOC_ODR.9,点击 Run 按钮即可在 逻辑分析仪中看到如图 7-11;

  (3) 选择硬件调试模式,选择 Start/Stop Debug Session 项或 Ctrl+F5 键,下载程序并运行,观察 LED 灯的变化情况;当程序运行在 while 循环体内时,按 Key 键,程序进入中断服务子程序 EXTI9_5_IRQHandler(), 单步运行,观察 LED 的变化情况。

 (4) 退出 Debug 模式,打开 Flash 菜单>Download,将程序下载到 EduKit-M3 实验平台的 Flash 中,按 RESET 键复位, 观察 LED 灯的情况,正常情况应如下。

 LED 灯状态 1

 说

 明 LED1 LED2 LED3

 LED4

 亮

 灭

 灭

 灭

  程序正常运行,发光二极管依次点亮 灭

 亮

 灭

 灭

 灭

 灭

 亮

 灭

 灭

 灭

 灭

 亮

 灭

 灭

 灭

 灭

  外部信号输入,发生中断,执行中断处理程序 亮

 亮

 亮

 亮

  LED 灯状态 2

  说

 明 LED1 LED2 LED3

 LED4

 亮

 灭

 灭

 灭

  程序正常运行,发光二极管依次点亮 亮

 亮

 灭

 灭

 亮

 亮

 亮

 灭

 亮

 亮

 亮

  亮

 灭

 灭

 灭

 灭

  外部信号输入,发生中断,执行中断处理程序 亮

 亮

 亮

 亮

 4

 主 要 程 序 代 码 分 析

  软件程序设计

 1、配置 PB 口第 9 个引脚作为外部中断,下降延触发;

  /* Configure PB9 as input floating (EXTI Line9) */

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;

  //引脚选择

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//输入模式选择 GPIO_Init(GPIOB, &GPIO_InitStructure);

  2、读取端口数据输出寄存器 GPIOC_ODR[15:0]的值,因为 C 口[9:6]位和四个 LED 灯连通。

  方法一:

  /* Configure PC. as Output push-pull */

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;

 //与 LED 灯连通的引脚选择

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  //设置输出引脚的速度

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

  // 设置输出引脚的模式为推挽输出模式

  GPIO_Init(GPIOC, &GPIO_InitStructure); 方法二:

  利用端口配置低寄存器(GPIOx-CRL)(x=A..E)和端口配置高寄存器(GPIOx-CRH)(x=A..E)

  GPIOC_CRL=0xcc444444 ;

  GPIOC_CRH=0x444444cc ;

 3、初始化时,LED 依次点亮,当按下 Key 键时产生中断; /* Configure EXTI Line9 to generate an interrupt on falling edge */

  EXTI_InitStructure.EXTI_Line = EXTI_Line9;

  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;

  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;

 5

  EXTI_InitStructure.EXTI_LineCmd = ENABLE;

  EXTI_Init(&EXTI_InitStructure); 4、LED 依次点亮的子程序

 for(;;)

 {

  GPIO_ResetBits(GPIOC,GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9);

 GPIO_SetBits(GPIOC,GPIO_Pin_6); 算法 1

 GPIOC->ODR&= 0xfffffc4f;

 //1

 高 16 位保留,全为 F,底 16 位相应置高或置底

 /*Delay(800);

 GPIOC->ODR&= 0xfffffc0f;

  GPIOC->ODR|= 0x00000cc0;

  //2

  Delay(800);

 GPIOC->ODR&= 0xfffffc0f;

 GPIOC->ODR|= 0x00000dc0;

 //3

 Delay(800);

  GPIOC->ODR&= 0xfffffc0f;

 GPIOC->ODR|= 0x00000fc0;

  //4

 Delay(800);

 算法 2

  GPIO_ResetBits(GPIOC,GPIO_Pin_6);//使 Pin_6 置低

  Delay(800);

 GPIO_SetBits(GPIOC,GPIO_Pin_6);//使 Pin_6 置高

  Delay(100);

  GPIO_ResetBits(GPIOC,GPIO_Pin_7);

 Delay(800);

  GPIO_SetBits(GPIOC,GPIO_Pin_7);

  Delay(100);

  GPIO_ResetBits(GPIOC,GPIO_Pin_8);

 Delay(800);

  GPIO_SetBits(GPIOC,GPIO_Pin_8);

  Delay(100);

  GPIO_ResetBits(GPIOC,GPIO_Pin_9);

 Delay(800);

 6

  GPIO_SetBits(GPIOC,GPIO_Pin_9);

  Delay(100);

 }

  //

 使用这两个函数对引脚进行配置。

  (写不完时,可调整表结构。)

 7 心 得 体 会

 (这部分内容要手写)

 成 绩 评 定

  教师签名:

  年

  月

  日

篇三:gpio输出控制实验报告

科技大学《微控制器原理》实验指导书

  STM32F103-GPIO 基本输入输出实验 1实验 01 STM32F103-GPIO 基本输入输出实验

 实验 01 STM32F103-GPIO 基本输入输出实验

 一、实验目的

 学习 STM32F103VCT6 单片机的通用 GPIO 的基本输出输入功能,主要了解 STM32 的GPIO 的原理和应用。

 二、实验设备 1) 装有 RV MDK 仿真软件的 Pentium 以上的计算机一套; 2) J-Link-ARM V8 仿真器一套; 3) STM32F103VCT 的神舟 II 号开发板一套。

 三、实验电路原理图及其说明 在神州Ⅱ号 STM32 开发板中,一共有 5 个 LED 指示灯,其中一个是电源指示灯LD5,其他的 4 个 LED (LD1、LD2、LD3 和 LD4)由 GPIO-PD 控制,4 个 LED 分别串了 470KΩ的电阻,起限流作用防止电流过大损坏 LED 和 GPIO 口。电路原理图如图 1 所示。

  图 1 STM32F103GPIO-LED 电路原理图图 当 GPIO 管脚输出高电平时,对应的 LED 灯亮;当 GPIO 管脚输出低电平时对应的LED 灯灭。GPIO 管脚与对应的 LED 灯的关系如下表所示:

 LED 灯 LED 灯对应的 GPIO LD1 PD08 LD2 PD09 LD3 PD10 LD4 PD11 蜂鸣器 DEEP PC8

 山东科技大学《微控制器原理》实验指导书

  STM32F103-GPIO 基本输入输出实验 2

 图 2 按键 KEY 硬件电路 GPIO 管脚与按键对应的关系 按键 GPIO 说明 确定 OK PD3 下拉电阻 上 UP PD4 下拉电阻 下 DOWN PA8 下拉电阻 左 LEFT PD0 下拉电阻 右 RIGHT PD1 下拉电阻 用户自定义 User PD2 上拉电阻 干预 Tamper PC13 上拉电阻 唤醒 Wakeup PA0 下拉电阻 四、实验内容 1. 使用单步运行实现 LD1、LD2、LD3、LD4 点亮和熄灭。

 2. 使用软件延时 1s 实现这四个灯交替闪烁的流水灯效果。

 3. 按下 UP、DOWN、LEFT、RIGHT 键分别让对应的 LD1、LD2、LD3、LD4 指示灯亮。

 4. 按下 LEFT 键让 LD1→LD2→LD3→LD4 自左向右流水显示;按下 RIGHT 键分别让LD4→LD3→LD2→LD1 自右向左流水显示。

 5. 按下 UP 键让 LD1→LD2→LD3→LD4 自左向右流水循环显示;按下 DOWN 键分别让LD4→LD3→LD2→LD1 自右向左流水循环显示。

 五、实验原理 流水灯的关键实际上就是如何控制 STM32 处理器的 GPIO 接口,作为 IO 口,输出指定的电平信号。

 STM32 的 IO 口可以由软件配置成 8 种模式:模拟输入、输入悬空、输入下拉、输入

 山东科技大学《微控制器原理》实验指导书

  STM32F103-GPIO 基本输入输出实验 3上拉、开漏输出、推挽输出、复用功能开漏输出和复用功能推挽输出等。STM32 每个 IO口可以自由编程,单 IO 口寄存器必须要按 32 位字被访问。STM32 的很多 IO 口都是 5V兼容的,这些 IO 口在与 5V 电平的外设连接的时候很有优势。

 STM32 的每个 IO 端口都有 7 个寄存器来控制:配置模式的 2 个 32 位的端口配置寄存器 CRL 和 CRH、2 个 32 位的数据寄存器 IDR 和 ODR、1 个 32 位的置位/复位寄存器 BSRR、一个 32 位的复位寄存器 BRR、1 个 32 位的锁存寄存器 LCKR 等。

 GPIO_CR 控制着每个 IO 口的模式及输出速率,STM32 的 IO 口位配置表如下表所示。

 配置模式 CNF1 CNF0 MODE1 MODE0 PxODR 寄存器 通用输出 推挽式 Push-Pull 0 0 01 10 11 见表 3.1.2 0 或 1 开漏 Open-Drain 1 0 或 1 复 用 功 能输出 推挽式 Push-Pull 1 0 不使用 开漏 Open-Drain 1 不使用 输入 模拟输入 0 0 00 不使用 浮空输入 1 不使用 下拉输入 1 0 0 上拉输入 1 STM32 输出模式配置如下表所示:

 MODE[1:0] 意义 00 保留 01 最大输出速度为 10MHz 10 最大输出速度为 2MHz 11 最大输出速度为 50MHz 六、实验现象 把程序下载到神州Ⅱ号 STM32 开发板后,可以根据实验设计看到四个 LED(LD1-4)单独或者轮流闪亮,实现流水灯的效果。

  七、实验报告书写要求 说明:七、实验报告书写要求 说明:

 实验报告均按以下格式书写

  1) 绘制程序流程图。

 2) 写出程序清单。

 3) 给出实验中用到的数据和实验结果。

 4) 通过实验,分析你的收获、不足、问题。

 山东科技大学《微控制器原理》实验指导书

  STM32F103-GPIO 基本输入输出实验 4八、参考程序 /* Includes ------------------------------------------------------------------*/ #include "stm32f10x.h" /* Private define ------------------------------------------------------------*/ #define RCC_GPIO_LED

 RCC_APB2Periph_GPIOD /*LED 使用的 GPIO 时钟*/ #define LEDn

 4

  /*神舟 II 号 LED 数量*/ #define GPIO_LED

  GPIOD

 /*LED 使用的 GPIO 组*/ #define LD1_PIN

  GPIO_Pin_8

  /*LD1 使用的 GPIO 管脚*/ #define LD2_PIN

  GPIO_Pin_9

 /*LD2 使用的 GPIO 管脚*/ #define LD3_PIN

  GPIO_Pin_10

  /*LD3 使用的 GPIO 管脚*/ #define LD4_PIN

  GPIO_Pin_11

 /*LD4 使用的 GPIO 管脚*/ /* Private variables ---------------------------------------------------------*/ u8 count=0; /* Private function prototypes -----------------------------------------------*/ void Delay(vu32 nCount); void Turn_On_LED(u8 LED_NUM); /* Private functions ---------------------------------------------------------*/ int main(void) { GPIO_InitTypeDef

 GPIO_InitStructure;

  //定义结构体变量

 /* 配置神舟 II 号 LED 灯使用的 GPIO 管脚模式*/

 RCC_APB2PeriphClockCmd(RCC_GPIO_LED, ENABLE); /*使能 LED 使用的 GPIO 时钟*/

 GPIO_InitStructure.GPIO_Pin = LD1_PIN|LD2_PIN|LD3_PIN|LD4_PIN;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

 GPIO_Init(GPIO_LED, &GPIO_InitStructure);

 /*LED 灯相关的 GPIO 口初始化*/

 GPIO_ResetBits(GPIO_LED,LD1_PIN|LD2_PIN|LD3_PIN|LD4_PIN);/*关闭所有 LED 灯*/

  while(1)

  {

 GPIO_ResetBits(GPIO_LED,LD1_PIN|LD2_PIN|LD3_PIN|LD4_PIN);/*关闭所有 LED 灯*/

  Turn_On_LED(count%4);

  //点亮一个 LED 灯

  count++;

  Delay(0x2FFFFF);

  } } /*点亮对应灯*/ void Turn_On_LED(u8 LED_NUM) {

 switch(LED_NUM)

 {

  case 0: GPIO_SetBits(GPIO_LED,LD1_PIN); break; /*点亮 LD1 灯*/

  case 1: GPIO_SetBits(GPIO_LED,LD2_PIN); break; /*点亮 LD2 灯*/

  case 2: GPIO_SetBits(GPIO_LED,LD3_PIN); break; /*点亮 LD3 灯*/

 山东科技大学《微控制器原理》实验指导书

  STM32F103-GPIO 基本输入输出实验 5

 case 3: GPIO_SetBits(GPIO_LED,LD4_PIN); break; /*点亮 LD4 灯*/

  default:

  GPIO_SetBits(GPIO_LED,LD1_PIN|LD2_PIN|LD3_PIN|LD4_PIN); break;/*点亮所有灯*/

 } } /******************************************************************************* * Function Name

 : Delay * Description

 : Inserts a delay time. * Input

 : nCount: specifies the delay time length. * Output

  : None * Return

  : None *******************************************************************************/ void Delay(vu32 nCount) {

  for(; nCount != 0; nCount--); } /******************* (C) COPYRIGHT 2008 STMicroelectronics *****END OF FILE****/ 说明:

 1) 为了降低STM32处理器的功耗,可以依据实际的需求,选择合适的时钟速率,GPIO口支持的最大时钟速率越低,它产生的功耗也越低。

 2) 在使用一个 GPIO 之前,一般需要对 GPIO 管脚的时钟、GPIO 管脚模式以及速率进行设定。

篇四:gpio输出控制实验报告

IO 实验 【实验内容】

 1、 LED 闪烁

  2、 LED 流水灯

  3、 继电器控制 【需要了解的知识】

 1、 GPIO 设定

  2、 输入与输出及其处理 【实验预习】

 仔细预读实验指导电子文档的实验一到三及其前面的实验流程 【实验设备】

  Keil C51 软件、 ICE52 仿真驱动、 MEFlash 编程软件、 USB 驱动程序

 【实验过程】

 实验一

 LED 闪烁 实验任务:

  1)

 P0、 P2 端口的 LED 亮 300ms, 灭 300ms, 如此循环

 2)

 发光二极管在不停地一亮一灭, 时间间隔为 300ms, 形成闪烁效果 实验步骤:

  1)

 首先安装好相应的软件和驱动程序

 2)

 连接好 ME850:

 将随机 USB 线的扁头端连接至计算机的 USB 接口, 方头端连接到 ME850 的 USB 插座上

 3)

 将电源开关 SW1 拨到 USB 端, 电源指示灯“PWR” 亮, 表明已经正常接通电源可以做实验了

  4)

 将 JP1(MCU 类型选择跳线, 位于锁紧插座的手柄旁边)

 的跳线帽短接在“51” 的位置, JP9 的跳线帽全部插上;

  5)

 将 AT89S52 单片机芯片放入 ME850 的锁紧插座

 6)

 驱动 MEFlash 软件, 正常打开后软件右下角会显示实验仪的型号和连接状态

 7)

 在软件中点击“器件” 按钮, 选择型号“AT89S52”

  8)

 在软件中点击“加载” 按钮, 定位到产品光盘Emamples_A51\EX1_LED\LED. hex, 点击“打开” , 弹出“加载文件” 对话框, 按默认点击确定即可

 9)

 在软件中点击“擦除” 按钮, 再点击“编程” 按钮, 编辑完毕, 即可看到 16 个发光二极管都在闪烁了 汇编源程序:

  ORG

  0000H

  ; 初始地址为 0000H

  AJMP

 MAIN

  ; 跳转到 MAIN

 ORG

  0050H

  ; 初始地址为 0050H MAIN:

 MOV

 P0, #OFFH

  ; 初始化 P0

 MOV

 P2, #OFFH

  ; 初始化 P2 LOOP:

 MOV

  P0, #O0H

  ; 为 P0 赋值 0

 MOV

  P2, #OOH

  ; 为 P2 赋值 0

 ACALL

  DELAY

  ; 调用子程序 DELAY

 MOV

 P0, #OFFH

  ; 为 P0 赋值

 MOV

 P2, #OFFH

  ; 为 P2 赋值

 ACALL

 DELAY

 ; 调用子程序 DELAY

 AJMP

  LOOP

  ; 跳转到 LOOP DELAY:

  MOV

  R5, #3

  ; 将 3 赋给寄存器 R5 DEL1:

  MOV

  R6, #200

  ; 将 200 赋给寄存器 R6

 DEL2:

  MOV

 R7, #230

 ; 将 230 赋给寄存器 R7 DEL3:

  DJNZ

  R7 , DEL3

 ; 第一层循环

 DJNZ

  R6, DEL2

 ; 第二层循环

 DJNZ

  R5, DEL1

 ; 第三层循环

  RET

 ; 返回

 END

 ; 结束 试验流程图:

  实验结果:

  1)

 P0、 P2 端口的 LED 亮 300ms, 灭 300ms, 如此循环

 2)

 发光二极管在不停地一亮一灭, 时间间隔为 300ms, 形成闪烁效果 P0、 P2 端口初始化P0、 P2 端口送低电平所有 LED 点亮 延时 300ms P0、 P2 端口送高电平所有 LED 熄灭 延时 300ms

 问题解决及讨论:

  1)

 JP24 没有切换到“OFF” 端, 结果 P0 口的 8 个 LED 不闪烁。

 原因是被1602LED 干扰

 2)

 没有正确加载烧写文件。

 必须是先选芯片在加载文件

 3)

 芯片型号没有选择正确。

 可重新选择型号

 4)

 没有放置芯片。

 先放芯片, 再压下锁紧座手柄锁紧

 5)

 芯片损坏。

 换新的芯片重试 实验二

 流水灯 实验任务:

 P0、 P2 端口的 LED 先从从右至左方向依次点亮, 再从左至右方向依次点亮, 如此循环形成流水灯效果 实验步骤:

 1、 首先在硬盘上建立一个文件夹;

 2、 启动 Keil C51 软件;

 3、 执行 Keil C51 软件的菜单“Project| New Project……” , 弹出一个名为“Create New Project” 的对话框。

 输入工程文件名, 选择保存路径 uv2 后缀,点击“保存” 按钮;

 4、 紧接着弹出“Options for Target‘Target 1’”, 为刚才的项目选择 ATMEL的 AT89S52 的 CPU。

 选择之后, 点击“确定” 按钮;

 5、 接下来弹出一个对话框提示你是否要把标准 8051 的启动代码添加项目中去, 此时, 点击“否” 按钮;

 6、 执行 菜单“File| New……”, 出现一个名为“Text1” 的文档。

 接着执行菜单“File| Save” 弹出一个名为“Save As” 的对话框, 将文件名改为“. asm”后缀, 然后保存;

 7、 添加源程序文件到工程中, 一个空的源程序文件建成。

 单击 Keil C51 软件左边项目工作窗口“Target1” 上的“+”, 将其展开。

 然后右击 “Source Group1”文件夹弹出下拉菜单, 单击其中的“Add Files to Group‘Source Group1’” 项;

 8 、在 弹 出 的 对 话 框 中 先 选 择 文 件 类 型 为 “ Asm Source file(*. s*; *. src; *. a*)” , 这时对话框内创建的空的源程序文件已经出现在项目工作窗口的“Source Group1” 文件夹中;

 输入源程序代码;

 9、 点击工具栏“Options for target” 按钮, 弹出一个对话框, 定义“Xtal”为 11. 0592. 下面依序是存储模式、 程序空间大小等设置, 均用默认值即可。

 点击 Output 选项, 选中“Create Hex File”,

 10、 单击编译按钮, 编译当前源程序;

 11、 运行, 查看效果。

 汇编源程序:

 ORG

  0000H

  ; 初始化地址

 AJMP

  MAIN

  ; 跳转到 MAIN

 ORG

 0050H

 ; 初始化地址 MAIN:

  MOV

 P0, #0FFH

  ; 端口初始化

  MOV

  P2, #0FFH

  ; 端口初始化 LOOP:

  MOV

 A, #0FEH

  ; 复制初始

  MOV

 R0, #08H

  ; 移动次数 LOOPL:

 ; 左移显示

  MOV

 P0, A

 ; 送数显式

  MOV

  P2, A

 ; 送数显式

  RL

 A

  ; 左移一位

  ACALL

 DELAY

  ; 延时 300ms

  DJNZ

 R0, LOOPL

 ; 是否左移 8 次

 MOV

  P0, #0FFH

 ; 关闭显示

  MOV

  P2, #0FFH

 ; 关闭显示

  ACALL

 DELAY

  ; 延时 300ms

 MOV

 A, #7FH

 ; 赋初始值

  MOV

  R0, #08H

 ; 移动次数 LOOPR:

 ; 右移显示

 MOV

 P0, A

  ; 送数显式

  MOV

  P2, A

  ; 送数显式

  RR

  A

 ; 右移一位

 ACALL

 DELAY

  ; 延时 300ms

  DJNZ

 R0, LOOPR ; 是否右移 8 次

 MOV

 P0, #0FFH

 ; 关闭显示

  MOV

  P2, #0FFH ; 关闭显示

  ACALL

  DELAY

 ; 延时 300ms

  AJMP

  LOOP

 ; 跳转到 LOOP DELAY:

 MOV

 R5, #3

  ; 将 3 赋给寄存器 R5 DEL1:

 MOV

 R6, #200

  ; 将 3 赋给寄存器 R5 DEL2:

 MOV

 R7, #230

  ; 将 3 赋给寄存器 R5 DEL3:

 DJNZ

 R7, DEL3

 ; 第一层循环

 DJNZ

 R6, DEL2

  ; 第二层循环

 DJNZ

 R5, DEL1

  ; 第三层循环

 RET

 ; 结束 试验流程图:

  实验结果:

 P0、 P2 端口的 LED 先从从右至左方向依次点亮, 再从左至右方向依次点亮, 如此循环形成流水灯效果 问题解决及讨论:

  1)

 没有正确加载烧写文件。

 必须是先选芯片在加载文件

 2)

 芯片型号没有选择正确。

 可重新选择型号

 3)

 没有放置芯片。

 先放芯片, 再压下锁紧座手柄锁紧

 4)

 芯片损坏。

 换新的芯片重试

 5)

 JP24 没有切换到“OFF” 端, 结果 P0 口的 8 个 LED 不闪烁。

 原因是被1602LED 干扰

 实验三

 继电器控制 实验任务:

  用按键控制继电器的工作状态:

  K1-吸和键, K2-释放键

 按 K1 键, 继电器吸合, DL11 灯亮。

  按 K2 键, 继电器释放, DL11 灯灭。

 实验步骤:

 1、 首先在硬盘上建立一个文件夹;

 2、 启动 Keil C51 软件;

 3、 执行 Keil C51 软件的菜单“Project| New Project……” , 弹出一个名为“Create New Project” 的对话框。

 输入工程文件名, 选择保存路径 uv2 后缀,点击“保存” 按钮;

 4、 紧接着弹出“Options for Target‘Target 1’”, 为刚才的项目选择 ATMEL的 AT89S52 的 CPU。

 选择之后, 点击“确定” 按钮;

  5、 接下来弹出一个对话框提示你是否要把标准 8051 的启动代码添加项目中去, 此时, 点击“否” 按钮;

 6、 执行 菜单“File| New……”, 出现一个名为“Text1” 的文档。

 接着执行菜单“File| Save” 弹出一个名为“Save As” 的对话框, 将文件名改为“. asm”后缀, 然后保存;

 7、 添加源程序文件到工程中, 一个空的源程序文件建成。

 单击 Keil C51 软件左边项目工作窗口“Target1” 上的“+”, 将其展开。

 然后右击 “Source Group1”文件夹弹出下拉菜单, 单击其中的“Add Files to Group‘Source Group1’” 项;

 8 、在 弹 出 的 对 话 框 中 先 选 择 文 件 类 型 为 “ Asm Source file(*. s*; *. src; *. a*)” , 这时对话框内创建的空的源程序文件已经出现在项目工作窗口的“Source Group1” 文件夹中;

 输入源程序代码;

 9、 点击工具栏“Options for target” 按钮, 弹出一个对话框, 定义“Xtal”为 11. 0592. 下面依序是存储模式、 程序空间大小等设置, 均用默认值即可。

 点击 Output 选项, 选中“Create Hex File”,

 10、 单击编译按钮, 编译当前源程序;

 11、 运行, 查看效果。

 汇编源程序:

 KEY_NEW

  EQU

 40H

 ; 为标号 KEY_NEW 赋值为 40H

 KEY_OLD

  EQU

 41H

 ; 为标号 KEY_OLD 赋值为 41H

  K1

  BIT

 P1. 4

  K2

  BIT

 P1. 5

  RELAY

 BIT

 P3. 6

 ; 继电器控制线

 ORG

  0000H

 ; 初始化地址

 AJMP

  MAIN

 ; 跳转到 MAIN

 ORG

 0050H

  ; 地址初始化 MAIN:

 MOV

  SP, #60H

  ; 设置栈指针

 MOV

  P0, #0FFH

 ; 将 P0 端口初始化为高电平

 MOV

  P2, #0FFH

  ; 将 P2 端口初始化为高电平

 MOV

  KEY_OLD, #03H

 ; 初始键比较值 KEY_CHK:

  ; 循环检测按键是否按下

 ACALL

 SCAN_KEY

 ; 输入按键状态

 XRL

 A, KEY_OLD

 ; 查按键是否改变

 JZ

  KEY_CHK

  ; 若无键被按则跳转到 KEY_CHK

 ACALL

 DELAY

  ; 延时去抖

  ACALL

 SCAN_KEY

 ; 再次检查按键值

  XRL

 A, KEY_OLD

 ; 寄存器 KEY_OLD 异或到累加器 A

  JZ

  KEY_CHK

 ; 累加器为零则跳转到 KEY_CHK

 MOV

 KEY_OLD, KEY_NEW ; 保存按键状态

  ACALL

 PROC_KEY

 ; 绝对调用子程序 PROC_KEY

  AJMP

 KEY_CHK

 ; 绝对跳转到 KEY_CHK SCAN_KEY:

 CLR

  A

  ; 累加器 A 清零

 MOV

  C, K1

  ; 将 K1 的值赋给 C

 MOV

  ACC. 0, C

 ; 将 C 的值赋给累加器 A

  MOV

  C, K2

  ; 将 K2 的值赋给 C

 MOV

  ACC. 1, C

 ; 将 C 的值赋给 A

 MOV

  KEY_NEW, A ; 无键按下 KEY_NEW

 RET

 ; 返回 PROC_KEY:

 MOV

 A, KEY_NEW ; 将 KEY_NEW 的值赋给累加器 A

  JNB

 ACC. 0, PROC_K1 ; K1 键按下

  JNB

 ACC. 1, PROC_K2 ; K2 键按下

  RET

  ; 返回 PROC_K1:

  ; 按键 K1 处理程序

  CLR

 RELAY

 ; 继电器吸合

 RET

  ; 返回 PROC_K2:

  ; 按键 K2 处理程序

  SETB

 RELAY

  ; 继电器释放

 RET

  ; 返回 DELAY:

 ; 延时子程序 R6、 R7 控制循环

  MOV

 R6, #10

  ; R6 赋值为 10 DEL1:

 MOV

 R7, #185

  ; R7 赋值为 185 DEL2:

  NOP

 ; 空操作, 延迟一个机器周期

  NOP

  NOP

  DJNZ

 R7, DEL2

  ; 第一层循环

  DJNZ

 R6, DEL1

  ; 第二层循环

  RET

  ; 返回

  END

  ; 结束

 试验流程图:

  实验结果:

 用按键控制继电器的工作状态:

  K1-吸和键, K2-释放键

 按 K1 键, 继电器吸合, DL11 灯亮。

  按 K2 键, 继电器释放, DL11 灯灭。

 问题解决及讨论:

  1)

 没有正确加载烧写文件。

 必须是先选芯片在加载文件

 2)

 芯片型号没有选择正确。

 可重新选择型号

 3)

 没有放置芯片。

 先放芯片, 再压下锁紧座手柄锁紧

 4)

 芯片损坏。

 换新的芯片重试

 5)

 JP24 没有切换到“OFF” 端, 结果 P0 口的 8 个 LED 不闪烁。

 原因是被1602LED 干扰

篇五:gpio输出控制实验报告

四 GPIO 输入实验 一、实验目的 1、能够使用 GPIO 的输入模式读取开关信号。

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

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

 二、实验环境

 PC 机

  一台

 ADS 1.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.4 LED 控制电路

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

 图 4.5 按键输入实验流程图

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

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

 实验步骤 ① 启动 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)打开变量观察窗口,通过此窗口可以观察局部变量和全局变量。选择 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 时,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

 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 仿真调试。

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

 ⑦ 单击 Context Variable 图标按钮(或者选择 Processor Views->Variables)打开变量观察窗口,通过此窗口可以观察局部变量和全局变量。选择 System Views->Debugger Internals 即可打开 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" 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 连接蜂鸣器。

 *******************************************************************************************/ 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 灯灭 } 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)打开变量观察窗口,通过此窗口可以观察局部变量和全局变量。选择 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 时,蜂鸣器鸣响,流水灯亮;松开后,蜂鸣器静音,流水灯灭。

 源代码如下:

 #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。

 *******************************************************************************************/ /* 流水灯花样,低电平点亮,注意调用时候用了取反操作 */ 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) { 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) {

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

  // 软件延时 } return 0; }

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

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

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

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

篇六:gpio输出控制实验报告

 通用 O GPIO 的使用

 (4 4 学时)

 一、实验目的

 1、掌握 C51 芯片 I/O 接口的性能特点。

 2、掌握 STM32 芯片 I/O 接口的性能特点。

 3、对于 C51 芯片,使用 P0、P1 口做 I/O 接口,实现输入和

 输出控制。

 4、对于 STM32 芯片掌握 GPIO 的功能设定方法,使用

  GPIO 完成输入与输出的电路驱动 二、实验内容 1.

 P1 口做为输出口控制“单只数码管循环显示 0~9”。

 2. 编写一段程序,并修改硬件电路,用 P1.0-P1.6 口控制LED,P1.7 控制 LED 的亮与灭(P1.7 接按键,按下时 LED亮,不按时 LED 灭)。

 3、用 STM32 芯片 I/O 接口实现流水灯的控制。

 三、思考题 1、为什么 P0 作为 I/O 接口时,要接上拉电阻? 答:因为 P0 口作为 I/O 接口时内部是漏极开路型。

 2、在实验内容 2 中,如果 P0 某个管脚接按键,该如何修改硬件和软件? 3、设计一单片机控制电路,用八只开关分别控制八只 LED的亮灭。

 四、实验结果分析

 对于问题 2

 四、结论

 这次对单片机 GPIO 口的实验,我们分别做了 51 单片机和 STM32f103r6 对GPIO 端口的应用,再通过 protues 的仿真验证,证明我们的思路是正确的。由于在这次实验中没有吧 protues8.6 版本安装好,导致实验过程中出现了了一些延误,没能按照老师课堂的进度,但在实验课过后过后,及时复习和查资料,解决了这个问题。实验过程中不足的有,对于实验仍处于生搬硬套的阶段,无法将老师理论课所讲与实验结合在一起,对于写代码的能力有待提高。

篇七:gpio输出控制实验报告

IO 实验 ------1 090307031 3_某某 一、 实验目的:

 ⑴:熟悉 ARM 开发板基本组成电路, 并通过配套教材熟悉 ARM 芯片特性。

 了解 ADS1. 2 软件使用, 并会用该软件编译调试开发板。

 ⑵:了解 H—JTAG 软件原理, 利用教材中提供的 LED 测试程序, 完成实验。

 ⑶:进一步掌握 ADS 1.2 集成开发环境的使用方法。

 ⑷:掌握 LPC2000 专用工程模板的添加和使用。

 ⑸:能够在 EasyARM2100 教学实验开发平台上运行第一个程序(无操作系统)。

 ⑹:熟悉 LPC2000 系列 ARM7 微控制器的 GPIO 控制。

 ⑺:了解应用程序的固化方法。

 二、 实验内容及原理:

 ⑴:单 LED 闪烁 使用 P0.25 的输出功能, 控制一个 LED 闪动。

 采用灌电流方式驱动 LED, 即输出地电平时 LED 点亮。

 程序首先设置 PINSEL0, PINSEL1 进行管教连线, 然后由 IO0DIR 设置 P0.25口为输出模式, 即可通过对 IO0SET 和 IO0CLR 寄存器进行口线设置 1 或置 0 输出控制。

 ⑵:单键输入

 GPIO 是一个双向的 I/O 口, 内部无上拉电阻, 所以作于键盘输入时, 要上拉电阻。

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

 使用 P0016 口作按键的输入, 每一次有效按键即对 LED4 进行取反控制。

 ⑶:多键多 LED (选作) KEY1 按下 LED1 取反, ......, KEY4 按下 LED4 取反, KEY5 按下 LED 全灭, KEY6 按下LED 全亮。

 ⑷:模拟 SPI 数码显示

 EasyARM2100 开发实验板提供了一位静态数码管, 由 74HC595 直接驱动。

 74HC595 是一 个串入并出的一位寄存器, 三态输出口, 可以通过 SQH 进行级连, 支持 100MHz 时钟频

 率。

 通过 3 个 GPIO 口模拟对 74HC595 进行控制, 驱动数字数码管显示数字 0~F。

 ⑸:LED 及数码编码显示

 程序驱动数码管循环显示 16 进制数 0~F,并使用 LED1~LED4 指示当前数值, LED4 表示高位(d3)

 ,LED1 指示低位(d0), 点亮为 1, 熄灭为 0。

 ⑹多键及显示组合(选作) KEY1 按下数码显示“1”, ......, KEY6 按下数码显示“6”, 同时 LED 显示数据 BCD 编码 。

 三、 实验器材 PC 机一台, 周立功开发板一块(EasyARM2100)

 四、 实验预习与要求:

  (1)

 认真复习 LPC2000 系列 ARM7 微控制器的 GPIO 控制机制以及 LPC2100 管脚连接

  模块等内容。

  (2)

 了解 EasyARM2100 教学实验开发平台的硬件结构, 注意蜂鸣器的相关控制电路。

  (3)

 了解 EasyARM2100 教学实验开发平台上的跳线。

  (4)

 仔细阅读附带文档《ADS 集成开发环境及仿真器应用》 或其它相关资料, 了解 GPIO

 的设置、 74HC595 时序、 逻辑控制方法、 LPC2000 专用工程模板。

 五、 程序流程图 ⑴:

 单 LED 闪烁

  ⑵:

 单键输入

 ⑶:

 模拟 SPI 数码显示

 ⑷:

 LED 及数码编码显示

  六、 实验源程序为(C 语言):

 ⑴:

 单 LED 闪烁 #include "config.h" #define

 LEDCON

 0x00400000

 void DelayNS(uint32

 dly) {

 uint32 i;

 for(;dly>0;dly--)

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

 ; } int main(void) {

 PINSEL0=0x00000000;

 PINSEL1=0x00000000;

  IO0DIR=LEDCON;

 while(1)

 {

 IO0SET=LEDCON;

  DelayNS(30);

  IO0CLR=LEDCON;

  DelayNS(30);

 }

 return(0); } ⑵:

 单键输入 #include "config.h" #define

 LEDCON

 0x00400000 #define

 KEY

 0x00010000

 void WaitKey(void) {

 uint32 i;

  while(1)

 {

 while((IO0PIN&KEY)!=0)

 ;

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

 ;

  if((IO0PIN&KEY)==0)

 break;

 }

 while((IO0PIN&KEY)==0)

 ; }

 int main(void) {

 PINSEL0=0x00000000;

 PINSEL1=0x00000000;

  IO0DIR=LEDCON;

 while(1)

 {

  IO0SET=LEDCON;

  WaitKey();

  IO0CLR=LEDCON;

  WaitKey();

 }

 return(0); } ⑶:

 模拟 SPI 数码显示 #include "config.h" #define SPI_CS

  0X20000100

 #define SPI_DATA 0x00000040 #define SPI_CLK

 0x00000010 #define SPI_IOCON (SPI_CS|SPI_DATA|SPI_CLK)

 void DelayNS(uint32 dly) {

  uint32

 i;

  for(;dly>0;dly--)

  for(i=0;i<50000;i++); } void HC595_SendDat(uint8 dat) {

 uint8 i;

 IO0CLR=SPI_CS;

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

 {

  IO0CLR=SPI_CLK;

  if((dat&0x80)!=0)

 IO0SET=SPI_DATA;

  else

 IO0CLR=SPI_DATA;

  dat<<=1;

  IO0SET=SPI_CLK;

 }

 IO0SET=SPI_CS; }

 int main(void) {

  Const uint8 DISP_TAB[16]={0xC0,0xF9,0xA4,0xB0,0X99,0x82 ,0xF8,0x80,0x90,0x88,0x83,0x83,0xC6,0xA1,0x86,0x8E};

  uint8 i;

  PINSEL0=0x00000000;

  PINSEL1=0x00000000;

  IO0DIR=SPI_IOCON;

  while(1)

  {

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

  {

  HC595_SendDat(DISP_TAB[i]);

  DelayNS(50);

  }

  }

  return(0); } ⑷:

 LED 及数码编码显示 #include "config.h"

 #define SPI_CS (1<<29) #define SPI_DATA (1<<6) #define SPI_CLK (1<<4) #define BEEP (1<<7) #define SPI_IOCON (SPI_CS|SPI_DATA|SPI_CLK) #define LED_IOCON (0x0F<<22)

 void DelayNS(uint32 dly) {

 uint32 i;

 for(;dly>0;dly--)

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

 void HC595_SendDat(uint8 dat) {

 uint8 i;

 IO0CLR = SPI_CS;

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

 {

  IO0CLR = SPI_CLK;

  if((dat&0x80)!=0)

 IO0SET = SPI_DATA;

  else IO0CLR = SPI_DATA;

  dat <<=1;

  IO0SET = SPI_CLK;

 }

 IO0SET = SPI_CS; }

 const uint8 DISP_TAB[16]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82 ,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};

 int main(void) {

  uint8 i;

 PINSEL0 = 0x00000000;

 PINSEL0 = 0x00000000;

 IO0DIR = SPI_IOCON|LED_IOCON|BEEP;

 while(1)

 {

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

  {

 HC595_SendDat(DISP_TAB[i]);

 IO0SET = 0x0F << 22;

 IO0CLR = i<< 22;

  IO0CLR = BEEP;

 DelayNS(50);

 IO0SET = BEEP;

 DelayNS(50);

  }

 }

 return(0); } 七、 实验步骤:

 ㈠、 找到开发板的芯片及 flash 1.计算机并口与开发板 JTAG 口相连接打开 JTAG 软件 H-JTAG Server 在 Flasher 里面选择 auto download。

 2.然后点击左上角的放大镜 看是否可以找到开发板 CPU 。

 3.如果找到 CPU , 软件界面会出现 ARM7 字样以及芯片 ID 号。

  4.如果找到 CPU, 在 flash selection 里选择 LPC2114

 5.configuration 里设置晶振的频率为 11.0592

  打开 H-Flasher 点击 check , 会出现 ARM7 相关字样, 证明可以找到 flash ㈡、 编写程序代码仿真并验证结果

 打开 Code Warrior for ARM Developer suite 编写相应的代码, 测试没有语法错误后仿真并查看运行结果, 对比是否与预期的是否相同。

 如果与结果存在出入, 检查源程序是否存在逻辑上的错误, 修改并知道实验结果正确。

 八、 实验结果:

 单 LED 闪烁实验结果:

 实验电路板上的 LED 按一定周期快速闪烁。

 单键输入实验结果:当按下 EasyARM2100 实验板的第一个按钮时对应的 LED 灯熄灭, 再次按下时又点亮, 实现按键取反的效果。

 模拟 SPI 数码显示实验结果:

 程序驱动数字数码管显示数字 0~F。

 LED 及数码编码显示实验结果:

 除了数字数码管显示数字 0~F, 四个 LED 灯显示对应的以点亮/熄灭分别代表 1/0 二进制数, 并伴随蜂鸣。

 经过实验, 实验结果与预期结果基本吻合, 表示实验成功。

 九、 实验结论:

  通过本次试验在一定程度上, 了解 H—JTAG 软件原理, 熟悉了 ARM 开发板基本组成电路, 并通过配套教材熟悉 ARM 芯片特性以及 ADS1.2 软件使用, 并会用该软件编译调试开发板掌握了 LPC2000 专用工程模板的添加和使用。

 在老师的讲解下以及帮助下, 能够在EasyARM2100 教学实验开发平台上运行第一个程序。

 并熟悉了 LPC2000 系列 ARM7 微控制器的 GPIO 控制。

 了 解了简单的应用程序的固化方法, 并能根据教材提示完成实验。

 掌握了LPC2000 系列 ARM7 微控制器的 GPIO 控制机制以及 LPC2100 管脚连接和模块等内容, 了解了 EasyARM2100 教学实验开发平台的硬件结构, 以及教学实验开发平台上的跳线。

 老师的教学态度很认真, 对于实验的的改进方面的建议是, 教学时可以照顾下水平低的同学, 适当的降慢课程的讲解速度。

 实验课程, 必要时使用一下软件视频教学。

篇八:gpio输出控制实验报告

实验效果分析(包括仪器设备等使用效果)

  一、 实验效果分析

 1、在进行实验时要严格按照实验步骤进行实验,否则试验程序出错则实验效果会发生偏差。

 2、由于本实验属于硬件实验的范畴,所以实验起初时要先设定实验属于硬件实验,而不是直接进行。

 3、经过一系列的调制修改,实验达到了要求的效果,实验成功。

 教

 师

 评

 语

 指导老师

 年

 月

  日

  江西师范大学物理与通信电子学院 教学实验报告 通信工程 专业

  2013 年 11 月

 26 日 实验名称 GPIO 控制实验 指导老师

 姓

 名

 年级 11 级 学号

 成绩

 一、预习部分 1、实验目的 2、实验基本原理 3、主要仪器设备(含必要的元器件、工具)

 一、 实验目的:

 1、了解 GPIO 片上外设

 2、掌握延时程序应用

  3、用 GPIO 口实现 LED 指示灯控制。

 二、 实验基本原理:

 通用目的输入输出片内外设提供了专用的通用目的引脚,可以配置位输入或输出。当配置为一个输出时,用户可以写一个内部寄存器以控制输出引脚上驱动的状态。当配置为输入引脚时,用户可以通过内部寄存器的状态检测到输入的状态。另外,GPIO 片内外设可以用不同的中断/事件产生 CPU 中断和 EDMA事件。一旦在 GPIO 使能寄存器被使能,GPIO 引脚可以用作通用目的输入/输出。用户可以使用 GPIO 方向寄存器独立配置每条 GPIO 引脚为输入或输出。当配置为输出(GPXDIR 位=1),GPIO 值寄存器(GPVAL)的 GPXVAL 位的值就被送到相应的 GPn 引脚。当配置为输入(GPXDIR 位=0)时,输入状态可以从相应的 GPXVAL 读取 TMS320VC5502 有 1-位通用输出引脚 XF 和 8-位通用 I/O 引脚GPIO[7:0],其中 GPIO3、GPIO5 与 McBSP2 复用引脚。SEED-DEC5502 模板上这些引脚的使用情况如下:

 XF 用于点亮 LED 指示灯 D1。XF = 1,点亮;XF = 0,熄灭。

 GPIO[2:0]:经电平转换后连至外设扩展总线的备用引脚。

 GPIO3:与 McBSP2 的 CLKX2 复用引脚,当配置为 GPIO3 时,用作 COM1 的 。

 GPIO4:经电平转换后连至外设扩展总线的备用引脚。

 GPIO5:与 McBSP2 的 FSX2 复用引脚,当配置为 GPIO5 时,用作 COM1 的 。

 GPIO6:经电平转换后连至外设扩展总线的备用引脚。

 GPIO7:用于点亮 LED 指示灯 D5。XF = 1,点亮;XF = 0,熄灭。

 通过本实验,要求掌握 GPIO 口的应用;熟悉延时程序的应用。

  1、5502_GPIO.c:这是实验的主程序包含系统初始化,GPIO 引脚点亮程序等;

  2、vectors.s55: 包含 5502 的中断向量表;

  3、SEED_DEC5502.cmd: 声明了系统的存储器配置与程序各段的连接关系。

 三、 主要仪器设备

 计算机、ccs 软件

 二、实验操作部分

 1、实验数据、表格及数据处理

 2、实验操作过程(可用图表示)

 3、结论

 一、实验操作过程 1. 打开 CCS,进入 CCS 的操作环境。

 2. 装入 DEC5502_GPIO.pjt 工程文件, 添加 SEED_DEC5502.gel 文件。

 3. 装载程序 DEC5502_GPIO.out,进行调试。

 4. 在 5502_LED.c 程序的第 69 行“delay();”处,第 72 行“delay();”处,第 75 行“delay();” 处,第 78 行“delay();”处设置断点。

 5. 运行程序,程序会停在第一个断点处,关闭指示灯 D1; 6. 继续运行程序,程序每次都会停在第二个断点处,点亮指示灯 D1;

 7. 继续运行程序,程序每次都会停在第三个断点处,点亮指示灯 D5; 8. 继续运行程序,程序每次都会停在第四个断点处,关闭指示灯 D5; 9. 也可直接执行程序,观察指示灯 D1,D5 的闪烁情况。

 二、实验截图

篇九:gpio输出控制实验报告

南理工大学 《嵌入式系统》课程实验报告- STM32 单片机 GPIO 程序开发

 实验概述

 【实验目的及要求】

 实验目的:

 1. 掌握 STM32 单片机输入输出接口程序开发 2. 掌握用寄存器开发 STM32 单片机程序 3. 掌握用库函数开发 STM32 单片机程序 实验要求:

 1. 完成实验要求中提到要完成的所有内容,完成代码并提交主要代码。

 2. 分析寄存器和库函数编程的优势和劣势,你喜欢用哪种方式。

 3. 对每行主要代码要进行注释,说明其功能。

 实验内容:

  1.熟悉TEB-CM5000嵌入式单片机实验系统上的LED灯电路和单独按钮电路。

 2.学习并掌握寄存器版本、库函数版本相关的实例程序,主要学习实例stm32referencesrcforch5 目录下的,LED、LEDLib、KEY_LED 和 KEY_LEDlib 四个程序。

  3.利用寄存器位操作模式、库函数分别开发出 USER2(PD3)按钮控制LD5(PF7)亮灭。具体功能:USER2(PD3)按钮按下时,LD5 灯闪烁;当 USER2(PD3)按钮弹开时,LD5 灯停止闪烁。

 4.实现利用寄存器位操作模式、库函数分别开发出: 当每次 USER2(PD3)按钮按下时,LD5 灯只闪烁一次。

 【实验环境】

 1. TEB-CM5000 嵌入式单片机实验系统 2. MDK4.12 嵌入式软件开发环境

 实验内容

 【实验过程】

 二、实验步骤:

 1. USER2(PD3)按钮按下时,LD5 灯闪烁;

 USER2(PD3)按钮弹开时,LD5 灯停止闪烁。

 (1)

 寄存器位操作模式:

 设置输入输出

  循环判断 PD3 的状态,并执行对应操作(点亮或熄灭灯)

  (2)

 库函数

  设置 LD5 和 USER2

 循环判断 PD3 的状态,并执行对应操作(点亮或熄灭灯)

  2.当每次 USER2(PD3)按钮按下时,LD5 灯只闪烁一次。

 (1)寄存器位操作模式 循环判断 PD3 的状态,并执行对应操作(点亮或熄灭灯)

  (3)

 库函数 循环判断 PD3 的状态,并执行对应操作(点亮或熄灭灯)

 小结

 1. 只闪烁一次跟一直闪烁的区别主要在于 Flag 值。

 在只闪烁一次的程序中,设置 flag 值作为标志,灯亮以后改变 flag 值的状态,flag 的状态改变灯的状态就不再继续。

 2. 学会了如何使用或者调用相关函数或库,以及寄存器操作和库函数操作的区别。

 3. 学会了利用值的改变来改变灯的状态。

 指导教师评语及成绩

 评语:

 成绩:

  指导教师签名:

 批阅日期:

推荐访问:gpio输出控制实验报告 输出 实验 控制