|
#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;
}
}
|
-
-
-
溫度 ph2.zip
2025-4-21 16:15 上傳
點擊文件名下載附件
47.82 KB, 下載次數: 0
|