公司让我调试TM7705,接的是压力传感器 全桥的先上图:
这是我自己接的线路。
下面是代码
[mw_shl_code=c,true] #include <reg51.h>
#include<lcd.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit AD_CLK=P1^0;//串行时钟
sbit AD_DRDY=P1^1;//忙标志位
sbit AD_DIN =P1^2;//串行数据输入
sbit AD_DOUT=P1^3;//串行数据输出
uchar USRTdata[8]={'0','0','0','0','0','0','0','0'};
unsigned int DATA1=0;
void delay10us(uint c) //误差 -0.234375us
{
unsigned char a,b;
for(b=c;b>0;b--)
{
for(a=3;a>0;a--);
}
}
/************************************************************************************
写1字节到AD7705
************************************************************************************/
void write_ad(uchar i)
{
uchar a;
for(a = 8;a > 0;a--)
{
if((i & 0x80) == 0)
{
AD_DIN = 0;
}
else
{
AD_DIN = 1;
}
i <<= 1;
AD_CLK = 0;
_nop_();
_nop_();
_nop_();
AD_CLK = 1;
}
}
/************************************************************************************
设置AD7705通道
* 0 为第一通道
* 1 为第二通道
//MD1(0) 工 作 模 式
//MD0(0) 工 作 模 式
//G2(0) 增益选择 0 0 0 0 1 1 1 1
//G1(0) 增益选择 0 0 1 1 0 0 1 1
//G0(0) 增益选择 0 1 0 1 0 1 0 1
// 1 2 4 8 16 32 64 128
//B/U(0) 单极性/双极性工作。“0”表示选择双极性操作,“1”表示选择单极性工作
//BUF(0) 缓冲器控制。“0”表示片内缓冲器短路,缓冲器短路后,电源电流降低
// 此位处于高电平时,缓冲器与模拟输入串联,输入端允许处理高阻抗源
//FSYNC(1) 滤波器同步
//设置40H 双极性方式 44H 单极性方式
//-----短路滤波器后线性也好了
************************************************************************************/
/*void set_7705_ch(bit a)
{
if(a == 0)
{
write_ad(0x20);//write_ad(0x20); 指向时钟寄存器 通道1
write_ad(0x05);// 外部时钟除以2为系统时钟
write_ad(0x10);//write_ad(0x10); 指向设置寄存器
write_ad(0x44);//自校正 增益为1 单极性 缓冲器短路 滤波器打开
}
else
{
write_ad(0x21);//write_ad(0x20); 指向时钟寄存器 通道2
write_ad(0x05);
write_ad(0x11);//write_ad(0x10); 指向设置寄存器 通道2
write_ad(0x44);//自校正 增益为4 单极性 缓冲器短路 滤波器打开
}
} */
void TM7705_init()
{
write_ad(0x20);//写时钟寄存器命令00100000;
write_ad(0x05);//设置时钟寄存器00000101
write_ad(0x10);//写设置寄存器命令 00010000
write_ad(0x40);//设置设置寄存器 自校准 增益为1 双极性 缓冲器短路 滤波器处理数据 01000000
}
//************************************************************************************
// 读1字节到AD7705
//***********************************************************************************
uchar read_ad()
{
uchar temp2;
uchar a;
for(a = 8;a > 0;a--)
{
AD_CLK = 0;
_nop_();
_nop_();
_nop_();
AD_CLK = 1;
_nop_();
_nop_();
_nop_();
temp2 <<= 1;
if(AD_DOUT == 0)
{
temp2 &= 0xfe;
}
else
{
temp2 |= 0x01;
}
}
return temp2;
}
/************************************************************************************
读AD7705转换后的数据 ,不检测DRDY
************************************************************************************/
unsigned int readAD_data()
{
uint temp;
uchar i;
for(i = 16;i > 0;i--)
{
AD_CLK = 0;
_nop_();
_nop_();
_nop_();
AD_CLK = 1;
_nop_();
_nop_();
_nop_();
temp <<= 1;
if(AD_DOUT == 0)
{
temp &= 0xfffe;
}
else
{
temp |= 0x0001;
}
}
return temp;
}
void rst_ad()//复位串口程序
{
unsigned char i;
for(i=0;i<64;i++)
{ /* 多于连续32个 DIN=1 使串口复位 */
AD_CLK=0;
write_ad(0xff);
AD_DIN =1;
write_ad(0xff);
AD_CLK=1;
write_ad(0xff);
}
}
void USRTShowData(uint ShowData)//1602显示程序
{
int i;
USRTdata[0]='0'+(ShowData/10000);
ShowData%=10000;
USRTdata[1]='0'+(ShowData/1000);
ShowData%=1000;
USRTdata[2]='0'+(ShowData/100);
ShowData%=100;
USRTdata[3]='0'+(ShowData/10);
USRTdata[4]='0'+(ShowData%10);
for(i=0;i<8;i++)
{
LcdWriteData(USRTdata);
}
}
void main(void)
{
TM7705_init();
LcdInit();
rst_ad();
// P1=0x00;
LcdWriteCom(0x80);
USRTShowData(DATA1);
rst_ad();
delay10us(10);
while(1)
{
write_ad(0x38);
delay10us(1000);
DATA1=readAD_data();
LcdWriteCom(0x80);
USRTShowData(DATA1);
//delay10us(1000);
/*
delay10us(1000);
LcdWriteCom(0x80);
USRTShowData(DATA1);
delay10us(1000);
LcdWriteCom(0x80);
USRTShowData(DATA1);
delay10us(1000);
LcdWriteCom(0x80);
USRTShowData(DATA1);
delay10us(1000);
LcdWriteCom(0x80);
*/
}
}[/mw_shl_code]
我调试的OUT和DRDY总是输出高电位 我的1602LCD屏总是显示65535,这是怎么回事 求大神指点,我都快忙活了一星期了,
|