小弟新手,做了個溫濕度檢測,但是一直讀不到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();
}
}
|