zzzzmmmmpppp 2023-04-04 13:25 采纳率: 0%
浏览 79
已结题

嵌入式的实验求具体工程

proteus + keil +stm32cubemx

二、实验内容:

  1. 利用Proteus实现一个闹钟,闹钟在OLED上显示的时间仅有时分秒,OLED上显示两个时间,上面是两行是运行时间: “Now Time:
    05:07:00”,
    下面两行显示闹钟设置时间:“Set Time:
    05:08:00”
    运行时间==闹钟时间,OLED显示警告信:
    “Alarm!”
    然后黑屏,再显示上面的提醒信息,如此循环四至五次,时间间隔为1秒,然后继续显示运行时间和设置时间。
  2. 利用通用定时器的中断,实现运行时间的改变,并在OLED中显示时间信息。
  3. 通过按键更改当前时间和设置闹钟。
    三、实验设备:
  4. STM32F1教学实验板、Proteus;
  5. PC操作系统WINDOWS,Keil MDK集成开发环境,STM32CubeMX。
    四、实验步骤:
  6. 连线:将教学实验板的电源线连接好,并检测J-link仿真器与试验箱CPU板和电脑连接好;
  7. 读懂原理图,本次试验使用电路图中的KEY2、KEY3、KEY4三个按键,它们分别接PA1、PA2、PA3。在实验板上三个按键标注为KEY1、KEY2、KEY3,连接的IO口不变。
  8. 完成按键的初始化,初始化按键时钟,将IO口配置成上拉输入。键盘去抖动一般要延时10毫秒,建议用SysTick完成一个10毫秒的延时程序,这样完成键盘的扫描。
  9. 完成OLED的初始化,先完成OLED的IO口配置,再进行寄存器的配置,并试着在屏幕中显示一个字符,确认通讯的正确。
  10. 定时器中断的初始化,由于定时器内部计数次数最大为2^16,在此推荐将时钟72分频后计数1000此产生一个1ms的中断,在中断中再计数1000次获得1s的时间。
  11. 在main函数中完成各种初始化,包括:
    时钟的初始化(参考课本P102的RCC_Configurantion()函数);
    GPIO初始化,初始化PA1、PA2、PA3;
    SysTick初始化(参考课本P126页,10毫秒去抖动用);
    OLED初始化,直接调用OLED_Init()函数;
    通用定时器2或3的初始化和定时器优先级设置。
  12. 按键的扫描参考PPT的程序,也可自己写,GPIO初始化参考PPT。
    键盘去抖动一般要延时10毫秒,建议用SysTick完成一个10毫秒的延时程序,实现去抖动的延时。
  • 写回答

7条回答 默认 最新

  • 流转的年华 2023-04-04 16:25
    关注

    参考程序:

    以下是基于Proteus+Keil+STM32CubeMX的嵌入式闹钟实验的参考程序,供参考学习:

    1. main.c
    
    ```c
    /* Includes ------------------------------------------------------------------*/
    #include "main.h"
    #include "OLED.h"
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    /* Private variables ---------------------------------------------------------*/
    RTC_HandleTypeDef hrtc;
    TIM_HandleTypeDef htim3;
    
    /* Private function prototypes -----------------------------------------------*/
    void SystemClock_Config(void);
    static void MX_GPIO_Init(void);
    static void MX_TIM3_Init(void);
    static void MX_RTC_Init(void);
    
    void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim);
    void get_time(uint8_t time[]);
    void update_time(void);
    void update_alarm(void);
    void alarm(void);
    void RTC_IRQHandler(void);
    
    /* Private variables ---------------------------------------------------------*/
    char buffer[20];
    uint8_t time_now[6] = {0};
    uint8_t time_set[6] = {0};
    uint8_t i = 0, j = 0;
    uint8_t curr_val = 0, prev_val = 0;
    
    /* Private function definitions ----------------------------------------------*/
    /**
      * @brief  The application entry point.
      * @retval int
      */
    int main(void)
    {
      /* MCU Configuration--------------------------------------------------------*/
      HAL_Init();
      SystemClock_Config();
      MX_GPIO_Init();
      MX_TIM3_Init();
      MX_RTC_Init();
      OLED_Init();
      
      /* Start the TIM3 timer */
      HAL_TIM_Base_Start_IT(&htim3);
    
      /* Infinite loop */
      while (1)
      {
        get_time(time_now); // 获取当前时间
        update_time();      // 更新显示时间
        update_alarm();     // 更新闹钟时间
    
        curr_val = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1);
        if(curr_val == GPIO_PIN_RESET && prev_val == GPIO_PIN_SET) { // PA1键按下
            HAL_Delay(10);
            curr_val = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1);
            if(curr_val == GPIO_PIN_RESET) {
                i = (i + 1) % 6; // 逐个修改时分秒
                time_now[i] = (time_now[i] + 1) % ((i == 0 ? 24 : 60));
            }
        }
        prev_val = curr_val;
    
        curr_val = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_2);
        if(curr_val == GPIO_PIN_RESET && prev_val == GPIO_PIN_SET) { // PA2键按下
            memcpy(time_set, time_now, sizeof(time_set)); // 闹钟时间设为当前时间
        }
        prev_val = curr_val;
    
        curr_val = HAL_GPIO_ReadPin
    
    
    评论

报告相同问题?

问题事件

  • 系统已结题 4月12日
  • 创建了问题 4月4日

悬赏问题

  • ¥20 Keil uVision5创建project没反应
  • ¥15 mmseqs内存报错
  • ¥15 vika文档如何与obsidian同步
  • ¥15 华为手机相册里面的照片能够替换成自己想要的照片吗?
  • ¥15 陆空双模式无人机飞控设置
  • ¥15 sentaurus lithography
  • ¥100 求抖音ck号 或者提ck教程
  • ¥15 关于#linux#的问题:子进程1等待子进程A、B退出后退出(语言-c语言)
  • ¥20 web页面如何打开Outlook 365的全球离线通讯簿功能
  • ¥15 io.jsonwebtoken.security.Keys