我写的程序也是参考网上前辈的人,可AD7705_DRDY为什么一直处于高电平,希望懂得帮我说一下,谢谢。
#include<reg52.h>
#include<intrins.h>
sbit lcd_rs=P2^6;
sbit lcd_rw=P2^5;
sbit lcd_e=P2^7;
sbit led=P0^7;
sbit led1=P0^5;
sbit AD7705_CLK=P1^0;
sbit AD7705_CS=P2^1;
sbit AD7705_DRDY=P1^3;
sbit AD7705_DATA=P1^2;
sbit AD7705_DATAin=P1^1;
//sbit AD7705_DATA1=P2^0;
#define lcd_db P0
#define uchar unsigned char
#define uint unsigned int
float T_Voltage;
unsigned int MSB_Data,LSB_Data,temp0,temp1,temp2,temp3,temp4,temp5;
uchar str1[]={"wellcome to"};
uchar str2[]={'0','1','2','3','4','5','6','7','8','9'};
void AD7705_Read();
void AD7705_init();
void delay(ms)
{
uchar i;
while(ms--)
{for(i=0;i<250;i++)
{_nop_();_nop_();_nop_();_nop_();}
}
}
void write_cmd(cmd)//写入指令
{
lcd_rs=0;
lcd_rw=0;
lcd_e=0;
delay(1);
lcd_e=1;
lcd_db=cmd;
delay(1);
lcd_e=0;
}
uchar lcd_buzy()//查看是否在忙
{
uchar temp;
lcd_rs=0;
lcd_rw=1;
lcd_e=1;
temp=lcd_db;
delay(2);
lcd_e=0;
return temp;
}
void write_dat(uchar str)//写数据
{
while(lcd_buzy()&0x80);
lcd_rs=1;
lcd_rw=0;
lcd_e=0;
delay(1);
lcd_e=1;
lcd_db=str;
delay(1);
lcd_e=0;
}
void write_cusor(uchar addr)//写坐标的位置
{
write_cmd(addr|0x80);
}
void write_lcd(uchar *str)//写显示
{
while(*str!='\0')
{
write_dat(*str++);
}
}
void lcd_init()//LCD初始化
{
write_cmd(0x38);
write_cmd(0x0c);
write_cmd(0x06);
write_cmd(0x01);
}
main()
{
lcd_init();
AD7705_DRDY=1;
AD7705_DATAin=1;
AD7705_init();
AD7705_CS=0;
while(lcd_buzy()&0x80);
write_cusor(0);
write_lcd(str1);
write_cusor(0x40);
//write_lcd(str2);
delay(10);
while(1)
{
led1=0;
while(AD7705_DRDY==1);
led1=1;
AD7705_Read();
write_cusor(0x40);
//write_dat(str2[1]);
write_dat(str2[temp2]);
write_cusor(0x41);
write_dat(str2[temp3]);
write_cusor(0x42);
write_dat(str2[temp4]);
write_cusor(0x43);
write_dat(str2[temp5]);
//while(!AD7705_DRDY);
}
}
/////////////////////////ad7705///////读取处理部分
void AD7705_Write_Reg(unsigned char Data_byte)//写寄存器
{
unsigned char i;
AD7705_CS = 0;
AD7705_CLK = 1;
_nop_();
_nop_();
for(i = 0; i < 8; i++)
{
AD7705_CLK = 0;
_nop_();
_nop_();
_nop_();
AD7705_DATAin = (bit)(Data_byte & 0x80);
_nop_();
_nop_();
_nop_();
AD7705_CLK = 1;
Data_byte <<= 1;
}
_nop_();
AD7705_DATA =1;
AD7705_CS = 0;
}
unsigned char AD7705_Read_Reg()//读寄储器
{
unsigned char i,Data_read;
AD7705_CS = 0;
AD7705_CLK = 1;
_nop_();
for(i = 0; i < 16; i++)
{
AD7705_CLK = 0;
_nop_();
_nop_();
Data_read <<= 1;
if(AD7705_DATA)
Data_read=Data_read+1;
_nop_();
_nop_();
AD7705_CLK = 1;
_nop_();
_nop_();
}
_nop_();
AD7705_CS = 0;
//AD7705_DRDY = 1;
return(Data_read);
}
void AD7705_Reset(void)//复位
{
uchar i;
AD7705_CLK=1;
AD7705_DATAin=1; // DIN端口连续写40个周期的高电平,保证复位
for(i=0;i<40;i++)
{
AD7705_CLK=0;
_nop_();
AD7705_CLK=1;
_nop_();
}
delay(10); // 复位之后等待1MS
}
void AD7705_init()
{
AD7705_Reset();
AD7705_Write_Reg(0x20);//通道1 ,下一个写时钟寄存器
AD7705_Write_Reg(0x0c);//写时钟寄存器设置更新速率为20Hz
AD7705_Write_Reg(0x10);//通道1 ,下一个写设置寄存器
AD7705_Write_Reg(0x44);//写设置寄存器,设置成双极性、无缓冲、增益为1、滤波器工作、自校准
}
void AD7705_Read()
{
led=0;
//while(AD7705_DRDY);// 写数据的时候不需要判断忙,只有读数据的时候才需要
AD7705_Write_Reg(0x38);//读第一个通道
delay(5);
led=1;
MSB_Data = AD7705_Read_Reg();
//MSB_Data =45;
LSB_Data = AD7705_Read_Reg();
//LSB_Data =12;
T_Voltage =(float)MSB_Data;
T_Voltage = T_Voltage*100;
T_Voltage = T_Voltage + (float)LSB_Data;
temp0 = T_Voltage/100000;
temp1 = ((T_Voltage-temp0*100000)/10000);
temp2 = ((T_Voltage-temp0*100000-temp1*10000)/1000);
temp3 = ((T_Voltage-temp0*100000-temp1*10000-temp2*1000)/100);
temp4 = (T_Voltage-temp0*100000-temp1*10000-temp2*1000-temp3*100)/10;
temp5 = (T_Voltage-temp0*100000-temp1*10000-temp2*1000-temp3*100-temp4*10);
}
|