专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
51单片机和DS18B20做温度检测
2019-03-24 20:09
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
51单片机
7194
1
1627
这个图可以做出温度检测的效果吗?我想用一个c51和4个DS18B20做一个多点温度检测系统。有没有哪位高手可以帮我编下程,或者谁有原理图和源程序都发我考下。我QQ104314787.谢谢了
[
本帖最后由 happy104314787 于 2010-10-11 22:24 编辑
] 此帖出自
小平头技术问答
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
1条回答
happy104314787
1楼-- · 2019-03-25 05:09
4.3.2采集程序
主要程序代码及其说明(见注释语句)如下:
uchar tplsb,tpmsb; //温度值低位、高位字节
sbit DQ=P0^0; //数据通信线
/*延时t毫秒*/
void delay(uint t)
{
uint i ;
while (t--)
{
/*对于11.0592Hz时钟,约延时1毫秒*/
for (i=0;i<125;i++)
{}
}
}
/*产生复位脉冲,初始化DS18B20*/
void Txreset (void)
{
uint i ;
DQ =0;
/*拉低约900μs*/
i=100;
while(i>0)i--;
DQ =1 ; //产生上升沿
i=4 ;
while (i>0) i--;
}
/*等待应答脉冲*/
void RxWait (void)
{
uint i ;
while (DQ) ;
while (~DQ) ; //检测到应答脉冲
i =4 ;
while (i>0) i-- ;
}
/*读取数据的一位,满足读时序要求*/
bit RdBit (void)
{
uint i ;
bit b ;
DQ=0;
i++; //保持低至1us
DQ=1;
i++; i++; //延时15us以上,读时序下降沿后15us,DS18B20输出数据才有效
b=DQ;
i=8;
while(i>0) i--; //读时隙不低于60us
return(b);
}
/*读取数据的一个字节*/
uchar RdByte(void)
{
uchar i,j,b;
b=0;
for (i=1;I<=8;i++)
{
j=RdBit();
b=(j<<7)|(b>>1);
}
return(b);
}
/*写数据的一个字节,满足写”1”和写”0”的设计要求*/
void WrByte (uchar b)
{
uint i ;
uchar j ;
bit btmp ;
for (j=1;j<=8;j++)
{
btmp =b&0x01;
b=b>>1; //取下一位(由低位向高位)
if (btmp)
{
/*写1*/
DQ=0;
i++;i++; //延时,使得15us以内拉高
DQ=1;
i=8;
while (i>0) i--; //整个写1时序不低于60us
}
else
{
/*写0*/
DQ=0;
i=8;
while (i>0) i--; //保持低电平在60us到120us之间
DQ=1;
i++;
i++;
}
}
}
/*启动温度转换*/
void convert (void)
{
TxTeset (); //产生复位脉冲,初始化DS18B20
RxWait (); //等待DS18B20给出应答脉冲
delay (1); //延时
WrByte (0xcc); //skip rom命令
WrByte (0x44); //convert T 命令
}
/*读取温度值*/
void Rdtemp (void)
{
TxReset (); //产生复位脉冲,初始化DS18B20
RxWait (); //等待DS18B20给出应答脉冲
delay (1); //延时
WrByte (0xcc); //skip rom 命令
WrByte (0xbe); //read scratchpad 命令
tplsb=RdByte (); //温度值低位字节(其中低4位为二进制的”小数”部分)
tpmsb=RdByte();
}
/*主程序,读取的温度值最终存放在tplsb和tpmsb变量中。tplsb其中低4位为二进制的”小数”部分;tpmsb其中高5位为符号位;真正通过数码管输出时,需要进行到十进制有符号实数(包括小数部分)的转换*/
void main (void)
{
do
{
delay (1); //延时1ms
convert (); //启动温度转换,需要750ms
delay (1000); //延时1s
RdTemp (); //读取温度
}
while (1);
}
4.4温度显示程序的设计
4.4.1程序流程图
温度显示程序流程图如图4.5所示。
图4.5 LED显示流程图
4.4.2显示程序
void display(unsigned char *lp) //显示
{
unsigned char i; //定义变量
P3=0; //LED段选共阴极送1点亮某段
P1=0; //LED位选共阴极送0选中某位
P3=0xfe; //先用1111,1110显示第一位
P1=table[lp[0]];
delay(); //延时5个空指令
P1=0;
P3=0xfd; //1111,1101显示第二位
P1=table[lp[1]];
delay(); //延时5个空指令
P1=0;
P3=0xfb; //1111,1011显示第三位
P1=table[lp[2]]|0x80;
delay(); //延时5个空指令
P1=0;
P3=0xf7; //1111,0111显示第四位
P1=table[lp[3]];
P1=P1; //发光二极管,用来显示小数点后一位的数字段,送0点亮,所以不亮的灯就是段码
delay(); //延时5个空指令
P2=1;
这个是那份资料里面的程序。我觉得它很乱。应该是错的。请大侠指正修改吧
加载中...
一周热门
更多
>
相关问题
相关文章
基于51单片机的计算器设计
0个评论
51单片机300个proteus仿真实例下载
0个评论
51单片机 蜂鸣器
0个评论
51单片机驱动RC522模块
0个评论
基于51单片机的指纹密码锁
0个评论
AT89C51单片机制作简易密码锁
0个评论
51单片机汇编语言计数器
0个评论
51单片机精确延时设计
0个评论
×
关闭
采纳回答
向帮助了您的网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
关闭
您已邀请
15
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
主要程序代码及其说明(见注释语句)如下:
uchar tplsb,tpmsb; //温度值低位、高位字节
sbit DQ=P0^0; //数据通信线
/*延时t毫秒*/
void delay(uint t)
{
uint i ;
while (t--)
{
/*对于11.0592Hz时钟,约延时1毫秒*/
for (i=0;i<125;i++)
{}
}
}
/*产生复位脉冲,初始化DS18B20*/
void Txreset (void)
{
uint i ;
DQ =0;
/*拉低约900μs*/
i=100;
while(i>0)i--;
DQ =1 ; //产生上升沿
i=4 ;
while (i>0) i--;
}
/*等待应答脉冲*/
void RxWait (void)
{
uint i ;
while (DQ) ;
while (~DQ) ; //检测到应答脉冲
i =4 ;
while (i>0) i-- ;
}
/*读取数据的一位,满足读时序要求*/
bit RdBit (void)
{
uint i ;
bit b ;
DQ=0;
i++; //保持低至1us
DQ=1;
i++; i++; //延时15us以上,读时序下降沿后15us,DS18B20输出数据才有效
b=DQ;
i=8;
while(i>0) i--; //读时隙不低于60us
return(b);
}
/*读取数据的一个字节*/
uchar RdByte(void)
{
uchar i,j,b;
b=0;
for (i=1;I<=8;i++)
{
j=RdBit();
b=(j<<7)|(b>>1);
}
return(b);
}
/*写数据的一个字节,满足写”1”和写”0”的设计要求*/
void WrByte (uchar b)
{
uint i ;
uchar j ;
bit btmp ;
for (j=1;j<=8;j++)
{
btmp =b&0x01;
b=b>>1; //取下一位(由低位向高位)
if (btmp)
{
/*写1*/
DQ=0;
i++;i++; //延时,使得15us以内拉高
DQ=1;
i=8;
while (i>0) i--; //整个写1时序不低于60us
}
else
{
/*写0*/
DQ=0;
i=8;
while (i>0) i--; //保持低电平在60us到120us之间
DQ=1;
i++;
i++;
}
}
}
/*启动温度转换*/
void convert (void)
{
TxTeset (); //产生复位脉冲,初始化DS18B20
RxWait (); //等待DS18B20给出应答脉冲
delay (1); //延时
WrByte (0xcc); //skip rom命令
WrByte (0x44); //convert T 命令
}
/*读取温度值*/
void Rdtemp (void)
{
TxReset (); //产生复位脉冲,初始化DS18B20
RxWait (); //等待DS18B20给出应答脉冲
delay (1); //延时
WrByte (0xcc); //skip rom 命令
WrByte (0xbe); //read scratchpad 命令
tplsb=RdByte (); //温度值低位字节(其中低4位为二进制的”小数”部分)
tpmsb=RdByte();
}
/*主程序,读取的温度值最终存放在tplsb和tpmsb变量中。tplsb其中低4位为二进制的”小数”部分;tpmsb其中高5位为符号位;真正通过数码管输出时,需要进行到十进制有符号实数(包括小数部分)的转换*/
void main (void)
{
do
{
delay (1); //延时1ms
convert (); //启动温度转换,需要750ms
delay (1000); //延时1s
RdTemp (); //读取温度
}
while (1);
}
4.4温度显示程序的设计
4.4.1程序流程图
温度显示程序流程图如图4.5所示。
图4.5 LED显示流程图
4.4.2显示程序
void display(unsigned char *lp) //显示
{
unsigned char i; //定义变量
P3=0; //LED段选共阴极送1点亮某段
P1=0; //LED位选共阴极送0选中某位
P3=0xfe; //先用1111,1110显示第一位
P1=table[lp[0]];
delay(); //延时5个空指令
P1=0;
P3=0xfd; //1111,1101显示第二位
P1=table[lp[1]];
delay(); //延时5个空指令
P1=0;
P3=0xfb; //1111,1011显示第三位
P1=table[lp[2]]|0x80;
delay(); //延时5个空指令
P1=0;
P3=0xf7; //1111,0111显示第四位
P1=table[lp[3]];
P1=P1; //发光二极管,用来显示小数点后一位的数字段,送0点亮,所以不亮的灯就是段码
delay(); //延时5个空指令
P2=1;
这个是那份资料里面的程序。我觉得它很乱。应该是错的。请大侠指正修改吧
一周热门 更多>