实验三 中断应用——行人过街交通灯

实验三 中断应用——行人过街交通灯

相关电路代码文件下载https://wwe.lanzouw.com/ioorOyxic0h

一.实验目的

(1)熟悉STM32CubeMX的安装与使用。
(2)熟悉MDK Keil软件的安装与使用。
(3)熟悉Proteus仿真软件的使用。
(4)掌握STM32外部中断的应用方法。

二.实验内容

利用红色、绿色、黄色发光二极管、数码管和按键设计一组行人过街交通灯,行人过街交通灯有一个车辆交通灯和一个行人交通灯组成。
车辆交通灯由一组红、黄、绿二极管和一个数码管组成。初始状态下绿灯一直亮;行人按键后,绿灯亮10秒,同时数码管倒数10秒;绿灯灭,黄灯亮3秒;接着黄灯灭,红灯亮30秒,最后10秒数码管倒数;接着红灯灭,绿灯亮。
行人交通灯由一组红、绿二极管、一个数码管和一个按键组成。初始状态下红灯一直亮;行人按键后,红灯亮13秒,数码管倒数最后10秒;接着红灯灭,绿灯亮30秒,最后10秒数码管倒数;接着绿灯灭,红灯亮。
行人过街交通灯
(1)利用Proteus软件基于STM32F103设计交通灯电路。
(2)利用STM32CubeMX和MDK Keil设计交通灯程序,并在Proteus软件上仿真。
实验扩展
考虑车辆和行人双向行驶,即需要两个车辆交通灯、两个行人交通灯。

三.电路设计说明

准备四个数码管,车辆行人交通灯各两个,车辆交通灯使用两组红黄蓝LED灯,行人交通灯使用两组红绿LED灯。外加10Ω电阻和+5V电源若干,数码管和LED灯都需要接电阻以及电源。
将显示车辆交通灯的数码管的7个引脚依次接到PA0-PA6上,将显示行人的数码管的7个引脚依次接到PB0-PB6上。将车辆红色LED灯的引脚接到PC0,车辆黄色LED灯的引脚接到PC1,车辆绿色LED灯的引脚接到PC2。行人红色LED灯的引脚接到PC3,行人绿色LED灯的引脚接到PC4,中断按钮的引脚接到PC10。

四.电路图

图 1 实验设计电路图
图 1 实验设计电路图

五.程序设计说明

首先将控制数码管显示数字的数据存储到number数组中,以便后面使用。设置一个中断标记key,编写中断处理函数,监测到中断就将key置为一。根据题意,车辆和行人的交通灯的显示组合共有三种,提前将其计算出结果,存放在主函数外。编写延时函数,10万空循环设置为一秒。
在主函数中,初始状态下,数码管不亮,故将对应端口设置为0xff。车辆交通灯为绿色,行人交通灯为红色,故将对应端口设置为~(green)。
使用一个if语句判断key是否为1。key若为1,将车辆交通灯置为绿色,开始10秒倒计时,车辆交通灯数码管并开始倒计时,三秒后行人交通灯数码管从9开始倒计时。然后关闭车辆交通灯数码管,将车辆交通灯置为黄色,行人交通灯仍为红色,故将对应端口设置为(yellow)。此时行人交通灯数码管继续倒计时。倒计时结束后,将车辆交通灯置为红色,行人交通灯置为绿色,故将对应端口设置为(red),并开始30秒倒计时,数码管只显示最后10秒。
key若不为1,则数码管不亮,故将对应端口设置为0xff。车辆交通灯为绿色,行人交通灯为红色,故将对应端口设置为~(green)。

六.主要的程序源码

int key=0;//中断标记
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)//中断处理函数
{
      key=1;
}
unsigned int red = 0x11;
unsigned int yellow = 0xa;
unsigned int green = 0xc;
unsigned char number[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管数字
void delay(int x)//延时函数
{
   int i;
   for(i=0;i<x*100000;i++);
}
int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_NVIC_Init();
 while (1)
  {
      int j;
      GPIOA->ODR=0xff;
      GPIOB->ODR=0xff;
      if (key==1){
         GPIOC->ODR=~(green);
            for(j=10;j>0;j--){
                  GPIOA->ODR=~number[j];
                     if(j<7){
                        GPIOB->ODR=~number[j+3];
                  }
                  delay(1);
            }
         GPIOA->ODR=0xff;
         GPIOB->ODR=0xff;
         GPIOC->ODR=~(yellow);
         for(j=3;j>0;j--){
               GPIOC->ODR=~(yellow);
               GPIOB->ODR=~number[j];
               delay(1);
         }
         GPIOA->ODR=0xff;
         GPIOB->ODR=0xff;
         GPIOC->ODR=~(red);
         for(j=30;j>0;j--){
               if(j<10){
                  GPIOA->ODR=~number[j];
                  GPIOB->ODR=~number[j];
               }
               delay(1);
         }
         key=0;
      }
      else {
         GPIOC->ODR=~(green);
         GPIOA->ODR=0xff;
         GPIOB->ODR=0xff;
      }
  }
}

七.实验结果

默认状态下,车辆交通灯为绿灯,行人交通灯为红灯,双方数码管都不亮,如图2所示。
图 2 默认状态下的显示效果
图 2 默认状态下的显示效果

按下按钮后,车辆交通灯仍为绿灯,行人交通灯仍为红灯,车辆交通灯由于先开始倒计时,所以它显示的数字比行人交通灯现实的数字小3,如图3所示.
图 3 按下按钮后第一阶段的显示效果
图 3 按下按钮后第一阶段的显示效果

车辆交通灯倒计时结束后变为黄灯,其数码管熄灭。行人交通灯保持原状态继续倒计时,如图4所示。
图 4 按下按钮后第二阶段的显示效果
图 4 按下按钮后第二阶段的显示效果

行人交通灯倒计时结束后,其数码管熄灭,车辆交通灯变为红色,行人交通灯变为绿色。如图5所示。
图 5 按下按钮后第三阶段的显示效果
图 5 按下按钮后第三阶段的显示效果

车辆和行人交通灯将距离灯灭还剩最后十秒时将会显示倒计时,如图6所示。倒计时结束后将会恢复默认状态,如图2所示。
图 6 按下按钮后第四阶段的显示效果
图 6 按下按钮后第四阶段的显示效果

八.总结

通过这次实验使我了解了STM32的三种中断方式,掌握了STM32外部中断的应用方法。可以通过STM32CubeMX、MDK Keil和Proteus完成独立一个外部中断小程序。虽然首次做绕了一点弯路,把中断方式做成了轮询方式。但是最后在老师和同学的帮助下,顺利的完成了此次实验。

STM32CubeMX中断设置

1、设置GPIO接口为中断模式GPIO_EXIT*。
在这里插入图片描述
2、设置GPIO中断方式,默认为上升沿触发。
在这里插入图片描述
3、设置NVIC
在这里插入图片描述

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值