,不知道该怎么下手整改好,我觉得可能是时序不对了,于是我采用查询法还是不行,有哪位写过这个的能给我参考下吗?
主程序是:
#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
{
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;
}
先谢谢了!