求AT89S52单片机与DS18B20传感器用Keil c语言设计程序

2025-02-27 11:05:23
推荐回答(3个)
回答1:

电路其实很简单 很多实验板都有
刚好我写过这个程序 你就多加些分吧

这是源代码
#include
#include
#include
#define uchar unsigned char
sbit DQ=P3^7; //总线接口设置成P3.7
uchar temp; //温度参数
uchar temph,templ; //温度值的高位和地位
/*******短延时子程序****/
void delay(unsigned int i)
{
while(i--);
}
/*******长延时子程序****/
void delay1(unsigned int m)
{
unsigned int i; //定义延时变量
while(m--)
{
for(i=0;i<125;i++)
{}
}
}
/*******DS18B20初始化子程序****/
void reset()
{
DQ=1; //DQ复位
delay(5); //稍作延时
DQ=0; //单片机将DQ拉低
delay(60); //精确延时大于480微秒
DQ=1; //拉高总线
delay(8);
}
/*******检测应答脉冲子程序****/
void retemp()
{
while(DQ);
while(~DQ) //检测到应答脉冲
{
delay(4);
break;
}
}
/*****数据位读取子程序******/
bit temprd(void)
{
bit b; //定义一位变量,存储温度数据的某一位
DQ=0;
delay(1); //保持拉低至少1微秒
DQ=1;
delay(2); //延时15微秒以后,DS18B20的输出数据有效
b=DQ;
delay(8); //读时隙时间不低于60微秒
return(b);
}
/*****数据字节读取子程序******/
char tempREAD(void)
{
unsigned int i;
unsigned char a,b; //定义两个字节变量,存储温度字节
b=0;
for(i=0;i<8;i++)
{
a=temprd(); //读取一个字节中的一位数据
b=(a< } //将读取的数据按由低到高的顺序组合成一个字节
return(b); //将读取的温度值返回
}
/*****写命令子程序******/
void tempwrite(uchar b)
{
unsigned int i,j;
unsigned char btmp;
for(i=0;i<8;i++)
{
j=0;
btmp=b&0x01; //取操作命令字节的每一位数值(由低到高)
b>>=1;
if((btmp)==0)
{
DQ=0;
delay(8); //保持拉低60~120微秒
DQ=1;
}
else
{
DQ=0;
j++; //在15秒延时之内拉高
DQ=1;
delay(8);
} //整个写时隙时间在60微秒以上
}
}
/*****启动温度转换子程序******/
void tempconvert()
{
reset(); //初始化
retemp(); //读取应答脉冲
delay1(1); //延时
tempwrite(0xcc); //跳过验证序列号命令,若单线上有多个DS18B20,则不可用
tempwrite(0x44);
}
/*****读取温度子程序******/
rdtemp(unsigned int y)
{
reset(); //初始化
retemp(); //读取应答脉冲
delay1(1); //延时
tempwrite(0xcc); //跳过验证序列号命令
tempwrite(0xbe); //读取内部ROM的数据
templ=tempREAD();//读取温度低位字节
temph=tempREAD();//读取温度高位字节
y=temph*16*16+templ;
return y;
}
/*****主程序******/
void main(void)
{
unsigned int temp;
do
{
delay1(1); //延时1毫秒
tempconvert(); //启动温度转换
delay1(1000); //延时1秒
temp=rdtemp(); //读取温度值
/*display(temp)*/ //将读取的温度值送入显示程序
}while(1);
}

回答2:

建议去proteus论坛,有现成实例可供参考。
DS18B20,1602都有~~~【可找找总线接法的,比较好写程序(1602)】
祝你好运!

回答3:

在PROTEUS中没有AT89S52芯片吧。 用51 仿真可以。