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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 265|回復: 3
收起左側

單片機程序 心率數據顯示不對

[復制鏈接]
ID:1142165 發表于 2025-3-31 16:44 | 顯示全部樓層 |閱讀模式
#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 HeartRateSensor = P3^3;
#define LCD_DATA P0
// 定義蜂鳴器引腳
sbit BUZZER = P1^7;
// 定義MAX30102的SDA引腳
sbit SDA = P3^4;
sbit INT = P3^2;

// 溫度上下限設置
#define TEMP_LOWER 35
#define TEMP_UPPER 40

// 函數聲明
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 相關函數聲明
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;            // 定時器中斷計數變量
// 聲明 str 數組為全局變量
static unsigned char str[10];

// 全局變量用于心率計算
unsigned int pulse_count = 0;
unsigned int prev_pulse_count = 0;
unsigned int heart_rate = 0;
uint  temp;                   // 臨時變量
uint  count; // 計數
float tempF;
bit   flag_S = 0;

// 定時器0初始化函數
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); // 設置 16x2 顯示,5x7 點陣,8 位數據
    delay_ms(5);
    lcd_command(0x38);
    delay_ms(5);
    lcd_command(0x38);
    lcd_command(0x0C); // 打開顯示,關閉光標
    lcd_command(0x06); // 光標右移,字符不移動
    lcd_command(0x01); // 清屏
    delay_ms(5);
}

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

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

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

// 顯示心率
void display_heart_rate(unsigned int heart_rate)
{
    lcd_command(0x87); // 設置顯示位置
    sprintf(str, "%d bpm ", heart_rate);
    lcd_string(str);
}

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

void delay(uint t) // @12T 1us
{
    while (t--);
}

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

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

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

float ds18b20_read_temp(void)
{
    Init_DS18b20();  // 初始化18b20
    write_byte(0xcc); // 跳過讀寫序列號
    write_byte(0x44); // 啟動溫度轉換
    Init_DS18b20();  // 初始化18b20
    write_byte(0xCC); // 跳過讀寫序列號
    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++;
    if (i >= 500)                                // 0.5秒
    {
        i = 0;
        flag_S = 1;                        // 0.5秒標志
    }
}

// 外部中斷 0 服務函數,用于檢測心率脈沖
void External0_ISR() interrupt 0
{
    TR0 = 0;                                        // 關定時器0
    D_num = count;                        // 讀取定時器1ms中斷計數值
    count = 0;                                        // 定時器1ms中斷計數值清0
    TH0 = 0xFC;
    TL0 = 0x18;
    TR0 = 1;                                        // 開定時器0
}

// 主程序
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;  // 下降沿觸發
    EX0 = 1;  // 使能外部中斷 0
    EA = 1;   // 使能全局中斷
    IE0 = 0;         // INT0中斷請求標志清0

    while (1)
    {
        if (flag_S) // 0.5秒
        {
            flag_S = 0;
            heart_rate = DASE / D_num;        // 計算心率
            display_heart_rate(heart_rate);
            // 獲取溫度
            temperature = ds18b20_read_temp();
            display_temperature(temperature);

            // 溫度報警檢查
            if (temperature < TEMP_LOWER || temperature > TEMP_UPPER)
            {
                BUZZER = 0;  // 蜂鳴器響
                delay_ms(500);  // 響一段時間
            }
            else
            {
                BUZZER = 1;  // 溫度正常,關閉蜂鳴器
            }
        }
    }
}
回復

使用道具 舉報

ID:67526 發表于 2025-4-17 09:12 | 顯示全部樓層
sbit HeartRateSensor = P3^3;改為sbit HeartRateSensor = P3^2;或者改外中斷號
回復

使用道具 舉報

ID:67526 發表于 2025-4-17 09:14 | 顯示全部樓層
sbit HeartRateSensor = P3^3;改為sbit HeartRateSensor = P3^2;或者在程序中改外相應的中斷號
回復

使用道具 舉報

ID:1137639 發表于 2025-4-19 22:44 | 顯示全部樓層
sbit HeartRateSensor = P3^3;改為sbit HeartRateSensor = P3^2;或者改外中斷號
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 黄视频网址 | www.国产视频| 欧美精品在线播放 | 国产成人精品一区 | 国产精品日韩欧美一区二区三区 | 中文字幕日韩欧美 | 国产亚洲成av人片在线观看桃 | 精品久久久久香蕉网 | 一级久久久久久 | av黄色在线播放 | 欧美成人免费在线 | 国产日产欧产精品精品推荐蛮挑 | 亚洲第一天堂无码专区 | 欧美日韩在线观看一区 | 国产精品久久久久久久久久三级 | 午夜网站视频 | 亚洲aⅴ| 产真a观专区 | 国产精品美女久久久久久免费 | 成人免费观看视频 | 日韩午夜 | 天天曰天天干 | 亚洲国产精品人人爽夜夜爽 | 亚洲在线一区 | 一区二区三区国产视频 | 91精品国产综合久久香蕉922 | 午夜视频在线观看网站 | 国产日产欧产精品精品推荐蛮挑 | 成人做爰www免费看视频网站 | 中文字幕在线精品 | 亚州春色 | 久久精品国产一区 | 美国av毛片 | 日韩羞羞 | 91电影 | 国产一区视频在线 | 亚洲在线视频 | 日韩午夜一区二区三区 | 亚洲免费在线视频 | 在线高清免费观看视频 | 亚洲一区二区久久 |