解释一下AT89c51与DS18B20的问题 我写的keilc51的程序老是得不到结果看看呀
#include<reg51.h>#include<intrins.h>#defineuintunsignedint#defineucharunsignedcharsbi...
#include<reg51.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit DQ=P1^0;
void delay1(uint i)
{ for(;i>0;i--);} //11us用于初始化
reset(void)
{
char presence=1;
while(presence)
{
while(presence)
{
DQ=1;_nop_();_nop_();//总线上拉
DQ=0; //下拉
delay1(50); //维持550us,最短维持480us
DQ=1; //总线上拉
delay1(6); //检测总线上升沿,66us
presence=DQ; //DS18B20发存在低电平信号(60-240us);presence=0继续下一步
}
delay1(30); //延时300us,总线恢复高电平,DQ=1;
presence=~DQ;
}
DQ=1;
}
void write(uchar dat)
{ uchar i;
for(i=0;i<8;i++)
{
DQ=1;
_nop_();_nop_();
DQ=0;
_nop_();_nop_();_nop_();_nop_();_nop_();//延迟5us
DQ=dat&0x01;
delay1(6); //每个机器周期大约是66个u
dat>>=1;
}
DQ=1;
delay1(1);
}
uchar read(void)
{ uchar i;
uchar dat=0;
for(i=0;i<8;i++)
{ DQ=1;_nop_();_nop_();
dat>>=1;
DQ=0;_nop_();_nop_();_nop_();_nop_();
DQ=1; _nop_();_nop_();_nop_();_nop_();
if(DQ) dat|=0x80;
delay1(6);
}
delay1(1);
return(dat);
}
void main(void)
{ uchar templ=0,temph=0;
reset();
write(0xCC);
write(0x44);
delay1(75);
reset();
write(0xCC);
write(0xBE);
templ=read();
temph=read();
}
我把数据存在了temph还有templ中,但是好像不能老是不能启动温度计呀 展开
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit DQ=P1^0;
void delay1(uint i)
{ for(;i>0;i--);} //11us用于初始化
reset(void)
{
char presence=1;
while(presence)
{
while(presence)
{
DQ=1;_nop_();_nop_();//总线上拉
DQ=0; //下拉
delay1(50); //维持550us,最短维持480us
DQ=1; //总线上拉
delay1(6); //检测总线上升沿,66us
presence=DQ; //DS18B20发存在低电平信号(60-240us);presence=0继续下一步
}
delay1(30); //延时300us,总线恢复高电平,DQ=1;
presence=~DQ;
}
DQ=1;
}
void write(uchar dat)
{ uchar i;
for(i=0;i<8;i++)
{
DQ=1;
_nop_();_nop_();
DQ=0;
_nop_();_nop_();_nop_();_nop_();_nop_();//延迟5us
DQ=dat&0x01;
delay1(6); //每个机器周期大约是66个u
dat>>=1;
}
DQ=1;
delay1(1);
}
uchar read(void)
{ uchar i;
uchar dat=0;
for(i=0;i<8;i++)
{ DQ=1;_nop_();_nop_();
dat>>=1;
DQ=0;_nop_();_nop_();_nop_();_nop_();
DQ=1; _nop_();_nop_();_nop_();_nop_();
if(DQ) dat|=0x80;
delay1(6);
}
delay1(1);
return(dat);
}
void main(void)
{ uchar templ=0,temph=0;
reset();
write(0xCC);
write(0x44);
delay1(75);
reset();
write(0xCC);
write(0xBE);
templ=read();
temph=read();
}
我把数据存在了temph还有templ中,但是好像不能老是不能启动温度计呀 展开
1个回答
展开全部
#define uint unsigned int
#define uchar unsigned char
uchar led[]=;//数码管段选(共阴)
uchar ledbit[2]=;//数码管位选(共阴)
sbit DQ = P3^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);
}
/****************************************/
/* 主函数 */
/****************************************/
void main()
{
P1=0x00;
P0=0xff;
mdelay(100);
Init_DS18B20( ) ;
P0=0xff;
P1=0x00;
while(1)
{
show_temp();
}
}
这是我以前用过的一个,不知道对你有帮助吗
#define uchar unsigned char
uchar led[]=;//数码管段选(共阴)
uchar ledbit[2]=;//数码管位选(共阴)
sbit DQ = P3^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);
}
/****************************************/
/* 主函数 */
/****************************************/
void main()
{
P1=0x00;
P0=0xff;
mdelay(100);
Init_DS18B20( ) ;
P0=0xff;
P1=0x00;
while(1)
{
show_temp();
}
}
这是我以前用过的一个,不知道对你有帮助吗
追问
我的单片机晶振是12mhz 但是示波器(虚拟示波器)在仿真时老是时间不一,还有在keil c51中f10单步时第一次好慢呀
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询