【TB作品】脉搏测量,ATMEGA8单片机,Proteus仿真,ATmega8控制脉搏测量与显示系统

news2024/11/29 2:49:36

硬件组成:
LCD1602+脉搏测量电路(带灯)+蜂鸣器报警+按键设置+AT24C02

功能:
(1)LCD1602主页显示脉搏、报警上限、报警下限;
(2)五个按键:按键1:切换设置上限和设置下限;
按键2:查看存的脉搏数值;
按键3:设置的时候加数值功能,查看存储的时候上翻页功能;
按键4:设置的时候减数值功能,查看存储的时候下翻页功能;
(3)脉搏不在上下限范围就报警;
(4)在正常测量中,每次测量出一次脉搏后,程序自动保存此次测量结果。
(5)使用AT24C02芯片存储100组脉搏信息,可以掉电保存;同时也存储设置的上下限,可以掉电保存;

随意加个时间显示

在这里插入图片描述

实验报告:ATmega8控制脉搏测量与显示系统

实验目的

设计并实现一个基于ATmega8微控制器的脉搏测量与显示系统,主要功能包括脉搏测量、上下限设置、报警功能和数据存储。

背景与原理

在本实验中,我们使用ATmega8微控制器、LCD1602显示器、DS1302时钟芯片以及AT24C02存储芯片构建了一个简易的脉搏测量与显示系统。系统通过脉搏测量电路获取脉搏信号,并在LCD1602上显示测量结果和设定的上下限值。当脉搏不在设定范围内时,系统会触发报警。此外,测量数据会存储在AT24C02芯片中,即使断电也能保持数据完整。

硬件组成

  • ATmega8微控制器
  • LCD1602显示器
  • DS1302时钟芯片
  • AT24C02存储芯片
  • 脉搏测量电路
  • 蜂鸣器报警
  • 按键

电路连接

  1. ATmega8与LCD1602连接
    • 数据线:PD0-PD7
    • 控制线:PC0(RS)、PC1(RW)、PC2(E)
  2. DS1302与ATmega8连接
    • RST:PC5
    • SCLK:PD6
    • IO:PD5
  3. AT24C02与ATmega8连接
    • SDA:PC4
    • SCL:PC5
  4. 脉搏测量电路:通过模拟输入端口连接到ATmega8
  5. 蜂鸣器与按键:分别连接到ATmega8的不同IO端口

软件设计

主要模块介绍

  1. 初始化模块

    • 初始化LCD1602、DS1302和AT24C02。
    • 设置定时器和中断。
  2. I2C通信模块

    • 实现I2C通信的启动、停止、读写等基本功能,用于与AT24C02存储芯片通信。
  3. 脉搏测量与显示模块

    • 通过定时中断测量脉搏频率。
    • 实时显示脉搏值和上下限设定值。
    • 判断是否超出设定范围并触发报警。
  4. 数据存储与读取模块

    • 将每次测量的脉搏值存储到AT24C02中。
    • 读取存储的历史数据供用户查看。
  5. 按键处理模块

    • 处理按键输入,实现上下限设置、历史数据查看等功能。

程序原理

主程序流程
  1. 初始化各模块。
  2. 进入主循环,不断监测按键输入并处理。
  3. 定时获取脉搏测量数据并更新显示。
  4. 判断是否超出设定范围,触发报警。
  5. 存储测量数据。
关键函数
  1. x24c02_init:初始化I2C通信和AT24C02存储芯片。
  2. ds1302_init:初始化DS1302时钟芯片。
  3. get_time:获取当前时间。
  4. x24c02_read/write:读写AT24C02芯片中的数据。
  5. deal_key:处理按键输入。
  6. display:更新LCD1602显示内容。

程序代码

#include <iom8v.h>
#include <macros.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "lcd1602.h"

// 函数声明
void flash_24c02(void);
void x24c02_init(void);
void start(void);
void stop(void);
void writex(unsigned char j);
unsigned char readx(void);
void ack(void);
unsigned char x24c02_read(unsigned char address);
void x24c02_write(unsigned char address, unsigned char info);
void ds1302_init(void);
void get_time(struct RTCTIME *p);
void time_write_1(unsigned char time_tx);
unsigned char time_read_1(void);
unsigned char getKeyBoardValue(void);
void display(void);
void deal_key(unsigned char button);
void main(void);

// 全局变量
unsigned int xinlv_cnt;
unsigned char xinlv, xinlv_h, xinlv_l, index, sum_xinlv, page;
struct RTCTIME rtctime;

// 主程序
void main(void) {
    // 初始化代码
    LCD_init();
    DDRD &= ~(0x08 + 0x03 + 0x10);
    DDRD |= 0x80; // BEEP
    SREG = 0x80; // 使能全局中断
    TIMSK |= (1 << TOIE1); // 使能定时溢出中断
    TCCR1A = 0x00; // 配置定时器工作在普通模式
    TCCR1B = 0x01; // 无分频
    TCNT1H = (65535 - 20000) / 256; // 5ms
    TCNT1L = (65535 - 20000) % 256; // 5ms
    MCUCR &= ~( (1 << ISC01) | (1 << ISC00) ); // 低电平触发中断
    GICR = (1 << INT0); // 使能外部中断0请求
    ds1302_init();
    LCD_write_str(0, 0, "                ");
    LCD_write_str(0, 1, "                ");
    x24c02_init();
    delay_nms(10);
    xinlv_h = x24c02_read(100);
    delay_nms(10);
    xinlv_l = x24c02_read(101);
    delay_nms(10);
    index = x24c02_read(102);
    delay_nms(10);
    sum_xinlv = x24c02_read(103);

    while (1) {
        // 按键检测与处理
        unsigned char button = getKeyBoardValue();
        if (button) {
            deal_key(button);
            while (getKeyBoardValue());
        }
        // 定时获取时间与脉搏数据
        static unsigned char timecyc = 0;
        timecyc = (timecyc + 1) % 10;
        if (timecyc == 0) {
            get_time(&rtctime);
            static unsigned char temp_sec;
            if (temp_sec != rtctime.miao) {
                temp_sec = rtctime.miao;
                display();
                if((xinlv < xinlv_l) || (xinlv > xinlv_h)) {
                    PORTD &= ~0x80;
                } else {
                    PORTD |= 0x80;
                }
            }
        }
        delay_nms(5);
    }
}

// 定时器中断服务程序
#pragma interrupt_handler Timer1_ovf:9
void Timer1_ovf(void) {
    TCNT1H = (65535 - 20000) / 256; // 5ms
    TCNT1L = (65535 - 20000) % 256; // 5ms
    xinlv_cnt++; // 时间加5ms
}

// 外部中断服务程序
#pragma interrupt_handler int0:2
void int0(void) {
    if (xinlv_cnt != 0) {
        xinlv = 60000 / (xinlv_cnt * 5); // 计算出心率
        x24c02_write(index, xinlv); // 写入心率
        index++;
        if (index == 100) {
            index = 0;
            sum_xinlv = 1;
            x24c02_write(103, sum_xinlv);
            flash_24c02();
        }
        x24c02_write(102, index);
    }
    xinlv_cnt = 0;
}

结果与分析

系统成功实现了脉搏测量与显示功能,并且可以通过按键设置报警上下限。当脉搏不在设定范围内时,系统能够正确触发报警。此外,测量数据能实时存储并掉电保持。

总结

本实验通过硬件与软件的结合,实现了一个简易的脉搏测量与显示系统。通过对各模块的合理设计与调试,使系统具备了脉搏实时监测、上下限设置、报警和数据存储等功能,为相关领域的进一步研究和应用提供了良好的基础。

资源代码

在这里插入图片描述

https://docs.qq.com/sheet/DUEdqZ2lmbmR6UVdU?tab=BB08J2

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1902710.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

axios的使用,处理请求和响应,axios拦截器

1、axios官网 https://www.axios-http.cn/docs/interceptors 2、安装 npm install axios 3、在onMouunted钩子函数中使用axios来发送请求&#xff0c;接受响应 4.出现的问题&#xff1a; &#xff08;1&#xff09; 但是如果发送请求请求时间过长&#xff0c;回出现请求待处…

RK3568 GPU介绍及使用

一、RK3568简介 RK3568四核64位Cortex-A55 处理器&#xff0c;采用全新ARM v8.2-A架构&#xff0c;主频最高可达2.0GHz&#xff0c;效能有大幅提升&#xff1b;采用22nm先进工艺&#xff0c;具有低功耗高性能的特点RK3568集成了双核心架构 GPU&#xff0c;高性能VPU以及高效能…

YOLOv8_obb数据集可视化[旋转目标检测实践篇]

先贴代码,周末再补充解析。 这个篇章主要是对标注好的标签进行可视化,虽然比较简单,但是可以从可视化代码中学习到YOLOv8是如何对标签进行解析的。 import cv2 import numpy as np import os import randomdef read_obb_labels(label_file_path):with open(label_file_path,…

Linux内存管理--系列文章柒——硬件架构

一、引子 之前文章讲解的是系统的虚拟内存&#xff0c;本章讲述这些硬件的架构和系统怎样统一管理这些硬件的。 二、物理内存模型 物理内存模型描述了计算机系统中的物理内存如何由操作系统组织和管理。它定义了物理内存如何划分为单元&#xff0c;如何寻址这些单元以及如何…

yolov8实战——yolov8TensorRT部署(python推理)(保姆教学)

yolov8实战——yolov8TensorRT部署&#xff08;python推理&#xff09;&#xff08;保姆教学&#xff09; 一 、准备好代码和环境安装TensorRt下载代码和安装环境 部署和推理构建ONNX构建engine无torch推理torch推理 最近用到yolov8&#xff0c;但是寻找了一圈才找到了yolov8最…

Java 自定义集合常量

文章目录 Java 自定义集合常量一、普通方法自定义集合常量信息1、定义 Map 集合信息&#xff08;1&#xff09;方法一&#xff1a;使用静态代码块&#xff08;2&#xff09;方法二&#xff1a;简单定义 Map 常量 2、定义 List 集合信息3、定义 Set 集合信息 二、通过 Collectio…

Node.js-path 模块

path 模块 path 模块提供了 操作路径 的功能&#xff0c;如下是几个较为常用的几个 API&#xff1a; 代码实例&#xff1a; const path require(path);//获取路径分隔符 console.log(path.sep);//拼接绝对路径 console.log(path.resolve(__dirname, test));//解析路径 let pa…

一文学会 BootStrap

文章目录 认识BootStrap历史优缺点使用注意安装CDN源码引入包管理器 媒体查询屏幕尺寸的分割点&#xff08;Breakpoints&#xff09;响应式容器网格系统基本使用底层实现.container.row.col、.col-份数 网格嵌套自动布局列 Auto-layout响应式类 Responsive Class 响应式工具类-…

前端根据目录生成模块化路由routes

根据约定大于配置的逻辑&#xff0c;如果目录结构约定俗成&#xff0c;前端是可以根据目录结构动态生成路由所需要的 route 结构的&#xff0c;这个过程是要在编译时 进行&#xff0c;生成需要的代码&#xff0c;保证运行时的代码正确即可 主流的打包工具都有对应的方法读取文…

Qt(二)弹窗类 颜色对话框 字体对话框 资源文件

文章目录 一、QDebug类和QMessagebox类&#xff08;一&#xff09;QDebug类&#xff1a;打印调试类&#xff08;二&#xff09;QMessagebox类&#xff1a;弹窗类2. 修改组件图标&#xff08;1&#xff09;通过ui界面&#xff08;2&#xff09;通过QIcon的方式&#xff08;3&…

SpringBoot新手快速入门系列教程五:基于JPA的一个Mysql简单读写例子

现在我们来做一个简单的读写Mysql的项目 1&#xff0c;先新建一个项目&#xff0c;我们叫它“HelloJPA”并且添加依赖 2&#xff0c;引入以下依赖&#xff1a; Spring Boot DevTools (可选&#xff0c;但推荐&#xff0c;用于开发时热部署)Lombok&#xff08;可选&#xff0c…

如何在前端网页实现live2d的动态效果

React如何在前端网页实现live2d的动态效果 业务需求&#xff1a; 因为公司需要做机器人相关的业务&#xff0c;主要是聊天形式的内容&#xff0c;所以需要一个虚拟的卡通形象。而且为了更直观的展示用户和机器人对话的状态&#xff0c;该live2d动画的嘴型需要根据播放的内容来…

aardio —— 今日减bug

打字就减bug 鼠标双击也减bug 看看有多少bug够你减的 使用方法&#xff1a; 1、将资源附件解压缩&#xff0c;里面的文件夹&#xff0c;放到aardio\plugin\plugins 目录 2、aardio 启动插件 → 插件设置 → 选中“今日减bug” → 保存。 3、重启 aardio&#xff0c;等aa…

高效率写文案软件有哪些?5款免费文案生成器值得拥有

在信息洪流奔涌的当下&#xff0c;文案的重要性愈发凸显。对于文案创作者来说&#xff0c;找到能提高效率的软件至关重要&#xff0c;如&#xff1a;市面上有些不错的文案生成器&#xff0c;它们能够为大家自动生成出高质量文案内容&#xff0c;给文案创作者提供了非常大的帮助…

Python和MATLAB微机电健康推导算法和系统模拟优化设计

&#x1f3af;要点 &#x1f3af;惯性测量身体活动特征推导健康状态算法 | &#x1f3af;卷积网络算法学习惯性测量数据估计六自由度姿态 | &#x1f3af;全球导航卫星系统模拟&#xff0c;及惯性测量动态测斜仪算法、动态倾斜算法、融合算法 | &#x1f3af;微机电系统加速度…

vb.netcad二开自学笔记2:认识vs编辑器

认识一下宇宙第一编辑器的界面图标含义还是很重要的&#xff0c;否则都不知道面对的是什么还怎么继续&#xff1f; 一、VS编辑器中常见的图标的含义 变量 长方体&#xff1a;变量 局部变量 两个矩形块&#xff1a;枚举 预定义的枚举 紫色立方体&#xff1a;方法 橙色树状结构…

vs2022安装qt vs tool

1 缘由 由于工作的需要&#xff0c;要在vs2022上安装qt插件进行开发。依次安装qt&#xff0c;vs2022&#xff0c;在vs2022的扩展管理中安装qt vs tool。 2 遇到困难 问题来了&#xff0c;在qt vs tool的设置qt version中出现问题&#xff0c;设置msvc_64-bit时出现提示“invali…

理解GCN

一、从CNN到GNN 1、CNN可被视为一类特殊的GNN&#xff0c;相邻节点大小顺序固定的GNN。 2、利用消息传递进行节点分类的例子&#xff1a; 给定上面的图&#xff0c;和少量已经分类的节点&#xff08;红&绿&#xff09;&#xff0c;对剩余其他节点进行分类&#xff0c;这是…

C语言 do while 循环语句练习 中

练习&#xff1a; 4.编写代码&#xff0c;演示多个字符从两端移动&#xff0c;向中间汇聚 // 编写代码&#xff0c;演示多个字符从两端移动&#xff0c;向中间汇聚 //welcome to china!!! //w ! //we !! //wel !!! //.... //welco…

三、docker配置阿里云镜像仓库并配置docker代理

一、配置阿里云镜像仓库 1. 登录阿里云官网&#xff0c;并登录 https://www.aliyun.com/ 2. 点击产品 - 容器 - 容器与镜像服务ACR - 管理控制台 - 镜像工具 - 镜像加速器 二、配置docker代理 #1. 创建docker相关的systemd文件 mkdir -p /etc/systemd/system/docker.servic…