求解 单片机 操作DS18B20 问题

部分代码如下求高人指点下代码那点有问题,谢谢--..//单片机是Stc1205a60S212.000晶振voiddelay(uint16n){while(n--){_no... 部分代码如下 求高人指点下代码那点有问题,谢谢- -..
//单片机是 Stc1205a60S2 12.000晶振
void delay(uint16 n)
{
while (n--) {_nop_();_nop_();}
}
//读取温度
int16 read_temp(void)
{
float tt;
uint8 temp_data[2]; // 读出温度暂放
int16 temp;
DS18b20_reset(); // 复位
delay(1);
write_byte(0xcc); //忽略ROM指令
write_byte(0xbe); //读暂存器指令
delay(765);//
temp_data[0]=read_byte(); //温度低8位
temp_data[1]=read_byte(); //温度高8位

temp = temp_data[1];
temp <<= 8;
temp =temp | temp_data[0];

tt=temp*0.0625;
temp=tt*10+0.5;

return temp;
}
//

void UART_Send_Byte(uint8 dat)
{
SBUF = dat;
while (TI == 0);
TI = 0;
}

/**
* 将数据转换成ASC码并通过UART发送出去
*/
void UART_Send_Dat(uint16 dat)
{
UART_Send_Byte(dat/10%10 + '0');
UART_Send_Byte(dat%10 + '0');
}
/**
* 将数据转换成ASC码并通过UART发送出去
*/
void UART_Send_Dat(uint16 dat)
{
UART_Send_Byte(dat/10%10 + '0');
UART_Send_Byte(dat%10 + '0');
}
//***Main函数部分代码***********
ans=read_temp();
UART_Send_Dat(ans);
UART_Send_Byte('\r');
UART_Send_Byte('\n');

//=============================//
求助啊:
temp_data[0]=read_byte(); //温度低8位
temp_data[1]=read_byte(); //温度高8位
temp = temp_data[1];
temp <<= 8;
temp =temp | temp_data[0];
tt=temp*0.0625; //
temp=tt*10+0.5;
问:
1. 温度转化十进制那里没看明白,希望举个例子,(二进制数直接能和Float直接进行乘法吗?)
2.为什么发送到串口用字符显示温度都是显示 80多 90多 50多 而不是真实的温度,真实温度只有20度左右
研究几天了,愣是不知道那里错了,网上代码也参考不少,泪奔啊- -!
void start_temp_sensor(void)
{
DS18b20_reset();
write_byte(0xCC); // 发Skip ROM命令
write_byte(0x44); // 发转换命令
delay(765);
}
main()
{
int16 ans;
p00=1;
uart_init();
while (1)
{
delay_ms (1000); // 延时
start_temp_sensor();
ans=read_temp();
if (ans < 0)
{
UART_Send_Byte('-');
ans = -ans;
}
UART_Send_Dat(ans);
UART_Send_Byte('\r');
UART_Send_Byte('\n');
}
}
展开
六十七年
2011-11-26 · TA获得超过493个赞
知道小有建树答主
回答量:293
采纳率:57%
帮助的人:89.8万
展开全部
uint16应该是unsigned int型的,16位。而uint8应该是unsigned char型的,8位。temp_data[1]=read_byte(); temp <<= 8;这是将temp_data[1]放到temp的高八位上,而temp =temp | temp_data[0];是将temp_data[0];放到temp的低八位上。上面的操作将两个unsigned char型的变量和并成一个unsigned int的变量。二进制数直接能和Float直接进行乘法应该是可以的,这里我不是很明白。
init();//相当于你那个DS18b20_reset();
write_byte(0xcc);//启动温度转换
write_byte(0x44);
init();
write_byte(0xcc);
write_byte(0xbe);
你的程序中缺少缺少启动温度装换的指令
另外你仔细看一下,延时函数,都是ns级的,ds18b20对时间的要求还是很精确的
追问
非常感谢  六十七年 回答
我把Main函数发上去了,等待你的帮助,谢谢!

main()
{
int16 ans;
p00=1;
uart_init();
while (1)
{
delay_ms (1000); // 延时
start_temp_sensor();// 启用温度转换
ans=read_temp();
if (ans < 0)
{UART_Send_Byte('-');ans = -ans;}
UART_Send_Dat(ans);
UART_Send_Byte('\r');
UART_Send_Byte('\n');
}}
追答
你的这个程序拷进去后,什么现象啊?
你可以看一下这个程序,是用数码管显示的,没有串口通信
#include
#include
#define uint unsigned int
#define uchar unsigned char
sbit ds=P2^2;
sbit wela=P2^7;
sbit dula=P2^6;
uint temp;
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f};
unsigned char code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,
0x87,0xff,0xef};

void delay(uchar i)//延时
{
while(--i);
}
void init()//初始化函数
{
ds=1;
delay(1);
ds=0;
delay(250);
ds=1;
delay(100);
}
void write_byte(uchar dat)//写函数
{
uchar i;
for(i=0;i>=1;
delay(1);
}
}
uchar readbyte()//读函数
{
uchar i,dat;
for(i=0;i>=1;
ds=1;
delay(1);
if(ds)// 读1
{
dat|=0x80;
}
delay(20);
}
return dat;
}
uint get_temp()//获得温度
{
uchar a,b;
float tt;
init();

write_byte(0xcc);
write_byte(0x44);
init();

write_byte(0xcc);
write_byte(0xbe);
a=readbyte();
b=readbyte();
temp=b;
temp<<=8;
temp|=a;
tt=temp*0.0625;
temp=tt*10+0.5;
return temp;
}
void display(uint temp)//数码管显示函数
{
uchar bai,shi,ge;
bai=temp/100;
shi=temp%100/10;
ge=temp%10;

dula=1;
P0=table[bai];
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delay(0);

dula=1;
P0=table1[shi];
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delay(0);

dula=1;
P0=table[ge];
dula=0;
P0=0xff;
wela=1;
P0=0xfb;
wela=0;
delay(0);
}
void main()
{
while(1)
{

display(get_temp());

}
}
duyin2011
2011-11-26 · TA获得超过2398个赞
知道大有可为答主
回答量:1723
采纳率:100%
帮助的人:661万
展开全部
temp=tt*10+0.5;你放大了10倍,应该改成temp=tt
发送改成 :
UART_Send_Byte(dat/10+ '0');
UART_Send_Byte(dat%10 + '0');
就可以了
加'0'其实就是加0x30,将其加成asc2 码,0x30 是0 0x31是1 ..........
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2011-11-27
展开全部
dpo
375
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式