请好心人帮忙写程序:18B20测温4位供阳数码管显示,用三极管驱动。P2.7数据端,P0口段选,p3.4-p3.7位选。

用5V继电器控制220V电压,做恒温箱实验,恒温箱我就用小盒子把灯泡和18B20放进去就行了。如果温度低于设定值25度,led绿灯亮,继电器工作加热,温度高于25度,则蜂... 用5V继电器控制220V电压,做恒温箱实验,恒温箱我就用小盒子把灯泡和18B20放进去就行了。如果温度低于设定值25度,led绿灯亮,继电器工作加热,温度高于25度,则蜂鸣器响,led红灯亮,其中p2.0控制绿灯,p2.1控制红灯,p2.2控制蜂鸣器。谢谢了,急用啊!! 展开
 我来答
陆景超
2011-04-12 · 超过15用户采纳过TA的回答
知道答主
回答量:50
采纳率:100%
帮助的人:27.2万
展开全部
/////*******************你自己看看吧,,*/*////////////////////////////////
#include <AT89X51.H>
#include <absacc.H>

#define uint unsigned int

#define uchar unsigned char

uchar led[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//数码管段选(共阳极)
sbit p20 = P2^0; //绿灯
sbit p21 = P2^1; //红灯
sbit p22 = P2^2; //蜂鸣器
sbit DQ = P2^7; //温度传送数据IO口

uchar temp_value,tem; //温度值

/***********ds18b20子程序*************************/

/***********ds18b20延迟子函数(晶振12MHz )*******/

void delay_18B20(unsigned int i)
{
while(i--);
}

/**********ds18b20初始化函数**********************/

void Init_DS18B20(void)
{
unsigned char x=0;
DQ = 1;
delay_18B20(8);
DQ = 0;
delay_18B20(80);
DQ = 1;
delay_18B20(14);
x=DQ;
delay_18B20(20);
}

/***********ds18b20读一个字节**************/

unsigned char ReadOneChar(void)
{
uchar i=0;
uchar dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; // 给脉冲信号
if(DQ)
dat|=0x80;
delay_18B20(4);
}
return(dat);
}

/*************ds18b20写一个字节****************/

void WriteOneChar(uchar dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
delay_18B20(5);
DQ = 1;
dat>>=1;
}
}

/**************读取ds18b20当前温度************/

void ReadTemp(void)
{
unsigned char a=0;
unsigned char b=0;
unsigned char t=0;

Init_DS18B20();
WriteOneChar(0xCC);
WriteOneChar(0x44);

delay_18B20(100);

Init_DS18B20();
WriteOneChar(0xCC);
WriteOneChar(0xBE);
delay_18B20(100);

a=ReadOneChar();
b=ReadOneChar();
temp_value=b<<4;
temp_value+=(a&0xf0)>>4;
}

/*延时子程序*/
void mdelay(uint delay)
{
uint i;

for(;delay>0;delay--)

{
for(i=0;i<62;i++); //1ms延时.

}
}
/*************温度显示********************/
void show_temp()
{
uchar tem1,tem2;
ReadTemp();

tem1=temp_value/10;/*数码管个位*/
P0=led[tem1];
P1=0xfd;//P1.0位为选的数码管
mdelay(5);
tem2=temp_value%10;/*数码管十位*/
P0=led[tem2];
P1=0xfe;//i位为选的数码管
mdelay(5);
if(temp_value<25)
{
p20==1;
}
else
{
p21==1;
{
int i;
for(i=0;i<3000;i++)
{
p22=1;
mdelay(30);
p22=0;

}

}
}

}
/****************************************/
/* 主函数 */
/****************************************/
void main()
{
P1=0x00;
P0=0xff;

mdelay(100);
Init_DS18B20( ) ;
P0=0xff;
P1=0x00;
while(1)
{
show_temp();

}
}
匿名用户
2011-04-04
展开全部
这么简单,,,
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
usryyll
2011-04-09
知道答主
回答量:6
采纳率:0%
帮助的人:0
展开全部
是很简单,但是很烦,你才给5分。估计是没人帮你的。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式