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

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

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 421|回復(fù): 1
收起左側(cè)

怎么給這個(gè)程序加一個(gè)上下限和警報(bào)

[復(fù)制鏈接]
ID:1142165 發(fā)表于 2025-3-5 14:42 | 顯示全部樓層 |閱讀模式
屏幕截圖 2025-03-05 143744.png
#include <reg52.h>
#include <intrins.h>
#include <stdio.h>
#define uint unsigned int
#define uchar unsigned char
#define DASE 60000
// 定義 LM016L 引腳
sbit RS = P2^2;
sbit RW = P2^1;
sbit EN = P2^0;
// 定義 DS18B20 引腳
sbit DQ = P1^4;
// 定義心率引腳
sbit HeartRateSensor = P3^2;
#define LCD_DATA P0

// 函數(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;

// 定時(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); // 打開(kāi)顯示,關(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++);
        }
}

// 顯示心率
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
        {
                sprintf(str, "%.1f C", temperature);
        }
        lcd_string((const char *)str);
}
/*
// 修改復(fù)位函數(shù)使用精確延時(shí)
bit ds18b20_reset(void)
{
    bit presence;
    DQ = 0;
    delay_us(480); // 拉低至少 480us
    DQ = 1;
    delay_us(60);  // 等待 15 - 60us
    presence = !DQ;
    delay_us(420); // 等待 480 - 960us
    return presence;
}

// 向 DS18B20 寫一個(gè)字節(jié)
void ds18b20_write_byte(unsigned char dat)
{
    unsigned char i;
    for (i = 0; i < 8; i++)
        {
        DQ = 0;
        _nop_();
        DQ = dat & 0x01;
        delay_us(60); // 使用精確延時(shí)函數(shù)
        DQ = 1;
        dat >>= 1;
    }
}

// 從 DS18B20 讀一個(gè)字節(jié)
unsigned char ds18b20_read_byte(void)
{
    unsigned char i, dat = 0;
    for (i = 0; i < 8; i++)
        {
        DQ = 0;
        _nop_();
        DQ = 1;
        _nop_();
        if (DQ)
                {
            dat |= (1 << i);
        }
        delay_us(60); // 使用精確延時(shí)函數(shù)
    }
    return dat;
}

// 讀取 DS18B20 的溫度值
float ds18b20_read_temp(void)
{
    unsigned char low_byte, high_byte;
    int temp_value;
    float temperature;
    int retry = 3;  // 重試次數(shù)
    int reset_failure_count = 0;

    while (retry--)
        {
        if (ds18b20_reset())
                {
            reset_failure_count++;
            continue; // 復(fù)位失敗,重試
        }
        ds18b20_write_byte(0xCC); // 跳過(guò) ROM 操作
        ds18b20_write_byte(0x44); // 啟動(dòng)溫度轉(zhuǎn)換
        delay_ms(750); // 等待轉(zhuǎn)換完成

        low_byte = ds18b20_read_byte();
        high_byte = ds18b20_read_byte();

        temp_value = (high_byte << 8) | low_byte;
        temperature = (float)temp_value * 0.0625;

        return temperature;
    }
}*/

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

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);
}
//void Read_Temperature()//讀取溫度函數(shù)
float ds18b20_read_temp(void)
{
        Init_DS18b20();  //初始化18b20
        write_byte(0xcc);//跳過(guò)讀寫序列號(hào)
        write_byte(0x44);//啟動(dòng)溫度轉(zhuǎn)換
        Init_DS18b20();  //初始化18b20
        write_byte(0xCC);//跳過(guò)讀寫序列號(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++;
        if(i>=500)                                //0.5秒
        {
                i=0;
                flag_S=1;                        //0.5秒標(biāo)志
        }
}
// 外部中斷 0 服務(wù)函數(shù),用于檢測(cè)心率脈沖
void External0_ISR() interrupt 0
{
        TR0=0;                                        //關(guān)定時(shí)器0
        D_num=count;                        //讀取定時(shí)器1ms中斷計(jì)數(shù)值
        count=0;                                        //定時(shí)器1ms中斷計(jì)數(shù)值清0
        TH0 = 0xFC;
        TL0 = 0x18;
        TR0=1;                                        //開(kāi)定時(shí)器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;  // 下降沿觸發(fā)
        EX0 = 1;  // 使能外部中斷 0
        EA = 1;   // 使能全局中斷
        IE0 = 0;         //INT0中斷請(qǐng)求標(biāo)志清0      
        while(1)
        {
                if(flag_S)//0.5秒
                {
                        flag_S=0;
                        heart_rate = DASE/D_num;        //計(jì)算心率
                        display_heart_rate(heart_rate);
                        // 獲取溫度
                        temperature = ds18b20_read_temp();
                        display_temperature(temperature);
                }               
        }      
}

程序是對(duì)的需要加一個(gè)警報(bào)和上下限設(shè)置,五個(gè)按鈕分別是設(shè)置心率 的上線加減,溫度的上線加減。
求各位大神幫幫忙
回復(fù)

使用道具 舉報(bào)

ID:879809 發(fā)表于 2025-3-6 14:03 | 顯示全部樓層
比較一下溫度就可以了。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 2020天天操 | 91精品国产乱码麻豆白嫩 | 在线激情视频 | 2021狠狠天天天 | 欧美一区二区三区在线 | 欧美亚洲另类丝袜综合网动图 | 中文字幕第一页在线 | 91久久精品一区二区二区 | 亚洲乱码国产乱码精品精的特点 | 亚洲精品一区在线观看 | 先锋资源站 | 一区二区三区免费观看 | 99欧美精品| 国产成人精品一区二区三区四区 | 国产成人在线播放 | 成人啊啊啊 | 国产精品久久久久久久久久免费 | 狠狠色狠狠色综合系列 | av网站在线看 | 欧美日韩专区 | 色视频在线免费观看 | 国产精品高清一区二区 | 日本三级电影免费 | 日韩在线免费视频 | 性做久久久久久免费观看欧美 | 国产精品无 | 日日日干干干 | 免费在线一区二区 | 日韩一区二区三区视频 | 天天操人人干 | 精品国产乱码久久久 | 午夜成人免费视频 | 麻豆av电影网 | 搞黄网站在线观看 | 日韩一区二区三区在线观看 | 玖玖视频免费 | 国产1区2区 | 中文字幕亚洲精品 | 欧美三级在线 | 久久精品aaa | 国产精品久久久久aaaa九色 |