#include "reg51.h" #include "intrins.h" #include "string.h" void Reset7705(void); void ad7705Init(); void Write(unsigned char dat); unsigned read7705(); sbit cs=P3^1; sbit reset=P3^2; sbit drdy=P3^3; sbit sclk=P3^4; sbit din=P3^6;//此为din dout 实际联接 sbit dout=P3^5; void Reset7705(void) { int tim,j; cs=0; tim=1000; reset=0; while(tim--); reset=1; //用示波器看reset位是频率很高的脉冲 //reset不是应该恒为1吗? sclk=1; for(j=0;j<1;j++) //*多于连续32个 din=1 使串口复位 //本应该是j<40;但如果<40程序就不对了, //这是怎么回事? { sclk=0; _nop_(); _nop_(); din =1; _nop_(); _nop_(); sclk=1; } //drdy=0; }
//写入寄存器8位数据 void Write(unsigned char dat) {
unsigned i; for(i=0;i<8;i++) { sclk=0; _nop_(); _nop_(); if(dat&0x80) din=1; else din=0; _nop_(); _nop_(); sclk=1; dat=dat<<1;//保证t13延时 } }
void ad7705Init() { Write(0x20); Write(0x04); Write(0x10); Write(0x40);//40是增益为1 } unsigned read7705() { unsigned result=0; unsigned i,dout; //dout=0; //din=1; while(drdy);//如果把本句屏蔽了,din dout用示波器看 //都有输出,但似乎不对,如果不屏蔽根本没有输出 Write(0x38); sclk=1; for(i=0;i<16;i++) { result<<=1; sclk=1; _nop_(); sclk=0; //程序执行完后sclk仍为高电平 _nop_(); _nop_(); result+=(0x01&dout);//保证t5 res=result; } //sclk=1; //din=1;//程序没走到这 return result; } void main() { Reset7705(); ad7705Init(); read7705();//加while(1)似乎不对 } /***************************************** 可能我发在这里很冒昧,但这个问题真是困扰我 很长时间了,我希望能有谁用过能指点一下. 非常感谢! *****************************************/
|