
用stc89c52单片机 c语言编的i2c总线 温度传感器ds1621的程序 非常急!!!!!!! 10
3个回答
展开全部
#include<at89x51.h>
#define uchar unsigned char
#define uint unsigned int
sbit SCL=P3^1;
sbit SDA=P3^2;
void delay(uint i)
{
uchar j;
while(i--)
for(j=0;j<100;j++);
}
void write_add(uchar r) //r=1; 读否则写
{
uchar i;
uchar add_rw;
if(r)
add_rw=0x91; //读
else
add_rw=0x90; //写
SCL=1; //START
SDA=1;
SDA=0;
SCL=0;
for(i=0;i<8;i++) //ADDRESS
{
if(add_rw&0x80)
SDA=1;
else SDA=0;
SCL=1;
SCL=0;
add_rw=add_rw<<1;
}
SDA=1;
SCL=1;
while(SDA); //等待应答
SCL=0;
}
void write_data(uchar d)
{
uchar i;
SCL=0;
for(i=0;i<8;i++) //DATA
{
if(d&0x80)
SDA=1;
else SDA=0;
SCL=1;
SCL=0;
d=d<<1;
}
SDA=1;
SCL=1;
while(SDA); //等待应答
SCL=0;
}
void stop(void)
{
SCL=1;
SDA=1;
}
uchar read_data(uchar over)
{
uchar i,d;
SCL=0;
for(i=0;i<8;i++) //DATA
{
d=d<<1;
SCL=1;
if(SDA)
d=d|0x01;
SCL=0;
}
if(over) SDA=1;
else SDA=0;
SCL=1; //应答
SCL=0;
SDA=0;
return d;
}
void write_cmd(uchar d)
{
uchar i,w_add=0x90;
SCL=1; //START
SDA=1;
SDA=0;
SCL=0;
for(i=0;i<8;i++) //ADDRESS
{
if(w_add&0x80)
SDA=1;
else SDA=0;
SCL=1;
SCL=0;
w_add=w_add<<1;
}
SDA=1;
SCL=1;
while(SDA); //等待应答
SCL=0;
SDA=0;
for(i=0;i<8;i++) //DATA
{
if(d&0x80)
SDA=1;
else SDA=0;
SCL=1;
SCL=0;
d=d<<1;
}
SDA=1;
SCL=1;
while(SDA); //等待应答
SCL=0;
SDA=0;
SCL=1;
SDA=1;
}
uchar read_tmp(void)
{
uchar h,l;
write_add(0);
write_data(0xee);//转换
stop();
delay(1000);
write_add(0);
write_data(0xaa);//读温度
stop();
write_add(1);
h=read_data(0);
l=read_data(1);
stop();
return(h);
}
void main(void)
{
while(1)
P0=read_tmp();
}
显示部分我用的串口,你改改就可以了
#define uchar unsigned char
#define uint unsigned int
sbit SCL=P3^1;
sbit SDA=P3^2;
void delay(uint i)
{
uchar j;
while(i--)
for(j=0;j<100;j++);
}
void write_add(uchar r) //r=1; 读否则写
{
uchar i;
uchar add_rw;
if(r)
add_rw=0x91; //读
else
add_rw=0x90; //写
SCL=1; //START
SDA=1;
SDA=0;
SCL=0;
for(i=0;i<8;i++) //ADDRESS
{
if(add_rw&0x80)
SDA=1;
else SDA=0;
SCL=1;
SCL=0;
add_rw=add_rw<<1;
}
SDA=1;
SCL=1;
while(SDA); //等待应答
SCL=0;
}
void write_data(uchar d)
{
uchar i;
SCL=0;
for(i=0;i<8;i++) //DATA
{
if(d&0x80)
SDA=1;
else SDA=0;
SCL=1;
SCL=0;
d=d<<1;
}
SDA=1;
SCL=1;
while(SDA); //等待应答
SCL=0;
}
void stop(void)
{
SCL=1;
SDA=1;
}
uchar read_data(uchar over)
{
uchar i,d;
SCL=0;
for(i=0;i<8;i++) //DATA
{
d=d<<1;
SCL=1;
if(SDA)
d=d|0x01;
SCL=0;
}
if(over) SDA=1;
else SDA=0;
SCL=1; //应答
SCL=0;
SDA=0;
return d;
}
void write_cmd(uchar d)
{
uchar i,w_add=0x90;
SCL=1; //START
SDA=1;
SDA=0;
SCL=0;
for(i=0;i<8;i++) //ADDRESS
{
if(w_add&0x80)
SDA=1;
else SDA=0;
SCL=1;
SCL=0;
w_add=w_add<<1;
}
SDA=1;
SCL=1;
while(SDA); //等待应答
SCL=0;
SDA=0;
for(i=0;i<8;i++) //DATA
{
if(d&0x80)
SDA=1;
else SDA=0;
SCL=1;
SCL=0;
d=d<<1;
}
SDA=1;
SCL=1;
while(SDA); //等待应答
SCL=0;
SDA=0;
SCL=1;
SDA=1;
}
uchar read_tmp(void)
{
uchar h,l;
write_add(0);
write_data(0xee);//转换
stop();
delay(1000);
write_add(0);
write_data(0xaa);//读温度
stop();
write_add(1);
h=read_data(0);
l=read_data(1);
stop();
return(h);
}
void main(void)
{
while(1)
P0=read_tmp();
}
显示部分我用的串口,你改改就可以了
追问
程序 写进去 显示-55 和我编的显示的结果一样 不知道为什么 不过还是谢谢你
追答
你是仿真吗?用的什么方式显示,这个程序肯定行

2023-06-12 广告
STM32F103是一款高性能的嵌入式芯片,由意法半导体(STMicroelectronics)公司生产。它是STM32系列芯片之一,具有紧凑、低功耗、高性能等特点,被广泛应用于嵌入式系统中。STM32F103的主要特点包括:1. 集成了A...
点击进入详情页
本回答由意法半导体(中国)投资有限公司提供
展开全部
ds1621和1820基本上一样,只是多了个片选和状态控制。程序和20基本一样的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
stc89c52单片机有,但是你说的那个传感器就悲剧了,没听说过。
追问
额 如果是18b20就好了 呵呵
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询