前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >物联网-点灯闪灯实验(三个灯)

物联网-点灯闪灯实验(三个灯)

原创
作者头像
会洗碗的CV工程师
发布2024-02-04 21:12:56
3310
发布2024-02-04 21:12:56
举报
文章被收录于专栏:LongJava学习资料

1. 实验目的

使用寄存器点亮D3,D4,D5,三个LED灯

点灯闪灯实验(三个灯)的步骤如下:

  1. 将电源正极连接到二极管阳极,负极连接到阴极。确保二极管正常工作。
  2. 连接三个LED灯到单片机引脚,并编写程序来控制它们的状态。可以使用sbit关键字定义变量,并将LED灯的状态赋值给这些变量。
  3. 在程序中编写一个循环,使三个LED灯以固定的频率交替闪烁。可以使用计数器来控制计时的精度,并根据计数值来控制LED灯的状态。
  4. 在每次计时到1秒之后,计数器清零,然后重新开始计数。根据计数值的大小,将LED0和LED1的状态进行切换,实现LED灯的交替闪烁。
  5. 重复上述步骤,使三个LED灯保持交替闪烁的状态。

注意:在实验过程中,要确保电流在3~20mA之间,以避免烧坏二极管。同时,确保连接的线路正确无误,以避免发生短路等安全事故。

2. 实验原理

图 3.3.2 LED 灯电路连接图

图中从 3 个 LED 灯的阳极引出连接到 3.3V 电源,阴极各经过 1 个电阻引入至 STM32

的 3 个 GPIO 引脚 PH10、PH11、PH12 中,所以我们只要控制这三个引脚输出高低电平,

即可控制其所连接 LED 灯的亮灭。如果您的实验板 STM32 连接到 LED 灯的引脚或极性不

一样,只需要修改程序到对应的 GPIO 引脚即可,工作原理都是一样的。

我们的目标是把 GPIO 的引脚设置成推挽输出模式并且默认下拉,输出低电平,这样就

能让 LED 灯亮起来了。

3. 主要仪器设备

STM32开发板,keil5软件

4. 实验内容及步骤

1. 使用keil5打开工程

2. 引入stm32f4xx.h头文件

3. 修改main函数,如下:

代码语言:c
复制
/*
 使用寄存器的方法点亮LED灯
  */
#include "stm32f4xx.h" 
void delay(int xms) {
 int i,j;
 for(i=xms;i>0;i--)
  for(j=110;j>0;j--);
}
/**
  *   主函数
  */
int main(void)
{ 
 /*开启 GPIOH 时钟,使用外设时都要先开启它的时钟*/
 RCC_AHB1ENR |= (1<<7); 
 /* LED 端口初始化 */
 /*GPIOH MODER10清空*/
 GPIOH_MODER  &= ~( 0x03<< (2*11));
 /*PH10 MODER10 = 01b 输出模式*/
 GPIOH_MODER |= (1<<2*11);
  /*GPIOH MODER10清空*/
 GPIOH_MODER  &= ~( 0x03<< (2*12));
 /*PH10 MODER10 = 01b 输出模式*/
 GPIOH_MODER |= (1<<2*12);
  /*GPIOH MODER10清空*/
 GPIOH_MODER  &= ~( 0x03<< (2*10));
 /*PH10 MODER10 = 01b 输出模式*/
 GPIOH_MODER |= (1<<2*10);
 /*GPIOH OTYPER10清空*/
 GPIOH_OTYPER &= ~(1<<1*10);
 /*PH10 OTYPER10 = 0b 推挽模式*/
 GPIOH_OTYPER |= (0<<1*10);
 /*GPIOH OSPEEDR10清空*/
 GPIOH_OSPEEDR &= ~(0x03<<2*10);
 /*PH10 OSPEEDR10 = 0b 速率2MHz*/
 GPIOH_OSPEEDR |= (0<<2*10);
 /*GPIOH PUPDR10清空*/
 GPIOH_PUPDR &= ~(0x03<<2*10);
 /*PH10 PUPDR10 = 01b 上拉模式*/
 GPIOH_PUPDR |= (1<<2*10);
 while(1){
 /*PH10 BSRR寄存器的 BR10置1,使引脚输出低电平*/
 GPIOH_BSRR |= (1<<16<<10);
  GPIOH_BSRR |= (1<<16<<11);
  GPIOH_BSRR |= (1<<16<<12);
 delay(5000);
 /*PH10 BSRR寄存器的 BS10置1,使引脚输出高电平*/
 GPIOH_BSRR |= (1<<10);
  GPIOH_BSRR |= (1<<11);
  GPIOH_BSRR |= (1<<12);
  delay(5000);
 }
}
// 函数为空,目的是为了骗过编译器不报错
void SystemInit(void){}

我正在参与2024腾讯技术创作特训营第五期有奖征文,快来和我瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档