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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

有大佬能幫我看看51的溫度和ph測不出來是怎么回事

[復制鏈接]
ID:1147665 發表于 2025-4-21 16:22 | 顯示全部樓層 |閱讀模式
#include <reg51.h>
#include <intrins.h>

// DS18B20????
sbit DS18B20_DQ = P3^7;

// ADC0832????
sbit ADC_CLK = P1^0;
sbit ADC_DO  = P1^1;
sbit ADC_CS  = P1^2;

// LCD1602????
sbit LCD_RS = P2^0;
sbit LCD_RW = P2^1;
sbit LCD_E  = P2^2;
#define LCD_DATA P0

// ????
sbit KEY_SET = P3^1;
sbit KEY_ADD = P3^2;
sbit KEY_SUB = P3^3;

// ????
sbit BUZZER = P3^0;

// ????
int temp_value;       // ???(??10?)
int ph_value;         // PH?(??10?)
int temp_high = 300;  // ????(30.0?)
int temp_low = 200;   // ????(20.0?)
int ph_high = 80;     // PH??(8.0)
int ph_low = 60;      // PH??(6.0)
bit alarm_flag = 0;

enum {
    MODE_NORMAL,
    MODE_TEMP_HIGH,
    MODE_TEMP_LOW,
    MODE_PH_HIGH,
    MODE_PH_LOW
} set_mode = MODE_NORMAL;

// ????
void Delayms(unsigned int ms);
void DS18B20_Init();
bit DS18B20_ReadBit();
void DS18B20_WriteByte(unsigned char dat);
unsigned char DS18B20_ReadByte();
void DS18B20_ConvertTemp();
void DS18B20_GetTemp();
unsigned char ADC0832_Read(unsigned char channel);
void Get_PH_Value();
void LCD_WriteCmd(unsigned char cmd);
void LCD_WriteData(unsigned char dat);
void LCD_Init();
void LCD_ShowStr(unsigned char x, unsigned char y, unsigned char *str);
void LCD_ShowValue(unsigned char x, unsigned char y, int value);
void Key_Process();
void Alarm_Check();

void main() {
    LCD_Init();
    DS18B20_Init();
    LCD_ShowStr(0, 0, "T:    . C PH: . ");
    LCD_ShowStr(0, 1, "TH:   . TL:   .");

    while(1) {
        DS18B20_ConvertTemp();
        DS18B20_GetTemp();
        Get_PH_Value();
        Alarm_Check();
        Key_Process();

        // ????
        LCD_ShowValue(2, 0, temp_value);
        // ??PH?
        LCD_ShowValue(11, 0, ph_value);
        // ????
        LCD_ShowValue(3, 1, temp_high);
        LCD_ShowValue(11, 1, temp_low);

        Delayms(200);
    }
}

// ????
void Delayms(unsigned int ms) {
    unsigned int i, j;
    for(i=0; i<ms; i++)
        for(j=0; j<114; j++);
}

// DS18B20???
void DS18B20_Init() {
    unsigned char x = 0;
    DS18B20_DQ = 1;
    _nop_();
    DS18B20_DQ = 0;
    Delayms(9);
    DS18B20_DQ = 1;
    Delayms(3);
    x = DS18B20_DQ;
    Delayms(5);
}

// DS18B20???
void DS18B20_WriteBit(bit dat) {
    DS18B20_DQ = 0;
    _nop_();
    DS18B20_DQ = dat;
    Delayms(1);
    DS18B20_DQ = 1;
}

// DS18B20???
bit DS18B20_ReadBit() {
    bit dat;
    DS18B20_DQ = 0;
    _nop_();
    DS18B20_DQ = 1;
    _nop_();
    dat = DS18B20_DQ;
    Delayms(1);
    return dat;
}

// DS18B20???
void DS18B20_WriteByte(unsigned char dat) {
    unsigned char i;
    for(i=0; i<8; i++) {
        DS18B20_WriteBit(dat & 0x01);
        dat >>= 1;
    }
}

// DS18B20???
unsigned char DS18B20_ReadByte() {
    unsigned char i, dat = 0;
    for(i=0; i<8; i++) {
        dat >>= 1;
        if(DS18B20_ReadBit()) dat |= 0x80;
        Delayms(1);
    }
    return dat;
}

// ??????
void DS18B20_ConvertTemp() {
    DS18B20_Init();
    DS18B20_WriteByte(0xCC);  // ??ROM
    DS18B20_WriteByte(0x44);  // ????
}

// ?????
void DS18B20_GetTemp() {
    unsigned char TL, TH;
    int temp;

    DS18B20_Init();
    DS18B20_WriteByte(0xCC);  // ??ROM
    DS18B20_WriteByte(0xBE);  // ????

    TL = DS18B20_ReadByte();  // ???
    TH = DS18B20_ReadByte();  // ???

    temp = TH;
    temp <<= 8;
    temp |= TL;

    if(temp & 0x8000) {       // ???
        temp = ~temp + 1;
        temp_value = -(temp >> 4) * 10 - ((temp & 0x0F) * 625) / 1000;
    } else {                  // ???
        temp_value = (temp >> 4) * 10 + ((temp & 0x0F) * 625 + 500) / 1000;
    }
}

// ADC0832??
unsigned char ADC0832_Read(unsigned char channel) {
    unsigned char i, dat = 0;
    ADC_CS = 0;
    ADC_CLK = 0;
    ADC_DO = 1;

    // ??????
    ADC_CLK = 1; _nop_(); ADC_CLK = 0; // ???
    ADC_CLK = 1; _nop_(); ADC_CLK = 0; // SGL
    ADC_DO = channel;
    ADC_CLK = 1; _nop_(); ADC_CLK = 0; // ODD

    // ????
    for(i=0; i<8; i++) {
        dat <<= 1;
        ADC_CLK = 1; _nop_();
        if(ADC_DO) dat |= 0x01;
        ADC_CLK = 0; _nop_();
    }

    ADC_CS = 1;
    return dat;
}

// ??PH?
void Get_PH_Value() {
    unsigned char adc_val = ADC0832_Read(0);
    ph_value = (adc_val * 140 + 127) / 255; // ???0-140(??0.0-14.0)
}

// LCD???
void LCD_WriteCmd(unsigned char cmd) {
    LCD_RS = 0;
    LCD_RW = 0;
    LCD_DATA = cmd;
    LCD_E = 1; _nop_(); LCD_E = 0;
    Delayms(1);
}

// LCD???
void LCD_WriteData(unsigned char dat) {
    LCD_RS = 1;
    LCD_RW = 0;
    LCD_DATA = dat;
    LCD_E = 1; _nop_(); LCD_E = 0;
    Delayms(1);
}

// LCD???
void LCD_Init() {
    LCD_WriteCmd(0x38); // 8?,2?,5x7??
    LCD_WriteCmd(0x0C); // ???,???
    LCD_WriteCmd(0x06); // ????,???
    LCD_WriteCmd(0x01); // ??
}

// LCD?????
void LCD_ShowStr(unsigned char x, unsigned char y, unsigned char *str) {
    if(y == 0) LCD_WriteCmd(0x80 + x);
    else       LCD_WriteCmd(0xC0 + x);
    while(*str) LCD_WriteData(*str++);
}

// LCD????(?????)
void LCD_ShowValue(unsigned char x, unsigned char y, int value) {
    unsigned char str[6];
    str[0] = value / 100 + '0';
    str[1] = (value / 10) % 10 + '0';
    str[2] = '.';
    str[3] = value % 10 + '0';
    str[4] = '\0';
    LCD_ShowStr(x, y, str);
}

// ????
void Key_Process() {
    static bit key_flag = 0;

    if(!KEY_SET) {
        Delayms(10);
        if(!KEY_SET) {
            set_mode++;
            if(set_mode > MODE_PH_LOW) set_mode = MODE_NORMAL;
            while(!KEY_SET);
        }
    }

    if(set_mode != MODE_NORMAL) {
        if(!KEY_ADD) {
            Delayms(10);
            if(!KEY_ADD) {
                switch(set_mode) {
                    case MODE_TEMP_HIGH: temp_high += 1; break;
                    case MODE_TEMP_LOW:  temp_low += 1; break;
                    case MODE_PH_HIGH:   ph_high += 1; break;
                    case MODE_PH_LOW:    ph_low += 1; break;
                }
                while(!KEY_ADD);
            }
        }

        if(!KEY_SUB) {
            Delayms(10);
            if(!KEY_SUB) {
                switch(set_mode) {
                    case MODE_TEMP_HIGH: temp_high -= 1; break;
                    case MODE_TEMP_LOW:  temp_low -= 1; break;
                    case MODE_PH_HIGH:   ph_high -= 1; break;
                    case MODE_PH_LOW:    ph_low -= 1; break;
                }
                while(!KEY_SUB);
            }
        }
    }
}

// ????
void Alarm_Check() {
    if((temp_value > temp_high) || (temp_value < temp_low) ||
       (ph_value > ph_high) || (ph_value < ph_low)) {
        BUZZER = 1;
    } else {
        BUZZER = 0;
    }
}

屏幕截圖 2025-04-21 162028.png

溫度 ph2.zip

47.82 KB, 下載次數: 0

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美日韩中文字幕在线 | 国产日韩欧美一区 | 久久人人爽人人爽人人片av免费 | 欧美久| 日韩国产中文字幕 | 欧美日韩国产精品一区二区 | 亚洲精品久久久久中文字幕二区 | 日韩精品国产精品 | 国产91精品在线 | 久久久www成人免费无遮挡大片 | 日韩在线观看 | 国产免费a视频 | 久久国品片 | 视频一区二区三区中文字幕 | 日韩电影一区二区三区 | 久久久久国产精品www | 在线观看国产视频 | 久久中文字幕一区 | 在线中文字幕视频 | 日本成人免费网站 | 久久999| 日本特黄a级高清免费大片 国产精品久久性 | 国产欧美一区二区三区久久 | 99精品免费 | 一区二区三区国产精品 | 久久免费国产视频 | 麻豆一区二区三区精品视频 | 一区二区三区视频在线观看 | 免费观看黄色片视频 | 欧美一区二区三区视频在线播放 | 奇色影视| 亚洲视频精品 | 亚洲视频在线看 | 亚洲视频一| 精品国产伦一区二区三区观看方式 | 91pao对白在线播放 | 国产一区二区av | 欧美色999 | 久久精品国产亚洲 | 欧美精品在线播放 | 一区二区视频在线 |