AD7705测试程序
/*************** AD7705 测试程序 000001 ****************/
#include
#include #define uchar unsigned char #define uint unsigned int
sbit DS=P1^0; //串行数据输入
sbit SH=P1^2; //移位时钟脉冲
sbit ST=P1^1; //输出锁存器控制脉冲
sbit lcden=P1^3; //lcd使能
sbit lcdrs=P1^4; //lcd读写控制
sbit AdClk = P2^0; /*AD7705时钟脉冲*/
sbit AdDout = P2^2;/*AD7705数据输出的反相脉冲*/ sbit AdDin = P2^1; /*AD7705数据输入脉冲*/ sbit drty = P2^3;
uint temp;
/********** 1602 显示 程序******/ void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--); }
uchar code table[]="maichong jiance"; //15
uchar code table1[]=" 00000 us"; //12
void hc_595(uchar date) {
uint j;
for(j=0;j<8;j++)
{
SH=0;
date=date<<1;
DS=CY;
SH=1;
SH=0; //上升沿发生移位
}
ST=0;
ST=1; //上升沿将数据送到输出锁存器
ST=0;
}
void write_com1602(uchar com) /* 写命令*/ {
lcdrs=0;
lcden=0;
hc_595(com);
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_date1602(uchar date) /* 写数据*/ {
lcdrs=1;
lcden=0;
hc_595(date);
delay(5);
lcden= 1;
delay(5);
lcden=0;
}
void write_dt1602(uint data2) /* 显示四位数*/ {
uint wei_1,wei_2,wei_3,wei_4,wei_5;
wei_1=data2/10000;
wei_2=data2/1000%10;
wei_3=data2/100%10;
wei_4=data2/10%10;
wei_5=data2%10;
write_com1602(0x80+0x40+4);
write_date1602(0x30+wei_1);
write_date1602(0x30+wei_2);
write_date1602(0x30+wei_3);
write_date1602(0x30+wei_4);
write_date1602(0x30+wei_5); }
void init1602()
{
uint num;
lcden=0;
write_com1602(0x38);
write_com1602(0x0c);
write_com1602(0x06);
write_com1602(0x01);
write_com1602(0x80);
for(num=0;num<15;num++)
{
write_date1602(table[num]);
delay(5);
}
write_com1602(0x80+0x40);
for(num=0;num<12;num++)
{
write_date1602(table1[num]);
delay(5);
}
}
/****************************************************************/
/* 向AD7705写入一个字节 */
void WriteByte7705(unsigned char x)
{
unsigned char i;
AdClk = 1;
for (i=0; i<8; i++)
{
AdClk=0;
AdDin =(bit) (x & 0x80);
AdClk=1;
x <<=1;
}
AdDin =1;//必不可少的。
}
/* 从AD7705读一个字 */
unsigned int ReadWord7705(void) {
unsigned char i;
unsigned int x=0 ;
AdClk = 1 ;
for (i = 0 ; i < 16 ; i++)
{
AdClk=0;
x<<=1;
if (AdDout)
x |= 0x01;
AdClk=1;
}
return x;
}
/* AD7705通信端口复位 */
void Reset7705(void)
{
unsigned char i;
for(i=0;i<35;i++) /* 多于连续32个 DIN=1 使串口复位 */
{
AdClk=0;
AdDin =1;
AdClk=1;
}
AdDin =1;
}
/*AD7705初始化*/
void Init7705()
{
Reset7705(); /* 复位 */
WriteByte7705(0x20); /* 写ch0 clock register */
WriteByte7705(0x04); /* 2.4576MHz时钟,20Hz数据更新速率 */
WriteByte7705(0x10);/*设置寄存器 写 ch0 */
WriteByte7705(0x44); /*0x44自校准模式 增益1 单极性 不缓冲 滤波器同步(0x46
自校准模式 增益1 单极性 缓冲 滤波器同步) */
}
/* 读AD7705转换数据 输入通道channel ----1=IN1,2=IN2;*/
unsigned int GetData7705() {
WriteByte7705(0x38);/*数据寄存器 读 通道1*/
return ( ReadWord7705() ); }
void main()
{
Init7705();
init1602();
while(1)
{
while(!drty)
{
temp=GetData7705();
write_dt1602(temp);
}
}
}
/*************** AD7705 测试程序000002****************/
#include
#include #define uchar unsigned char #define uint unsigned int #define AD_CLK_WIDTH 1 /*AD7705串口时钟脉冲宽度*/
sbit DS=P1^4; //串行数据输入
sbit SH=P1^2; //移位时钟脉冲
sbit ST=P1^3; //输出锁存器控制脉冲 sbit lcden=P1^1; //lcd使能
sbit lcdrs=P1^0; //lcd读写控制
sbit AdClk = P2^0; /*AD7705时钟脉冲*/ sbit AdDout = P2^2;/*AD7705数据输出的反相脉冲*/ sbit AdDin = P2^1; /*AD7705数据输入脉冲*/ sbit drty = P2^3;
uint temp;
**** hc595 驱动1602程序 ******/ void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
uchar code table[]="maichong jiance"; //15
uchar code table1[]=" 00000 us"; //12
void hc_595(uchar date) {
uint j;
for(j=0;j<8;j++)
{
SH=0;
date=date<<1;
DS=CY;
SH=1;
SH=0; //上升沿发生移位
}
ST=0;
ST=1; //上升沿将数据送到输出锁存器
ST=0;
}
void write_com1602(uchar com) /* 写命令*/ {
lcdrs=0;
lcden=0;
hc_595(com);
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_date1602(uchar date) /* 写数据*/ {
lcdrs=1;
lcden=0;
hc_595(date);
delay(5);
lcden= 1;
delay(5);
lcden=0;
}
void write_dt1602(uint data2) /* 显示四位数*/ {
uint wei_1,wei_2,wei_3,wei_4,wei_5;
wei_1=data2/10000;
wei_2=data2/1000%10;
wei_3=data2/100%10;
wei_4=data2/10%10;
wei_5=data2%10;
write_com1602(0x80+0x40+4);
write_date1602(0x30+wei_1);
write_date1602(0x30+wei_2);
write_date1602(0x30+wei_3);
write_date1602(0x30+wei_4);
write_date1602(0x30+wei_5); }
void init1602()
{
uint num;
lcden=0;
write_com1602(0x38);
write_com1602(0x0c);
write_com1602(0x06);
write_com1602(0x01);
write_com1602(0x80);
for(num=0;num<15;num++)
{
write_date1602(table[num]);
delay(5);
}
write_com1602(0x80+0x40);
for(num=0;num<12;num++)
{
write_date1602(table1[num]);
delay(5);
}
}
/****************************************************************/
/* AD7705软件延时 */
void Wait7705(unsigned int t)
{
for( ;t>0 ;t-- );
}
/* 向AD7705写入一个字节 */
void WriteByte7705(unsigned char x)
{
unsigned char i;
AdClk = 1;
for (i=0; i<8; i++)
{
AdClk=0;
Wait7705(AD_CLK_WIDTH);
AdDin =(bit) (x & 0x80);
Wait7705(AD_CLK_WIDTH);
AdClk=1;
Wait7705(AD_CLK_WIDTH);
x <<=1;
}
AdDin =1;
}
/* 从AD7705读一个字 */
unsigned int ReadWord7705(void)
{
unsigned char i;
unsigned int x=0 ;
AdClk = 1 ;
for (i = 0 ; i < 16 ; i++)
{
AdClk=0;
Wait7705(AD_CLK_WIDTH);
x<<=1;
if (AdDout)
x |= 0x01;
AdClk=1;
Wait7705(AD_CLK_WIDTH);
}
return x;
}
/* AD7705通信端口复位 */
void Reset7705(void)
{
unsigned char i;
for(i=0;i<35;i++) /* 多于连续32个 DIN=1 使串口复位 */
{
AdClk=0;
Wait7705(AD_CLK_WIDTH);
AdDin =1;
Wait7705(AD_CLK_WIDTH);
AdClk=1;
Wait7705(AD_CLK_WIDTH);
}
AdDin =1;
}
/*初始化*/
void Init7705(unsigned char channel , bit polarity ,unsigned char gain)
{
unsigned char x;
Reset7705(); /* 复位 */
WriteByte7705(0x20); /* 写ch0 clock register */
WriteByte7705(0x04); /* 2.4576MHz时钟,20Hz数据更新速率 */
//WriteByte7705(0x21); /* 写CH1 clock register */
//WriteByte7705(0x00); /* 2.4576MHz时钟,20Hz数据更新速率 */
if(channel==1) /* com register ,选择下步操作 setup register */
WriteByte7705(0x10);/*设置寄存器 写 ch0 */
else
WriteByte7705(0x11); /*设置寄存器 写 ch1 */
if(polarity) /* setup register */
x=0x04; /*0x04正常模式 增益1 单极性 不缓冲 滤波器同步(0x46自校准模式 增益1 单极性 缓冲 滤波器同步) */
else
x=0x42; /*0x00正常模式 增益1 双极性 不缓冲 滤波器同步(0x42) */
switch(gain) /*增益设置*/
{
case 1 : x|=0x40;break;
case 2 : x|=0x48;break;
case 4 : x|=0x50;break;
case 8 : x|=0x58;break;
case 16 : x|=0x60;break;
case 32 : x|=0x68;break;
case 64 : x|=0x70;break;
case 128 : x|=0x78;break;
default : x|=0x40;break;
}
WriteByte7705(x);
}
/* 读AD7705转换数据 输入通道channel ----1=IN1,2=IN2;*/
unsigned int GetData7705(unsigned char channel)
{
if(channel==1)
WriteByte7705(0x38);/*数据寄存器 读 通道1*/
else
WriteByte7705(0x39); /*数据寄存器 读 通道2*/
return ( ReadWord7705() ); }
void main()
{
Init7705(1,1,1);
init1602();
while(1)
{
while(!drty)
{
temp=GetData7705(1);
write_dt1602(temp);
delay(5);
}
}
}