急求STC89C52和DS18B20温控系统的程序

1)在设置模式下,用户可以通过按键设置允许最高温度TH、允许最低温度TL。K1切换当前温度和设置温度K2调上K3调下2)在测温模式下,实时测出当前温度并显示。(可采用LE... 1) 在设置模式下,用户可以通过按键设置允许最高温度TH 、允许最低温度TL。K1切换当前温度和设置温度 K2调上 K3调下

2) 在测温模式下,实时测出当前温度并显示。(可采用LED显示或LCD显示)。
3)在测温模式下,实时比较当前温度与报警温度,当高于高温报警TH 时,系统红灯亮,当在高温报警TH与低温报警TL 之间时,系统绿灯亮。
DQ在P1.7 ,开关123 分别在P0.0-0.2,LED灯在P1.4 1.5,

显示电路采用4位共阳LED数码管,从P0口输出段码,由P2.4 5 6 7口做位选三极管8550驱动

求高人呢写个程序啊
开关不用控制吗?最好加我下QQ275234110 好问下
展开
 我来答
yaofen2407343
2010-06-01
知道答主
回答量:1
采纳率:0%
帮助的人:0
展开全部
#include<reg52.h>
#include<stdio.h>
#define uchar unsigned char
#define uint unsigned int
sbit ds=P2^2; //温度传感器信号线
sbit dula=P2^6; //数码管段选线
sbit wela=P2^7; //数码管位选线
sbit beep=P2^3; //蜂鸣器
uint temp; //定义整型的温度数据
float f_temp; //定义浮点型的温度数据
uint warm_11=0; //定义温度下限值 是温度值乘以10后的结果
uint warm_h1=1200; //定义温度上限值
sbit led0=P1^0; //控制发光二极管
sbit led2=P1^2; //控制发光二极管
unsigned char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
0x6f,0xbf,0x86,0xdb,0xcf,0xe6,0xfd,0x87,0xff,0xef}; //编码
void delay(uint z) //延时函数
{ uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void dsreset(void) //DS18B20复位,初始化函数
{ uint i;
ds=0;
i=103;
while(i>0)i--;
ds=1;
i=4;
while(i>0)i--;
}
bit tempreadbit(void) //读一位数据函数
{uint i;
bit dat;
ds=0;i++; //i++起延时作用
ds=1;i++;i++;
dat=ds;
i=8;while(i>0)i--;
return (dat);
}
uchar tempread(void) //读一个字节数据函数
{ uchar i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{j=tempreadbit();
dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面,这样刚好一个字节在dat里
}
return (dat);
}
void tempwritebyte(uchar dat) //向DS18B20写一个字节数据函数
{uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{ testb=dat&0x01;
dat=dat>>1;
if(testb) //写1
{ds=0;
i++;i++;
ds=1;
i=8;while(i>0)i--;
}
else
{ds=0; //写0
i=8;while(i>0)i--;
ds=1;
i++;i++;
}
}
}
void tempchange(void) //DS18B20开始获取温度并转换
{ dsreset();
delay(1);
tempwritebyte(0xcc); //写跳过读ROM指令
tempwritebyte(0x44); //写温度转换指令
}
uint get_temp() //读寄存器中存储的温度数据
{uchar a,b;
dsreset();
delay(1);
tempwritebyte(0xcc);
tempwritebyte(0xbe);
a=tempread(); //读低8位
b=tempread(); //读高8位
temp=b;
temp<<=8; //两个字节组合为一个字
temp=temp|a;
f_temp=temp*0.062 //温度在寄存器中为12位,分辨率为0.0625
temp=f_temp*10+0.5; //乘10表小数点后只取1位,加0.5是四舍五入
f_temp=f_temp+0.05;
return temp; //temp 是整型
}
void display(uchar num,uchar dat) //数据显示函数
{ uchar i;
dula=0;
P0=table[dat]; //编码赋给P0口
dula=0;
dula=1;
wela=0;
i=0XFF;
i=i&(~((0x01)<<(num))); //用i来存储位选数据,只有一位为0
P0=i;
wela=1;
wela=0;
delay(1);
}
void dis_temp(uint t) //显示温度数值函数
{ uchar i;
i=t/100;
display(0,i);
i=t%100/10;
display(1,i+10);
i=t%100%10;
display(2,i);
}
void warn(uint s,uchar led) //蜂鸣器报警,灯闪烁
{ uchar i;i=s;
beep=0;
P1=~(led);
while (i--)
{dis_temp(get_temp());
}
beep=1;
P1=0xff;
i=s;
while (i--)
{dis_temp(get_temp());}

}
void deal(uint t)
{uchar i;
if(t<=0)
{warn(40,0x01);
}
else if(t>=1200)
{ warn(40,0x04);
}
else
{i=40;
while(i--)
{ dis_temp(get_temp());
}
}
}
void init_com(void) //串口初始化函数
{ TMOD=0X20;
PCON=0X00;
SCON=0X50;
TH1=0XFd;
TL1=0xFd;
TR1=1;
}

void comm(char*parr) //串口数据发送函数
{ do
{ SBUF=*parr++;
while(!TI);
TI=0;
}while(*parr);
}
void main() //主函数
{uchar buff[4],i;
dula=0;
wela=0;
init_com();
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()); //温度显示
}
comm(buff); //串口发送数据
for(i=10;i>0;i--)
{dis_temp(get_temp());} //温度显示
}
}
屹林达工贸
2024-11-21 广告
深圳屹林达是威图核心代理商,连续多年成为威图中国区域业绩屹林达始终坚持服务好客户为宗旨,通过完善的售前售后体系,快速为客户解决问题。欢迎咨询合作!深圳屹林达是威图核心代理商,连续多年成为威图中国区域业绩,屹林达始终坚持服务好客户为宗旨,通过... 点击进入详情页
本回答由屹林达工贸提供
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式