求程序--AT89C52的温度控制系统。

系统仿真图如下,但是自己编的程序不成功(咱编程序差爆了),在温度读取还有键盘扫描读取这两个方面不成功。请各位有爱心的编程高手们,帮我带带路,帮我编一下。led是模拟继电器(后面接加热棒)的。ds18b20输入温度,键盘输入信号,经控制显示屏来设定温度,和显示温度曲线。
程序用c语言编写或者汇编语言都行。
硬件结构:

流程如下:
开始 --> 中断初始化,lcd初始化,ds18b20初始化 --> 键盘定义和扫描 -->lcd运行 -->pid控制(设定温度,温度比较,控制加热)--> 检查模式,结束后分别跳到各模式-->返回。

#include<reg52.h>
#include<stdio.h>
#define uchar unsigned char
#define uint unsigned int
sbit ds=P2^2;
sbit rs=P3^5;
sbit lcden=P3^4;
sbit dawr=P2^1;
sbit dacs=P2^0;
sbit beep=P2^4;
uint temp;
uchar buff[4];
float f_temp;
uint warn_l1=270;
uint warn_l2=250;
uint warn_h1=300;
uint warn_h2=320;
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=10;j>0;j--);
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com)
{
P0=com;
rs=0;
lcden=0;
delay(20);
lcden=1;
delay(20);
lcden=0;

}

void write_date(uchar date)
{
P0=date;
rs=1;
lcden=0;
delay(20);
lcden=1;
delay(20);
lcden=0;

}
void init()
{
write_com(0x38);
delay(20);
write_com(0x0c);
delay(20);
write_com(0x06);
delay(20);
write_com(0x01);
delay(20);
}
void dsreset()
{
uint i;
ds=0;
i=103;
while(i>0)i--;
ds=1;
i=4;
while(i>0)i--;
}
bit tempreadbit()
{
uint i;
bit dat;
ds=0;i++;
ds=1;i++;i++;
dat=ds;
i=8;while(i>0)i--;
return dat;
}
uchar tempread()
{
uchar i,j,dat=0;
for(i=1;i<=8;i++)
{
j=tempreadbit();
dat=(j<<7)|(dat>>1);
}
return dat;
}
void tempwritebyte(uchar dat)
{
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb)
{
ds=0;i++;i++;
ds=1;
i=8;while(i>0)i--;
}
else
{
ds=0;
i=8;while(i>0)i--;
ds=1;i++;i++;
}
}
}
void tempchange()
{
dsreset();
delay(1);
tempwritebyte(0xcc);
tempwritebyte(0x44);
}
uint get_temp()
{
uchar a,b;
dsreset();
delay(1);
tempwritebyte(0xcc);
tempwritebyte(0xbe);
a=tempread();
b=tempread();
temp=b;
temp<<=8;
temp=temp|a;
f_temp=temp*0.0625;
temp=f_temp*10+0.5;
f_temp=f_temp+0.05;
return temp;
}
void dis_temp(uint t)
{
uchar temp[4],i=0;
write_com(0x80);
delay(50);
/* while(1)
{
temp[i]=t%10+48;
t=t/10;
if(t==0)
break;
}*/
for(i=0;i<4;i++)
{
write_date(buff[i]);
delay(20);
}
}
void deal(uint t)
{
uchar i;
if((t>warn_l2)&&(t<=warn_l1)) //25.0-27.0
{
beep=1;
delay(255);
beep=0;
delay(100);
beep=1;
delay(255);
beep=0;
}
else if(t>=warn_l1) //>27.0
{
beep=1;
delay(100);
beep=0;
delay(100);
beep=1;
delay(100);
beep=0;
delay(100);
beep=1;
delay(100);
beep=0;
}
/* else if((t<warn_h2)&&(t>=warn_h1)) //30.0-32.0
{
P1=0xdf;
} */
else if(t<warn_l2) //<25.0
{
beep=1;
delay(255);
beep=0;
}
else //default
{
i=40;
while(i--)
{
dis_temp(get_temp());
}
}
}
void main()
{
uchar i;
init();
dacs=0;
dawr=0;
while(1)
{
tempchange();
for(i=10;i>0;i--)
{
dis_temp(get_temp());
}
deal(temp);
sprintf(buff,"%f",f_temp);
for(i=10;i>0;i--)
dis_temp(get_temp());
}
}
//这是一个例子 你只要改改就好了追问

呵呵,在你给我程序之前,我已经解决了。不过,你中奖了!50分给你了

温馨提示:答案为网友推荐,仅供参考
相似回答