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

硬件组成:
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.mfbz.cn/a/777910.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据库测试|Elasticsearch和ClickHouse的对决

前言 数据库作为产品架构的重要组成部分&#xff0c;一直是技术人员做产品选型的考虑因素之一。 ClkLog会经常遇到小伙伴问支持兼容哪几种数据库&#xff1f;为什么是选择ClickHouse而不是这个或那个。 由于目前市场上主流的数据库有许多&#xff0c;这次我们选择其中一个比较典…

(软件06)串口屏的应用,让你的产品显得高级一点(下篇)

本文目录 学习前言 单片机代码实现 学习前言 目前市面上我记得好像有IIC的屏幕、SPI的屏幕、并口屏幕、还有就是今天我们介绍的这个串口屏了&#xff0c;串口屏&#xff0c;就是用串口进行通讯的&#xff0c;上篇我们已经介绍了屏幕供应商提供的上位机软件进行配置好了&#…

2000-2019年各省市资源错配指数

资源错配指数&#xff08;Misallocation Index&#xff09;是衡量一个地区或国家资源配置效率的重要经济指标。以下是对资源错配指数相关数据的介绍&#xff1a; 数据简介 定义&#xff1a;资源错配指数是一个反映生产要素配置合理性的指标&#xff0c;高指数意味着资源配置效…

Science期刊政策反转:允许生成式AI用于论文写作,意味着什么?

我是娜姐 迪娜学姐 &#xff0c;一个SCI医学期刊编辑&#xff0c;探索用AI工具提效论文写作和发表。 关于各大top期刊和出版社对于生成式AI用于论文写作中的规定&#xff0c;娜姐之前写过一篇文章&#xff1a; 如何合理使用AI写论文&#xff1f;来看Top 100学术期刊和出版社的…

Go 中的类型推断

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

昇思25天学习打卡营第08天 | 模型训练

昇思25天学习打卡营第08天 | 模型训练 文章目录 昇思25天学习打卡营第08天 | 模型训练超参数损失函数优化器优化过程 训练与评估总结打卡 模型训练一般遵循四个步骤&#xff1a; 构建数据集定义神经网络模型定义超参数、损失函数和优化器输入数据集进行训练和评估 构建数据集和…

东芝TB6560AHQ/AFG步进电机驱动IC:解锁卓越的电机控制性能

作为一名工程师&#xff0c;一直在寻找可靠且高效的组件来应用于你的项目中。东芝的TB6560AHQ/AFG步进电机驱动IC能够提供精准且多功能的电机控制&#xff0c;完全符合现代应用的高要求&#xff0c;保证高性能和易用性。在这篇文章中&#xff0c;我们将探讨TB6560AHQ/AFG的主要…

CentOS 7.9 停止维护(2024-6-30)后可用在线yum源 —— 筑梦之路

众所周知&#xff0c;centos 7 在2024年6月30日&#xff0c;生命周期结束&#xff0c;官方不再进行支持维护&#xff0c;而很多环境一时之间无法完全更新替换操作系统&#xff0c;因此对于yum源还是需要的&#xff0c;特别是对于互联网环境来说&#xff0c;在线yum源使用方便很…

直播预告 | VMware大规模迁移实战,HyperMotion助力业务高效迁移

2006年核高基专项启动&#xff0c;2022年国家79号文件要求2027年央国企100%完成信创改造……国家一系列信创改造政策的推动&#xff0c;让服务器虚拟化软件巨头VMware在中国的市场份额迅速缩水。 加之VMware永久授权的取消和部分软件组件销售策略的变更&#xff0c;导致VMware…

移动端UI风格营造舒适氛围

移动端UI风格营造舒适氛围

XXL-JOB中断信号感知

目录 背景 思路 实现逻辑 总结 背景 在使用xxl-job框架时&#xff0c;由于系统是由线程池去做异步逻辑&#xff0c;然后主线程等待&#xff0c;在控制台手动停止时&#xff0c;会出现异步线程不感知信号中断的场景&#xff0c;如下场景 而此时如果人工在控制台停止xxl-job执…

insert阻塞了insert?

一、发现问题 在arms监控页面看到某条insert语句的执行时长达到了431毫秒。 数据库中存在&#xff0c;insert语句受到了行锁阻塞&#xff0c;而阻塞的源头也在执行同样的insert语句&#xff0c;同样都是对表USERSYS_TASK_USER_LOG_TEMP01的插入操作&#xff0c;很是费解。 二…

idea创建的maven项目pom文件引入的坐标报红原因

如下所示 我们在引入某些依赖坐标的时候&#xff0c;即使点击了右上角的mavne刷新之后还是报红。 其实这是正常现象&#xff0c;实际上是我们的本地仓库当中没有这些依赖坐标&#xff0c;而idea就会通过报红来标记这些依赖来说明在我们的本地仓库是不存在的。 那有的同学就会…

ODOO17的邮件机制-系统自动推送修改密码的邮件

用户收到被要求重置密码的邮件&#xff1a; 我们来分析一下ODOO此邮件的工作机制&#xff1a; 1、邮件模板定义 2、渲染模板的函数&#xff1a; 3、调用此函数的机制&#xff1a; 当用户移除或增加了信任的设备&#xff08;如电脑、手机端等&#xff09;&#xff0c;系统会自…

农业气象站:现代农业的守护者与引领者

随着科技的飞速发展&#xff0c;农业领域也在经历着前所未有的变革。在这一变革中&#xff0c;农业气象站以其独特的功能和作用&#xff0c;逐渐成为了现代农业的守护者与引领者。 农业气象站&#xff0c;顾名思义&#xff0c;是专门用于观测和记录农田气象要素的设施。这些气象…

轻松设置:服务器域名配置全攻略

目录 前置条件 在阅读本篇内容之前&#xff0c;请先确保以下物料已准备好&#xff1a; 一台公网服务器&#xff0c;服务正常运行申请完成的域名&#xff0c;在对应域名服务商后台正常DNS解析域名备案完成可选条件&#xff1a;有https访问请求时&#xff0c;需要申请SSL证书 …

Android在framework层添加自定义服务的流程

环境说明 ubuntu16.04android4.1java version “1.6.0_45”GNU Make 3.81gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.12) 可能有人会问&#xff0c;现在都2024了怎么还在用android4版本&#xff0c;早都过时了。确实&#xff0c;现在最新的都是Android13、And…

在Linux环境下搭建Redis服务结合内网穿透实现通过GUI工具远程管理数据库

文章目录 前言1. 安装Docker步骤2. 使用docker拉取redis镜像3. 启动redis容器4. 本地连接测试4.1 安装redis图形化界面工具4.2 使用RDM连接测试 5. 公网远程访问本地redis5.1 内网穿透工具安装5.2 创建远程连接公网地址5.3 使用固定TCP地址远程访问 前言 本文主要介绍如何在Li…

Python处理表格数据常用的 N+个操作

Python作为一种强大且易用的编程语言&#xff0c;其在数据处理方面表现尤为出色。特别是当我们面对大量的表格数据时&#xff0c;Python的各类库和工具可以极大地提高我们的工作效率。以下&#xff0c;我将详细介绍Python处理表格数据常用的操作。 首先&#xff0c;我们需要安…

【算法笔记自学】第 3 章 入门篇(1)——入门模拟

3.1简单模拟 自己写的题解 #include <stdio.h> #include <stdlib.h> int main() {int N;int num0;scanf("%d",&N);while(N!1){if(N%20){NN/2;}else{N(3*N1)/2;}num;}printf("%d",num);system("pause"); // 防止运行后自动退出&…