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

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

流程如下:
开始 --> 中断初始化,lcd初始化,ds18b20初始化 --> 键盘定义和扫描 -->lcd运行 -->pid控制(设定温度,温度比较,控制加热)--> 检查模式,结束后分别跳到各模式-->返回。
展开
 我来答
Robby927
2013-08-03 · TA获得超过134个赞
知道答主
回答量:126
采纳率:100%
帮助的人:34.8万
展开全部
#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分给你了
创安恒业-动环监控
2024-08-01 广告
温湿度动环监控系统的主要功能是实现对机房、库房等场所的温湿度环境进行实时监测、设置和调节。系统通过温湿度传感器等设备,实时收集并处理各区域的温湿度数据,当温湿度超出设定范围时,系统会自动发出警报,及时通知管理人员进行相应处理。同时,系统还具... 点击进入详情页
本回答由创安恒业-动环监控提供
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式