我不加串口,只控制AD,可是好像还是不对,大家帮忙看看
/*TI=1时,申请中断,CPU响应中断后,发送数据,硬件控制TI RI=1时,申请中断,要求CPU取走数据*/ #include "reg51.h" #include "stdio.h" #include "intrins.h" #include "string.h" void Reset7705(void); unsigned int read7705(void); //返回一次采样值 void ad7705Init(unsigned char range); void Write(unsigned char dat); 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; sclk=1; for(j=0;j<1;j++) //*多于连续32个 din=1 使串口复位 { sclk=0; //Delay(); din =1; sclk=1; //Delay(); } drdy=0; }
//写入寄存器8位数据 void Write(unsigned char dat) {
unsigned i; for(i=0;i<8;i++) {//sclk=1; //Delay(); sclk=0; //din=(bit)(dat&0x80);//AD7705希望MSB在前,所以总是取最高位与,然后左移,把第二高位变成第一高位,再与 if(dat&0x80) din=1; else din=0; //Delay(); sclk=1; dat=dat<<1;//保证t13延时 } //din=1; //为保证不乱写程序,此语句非常重要,否则试验表明很不稳定 }
void ad7705Init(void) { Reset7705(); Write(0x20); Write(0x55); Write(0x10); Write(0x40); }
//返回一次采样值 unsigned int read7705(void) { unsigned rtval=0; unsigned i; //dout=0; //din=1; while(drdy==1); Write(0x38); //0x38:00111000 下一个16位数据寄存器;读;正常工作模式;通道AN1 sclk=1; for(i=0;i<16;i++) { //sclk=1; // Delay(); rtval<<=1; sclk=1; rtval+=(0x01&(unsigned)dout);//保证t5 sclk=0; //程序执行完后sclk仍为高电平 } //sclk=1; //din=1;//程序没走到这 return rtval; } void main() { ad7705Init(); while(1) { //cs=0; //ad7705Init(); read7705(); } }
|
|