DS18B20与单片机AT89S52设计的温度控制上下限报警器

作者&投稿:樊潘 (若有异议请与网页底部的电邮联系)
基于AT89S52单片机的上下限温度报警器中S8550D331三极管的作用及简介~~急啊,后天答辩呢~

51 IO口的驱动能力小不足以给蜂鸣器提供足够的工作电流 通过IO 控制三极管B极 由三极管给蜂鸣器提供工作电流

我做过,发你看下。

ds18b20 是总线式的。。。直接接io口就行

把读到的串行数据,转换、动态显示到数码管,会吧?

判断,一个上限,一个下限,哪个条件yes,哪个灯亮。。。

很简单,自己动脑子呗

你要的东西网上 我这只有仿真图



下面是部分程序

完整的在我空间里面有,日志名
实时数字温度计

/********************************************************
* *
* DS18B20温度传感器程序段 *
* *
********************************************************/
/***********11微秒延时函数**********/
//
void delayus(uint t)
{
for(;t>0;t--);
}

/***********18B20复位函数**********/
void ow_reset(void)
{
char presence=1;
while(presence)
{
while(presence)
{
DS18B20 = 1;_nop_();_nop_();
DS18B20 = 0;
delayus(50); // 550us
DS18B20 = 1;
delayus(6); // 66us
presence=DS18B20; // presence=0继续下一步
}
delayus(45); //延时500us
presence = ~DS18B20;
}
DS18B20 = 1;
}

/**********18B20写命令函数*********/
//向 1-WIRE 总线上写一个字节
void write_byte(uchar val)
{
uchar i;
for (i=8; i>0; i--) //
{
DS18B20 = 1;_nop_();_nop_();
DS18B20 = 0;_nop_();_nop_();_nop_();_nop_();_nop_();//5us
DS18B20 = val&0x01; //最低位移出
delayus(6); //66us
val=val/2; //右移一位
}
DS18B20 = 1;
delayus(1);
}
//
/*********18B20读1个字节函数********/
//从总线上读取一个字节
uchar read_byte(void)
{
uchar i;
uchar value = 0;
for (i=8;i>0;i--)
{
DS18B20 = 1;_nop_();_nop_();
value>>=1;
DS18B20 = 0; //
_nop_();_nop_();_nop_();_nop_(); //4us
DS18B20 = 1;_nop_();_nop_();_nop_();_nop_(); //4us
if(DS18B20)value|=0x80;
delayus(6); //66us
}
DS18B20 = 1;
return(value);
}
//
/***********读出温度函数**********/
//
void Ds18b20_ReadEE(void)
{
ow_reset();
write_byte(SkipROM); // Skip ROM
write_byte(Convert); // 发转换命令
ow_reset(); //总线复位
write_byte(SkipROM); // 发Skip ROM命令
write_byte(ReadScr); // 发读命令
collect_temperature[0]=read_byte(); //温度低8位
collect_temperature[1]=read_byte(); //温度高8位
}

我收藏的例子:
18B20+1602LCD温度实验(C语言)
可以参考下:
#include
<
reg51.h
>
#include
<
intrins.h
>
#define
uchar
unsigned
char
#define
uint
unsigned
int
sbit
DQ
=
P2^7
;
//定义DS18B20端口DQ
sbit
BEEP=P2^1
;
//蜂鸣器驱动线
bit
presence
;
sbit
LCD_RS
=
P3^0
;
sbit
LCD_RW
=
P3^1
;
sbit
LCD_EN
=
P3^2
;
uchar
code
cdis1[
]
=
{"
www.RICHMCU.COM
"}
;
uchar
code
cdis2[
]
=
{"
WENDU:
.
C
"}
;
uchar
code
cdis3[
]
=
{"
DS18B20
ERR0R
"}
;
uchar
code
cdis4[
]
=
{"
PLEASE
CHECK
"}
;
unsigned
char
data
temp_data[2]
=
{0x00,0x00}
;
unsigned
char
data
display[5]
=
{0x00,0x00,0x00,0x00,0x00}
;
unsigned
char
code
ditab[16]
=
{0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,
0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09}
;
void
beep()
;
unsigned
char
code
mytab[8]
=
{0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00}
;
#define
delayNOP()
;
{_nop_()
;_nop_()
;_nop_()
;_nop_()
;}
;
/*******************************************************************/
void
delay1(int
ms)
{
unsigned
char
y
;
while(ms--)
{
for(y
=
0
;
y<250
;
y++)
{
_nop_()
;
_nop_()
;
_nop_()
;
_nop_()
;
}
}
}
/******************************************************************/
/*检查LCD忙状态
*/
/*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。
*/
/******************************************************************/
bit
lcd_busy()
{
bit
result
;
LCD_RS
=
0
;
LCD_RW
=
1
;
LCD_EN
=
1
;
delayNOP()
;
result
=
(bit)(P0&0x80)
;
LCD_EN
=
0
;
return(result)
;
}
/*写指令数据到LCD
*/
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。
*/
/*******************************************************************/
void
lcd_wcmd(uchar
cmd)
{
while(lcd_busy())
;
LCD_RS
=
0
;
LCD_RW
=
0
;
LCD_EN
=
0
;
_nop_()
;
_nop_()
;
P0
=
cmd
;
delayNOP()
;
LCD_EN
=
1
;
delayNOP()
;
LCD_EN
=
0
;
}
/*******************************************************************/
/*写显示数据到LCD
*/
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。
*/
/*******************************************************************/
void
lcd_wdat(uchar
dat)
{
while(lcd_busy())
;
LCD_RS
=
1
;
LCD_RW
=
0
;
LCD_EN
=
0
;
P0
=
dat
;
delayNOP()
;
LCD_EN
=
1
;
delayNOP()
;
LCD_EN
=
0
;
}
/*
LCD初始化设定
*/
/*******************************************************************/
void
lcd_init()
{
delay1(15)
;
lcd_wcmd(0x01)
;
//清除LCD的显示内容
lcd_wcmd(0x38)
;
//16*2显示,5*7点阵,8位数据
delay1(5)
;
lcd_wcmd(0x38)
;
delay1(5)
;
lcd_wcmd(0x38)
;
delay1(5)
;
lcd_wcmd(0x0c)
;
//显示开,关光标
delay1(5)
;
lcd_wcmd(0x06)
;
//移动光标
delay1(5)
;
lcd_wcmd(0x01)
;
//清除LCD的显示内容
delay1(5)
;
}
/*
设定显示位置
*/
/*******************************************************************/
void
lcd_pos(uchar
pos)
{
lcd_wcmd(pos
|
0x80)
;
//数据指针=80+地址变量
}
/*自定义字符写入CGRAM
*/
/*******************************************************************/
void
writetab()
{
unsigned
char
i
;
lcd_wcmd(0x40)
;
//写CGRAM
for
(i
=
0
;
i<
8
;
i++)
lcd_wdat(mytab[
i
])
;
}
/*us级延时函数
*/
/*******************************************************************/
void
Delay(unsigned
int
num)
{
while(
--num
)
;
}
/*初始化ds1820
*/
/*******************************************************************/
Init_DS18B20(void)
{
DQ
=
1
;
//DQ复位
Delay(8)
;
//稍做延时
DQ
=
0
;
//单片机将DQ拉低
Delay(90)
;
//精确延时
大于
480us
DQ
=
1
;
//拉高总线
Delay(8)
;
presence
=
DQ
;
//如果=0则初始化成功
=1则初始化失败
Delay(100)
;
DQ
=
1
;
return(presence)
;
//返回信号,0=presence,1=
no
presence
}
/*
读一个字节
*/
/*******************************************************************/
ReadOneChar(void)
{
unsigned
char
i
=
0
;
unsigned
char
dat
=
0
;
for
(i
=
8
;
i
>
0
;
i--)
{
DQ
=
0
;
//
给脉冲信号
dat
>>=
1
;
DQ
=
1
;
//
给脉冲信号
if(DQ)
dat
|=
0x80
;
Delay(4)
;
}
return
(dat)
;
}
/*
写一个字节
*/
/*******************************************************************/
WriteOneChar(unsigned
char
dat)
{
unsigned
char
i
=
0
;
for
(i
=
8
;
i
>
0
;
i--)
{
DQ
=
0
;
DQ
=
dat&0x01
;
Delay(5)
;
DQ
=
1
;
dat>>=1
;
}
}
/*
读取温度
*/
/*******************************************************************/
Read_Temperature(void)
{
Init_DS18B20()
;
WriteOneChar(0xCC)
;
//
跳过读序号列号的操作
WriteOneChar(0x44)
;
//
启动温度转换
Init_DS18B20()
;
WriteOneChar(0xCC)
;
//跳过读序号列号的操作
WriteOneChar(0xBE)
;
//读取温度寄存器
temp_data[0]
=
ReadOneChar()
;
//温度低8位
temp_data[1]
=
ReadOneChar()
;
//温度高8位
}
/*
数据转换与温度显示
*/
/*******************************************************************/
Disp_Temperature()
{
display[4]=temp_data[0]&0x0f
;
display[0]=ditab[display[4]]+0x30
;
//查表得小数位的值
display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4)
;
display[3]=display[4]/100+0x30
;
display[1]=display[4]%100
;
display[2]=display[1]/10+0x30
;
display[1]=display[1]%10+0x30
;
if(display[3]==0x30)
//高位为0,不显示
{
display[3]=0x20
;
if(display[2]==0x30)
//次高位为0,不显示
display[2]=0x20
;
}
lcd_pos(0x48)
;
lcd_wdat(display[3])
;
//百位数显示
lcd_pos(0x49)
;
lcd_wdat(display[2])
;
//十位数显示
lcd_pos(0x4a)
;
lcd_wdat(display[1])
;
//个位数显示
lcd_pos(0x4c)
;
lcd_wdat(display[0])
;
//小数位数显示
}
/*******************************************************************/
/*
蜂鸣器响一声
*/
/*******************************************************************/
void
beep()
{
unsigned
char
y
;
for
(y=0
;y<100
;y++)
{
Delay(60)
;
BEEP=!BEEP
;
//BEEP取反
}
BEEP=1
;
//关闭蜂鸣器
Delay(40000)
;
}
/*
DS18B20
OK
显示菜单
*/
/*******************************************************************/
void
Ok_Menu
()
{
uchar
m
;
lcd_init()
;
//初始化LCD
lcd_pos(0)
;
//设置显示位置为第一行的第1个字符
m
=
0
;
while(cdis1[m]
!=
'\0')
{
//显示字符
lcd_wdat(cdis1[m])
;
m++
;
}
lcd_pos(0x40)
;
//设置显示位置为第二行第1个字符
m
=
0
;
while(cdis2[m]
!=
'\0')
{
lcd_wdat(cdis2[m])
;
//显示字符
m++
;
}
writetab()
;
//自定义字符写入CGRAM
delay1(5)
;
lcd_pos(0x4d)
;
lcd_wdat(0x00)
;
//显示自定义字符
}
/*
DS18B20
ERROR
显示菜单
*/
/*******************************************************************/
void
Error_Menu
()
{
uchar
m
;
lcd_init()
;
//初始化LCD
lcd_pos(0)
;
//设置显示位置为第一行的第1个字符
m
=
0
;
while(cdis3[m]
!=
'\0')
{
//显示字符
lcd_wdat(cdis3[m])
;
m++
;
}
lcd_pos(0x40)
;
//设置显示位置为第二行第1个字符
m
=
0
;
while(cdis4[m]
!=
'\0')
{
lcd_wdat(cdis4[m])
;
//显示字符
m++
;
}
}
/*
主函数
*/
/************************************/
void
main()
{
Ok_Menu
()
;
do
{
Read_Temperature()
;
Disp_Temperature()
;
}
while(!presence)
;
Error_Menu
()
;
do
{
Init_DS18B20()
;
beep()
;
}
while(presence)
;
}

我收藏的例子:
18B20+1602LCD温度实验(C语言)
可以参考下:
#include
<
reg51.h
>
#include
<
intrins.h
>
#define
uchar
unsigned
char
#define
uint
unsigned
int
sbit
DQ
=
P2^7
;
//定义DS18B20端口DQ
sbit
BEEP=P2^1
;
//蜂鸣器驱动线
bit
presence
;
sbit
LCD_RS
=
P3^0
;
sbit
LCD_RW
=
P3^1
;
sbit
LCD_EN
=
P3^2
;
uchar
code
cdis1[
]
=
{"
www.RICHMCU.COM
"}
;
uchar
code
cdis2[
]
=
{"
WENDU:
.
C
"}
;
uchar
code
cdis3[
]
=
{"
DS18B20
ERR0R
"}
;
uchar
code
cdis4[
]
=
{"
PLEASE
CHECK
"}
;
unsigned
char
data
temp_data[2]
=
{0x00,0x00}
;
unsigned
char
data
display[5]
=
{0x00,0x00,0x00,0x00,0x00}
;
unsigned
char
code
ditab[16]
=
{0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,
0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09}
;
void
beep()
;
unsigned
char
code
mytab[8]
=
{0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00}
;
#define
delayNOP()
;
{_nop_()
;_nop_()
;_nop_()
;_nop_()
;}
;
/*******************************************************************/
void
delay1(int
ms)
{
unsigned
char
y
;
while(ms--)
{
for(y
=
0
;
y<250
;
y++)
{
_nop_()
;
_nop_()
;
_nop_()
;
_nop_()
;
}
}
}
/******************************************************************/
/*检查LCD忙状态
*/
/*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。
*/
/******************************************************************/
bit
lcd_busy()
{
bit
result
;
LCD_RS
=
0
;
LCD_RW
=
1
;
LCD_EN
=
1
;
delayNOP()
;
result
=
(bit)(P0&0x80)
;
LCD_EN
=
0
;
return(result)
;
}
/*写指令数据到LCD
*/
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。
*/
/*******************************************************************/
void
lcd_wcmd(uchar
cmd)
{
while(lcd_busy())
;
LCD_RS
=
0
;
LCD_RW
=
0
;
LCD_EN
=
0
;
_nop_()
;
_nop_()
;
P0
=
cmd
;
delayNOP()
;
LCD_EN
=
1
;
delayNOP()
;
LCD_EN
=
0
;
}
/*******************************************************************/
/*写显示数据到LCD
*/
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。
*/
/*******************************************************************/
void
lcd_wdat(uchar
dat)
{
while(lcd_busy())
;
LCD_RS
=
1
;
LCD_RW
=
0
;
LCD_EN
=
0
;
P0
=
dat
;
delayNOP()
;
LCD_EN
=
1
;
delayNOP()
;
LCD_EN
=
0
;
}
/*
LCD初始化设定
*/
/*******************************************************************/
void
lcd_init()
{
delay1(15)
;
lcd_wcmd(0x01)
;
//清除LCD的显示内容
lcd_wcmd(0x38)
;
//16*2显示,5*7点阵,8位数据
delay1(5)
;
lcd_wcmd(0x38)
;
delay1(5)
;
lcd_wcmd(0x38)
;
delay1(5)
;
lcd_wcmd(0x0c)
;
//显示开,关光标
delay1(5)
;
lcd_wcmd(0x06)
;
//移动光标
delay1(5)
;
lcd_wcmd(0x01)
;
//清除LCD的显示内容
delay1(5)
;
}
/*
设定显示位置
*/
/*******************************************************************/
void
lcd_pos(uchar
pos)
{
lcd_wcmd(pos
|
0x80)
;
//数据指针=80+地址变量
}
/*自定义字符写入CGRAM
*/
/*******************************************************************/
void
writetab()
{
unsigned
char
i
;
lcd_wcmd(0x40)
;
//写CGRAM
for
(i
=
0
;
i<
8
;
i++)
lcd_wdat(mytab[
i
])
;
}
/*us级延时函数
*/
/*******************************************************************/
void
Delay(unsigned
int
num)
{
while(
--num
)
;
}
/*初始化ds1820
*/
/*******************************************************************/
Init_DS18B20(void)
{
DQ
=
1
;
//DQ复位
Delay(8)
;
//稍做延时
DQ
=
0
;
//单片机将DQ拉低
Delay(90)
;
//精确延时
大于
480us
DQ
=
1
;
//拉高总线
Delay(8)
;
presence
=
DQ
;
//如果=0则初始化成功
=1则初始化失败
Delay(100)
;
DQ
=
1
;
return(presence)
;
//返回信号,0=presence,1=
no
presence
}
/*
读一个字节
*/
/*******************************************************************/
ReadOneChar(void)
{
unsigned
char
i
=
0
;
unsigned
char
dat
=
0
;
for
(i
=
8
;
i
>
0
;
i--)
{
DQ
=
0
;
//
给脉冲信号
dat
>>=
1
;
DQ
=
1
;
//
给脉冲信号
if(DQ)
dat
|=
0x80
;
Delay(4)
;
}
return
(dat)
;
}
/*
写一个字节
*/
/*******************************************************************/
WriteOneChar(unsigned
char
dat)
{
unsigned
char
i
=
0
;
for
(i
=
8
;
i
>
0
;
i--)
{
DQ
=
0
;
DQ
=
dat&0x01
;
Delay(5)
;
DQ
=
1
;
dat>>=1
;
}
}
/*
读取温度
*/
/*******************************************************************/
Read_Temperature(void)
{
Init_DS18B20()
;
WriteOneChar(0xCC)
;
//
跳过读序号列号的操作
WriteOneChar(0x44)
;
//
启动温度转换
Init_DS18B20()
;
WriteOneChar(0xCC)
;
//跳过读序号列号的操作
WriteOneChar(0xBE)
;
//读取温度寄存器
temp_data[0]
=
ReadOneChar()
;
//温度低8位
temp_data[1]
=
ReadOneChar()
;
//温度高8位
}
/*
数据转换与温度显示
*/
/*******************************************************************/
Disp_Temperature()
{
display[4]=temp_data[0]&0x0f
;
display[0]=ditab[display[4]]+0x30
;
//查表得小数位的值
display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4)
;
display[3]=display[4]/100+0x30
;
display[1]=display[4]%100
;
display[2]=display[1]/10+0x30
;
display[1]=display[1]%10+0x30
;
if(display[3]==0x30)
//高位为0,不显示
{
display[3]=0x20
;
if(display[2]==0x30)
//次高位为0,不显示
display[2]=0x20
;
}
lcd_pos(0x48)
;
lcd_wdat(display[3])
;
//百位数显示
lcd_pos(0x49)
;
lcd_wdat(display[2])
;
//十位数显示
lcd_pos(0x4a)
;
lcd_wdat(display[1])
;
//个位数显示
lcd_pos(0x4c)
;
lcd_wdat(display[0])
;
//小数位数显示
}
/*******************************************************************/
/*
蜂鸣器响一声
*/
/*******************************************************************/
void
beep()
{
unsigned
char
y
;
for
(y=0
;y<100
;y++)
{
Delay(60)
;
BEEP=!BEEP
;
//BEEP取反
}
BEEP=1
;
//关闭蜂鸣器
Delay(40000)
;
}
/*
DS18B20
OK
显示菜单
*/
/*******************************************************************/
void
Ok_Menu
()
{
uchar
m
;
lcd_init()
;
//初始化LCD
lcd_pos(0)
;
//设置显示位置为第一行的第1个字符
m
=
0
;
while(cdis1[m]
!=
'\0')
{
//显示字符
lcd_wdat(cdis1[m])
;
m++
;
}
lcd_pos(0x40)
;
//设置显示位置为第二行第1个字符
m
=
0
;
while(cdis2[m]
!=
'\0')
{
lcd_wdat(cdis2[m])
;
//显示字符
m++
;
}
writetab()
;
//自定义字符写入CGRAM
delay1(5)
;
lcd_pos(0x4d)
;
lcd_wdat(0x00)
;
//显示自定义字符
}
/*
DS18B20
ERROR
显示菜单
*/
/*******************************************************************/
void
Error_Menu
()
{
uchar
m
;
lcd_init()
;
//初始化LCD
lcd_pos(0)
;
//设置显示位置为第一行的第1个字符
m
=
0
;
while(cdis3[m]
!=
'\0')
{
//显示字符
lcd_wdat(cdis3[m])
;
m++
;
}
lcd_pos(0x40)
;
//设置显示位置为第二行第1个字符
m
=
0
;
while(cdis4[m]
!=
'\0')
{
lcd_wdat(cdis4[m])
;
//显示字符
m++
;
}
}
/*
主函数
*/
/************************************/
void
main()
{
Ok_Menu
()
;
do
{
Read_Temperature()
;
Disp_Temperature()
;
}
while(!presence)
;
Error_Menu
()
;
do
{
Init_DS18B20()
;
beep()
;
}
while(presence)
;
}


关于ds18b20初始化问题,我的板子是TQ2440,为什么初始化不了
亲:我也用的TQ2440,板子不板载DS18B20,应该是你外接的吧。但是,DS18B20本身不能输出高电平,你要在DS的IO上拉一个10K的电阻哦。不知道你上拉了没。希望我的回答能帮助到你。

50分跪求一18B20测温计程序
WANG: LCALL W18B20 ;初始化18B20LCALL DU18B20 ;读18B20温度LCALL S18B20 ;送温度显视LCALL ANJIAN...;单字节十六进制转BCD;入口:(A)=单字节十六进制的温度值;出口:(A)=十位数和个位数;===HEX2BCD

怎么在89S52上使用18B20!接在哪?怎么才能让它采集温度?
18B20本身就是 温度传感器 它自己就可以采集温度。三个脚,边上两个接电源,中间一个信号线跟单片机一个io口相连,用来传送数据。具体硬件电路和程序网上多得很,自己下了。电路尤其简单,程序还稍微有些复杂。

花大钱 请人修改一下c51测温度程序
忽略 64 位 ROM 地址,直接向 DS1820 发温度变换命令。适用于单片工作。告警搜索命令 0ECH 执行后只有温度超过设定值上限或下限的片子才做出响应。表6: RAM指令表 指 令 约定代码 功 能 温度变换 44H 启动DS1820进行温度转换,12位转换时最长为750ms(9位为93.75ms)。结果存入内部9字节RAM中...

求DS18B20汇编编程,用汇编语言,求大神指导
RE_18B20 START: LCALL RST ;调用18B20复位子程序 JNB FLAG1,START1 ;DS1820不存在 LCALL MENU_...S_DATA: MOV A,R3 MOVC A,@A+DPTR LCALL WDATA ;写入数据 INC R3 DJNZ R2,S_DATA RETD_

18b20怎么采集数据,怎么转换数据
18B20采集来的数据是十六进制还是二进制,怎样转换成可以在数码管上显示的十进制数,最好能有18B20的数据转换程序,430的最好,谢谢各位的参与回答以及讨论!... 18B20采集来的数据是十六进制还是二进制,怎样转换成可以在数码管上显示的十进制数,最好能有18B20的数据转换程序,430的最好,谢谢各位的参与回答以及讨论!

我要写一篇关于单片机测温的论文谁给点资料,重谢!
基于51单片机的温度测量系统 摘 要: 单片机在检测和控制系统中得到广泛的应用, 温度则是系统常需要测量、控制和保持的一个量。本文从硬件和软件两方面介绍了AT89C2051单片机温度控制系统的设计,对硬件原理图和程序框图作了简洁的描述。关键词: 单片机AT89C2051;温度传感器DS18B20;温度;测量 引言 单片机...

有c51单片机的一些项目代码吗?
bit flag,sflag; \/\/flag是时钟冒号闪烁标志,sflag是温度负号显示标志void Disp_line1(void); \/\/...\/\/*** 18B20温度显示定义部分 sbit DQ=P3^3; \/\/18B20 接P07口typedef unsigned char byte;typedef

单片机万年历的c语言程序
\/*18B20*\/部分void init_18b20(){ DQ=1; delay(8); \/\/延时 DQ=0; delay(80); DQ=1; delay(20);}void write_dat(uchar dat){ uchar i,k...case 7: write_sj('S'); write_sj('A');write_sj('T'); break; case 1: write_sj('S'); write_sj('U');write_sj('N'); break; }...

怎样在这18b20温度程序里,加入按键,设定温度报警?我弄不明白。_百度知...
过程我告诉你吧,.你自己定义一个IO 1口做为报警用,再定义一个IO 2口做按键,定义一个变量做为警告温度(假如初始温度设定为x=10).然后加一个if(读出的温度>设定的问温) 这个IO=0;\/\/意思就是说当18B20读出的温度大于这个值时,这个IO口输出低电平.按键的利用.if(IO 2==0) {变量++; 延时0....

九龙坡区15332695927: 用AT89S51单片机如何做数字温度计{用DS18B20温度传感器} -
依荷蛇胆: DS18B20感应到对应温度值时会出输一个对应电压,对过AD采样模快对电压采样,得到对应值,数据给单片机计算然后输出显示就行了!

九龙坡区15332695927: 温度传感器ds18b20与单片机at89s52是怎么连接的?谢谢 -
依荷蛇胆: 电源接正极,地接地,IO口接数据端.(数据端和IO口之间加一个10K电阻)

九龙坡区15332695927: 求基于AT89S52单片机与4路DS18B20+LED显示的程序加原理图,下图是目前画出的原理图,不知对否,求大神帮忙 -
依荷蛇胆: DS18B20的接法不正确,不过应该不会影响仿真效果.如果是做实物产品的话,DQ端要加4.7K的上位电阻.也可以使用总线式,一条线上接四个DS18B20..附件是一个8路的温度采集及其显示,还可以PC机通信.供参考. 很抱歉,回答者上传的附件已失效

九龙坡区15332695927: 如何在单片机AT89S52连接10至20个DS18B20温度传感器? -
依荷蛇胆: 好好看18B20 datasheet,你只接到20个,那么单片机的p0,p1,p2口加起来就24个了,一个脚接一个都还剩4个脚,记得在18B20的数据引脚接4.7K的上拉电阻,如果你只有一个IO接口可用,那么就把所有的18B20数据引脚都接到这个引脚,还是记得上拉电阻.先调取每个18B20唯一身份证号,然后写入rom中,利用18B20序列号查询命令进行核对,是哪个就读取哪个 ,读是33H,匹配是55H,略过为ccH .建议仔细读它的datasheet,上面介绍很详细

九龙坡区15332695927: 温度传感器ds18b20与单片机at89s52是怎么连接的?谢谢 可以发到我邮箱 qulin12@eyou.com -
依荷蛇胆: 两边是电源(vcc和地),中间是数据,中间任接一个io口就行了

九龙坡区15332695927: 用单片机AT89S52和智能温度传感器DS18B20设计的温度传感器能输出4 - 20MA的电流信号吗?谢谢 -
依荷蛇胆: 可以,可将单片机测量到的温度采用PWM方式输出,加低通滤波器变为模拟电压信号,再用运放构成的电压/电流转换电路变为4~20mA信号.

九龙坡区15332695927: 我用DS18B20直接用杜邦线连接AT89S52,仿真没问题,实物没反应啊,怎么回事? -
依荷蛇胆: 在确定DS18B20没有损坏的情况下,确定一下单片机晶振频率是否跟仿真的晶振频率相同.在时序严格的场合,仿真会出现一定的偏差与实物并不是很匹配.所以仿真只是提供一个参考值.具体的实验,特别是时序要求特别严格的器件还是在实物上操作吧.

九龙坡区15332695927: DS18B20和单片机的通信 -
依荷蛇胆: DS18B20就是一个单总线的温度传感器,网上都是它的技术手册,所有读取温度的程序都是根据技术手册写出来的,也没有什么通信原理,应该说,只是单片机去读取温度,根据DS18B20要求的时序去写程序的,也不叫什么通信,更没有人讲什么通信原理的. 要么看技术手册,要么看程序.只有这两种资料.

九龙坡区15332695927: 普中开发板上ds18b20如何与单片机通信 -
依荷蛇胆: ds18b20与单片机是串行通讯,/****************************************************** 函数名称:void Init_DS18B20(void) 返回值:无 参数:无 作用:初始化18B20*******************************************************/ void Init_DS18B20(void) { char x=0; ...

九龙坡区15332695927: 求单片机at89s51和ds18b20控制加热丝加热 -
依荷蛇胆: 很简单啊.1、定时中断完成温度采集,并进行软件滤波去干扰,软件滤波有很多方法,取平均值、取中值都可以.采集周期可根据实际需求来定,周期越短,控制精度越高.2、主程序完成温度控制,就是环境温度低于-20℃时,给加热丝加热;高于0℃时断开开关.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网