便携式人体脉搏检测系统(1)

简介: 分步实现便携式人体脉冲监测系统

PCF8951+I2C+STC89C52 ADC采集与输出

I2C

IIC是一种多向控制总线,也就是说多个芯片可以连接到同一总线结构下,同时每个芯片都可以作为实时数据传输的控制源。主要包括启始、停止、读、写、应答信号。这种方式简化了信号传输总线接口。

IIC总线上可以挂多个器件,而每个器件都有唯一的地址,这样可以标识通信目标。数据的通信的方式采用主从方式,主机负责主动联系从机,而从机则被动回应数据。
1

1.I2C总线信号

(1)开始和停止信号
3

  • 开始信号:SCL=1,SDA下降沿;
void start()
{
    SDA = 1;     //初始时,SDA=1
    SCL = 1;     //初始时,SCL=1
    delay();     //保持时间大于4.7us
    SDA = 0;     //SDA下降沿
    delay();     //SDA下降沿保持时间大于4.0us
}
  • 停止信号:SCL=1,SDA为上升沿。
void stop()
{
    SDA = 0;    //初始时,SDA=0;
    SCL = 1;    //初始时,SCL=1;
    delay();    //保持时间大于4.0us
    SDA = 1;   //SDA上升沿
    delay();   //保持时间大于4.7us
}

(2)应答信号
18

void ack()
{
    uchar i = 0;     //定义缓冲变量
    SCL = 1;
    delay();
    while(SDA == 1 && i < 250)i++;    //稳定时间大于4us
    SCL = 0;   //SCL=0时,SDA数据才可以改变
    delay();
}

2.I2C总线数据传输条件

2

  • SCL=1时,SDA必须保持稳定;
  • SCL=0时,SDA才允许改变。

3.I2C总线读写操作

6
(1) 数据传送规则:

  • 每传送一个字节时必须保证是8位长度;
  • 数据传送时,先传送最高位(MSB);
  • 每个被传送的字节后面,跟随一位应答信号,即一帧实际共有9位。

(2)数据传送流程:

  • 主机向总线发送一个字节的数据后,释放总线,从机拉低总线(即应答信号),表示这一字节发送成功;
  • 主机从总线读取完一个字节的数据后,主机把总线拉低,表示这一字节发送成功。

a.写入数据
9

void write_byte(uchar dat)
{
    uchar i;
    for(i = 0; i < 8; i++)
    {
        dat = dat << 1;    //先写最高位,通过左移运算符,将一个字节的数据一位一位的传送到总线上     
        SCL = 0;     //SCL=0,从机准备接收数据         
        delay();
        SDA = CY;     //CY存储的是左移后的进位
        delay();
        SCL = 1;
        delay();
    }
    SCL = 0;      //8位数据传输完后,释放SDA,准备接收应答位              
    SDA = 1;      // 释放SDA           
    delay();
}

b.读取数据
10

uchar read_byte()
{
    uchar dat = 0, tmp, i;
    SCL = 0;    //SCL=0,准备接收数据
    delay();
    for(i = 0; i < 8; i++)
    {
        SCL = 1;     //SCL = 1,SDA稳定,准备读取数据     
        delay();
        tmp = SDA;     //读取此时SDA的状态       
        dat = dat << 1;    //先写最高位,通过左移运算符,将一个字节的数据一位一位的传送到总线上     
        dat = dat | tmp;    //读数据位,接收的数据位放在dat中
        delay();
        SCL = 0;    //释放SDA总线,为下一次读取做准备       
        delay();
    }
    return dat;   //  返回读取的dat值
}

4.I2C总线初始化

void I2C_init()               
{
    SDA = 1;   
    delay();
    SCL = 1;   
    delay();
}

PCF8951

PCF8591是单片、单电源低功耗8位CMOS数据采集器件,具有4个模拟输入、一个输出和一个串行I2C总线接口。3个地址引脚A0、A1 和A2 用于编程硬件地址,允许将最多8个器件连接至I2C总线而不需要额外硬件。器件的地址、控制和数据通过两线双向I2C总线传输。器件功能包括多路复用模拟输入、片上跟踪和保持功能、8位模数转换和8位数模拟转换。最大转换速率取决于I2C总线的最高速率。

1.器件地址

总线启动后,发送的第一个字节。
11
12
由电路原理图可知,A0 A1 A2均为0,所以:

  • lsb=0时,即器件地址为0x90时,表示主机向从机写数据,下一个字节向总线写入数据;
  • lsb=1时,即器件地址为0x91时,表示主机从从机读数据,下一个字节从总线读取数据。

2.控制字

总线启动后,发送的第二个字节。
16

  • msb,默认为0;
  • 第6位,选择是否允许模拟电压输出,DA转换时设置为1,AD转换时设置为0或1均可;
  • 第5/4位,选择模拟电压输出方式;
  • 第3位,默认为0;
  • 第2位,是自动增量使能位,设置1后,每次A/D 转换后通道号将自动增加;
  • 第1/0位,是在AD转换时选择输入的电压转换为数字量的通道。
    17

3.ADC

将AIN端口输入的模拟电压转换为数字量并发送到总线上。
14

uchar Read_D(uchar Channel)        
{
    uchar dat;    //定义缓存变量
    start();     //启动I2C总线
    write_byte(0x90);        //向总线写入从机地址09x0,表示下一个字节向总线写入数据    ,+0,主机发送数据            
    ack();    //应答信号
    write_byte(Channel);     //向总线写入控制字Channel表示通道1        
    ack();    //应答信号
    start();     //重复启动I2C总线,读写方向和上一次相反
    write_byte(0x91);        //向总线写入从机地址09x1,表示下一个字节从总线读取数据    ,+1,主机接收数据                        
    ack();    //应答信号
    dat=read_byte();    //读取数据并赋给变量dat                    
    ack();    //应答信号
    stop();    //停止I2C总线
    return dat;   //返回读取的数据值
}

4.DAC

将从总线上接收到的数字量通过AOUT输出。
15

void Out_A(uchar Digital)              
{
    start();     //启动I2C总线
    write_byte(0x90);        //向总线写入主机地址09x0,表示下一个字节向总线写入数据,+0,主机发送数据                      
    ack();   //应答信号
    write_byte(0x40);     //向总线写入控制字0x40,允许模拟输出,不自增单端,通道0             
    ack();   //应答信号
    write_byte(Digital);        //向总线写入要转换的数字量Digital
    ack();   //应答信号 
    stop();   //停止I2C总线          
}

主函数

void main()
{
    I2C_init() ;    //I2C总线初始化
    dat1 = Read_D(0x01);    //将通道1的模拟量转化为数字量,并读取  
    delay();    
    Out_A(dat1);     //将数字量转化为模拟量输出                       
    delay(); 
}

END!

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
7月前
|
传感器 监控 算法
LabVIEW风力机智能叶片控制系统
LabVIEW风力机智能叶片控制系统
28 1
|
存储 数据采集 算法
巡检机器人之仪表识别系统
巡检机器人—— 数字表计识别、指针表计识别。
266 0
巡检机器人之仪表识别系统
|
传感器 监控 安全
光学雨量计:更灵敏可靠、更智能的降雨监测工具
光学雨量计:更灵敏可靠、更智能的降雨监测工具 降雨量信息是评估大气环境和降水研究的关键指标,也是环境监测和农业安全监测的重要参数。目前,我们通常使用翻斗式或光学雨量计来监测降雨量,这些工具能够感知自然界的降雨量,并将其转换为相应的开关信号输出,以满足信息传输、处理、记录和显示的需求。
光学雨量计:更灵敏可靠、更智能的降雨监测工具
|
传感器 安全
红外雨量计(光学雨量传感器)在预防地质灾害中怎样发挥作用
红外雨量计是一种利用红外线原理测量雨量的设备。在预防地质灾害中,红外雨量计可以发挥以下作用:
红外雨量计(光学雨量传感器)在预防地质灾害中怎样发挥作用
|
监控 安全 异构计算
头盔佩戴检测(行人跟踪技术检测)
头盔佩戴检测(行人跟踪技术检测)
头盔佩戴检测(行人跟踪技术检测)
|
传感器 算法
基于STM32设计的健康检测设备(测温心率计步)
本文介绍的项目是基于STM32设计的健康检测设备,支持体温测量,心率检测,支持运动计步(采用MPU6050陀螺仪实现),支持WIFI传输数据到手机APP打印显示。
398 0
|
传感器 机器学习/深度学习 监控
基于环境传感器的跌倒检测
在智能监控领域中,基于深度学习的跌倒检测算法已经成为热门的研究方向,具体是利用卷积神经网络检测人体关键点以提取姿态信息,作为获取跌倒动作特征的重要前提,但目标的多尺度问题、人体姿态多样性及复杂场景因素的干扰会产生姿态遮挡和丢失现象,不利于跌倒特征的提取,并且在对跌倒动作进行检测时容易受到相似行为的影响,这些问题给算法的研究增加了难度。
658 0
|
传感器 机器学习/深度学习 人工智能
基于可穿戴设备的跌倒检测
跌倒是老年人发生意外事故甚至死亡的重要危险因素。因此,对跌倒风险准确预估,及时有效地实现跌倒检测非常重要。随着物联网技术和人工智能的迅速发展,可穿戴设备在跌倒检测中的应用得到越来越广泛的关注。
840 0
|
传感器 编解码 监控
基于传感器的人体生命体征监控技术
基于传感器的人体生命体征监控技术
基于传感器的人体生命体征监控技术
Sooth打造新型智能头盔,通过传感器可实时检测各项身体指标
将多个嵌入式传感器和智能头盔相结合,配备一个集成的应用程序,以此来预测用户是否有中暑征兆。
310 0