久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 63|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

心率沒有數(shù)據(jù),求大神解答

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:1142165 發(fā)表于 2025-4-11 16:09 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
#include <reg52.h>
#include <intrins.h>
#include <stdio.h>


#define uint unsigned int
#define uchar unsigned char
#define DASE 60000

// 定義 LM016L 引腳
sbit RS = P2^7;
sbit RW = P2^6;
sbit EN = P2^5;
// 定義 DS18B20 引腳
sbit DQ = P1^0;
// 定義心率引腳
sbit SCL = P3^3;
sbit SDA = P3^4;
sbit INT = P3^2;
// 定義MAX30102的I2C地址
#define MAX30102_ADDR 0xAE
// 定義蜂鳴器引腳
#define LCD_DATA P0
//定義蜂鳴器引腳
sbit BUZZER = P3^6;

// 函數(shù)聲明
void delay_us(unsigned int us);
void delay_ms(unsigned int ms);
void lcd_init();
void lcd_command(unsigned char cmd);
void lcd_data(unsigned char dat);
void lcd_string(const char *str);
void display_heart_rate(unsigned int heart_rate);
void display_temperature(float temperature);
// DS18B20 相關(guān)函數(shù)聲明
bit ds18b20_reset(void);
void ds18b20_write_byte(unsigned char dat);
unsigned char ds18b20_read_byte(void);
float ds18b20_read_temp(void);

uint  D_num;            // 定時(shí)器中斷計(jì)數(shù)變量
// 聲明 str 數(shù)組為全局變量
static unsigned char str[10];

// 全局變量用于心率計(jì)算
unsigned int pulse_count = 0;
unsigned int prev_pulse_count = 0;
unsigned int heart_rate = 0;
uint  temp;                   // 臨時(shí)變量
uint  count; // 計(jì)數(shù)
float tempF;
bit   flag_S = 0;
bit   flag_1s = 0;
unsigned int one_second_count = 0;

// 新增變量用于蜂鳴器控制
bit buzzer_alarm = 0;         // 蜂鳴器報(bào)警標(biāo)志

// 定時(shí)器0初始化函數(shù)
void InitTimer0(void)
{
    TMOD = 0x01;
    TH0 = 0xFC;
    TL0 = 0x18;
    EA = 1;
    ET0 = 1;
    TR0 = 1;
}

void delay_ms(unsigned int ms) // @12MHz
{
    unsigned i, j;
    for (i = ms; i > 0; i--)
        for (j = 120; j > 0; j--);
}

// 初始化 LCD
void lcd_init()
{
    delay_ms(15);
    lcd_command(0x38); // 設(shè)置 16x2 顯示,5x7 點(diǎn)陣,8 位數(shù)據(jù)
    delay_ms(5);
    lcd_command(0x38);
    delay_ms(5);
    lcd_command(0x38);
    lcd_command(0x0C); // 打開顯示,關(guān)閉光標(biāo)
    lcd_command(0x06); // 光標(biāo)右移,字符不移動(dòng)
    lcd_command(0x01); // 清屏
    delay_ms(5);
}

// 發(fā)送 LCD 命令
void lcd_command(unsigned char cmd)
{
    RS = 0;
    RW = 0;
    LCD_DATA = cmd;
    delay_ms(1);
    EN = 1;
    _nop_();
    EN = 0;
}

// 發(fā)送 LCD 數(shù)據(jù)
void lcd_data(unsigned char dat)
{
    RS = 1;
    RW = 0;
    LCD_DATA = dat;
    delay_ms(1);
    EN = 1;
    _nop_();
    EN = 0;
}

// 發(fā)送字符串到 LCD
void lcd_string(const char *str)
{
    while (*str)
    {
        lcd_data(*str++);
    }
}

// 微秒級(jí)延時(shí)函數(shù)
void delay(uint t) // @12T 1us
{
    while (t--);
}

// I2C起始信號(hào)
void I2C_Start() {
    SDA = 1;
    SCL = 1;
    delay(1);
    SDA = 0;
    delay(1);
    SCL = 0;
}

// I2C停止信號(hào)
void I2C_Stop() {
    SDA = 0;
    SCL = 1;
    delay(1);
    SDA = 1;
    delay(1);
}

// I2C發(fā)送一個(gè)字節(jié)
void I2C_SendByte(unsigned char dat) {
    unsigned char i;
    for (i = 0; i < 8; i++) {
        SDA = (dat & 0x80) >> 7;
        dat <<= 1;
        SCL = 1;
        delay(1);
        SCL = 0;
        delay(1);
    }
}

// I2C接收一個(gè)字節(jié)
unsigned char I2C_ReceiveByte() {
    unsigned char i, dat = 0;
    SDA = 1;
    for (i = 0; i < 8; i++) {
        SCL = 1;
        dat <<= 1;
        if (SDA) dat |= 0x01;
        SCL = 0;
        delay(1);
    }
    return dat;
}

// I2C發(fā)送應(yīng)答信號(hào)
void I2C_SendAck(bit ack) {
    SDA = ack;
    SCL = 1;
    delay(1);
    SCL = 0;
    delay(1);
}

// I2C接收應(yīng)答信號(hào)
bit I2C_ReceiveAck() {
    bit ack;
    SDA = 1;
    SCL = 1;
    ack = SDA;
    SCL = 0;
    delay(1);
    return ack;
}

// 向MAX30102寫一個(gè)字節(jié)數(shù)據(jù)
void MAX30102_WriteByte(unsigned char reg, unsigned char dat) {
    I2C_Start();
    I2C_SendByte(MAX30102_ADDR & 0xFE);  // 寫地址
    I2C_ReceiveAck();
    I2C_SendByte(reg);
    I2C_ReceiveAck();
    I2C_SendByte(dat);
    I2C_ReceiveAck();
    I2C_Stop();
}

// 從MAX30102讀一個(gè)字節(jié)數(shù)據(jù)
unsigned char MAX30102_ReadByte(unsigned char reg) {
    unsigned char dat;
    I2C_Start();
    I2C_SendByte(MAX30102_ADDR & 0xFE);  // 寫地址
    I2C_ReceiveAck();
    I2C_SendByte(reg);
    I2C_ReceiveAck();
    I2C_Start();
    I2C_SendByte(MAX30102_ADDR | 0x01);  // 讀地址
    I2C_ReceiveAck();
    dat = I2C_ReceiveByte();
    I2C_SendAck(1);  // 非應(yīng)答
    I2C_Stop();
    return dat;
}

// 初始化MAX30102
void MAX30102_Init() {
    MAX30102_WriteByte(0x09, 0x03);  // 配置采樣率等
    MAX30102_WriteByte(0x0A, 0x27);  // 配置LED等
    MAX30102_WriteByte(0x0C, 0x00);  // FIFO_WR_PTR = 0
    MAX30102_WriteByte(0x0D, 0x00);  // FIFO_OVF_CTR = 0
    MAX30102_WriteByte(0x0E, 0x00);  // FIFO_RD_PTR = 0
}
// 顯示心率
void display_heart_rate(unsigned int heart_rate)
{
    lcd_command(0x87); // 設(shè)置顯示位置
    sprintf(str, "%d bpm ", heart_rate);
    lcd_string(str);
}

// 顯示溫度
void display_temperature(float temperature)
{
    lcd_command(0xC7); // 設(shè)置顯示位置
    if (temperature == -1)
    {
        sprintf(str, "Err");
    }
    else
    {
        temperature += 4.2;
        sprintf(str, "%.1f C", temperature);
    }
    lcd_string((const char *)str);
}

void Init_DS18b20() // 18b20初始化函數(shù)
{
    DQ = 1;    // DQ復(fù)位
    delay(8);
    DQ = 0;    // 釋放DQ
    delay(80); // DS18B20收到信號(hào)后延時(shí)
    DQ = 1;   // 讀取DQ
    delay(30);
}

void write_byte(uchar dat) // 寫時(shí)序
{
    uchar i = 0;
    for (i = 8; i > 0; i--)
    {
        DQ = 0;
        DQ = dat & 0x01; // 寫1,在15微秒內(nèi)拉低
        delay(5); // 寫0,拉低60微秒
        DQ = 1;
        dat >>= 1;
    }
    delay(4);
}

uchar read_byte() // 讀時(shí)序
{
    uchar i = 0;
    uchar dat = 0;
    for (i = 8; i > 0; i--)
    {
        DQ = 0; // 拉低ds18b20單總線
        dat >>= 1;
        DQ = 1; // 15微秒內(nèi)拉釋放總線
        if (DQ)
            dat |= 0x80;
        delay(4);
    }
    return (dat);
}

float ds18b20_read_temp(void)
{
    Init_DS18b20();  // 初始化18b20
    write_byte(0xcc); // 跳過讀寫序列號(hào)
    write_byte(0x44); // 啟動(dòng)溫度轉(zhuǎn)換
    Init_DS18b20();  // 初始化18b20
    write_byte(0xCC); // 跳過讀寫序列號(hào)
    write_byte(0xBE); // 讀溫度寄存器
    temp = read_byte(); // 讀取溫度低8位
    temp = read_byte() << 8 | temp; // 讀取溫度高8位
    tempF = temp * 0.0625;
    return tempF;
}

void Timer0Interrupt() interrupt 1
{
    static uint i;
    TH0 = 0xFC;
    TL0 = 0x18;
    count++;
    i++;
    one_second_count++;
    if (i >= 500)                                // 0.5秒
    {
        i = 0;
        flag_S = 1;                        // 0.5秒標(biāo)志
    }
    if (one_second_count >= 1000) // 1秒
    {
        one_second_count = 0;
        flag_1s = 1;
    }
}

// 外部中斷 0 服務(wù)函數(shù),用于檢測心率脈沖
void External0_ISR() interrupt 0
{
    static uint last_time = 0;
    uint current_time = count;
    if (current_time - last_time > 20) // 消抖處理,20ms
    {
        pulse_count++;
        last_time = current_time;
    }
}

// 主程序
void main()
{
    float temperature = 0.0;
    unsigned int time_count = 0;
    // 初始化 LCD
    lcd_init();
    lcd_string("Heart: ");
    lcd_command(0xC0); // 第二行
    lcd_string("Temp: ");
    InitTimer0();
    // 初始化外部中斷 0
    IT0 = 1;  // 下降沿觸發(fā)
    EX0 = 1;  // 使能外部中斷 0
    EA = 1;   // 使能全局中斷
    IE0 = 0;         // INT0中斷請(qǐng)求標(biāo)志清0

    while (1)
    {
        if (flag_S) // 0.5秒
        {
            flag_S = 0;
            // 獲取溫度
            temperature = ds18b20_read_temp();
            temperature += 4.2;
            display_temperature(temperature);

            // 溫度報(bào)警檢查
            if (temperature <  30.8 || temperature > 35.8)
            {
                buzzer_alarm = 1;
                if (count % 2 == 0) { // 以1秒為周期閃爍鳴叫
                    BUZZER = 0;
                } else {
                    BUZZER = 1;
                }
            }
            else
            {
                buzzer_alarm = 0;
                BUZZER = 1;
            }
        }
        if (flag_1s) // 1秒
        {
            flag_1s = 0;
            heart_rate = pulse_count * 60; // 計(jì)算心率
            display_heart_rate(heart_rate);
            pulse_count = 0; // 清零脈沖計(jì)數(shù)
        }
    }
}有沒有大神幫幫我

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 欧美国产精品一区二区 | 91看片网 | 中文字幕国产精品 | 亚洲欧洲在线观看视频 | 欧美视频一区二区三区 | aacc678成免费人电影网站 | 免费一级片 | 欧美日本在线观看 | 日韩精品a在线观看图片 | 国产精久久久久久久妇剪断 | 天天干天天玩天天操 | 韩国久久精品 | 先锋av资源在线 | 国产精品视频久久久久 | 超碰8| 久草a√ | 久久久日韩精品一区二区三区 | 亚洲不卡视频 | 国产精品视频久久久 | 精品欧美一区二区中文字幕视频 | 丁香五月网久久综合 | 中文字幕免费 | 欧美亚洲国语精品一区二区 | 看片地址| 日本黄色激情视频 | 天天综合成人网 | 亚洲黄色av | h漫在线观看 | 午夜精品久久久久久久久久久久久 | 91se在线 | 亚洲精品久久久久久久不卡四虎 | 91精品国产色综合久久不卡98 | 97视频在线观看免费 | 久久国产一区二区三区 | 亚洲国产网站 | 午夜视频在线免费观看 | 国产精品久久久久一区二区三区 | 日韩精品免费 | 成人国内精品久久久久一区 | 狠狠狠色丁香婷婷综合久久五月 | 国产精品a久久久久 |