关于DS18B20和串口通信的问题,跪求各位大大帮忙,谢谢了!
,不知道该怎么下手整改好,我觉得可能是时序不对了,于是我采用查询法还是不行,有哪位写过这个的能给我参考下吗?主程序是:
#include "reg52.h"
#include "ds18b20.h"
unsigned int tflag;
bit secflag = 0;
unsigned char text[] = "Temperature = ";
unsigned char enter[] = {0x0A,0x0D}; //回车符
void uart_tx(unsigned char *p,unsigned char length);
char dat(char a);
void main(void)
{
unsigned char temp;
SCON = 0x50;
TMOD = 0x22;
TH1 = 0xFD;
TL1 = 0xFD;
TH0 = 0x06;
TL0 = 0x06;
EA = 1;
ET0 = 1;
TR0 = 1;
TR1 = 1;
while(1)
{
if(secflag == 1)
{
secflag = 0;
uart_tx(text,14);
temp = rd_temperature();
if(temp>99)
{
SBUF = temp/100 + 0x30;
while(TI == 0);
TI = 0;
}
if(temp>9)
{
SBUF = temp%100/10 + 0x30;
while(TI == 0);
TI = 0;
}
SBUF = temp%100%10 + 0x30;
while(TI == 0);
TI = 0;
uart_tx(enter,2);
}
}
}
//定时器TO中断服务函数
void isr_t0(void) interrupt 1
{
tflag++;
if(tflag == 4000)
{
tflag = 0;
secflag = 1;
}
}
//串口传输函数
void uart_tx(unsigned char *p,unsigned char length)
{
unsigned char i;
for(i=0;i<length;i++)
{
SBUF = *(p+i);
while(TI == 0);
TI = 0;
}
}
ds18b20的程序是:
#include "ds18b20.h"
//延时函数
void delay(unsigned int t)
{
while(t--);
}
//DS18B20初始化函数
bit init_ds18b20(void)
{
bit initflag = 0;
DQ = 1;
delay(8);
DQ = 0;
delay(80); // 延时大于480us
DQ = 1;
delay(14); // 14
initflag = DQ; // initflag等于1初始化失败
delay(20);
return initflag;
}
//通过单总线向从器件写一个字节
void wr_ds18b20(unsigned char byt)
{
unsigned char i;
for(i=0;i<8;i++)
{
DQ = 0;
DQ = byt&0x01;
delay(5);
DQ = 1;
byt >>= 1;
}
delay(5);
}
//通过单总线从从器件读一个字节
unsigned char rd_ds18b20(void)
{
unsigned char i;
unsigned char byt;
for(i=0;i<8;i++)
{
DQ = 0;
byt >>= 1;
DQ = 1;
if(DQ)
{
byt |= 0x80;
}
delay(5);
}
return byt;
}
//温度转换、读取及数据处理器函数
unsigned char rd_temperature(void)
{
unsigned char low,high;
char temp;
init_ds18b20();
wr_ds18b20(0xCC);
wr_ds18b20(0x44); //启动温度转换
delay(200);
init_ds18b20();
wr_ds18b20(0xCC);
wr_ds18b20(0xBE); //读取寄存器
low = rd_ds18b20(); //低字节
high = rd_ds18b20(); //高字节
temp = high<<4;
temp |= (low>>4);
return temp;
}
先谢谢了!
既然知道时序不对,为什么不自己去查呢?程序是调出来的,自己调吧
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit dq = P1^7;
bit flag=0;
uint temp1;
uchar y=2;
uchar disp[4];
uchar b[4],k,kk;
uchar h,Recflag,low,high;
#define fuhao 0xbf
#define Delay2us() _nop_();_nop_();
#define Delay8us() _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
uchar code dispTAB[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar code dispbit[]={0xfe,0xfd,0xfb,0xf7};
void Delayus(uint us)
{
while(us--)
;
}
/***DS18B20初始化 ***/
bit Ds18b20_Init(void)
{
bit temp=1;
dq=1;
Delay2us();
dq=0;
Delayus(100);
dq=1;
Delayus(10);
temp = dq;
dq=1;
Delayus(30);
return temp;
}
/***写bit2DS18B20***/
void Ds18b20_WriteBit(bit bitdata)
{
dq=1;
Delay2us();
if(bitdata)
{
dq=0;
Delay2us();
dq=1;
Delayus(12);
}
else
{
dq=0;
Delayus(12);
}
dq=1;
Delay2us();
}
/***写Byte DS18B20***/
void Ds18b20_WriteByte(uchar chrdata)
{
uchar i;
for(i=0;i<8;i++)
{
Ds18b20_WriteBit(chrdata&0x01);
chrdata>>= 1;
}
}
/***读bit From DS18B20***/
bit Ds18b20_ReadBit(void)
{
bit bitdata;
dq=1;
Delay2us();
dq=0;
Delay2us();
Delay2us();
dq=1;
Delay8us();
Delay8us();
bitdata = dq;
Delayus(10);
dq=1;
return bitdata;
}
/***读Byte DS18B20***/
uchar Ds18b20_ReadByte()
{
uchar i,chardata;
for(i=0;i<8;i++)
{
chardata>>=1;
if(Ds18b20_ReadBit())
chardata|=0x80;
}
return chardata;
}
/***读 DS18B20 BE***/
bit Ds18b20_ReadBE(uchar *P)
{
uchar z=2;
if(Ds18b20_Init())
return 1;
Ds18b20_WriteByte(0xCC);
Ds18b20_WriteByte(0xBE);
while(z--)
{
*P=Ds18b20_ReadByte();
P++;
}
return 0;
}
/***温度采集计算***/
uint Tempsnach( uchar temp[2] )
{
uint wendu;
wendu = temp[1];
wendu<<= 8;
wendu|= temp[0];
if(wendu&0x8000)
{
wendu=(~wendu)+1;
temp1= wendu *0.625+0.5;
flag=1;
}
else
{
flag=0;
temp1= wendu *0.625+0.5;
}
return wendu;
}
/***温度转换***/
void Tempdisp( uint temperature )
{
uchar tmp,i,temper1,temper2;
temper1=temperature/16;
temper2=temperature%16;
if(flag)
disp[0]=fuhao;
else
disp[0]=temper1/100;
disp[1]=(temper1%100)/10;
disp[2]=(temper1)%10;
disp[3]=temper2*5/8;
for(i=0;i<4;i++)
{
P2=dispbit[i];
tmp=disp[i];
if(i==2)
P0=dispTAB[tmp]&0x7f;
else if(i==0&&tmp==0)
P0=0xff;
else
P0=dispTAB[tmp];
Delayus(200) ;
P0=0xff;
}
}
void senddata(uchar a) //串口发送
{
SBUF=a;
while(TI==0);
TI=0;
}
void receive_inter() interrupt 4 //串口接收中断
{
if(RI==1)
{
h=SBUF;
RI=0;
if(h==0x01) //收到0X01开始发送数据
{
Recflag=1;
h=0x00;
}
else if(h==0x02) //收到0X02停止发送数据
{
Recflag=0;
h=0x00;
}
}
}
void main()
{
uchar a[2],j=0;
EA=1;
ES=1;
TMOD=0x20; //定时器T1方式2
SCON=0x50;
PCON=0x00;
TH1=0xfd; //波特率9600
TL1=0xfd;
TR1=1;
EX0=1;
IT0=0;
EX1=1;
IT1=0;
while(1)
{
Ds18b20_Init();
Ds18b20_WriteByte(0xCC);
Ds18b20_WriteByte(0x44);
Tempdisp(Tempsnach(a));
Delayus(50);
while(j--)
Tempdisp(Tempsnach(a));
Ds18b20_Init();
Ds18b20_ReadBE(a);
Tempdisp(Tempsnach(a));
if(Recflag==1)
{
low=temp1;//temp1的低8位
high=(temp1&0xff00)>>8;//temp1的高8位
senddata (high);
senddata (low);
}
}
}
恩,可能我不太耐心了,我再去试试,已经调出来了,谢谢了。
谢谢了,我自己的也调出来了
