小弟新手,做了个温湿度检测,但是一直读不到AM2320的数据,求大神解惑;
另:AM2320的sda和scl两根引脚要求接4.7千欧电阻,小弟没有,给接了1千欧的;
下面是小弟写的代码;
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit RS=P2^3;//LCD 三个引脚
sbit RW=P2^5;
sbit E=P2^7;//。
sbit scl=P2^0; //IIC 总线引脚
sbit sda=P2^1; // .
uchar code table[]="Tem: Hum: ";
uchar code table1[]=" *c %";
uchar wenh,wenl,shih,shil;
char *p;// 保存2320数据的变量
int newnum(char ha,char lb) //两个字节合并
{
int c;
c=(ha<<8)+lb;
return c;
}
void delay0()
{;;}
void delay(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void write_com(comm) //LCD 写命令函数
{
RS=0;
RW=0;
E=0;
P1=comm;
delay(5);
E=1;
delay(5);
E=0;
}
void write_date(datee) //LCD写数据函数
{
RS=1;
RW=0;
E=0;
P1=datee;
delay(5);
E=1;
delay(5);
E=0;
}
void display(int num,uchar w)//LCD 显示温度 湿度数字
{
uchar shi,ge,fushi;
shi=num/100;
ge=(num%100)/10;
fushi=num%10;
write_com(0x80+0x40+w);
delay(5);
write_date(0x30+shi);
delay(5);
write_date(0x30+ge);
delay(5);
write_date(0x2e);
delay(5);
write_date(0x30+fushi);
}
void init() //初始化
{
uint a; //LCD 初始化
write_com(0x38);
delay(5);
write_com(0x0c);
delay(5);
write_com(0x06);
delay(5);
write_com(0x01);
delay(5);
write_com(0x80);
for(a=0;a<16;a++)
{
write_date(table[a]);
delay(5);
}
write_com(0x80+0x40);
for(a=0;a<16;a++)
{
write_date(table1[a]);
delay(5);
} //........
scl=1; //IIC初始化
sda=1;
delay0(); //.
}
void star() //IIC 开始函数
{
sda=1;
delay0();
scl=1;
sda=0;
delay0();
scl=0;
}
void stop() //IIC 停止函数
{
sda=0;
delay0();
scl=1;
delay0();
sda=1;
}
void write_ack(uchar acknum) //IIC 主机读取数据后发送应答0或1
{
scl=0;
delay0();
sda=acknum;
scl=1;
delay0();
scl=0;
delay0();
sda=1;
}
void read_ack() //IIC 主机发送数据后读取从机应答
{
uchar b;
scl=0;
delay0();
sda=1;
delay0();
scl=1;
while((sda==1)&&b<255)
b++;
}
void write_byte(uchar dat) //IIC 写一个字节
{
uchar temp,i;
temp=dat;
for(i=0;i<8;i++)
{
scl=0;
delay0();
temp=temp<<1;
sda=CY;
delay0();
scl=1;
delay0();
}
scl=0;
delay0();
sda=1;
delay0();
}
uchar read_byte() //IIC 读一个字节
{
uchar i,a;
scl=0;
delay0();
sda=1;
for(i=0;i<8;i++)
{
scl=1;
delay0();
a=(a<<1)|sda;
delay0();
scl=0;
delay0();
}
delay0();
return a;
}
void write_add(uchar add) //写2320 读命令
{
star();
write_byte(add);
read_ack();
write_byte(0x03);
read_ack();
write_byte(0x00);
read_ack();
write_byte(0x04);
read_ack();
stop();
}
void read_add(uchar add)// 读2320数据
{
uchar i;
write_byte((add)|0x01);
read_ack();
delay(1);
for(i=0;i>8;i++)
{
*(p+i)=read_byte();
write_ack(0);
}
write_ack(1);
stop();
}
void hxing2320() //唤醒2320
{
star();
write_byte(0xB8);
read_ack();
delay(15);
stop();
}
void AM2320()// 使用2320
{
int wen,shi;
hxing2320();
delay0();
write_add(0xB8);
delay(20);
read_add(0xB8);
wen=newnum(*(p+2),*(p+3));
shi=newnum(*(p+4),*(p+5));
display(wen,1);
display(shi,10);
}
/*unsigned short crc16(unsigned char *ptr, unsigned char len) //计算*ptr内前len个字节的CRC码
{
unsigned short crc=0xFFFF;
unsigned char i;
while(len--)
{
crc ^=*ptr++;
for(i=0;i<8;i++)
{
if(crc & 0x01)
{
crc>>=1;
crc^=0xA001;
}else
{
crc>>=1;
}
}
}
return crc;
}*/
void main() //主函数
{
init();
while(1)
{
AM2320();
}
}
|