微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 关于AD7705 为什么DRDY总是高电平?

关于AD7705 为什么DRDY总是高电平?

时间:10-02 整理:3721RD 点击:
#include<reg52.h>
#include<math.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define out P0
/***********端口定义**********************************************************/
sbit rs=P1^0;
sbit rw=P1^1;
sbit e=P2^5;
sbit adc_din=P3^0;
sbit adc_clk=P3^1;
sbit adc_drdy=P3^2;
sbit adc_cs=P1^2;
/***********函数申明**********************************************************/
void check_busy(void);
void write_command(uchar com);
void write_data(uchar dat);
void LCD_initial(void);
void lcd_test(void);
void show(void);
void delay(uint);
void AD7705_init(void);
void AD7705_read();
/***********数据定义**********************************************************/
unsigned int readword();
unsigned char NM[10]={0x30+0,0x30+1,0x30+2,0x30+3,0x30+4,0x30+5,0x30+6,0x30+7,0x30+8,0x30+9};

unsigned int a0,a1,a2,a3;
int voltage;
uint ad_out;

/***********adc写函数**********************************************************/

void write_adc(unsigned char a) //发送数据 a
{
uchar i;
adc_cs=0;
adc_clk=1;
_nop_();
_nop_();
_nop_();
for(i=0;i<8;i++)
{
adc_clk=0;
_nop_();
adc_din=a&0x80;
_nop_();
_nop_();
adc_clk=1;
a<<=1;
_nop_();
_nop_();
_nop_();

}
adc_cs=1;
adc_din=1;

}
void AD7705_init() //7705初始化
{
unsigned char i;
adc_clk = 1;
adc_din = 1;
for(i=0;i<50;i++)
{
adc_clk = 0;
adc_din=1;
adc_clk = 1;
}
write_adc(0x10);
write_adc(0x40);
write_adc(0x20);
write_adc(0x0c);
}

/***********adc读数据函数**********************************************************/
unsigned int readword()
{
uchar i;
uchar DATA_OUT;
while(adc_drdy);
adc_cs=1;
adc_clk=1;
_nop_();
_nop_();
adc_cs=0;
_nop_();
_nop_();
for(i=0;i<8;i++)
{
DATA_OUT<<=1;
adc_clk=0;
_nop_();
DATA_OUT=DATA_OUT|(uchar)adc_din;
_nop_();
_nop_();
adc_clk=1;
_nop_();
_nop_();
}
adc_cs=1;
_nop_();
adc_drdy=1;
return(DATA_OUT);
}
/***********adc完成读函数及数据转换函数**********************************************************/
void AD7705_read()
{
uchar MSB,LSB;

write_adc(0x38);
MSB=readword();
LSB=readword();
ad_out=(uint)MSB;
ad_out<<=8;
ad_out=ad_out|(uint)LSB;
voltage=ad_out*5000/65536; // 原数据*1000 保留四位数据;
}
/***********延时函数**********************************************************/
void delay(uint j)
{
uchar i=250;
for(;j>0;j--)
{
while(--i);
i=249;
while(--i);
i=250;
}
}
//查忙程序
void show()
{
write_command(0x80);
write_data(0x54);
write_data(0x5f);
write_data(0x41);
write_data(0x4c);
write_data(0x43);
write_data(0x4f);
write_data(0xa0);
write_data(NM[a0]);
write_data(NM[a1]);
write_data(NM[a2]);

write_data(0x47);
write_data(0x2f);
write_data(0x4d);
write_data(0x4c);



write_command(0x80+0x40);
write_data(0x4d);
write_data(0x5f);
write_data(0x41);
write_data(0x4c);
write_data(0x43);
write_data(0x4f);
write_data(0xa0);

write_data(0x2e);

write_data(0x47);
write_data(0x2f);
write_data(0x4d);
write_data(0x4c);
delay(100);
delay(5);
write_command(0x01); //清屏
}
void check_busy(void)
{
uchar dt;
do
{
dt=0xff;
e=0;
rs=0;
rw=1;
e=1;
dt=out;
}
while(dt&0x80);
e=0;
}
//写控制指令
void write_command(uchar com)
{
check_busy();
e=0;
rs=0;
rw=0;
out=com;
e=1;
_nop_();
e=0;
delay(1);
}
//写数据指令
void write_data(uchar dat)
{
check_busy();
e=0;
rs=1;
rw=0;
out=dat;
e=1;
_nop_();
e=0;
delay(1);
}
//液晶屏初始化
void LCD_initial(void)
{
write_command(0x38);//8位总线,双行显示,5X7的点阵字符
write_command(0x0C);//开整体显示,光标关,无黑块
write_command(0x06);//光标右移
write_command(0x01);//清屏
delay(1);
}
void main()
{

LCD_initial(); //LCD1602 初始化
AD7705_init();
while(1)
{
delay(10);
while(adc_drdy);
AD7705_read() ;
a0=voltage/1000;
a1=(voltage%1000)/100;
a2=(voltage%100)/10;
a3=voltage%1000;
show();
}
}

我也正在搞7705呢 你的问题解决了吗?

还没有 还在调试

你是不是武汉理工大学的?

成都理工      我把 P3-0 换了 换成4线模式 输入  输出 接 p15  p16  就好了

做出来 就好,我还是不会不过有大神和我一组做出来了

写完了吗?写完了给我参考参考

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top