求教AD7705
时间:10-02
整理:3721RD
点击:
数据一直都出不来,基准电压2.5V AIN端输入也没错 RST口我直接接高电平
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
/************* 12864LCD引脚定义 *************/
#define LCD_data P0 //数据口
sbit LCD_RS = P2^4; //寄存器选择输入
sbit LCD_RW = P2^5; //液晶读/写控制
sbit LCD_EN = P2^6; //液晶使能控制
sbit LCD_PSB = P2^7; //串/并方式控制
sbit CLK=P1^0;
sbit DIN=P1^1;
sbit DOUT=P1^2;
sbit DRDY=P1^3;
sbit CS=P1^4;
#define NOP(); {_nop_();_nop_();_nop_();_nop_();};
/*********************************************************/
uchar code DIS1[] = {" 电阻测量 "};
uchar code DIS2[] = {"电阻值: "};
uchar DIS3[16];
uchar code DIS4[] = {" "};
/*********************************************************/
void delay(int ms)
{
while(ms--)
{
uchar i;
for(i=0;i<150;i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
/*******************************************************************/
/* */
/*检查LCD忙状态 */
/*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。 */
/* */
/*******************************************************************/
bit lcd_busy()
{
bit result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
NOP();
result = (bit)(P0&0x80);
LCD_EN = 0;
return(result);
}
/*******************************************************************/
/* */
/*写指令数据到LCD */
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。 */
/* */
/*******************************************************************/
void lcd_wcmd(uchar cmd)
{
while(lcd_busy());
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
_nop_();
_nop_();
P0 = cmd;
NOP();
LCD_EN = 1;
NOP();
LCD_EN = 0;
}
/*******************************************************************/
/* */
/*写显示数据到LCD */
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。 */
/* */
/*******************************************************************/
void lcd_wdat(uchar dat)
{
while(lcd_busy());
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
P0 = dat;
NOP();
LCD_EN = 1;
NOP();
LCD_EN = 0;
}
/*******************************************************************/
/* */
/* LCD初始化设定 */
/* */
/*******************************************************************/
void lcd_init()
{
LCD_PSB = 1; //并口方式
// LCD_RST = 0; //液晶复位
// delay(3);
// LCD_RST = 1;
// delay(3);
lcd_wcmd(0x34); //扩充指令操作
delay(5);
lcd_wcmd(0x30); //基本指令操作
delay(5);
lcd_wcmd(0x0C); //显示开,关光标
delay(5);
lcd_wcmd(0x01); //清除LCD的显示内容
delay(5);
}
/*********************************************************/
/* */
/* 设定显示位置 */
/* */
/*********************************************************/
void lcd_pos(uchar X,uchar Y)
{
uchar pos;
if (X==1)
{X=0x80;}
else if (X==2)
{X=0x90;}
else if (X==3)
{X=0x88;}
else if (X==4)
{X=0x98;}
pos = X+Y ;
lcd_wcmd(pos); //显示地址
}
/*********************************************************
* *
* 清屏函数 *
* *
*********************************************************/
void clr_screen()
{
lcd_wcmd(0x34); //扩充指令操作
delay(5);
lcd_wcmd(0x30); //基本指令操作
delay(5);
lcd_wcmd(0x01); //清屏
delay(5);
}
void xianshi()
{
uchar i;
lcd_pos(1,0); //设置显示位置为第一行
for(i=0;i<16;i++)
{
lcd_wdat(DIS1[i]);
delay(30);
}
lcd_pos(2,0); //设置显示位置为第二行
for(i=0;i<16;i++)
{
lcd_wdat(DIS2[i]);
delay(30);
}
lcd_pos(3,0); //设置显示位置为第三行
for(i=0;i<16;i++)
{
lcd_wdat(DIS3[i]);
delay(30);
}
lcd_pos(4,0); //设置显示位置为第四行
for(i=0;i<16;i++)
{
lcd_wdat(DIS4[i]);
delay(30);
}
}
void write(uchar x)
{
uchar i;
CS=0;
CLK=1;
for (i=0;i<8;i++)
{
CLK=0;
// delay(1);
DIN=(bit)(x&0x80);
// delay(1);
CLK=1;
// delay(1);
x<<=1;
}
DIN=1;
// SO=1;
//CS=1;
}
uint read(void)
{
uchar i;
uint w ;
w=0x00;
CS=0;
CLK=1 ;
for(i=0;i<16;i++)
{
CLK=0;
// delay(1);
w<<=1;
if(DOUT==1)
w|=0x01;
CLK=1;
delay(1);
}
DIN=1;
CLK=1;
//CS=1;
//DOUT=1;
return w;
}
void init()
{
unsigned char i;
CLK=1;
DIN=1;
for(i=0;i<40;i++)
{
CLK=0;
CLK=1;
}
write(0x20); //AD7705初始化-读第1通道A/D转换值下写时钟寄存器
write(0x05);//改刷新频率为20 不分频
write(0x10);//下写设置寄存器
write(0x44);
delay(50);
}
void zhua(float m)
{ uint n;
n=(uint)(m*10000);
DIS3[0]=n/10000+'0';
DIS3[1]=n%10000/1000+'0';
DIS3[2]=n%10000%1000/100+'0';
DIS3[3]=n%10000%1000%100/10+'0';
DIS3[4]=n%10+'0';
}
/*********************************************************
* *
* 主函数 *
* *
*********************************************************/
void main()
{
float a;
delay(100); //上电,等待稳定
lcd_init();
init(); //初始化LCD
while(1)
{
init();
if(DRDY==0) //等待DRDY变低
{
write(0x38);
if(DRDY==0)
{
a=read();
zhua(a);
}
}
xianshi();
}
}
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
/************* 12864LCD引脚定义 *************/
#define LCD_data P0 //数据口
sbit LCD_RS = P2^4; //寄存器选择输入
sbit LCD_RW = P2^5; //液晶读/写控制
sbit LCD_EN = P2^6; //液晶使能控制
sbit LCD_PSB = P2^7; //串/并方式控制
sbit CLK=P1^0;
sbit DIN=P1^1;
sbit DOUT=P1^2;
sbit DRDY=P1^3;
sbit CS=P1^4;
#define NOP(); {_nop_();_nop_();_nop_();_nop_();};
/*********************************************************/
uchar code DIS1[] = {" 电阻测量 "};
uchar code DIS2[] = {"电阻值: "};
uchar DIS3[16];
uchar code DIS4[] = {" "};
/*********************************************************/
void delay(int ms)
{
while(ms--)
{
uchar i;
for(i=0;i<150;i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
/*******************************************************************/
/* */
/*检查LCD忙状态 */
/*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。 */
/* */
/*******************************************************************/
bit lcd_busy()
{
bit result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
NOP();
result = (bit)(P0&0x80);
LCD_EN = 0;
return(result);
}
/*******************************************************************/
/* */
/*写指令数据到LCD */
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。 */
/* */
/*******************************************************************/
void lcd_wcmd(uchar cmd)
{
while(lcd_busy());
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
_nop_();
_nop_();
P0 = cmd;
NOP();
LCD_EN = 1;
NOP();
LCD_EN = 0;
}
/*******************************************************************/
/* */
/*写显示数据到LCD */
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。 */
/* */
/*******************************************************************/
void lcd_wdat(uchar dat)
{
while(lcd_busy());
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
P0 = dat;
NOP();
LCD_EN = 1;
NOP();
LCD_EN = 0;
}
/*******************************************************************/
/* */
/* LCD初始化设定 */
/* */
/*******************************************************************/
void lcd_init()
{
LCD_PSB = 1; //并口方式
// LCD_RST = 0; //液晶复位
// delay(3);
// LCD_RST = 1;
// delay(3);
lcd_wcmd(0x34); //扩充指令操作
delay(5);
lcd_wcmd(0x30); //基本指令操作
delay(5);
lcd_wcmd(0x0C); //显示开,关光标
delay(5);
lcd_wcmd(0x01); //清除LCD的显示内容
delay(5);
}
/*********************************************************/
/* */
/* 设定显示位置 */
/* */
/*********************************************************/
void lcd_pos(uchar X,uchar Y)
{
uchar pos;
if (X==1)
{X=0x80;}
else if (X==2)
{X=0x90;}
else if (X==3)
{X=0x88;}
else if (X==4)
{X=0x98;}
pos = X+Y ;
lcd_wcmd(pos); //显示地址
}
/*********************************************************
* *
* 清屏函数 *
* *
*********************************************************/
void clr_screen()
{
lcd_wcmd(0x34); //扩充指令操作
delay(5);
lcd_wcmd(0x30); //基本指令操作
delay(5);
lcd_wcmd(0x01); //清屏
delay(5);
}
void xianshi()
{
uchar i;
lcd_pos(1,0); //设置显示位置为第一行
for(i=0;i<16;i++)
{
lcd_wdat(DIS1[i]);
delay(30);
}
lcd_pos(2,0); //设置显示位置为第二行
for(i=0;i<16;i++)
{
lcd_wdat(DIS2[i]);
delay(30);
}
lcd_pos(3,0); //设置显示位置为第三行
for(i=0;i<16;i++)
{
lcd_wdat(DIS3[i]);
delay(30);
}
lcd_pos(4,0); //设置显示位置为第四行
for(i=0;i<16;i++)
{
lcd_wdat(DIS4[i]);
delay(30);
}
}
void write(uchar x)
{
uchar i;
CS=0;
CLK=1;
for (i=0;i<8;i++)
{
CLK=0;
// delay(1);
DIN=(bit)(x&0x80);
// delay(1);
CLK=1;
// delay(1);
x<<=1;
}
DIN=1;
// SO=1;
//CS=1;
}
uint read(void)
{
uchar i;
uint w ;
w=0x00;
CS=0;
CLK=1 ;
for(i=0;i<16;i++)
{
CLK=0;
// delay(1);
w<<=1;
if(DOUT==1)
w|=0x01;
CLK=1;
delay(1);
}
DIN=1;
CLK=1;
//CS=1;
//DOUT=1;
return w;
}
void init()
{
unsigned char i;
CLK=1;
DIN=1;
for(i=0;i<40;i++)
{
CLK=0;
CLK=1;
}
write(0x20); //AD7705初始化-读第1通道A/D转换值下写时钟寄存器
write(0x05);//改刷新频率为20 不分频
write(0x10);//下写设置寄存器
write(0x44);
delay(50);
}
void zhua(float m)
{ uint n;
n=(uint)(m*10000);
DIS3[0]=n/10000+'0';
DIS3[1]=n%10000/1000+'0';
DIS3[2]=n%10000%1000/100+'0';
DIS3[3]=n%10000%1000%100/10+'0';
DIS3[4]=n%10+'0';
}
/*********************************************************
* *
* 主函数 *
* *
*********************************************************/
void main()
{
float a;
delay(100); //上电,等待稳定
lcd_init();
init(); //初始化LCD
while(1)
{
init();
if(DRDY==0) //等待DRDY变低
{
write(0x38);
if(DRDY==0)
{
a=read();
zhua(a);
}
}
xianshi();
}
}
我是先测了下drdy引脚电平,之前一直是高电平,所以没输出。检查了下程序出了点问题。
可以详细说说啊?我也有这样的问题啊/////求解
