请帮我看看怎么修改用STC89C52芯片、DS18B20传感器、报警方式:是通过蜂鸣器、LED灯
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
// 【逐点校准的引脚定义】
sbit RS = P2^7;
sbit EN = P2^6;
sbit DQ = P3^7;
sbit RED = P1^3;
sbit GREEN = P1^4;
sbit BEEP = P1^0;
sbit KEY_ADD = P3^0;
sbit KEY_SUB = P3^1;
uint limit = 300; // 30℃报警
uint temp = 0; // 全局变量,保存当前温度
void delay(uint t)
{
uint i,j;
for(i=t;i>0;i--)
for(j=120;j>0;j--);
}
// 按键消抖(只修改报警温度,不直接控制灯)
void key_scan(void)
{
if(KEY_ADD==0)
{
delay(20);
if(KEY_ADD==0){
while(KEY_ADD==0);
if(limit<500) limit+=10;
}
}
if(KEY_SUB==0)
{
delay(20);
if(KEY_SUB==0){
while(KEY_SUB==0);
if(limit>100) limit-=10;
}
}
}
// 【Proteus专用】DS18B20稳定驱动
void ds_rst(void)
{
DQ=0;delay(70);
DQ=1;delay(30);
}
uchar ds_rd(void)
{
uchar i,dat=0;
for(i=0;i<8;i++)
{
dat>>=1;
DQ=0;delay(6);
DQ=1;delay(6);
if(DQ) dat|=0x80;
}
return dat;
}
void ds_wr(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
DQ=0;delay(6);
if(dat&0x01) DQ=1;
else DQ=0;
dat>>=1;
delay(6);
DQ=1;
}
}
uint get_temp(void)
{
uchar h,l;
uint t;
ds_rst();
ds_wr(0xcc);
ds_wr(0x44);
delay(800); // 加长转换延时,Proteus必须要
ds_rst();
ds_wr(0xcc);
ds_wr(0xbe);
l=ds_rd();
h=ds_rd();
t=(h<<8)|l;
t=t*0.625;
if(t <= 0) t = 250;
if(t > 1250) t = 1250;
return t;
}
// LCD1602防乱码显示
void lcd_w(uchar dat,bit cmd)
{
RS=cmd;
P0=dat;
EN=1;delay(1);
EN=0;
}
void lcd_init(void)
{
lcd_w(0x38,0);
lcd_w(0x0c,0);
lcd_w(0x06,0);
lcd_w(0x01,0);
delay(5);
}
void lcd_str(uchar x,uchar y,char *s)
{
if(y==0) lcd_w(0x80+x,0);
else lcd_w(0xc0+x,0);
while(*s) lcd_w(*s++,1);
}
void lcd_num(uint t)
{
uchar s,g,x;
s=t/100;
g=(t%100)/10;
x=t%10;
lcd_w(0xc0+2,0); // 固定位置,不冲乱其他字符
lcd_w(s+'0',1);
lcd_w(g+'0',1);
lcd_w('.',1);
lcd_w(x+'0',1);
lcd_w('C',1);
}
void main(void)
{
lcd_init();
lcd_str(0,0,"TEMP ALARM");
lcd_str(0,1,"T: C");
// 初始状态:绿灯亮,红灯灭,蜂鸣器关
GREEN=1;
RED=0;
BEEP=0;
while(1)
{
// 1. 扫描按键,只修改报警温度
key_scan();
// 2. 读取温度
temp = get_temp();
lcd_num(temp);
// 3. 温度判断报警(逻辑独立,和按键无关)
if(temp >= limit)
{
RED=1;
GREEN=0;
BEEP=1;
}
else
{
RED=0;
GREEN=1;
BEEP=0;
}
delay(350);
}
}


