便携式人体脉搏检测系统(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!

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务&nbsp;ACK 容器服务&nbsp;Kubernetes&nbsp;版(简称&nbsp;ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情:&nbsp;https://www.aliyun.com/product/kubernetes
目录
相关文章
|
7天前
|
传感器
光学雨量计红外雨量传感器在降水监测上具有许多优势和特点
光学雨量计红外雨量传感器在降水监测上具有许多优势和特点
光学雨量计红外雨量传感器在降水监测上具有许多优势和特点
|
7天前
|
传感器 安全
光学雨量计红外雨量传感器在降水监测上的优势与特点
光学雨量计红外雨量传感器在降水监测上的优势与特点
光学雨量计红外雨量传感器在降水监测上的优势与特点
|
1天前
|
传感器 存储 编解码
光学雨量计雨量传感器技术的优势与应用范围
光学雨量计雨量传感器技术的优势与应用范围
光学雨量计雨量传感器技术的优势与应用范围
|
9月前
|
传感器
红外雨量计(光学雨量传感器)调试步骤
红外雨量计是一种常见的雨量监测设备,下面是红外雨量计的调试步骤:
红外雨量计(光学雨量传感器)调试步骤
|
5月前
|
传感器 监控 安全
光学雨量计:更灵敏可靠、更智能的降雨监测工具
光学雨量计:更灵敏可靠、更智能的降雨监测工具 降雨量信息是评估大气环境和降水研究的关键指标,也是环境监测和农业安全监测的重要参数。目前,我们通常使用翻斗式或光学雨量计来监测降雨量,这些工具能够感知自然界的降雨量,并将其转换为相应的开关信号输出,以满足信息传输、处理、记录和显示的需求。
光学雨量计:更灵敏可靠、更智能的降雨监测工具
|
9月前
|
传感器 安全
红外雨量计(光学雨量传感器)在预防地质灾害中怎样发挥作用
红外雨量计是一种利用红外线原理测量雨量的设备。在预防地质灾害中,红外雨量计可以发挥以下作用:
红外雨量计(光学雨量传感器)在预防地质灾害中怎样发挥作用
|
11月前
|
传感器 存储 编解码
光学雨量计红外雨量传感器的常见问题
光学雨量计是基于红外光受雨滴影响原理的间接式降雨量检测传感器,检测精度、 准确性与雨滴大小、密度、降落速度等诸多因素有关,对于某种特定的均匀的降雨,通过系数修正,检测灵敏度和精度可以很高,但自然界中的真实降雨是复杂的且上述影响因素是连续或非连续不断变化的,故此很难做到检测数据与实际降雨的一致,我们也在不断改进检测方法、算法,构建尽量多尽量准确的数学模型,最大限度的修正检测数据。随着固件程序以及硬件的不断升级改进,检测精度也在不断提高。
光学雨量计红外雨量传感器的常见问题
|
11月前
|
监控 安全 异构计算
头盔佩戴检测(行人跟踪技术检测)
头盔佩戴检测(行人跟踪技术检测)
247 0
头盔佩戴检测(行人跟踪技术检测)
|
传感器 存储 编解码
光学雨量计红外雨量传感器的一些常见问题(2)
关于输出百分比 输出百分比寄存器 OUT_PER 内存储的是当前已检测到的变化量与预设输出分辨率 S_CNT 的值之比的百分率表示,每次信号输出后此值自动归零,并根据实时检测到的降雨数据实时更新,当达到 100 时再次输出一次信号。可以通过数字接口读取 OUT_PER 寄存器,获得更加实时、高分辨率的降雨信息。
光学雨量计红外雨量传感器的一些常见问题(2)
|
传感器 存储 编解码
光学雨量计红外雨量传感器的一些常见问题(1)
关于降雨总量寄存器 降雨总量寄存器内存储的是信号输出次数,每发生一次信号输出时自增 1 并永久存储。故此可在任意时刻通过数字接口读取获得总的输出次数,乘以输出分辨率即是以 mm 为单位的降雨总量,而无需时刻关注传感器的每次信号输出。默认参数时,输出分辨率寄存器 S_CNT 的值为 20000,表示分辨率 0.2mm,若读取降雨总量寄存器 R_TOTAL 的值为 100,则 100*0.2=20mm,即为降雨总量。
光学雨量计红外雨量传感器的一些常见问题(1)

相关课程

更多