|
#include <reg52.h>
sbit DQ = P2^0;
sbit RS = P2^1;
sbit RW = P2^2;
sbit E = P2^3;
sbit K1 = P2^4;
sbit K2 = P2^5;
sbit Buzzer = P2^6;
unsigned int highTemp = 30;
unsigned int lowTemp = 20;
unsigned int currentTemp = 0;
void delay(unsigned int ms) {
unsigned int i, j;
for (i = ms; i > 0; i--)
for (j = 110; j > 0; j--);
}
bit Init_DS18B20() {
bit presence;
DQ = 1;
delay(1);
DQ = 0;
delay(75);
DQ = 1;
delay(4);
presence = DQ;
delay(20);
return presence;
}
void Write_DS18B20(unsigned char dat) {
unsigned char i;
for (i = 0; i < 8; i++) {
DQ = 0;
_nop_();
DQ = dat & 0x01;
delay(5);
DQ = 1;
dat >>= 1;
}
}
unsigned char Read_DS18B20() {
unsigned char i, dat;
for (i = 0; i < 8; i++) {
DQ = 0;
_nop_();
DQ = 1;
_nop_();
dat >>= 1;
if (DQ)
dat |= 0x80;
delay(5);
}
return dat;
}
unsigned char ReadTemperature() {
unsigned char temp_h, temp_l;
Init_DS18B20();
Write_DS18B20(0xCC);
Write_DS18B20(0xBE);
temp_l = Read_DS18B20();
temp_h = Read_DS18B20();
currentTemp = temp_h;
return temp_l;
}
void LCD_Init() {
delay(15);
Write_Command(0x38);
Write_Command(0x0C);
Write_Command(0x06);
Write_Command(0x01);
}
void Write_Command(unsigned char com) {
RS = 0;
RW = 0;
E = 1;
P0 = com;
delay(1);
E = 0;
}
void Write_Data(unsigned char dat) {
RS = 1;
RW = 0;
E = 1;
P0 = dat;
delay(1);
E = 0;
}
void Display_Temperature(unsigned char temp) {
unsigned char temp_str[5];
temp_str[0] = temp / 10 + '0';
temp_str[1] = temp % 10 + '0';
temp_str[2] = '.';
temp_str[3] = ReadTemperature() / 10 + '0';
temp_str[4] = ReadTemperature() % 10 + '0';
Write_Command(0x80);
Write_String("Temp: ");
Write_Command(0x86);
Write_String(temp_str);
Write_Command(0xC0);
Write_String("High: ");
Write_Command(0xC6);
Write_Char(highTemp / 10 + '0');
Write_Char(highTemp % 10 + '0');
Write_Command(0xCB);
Write_String("Low: ");
Write_Command(0xCF);
Write_Char(lowTemp / 10 + '0');
Write_Char(lowTemp % 10 + '0');
}
void Write_String(unsigned char *str) {
while (*str != '\0') {
Write_Data(*str);
str++;
}
}
void Write_Char(unsigned char dat) {
Write_Data(dat);
}
void Alarm() {
Buzzer = 0;
delay(500);
Buzzer = 1;
delay(500);
}
void Key_Scan() {
if (K1 == 0) {
delay(5);
if (K1 == 0) {
highTemp++;
Write_Command(0xCB);
Write_Char(highTemp / 10 + '0');
Write_Char(highTemp % 10 + '0');
while (!K1);
}
}
if (K2 == 0) {
delay(5);
if (K2 == 0) {
lowTemp--;
Write_Command(0xCF);
Write_Char(lowTemp / 10 + '0');
Write_Char(lowTemp % 10 + '0');
while (!K2);
}
}
}
void main() {
LCD_Init();
while (1) {
ReadTemperature();
Display_Temperature(currentTemp);
if (currentTemp > highTemp || currentTemp < lowTemp) {
Alarm();
}
Key_Scan();
}
}
|
|