⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 p7705.c

📁 AD7705的读写驱动
💻 C
字号:
#include<reg51.h>
#include<intrins.h>
#define unchar unsigned char;


sbit A0=P1.0;
sbit A1=P1.1;
sbit A2=P1.2;
sbit DIN=P1.3;
sbit DOUT=P1.4;
sbit DRDY=P1.5;
sbit SCLK=P1.6;
//       通讯寄存器00,读,01写
//       设置寄存器01111010
//       时钟寄存器00000010         100Hz
//       数据寄存器16位
long mask,send_dat;
long data ad_ctrl_word,dat,dat1,wt;

long ad_rd16();   //读16位实际转换的值
void ad_wr8();         //写24位显示的值

//************************************
//*********延时1秒程序****************
//************************************
delay()
{
    int data i;
    for(i=0;i<5000;i++){}
}
//延时1豪秒程序
delay1ms()
{
    int data i;
    for(i=0;i<5;i++){}
}
//数字滤波,5次平均

save()
{
     char data i;
     long sum_temp=0,dat_sub=0;
    // wt=dat;
     dat_temp[temp_n]=dat;
     temp_n++;
     if(temp_n==5){ temp_n=0; }
     for(i=0;i<5;i++){sum_temp=sum_temp+dat_temp[i];}
     wt=sum_temp/5;
  }


//写24位控制字
void ad_ctrl_wr(long ctrl_word){                //写24位控制字
long data mask;                                 //确定掩码
char data i,temp;
    ad_a0=0;     //对控制字进行读写
    ad_tfs=1;
    ad_rfs=1;
    mask=0x00800000;                            //掩码最高位为1
    ad_tfs=0;                                  //先送高位后送低位
    for(i=0;i<24;i++){                         //送24位
        if((ctrl_word&mask)!=0){
            ad_sdata=1;
        }
        else{
            ad_sdata=0;
        }
        delay1ms();
        ad_sclk=1;
        mask=mask>>1;                           //延迟,给个下降沿脉冲
        delay1ms();
        ad_sclk=0;
    }
    ad_tfs=1;
}
long ad_ctrl_rd(){                       //读控制字
long data ddd;
char data i,temp;
    ad_a0=0;                  //读control
    ddd=0;
    ad_rfs=1;
    ad_tfs=1;
    ad_rfs=0;
    for(i=0;i<24;i++){                  //共读24位
        ad_sclk=1;                      //先让时钟为1
        if(ad_sdata==1){   ddd++;   }   //如果为1,则加加
        if(i<23){                       //如果小于23则左翼、
            ddd=ddd<<1;
        }
        delay1ms();
        ad_sclk=0;
        delay1ms();

    }
    ad_rfs=1; ad_a0=0;
    return(ddd);                 // 返回值
}
 //读AD输出数据16位


//读校准寄存器数据24位
void ad_cal_rd(){
    ad_ctrl_word=0xdc1493;     //写控制字
    ad_ctrl_wr(ad_ctrl_word);  //写控制字1101 1100 0001 0100 1001 0011
    dat=ad_rd1624(24);         //读校准系数
}

//写校准寄存器数据24位
void ad_cal_wr(){
    ad_ctrl_word=0xfc1493;    //写 写校准系数控制字
    ad_ctrl_wr(ad_ctrl_word); //写控制字1111 1100 0001 0100 1001 0011
    ad_wr24();                //写校准系数
}


//从AD7710中读16位或24位数据

long ad_rd1624(char bits){
long data ddd;
char data i;
    ad_a0=1;                  //读数据
    ddd=0;
    ad_rfs=1;                 //初始化端口均为1
    ad_drdy=1;
    while(ad_drdy==1){}       //如果该端口为0则为准备好
    ad_rfs=0; ad_sclk=0;      //始终和接受位先都置低
    for(i=0;i<bits;i++){      //读位数
        ad_sclk=1;
        if(ad_sdata==1){   ddd++;   }
        if(i<(bits-1)){
            ddd=ddd<<1;
        }
        delay1ms();
        ad_sclk=0;
        delay1ms();
    }
    ad_rfs=1; ad_a0=0;
    return(ddd);
}
//
void ad_wr24(){

}


convert(long wtt)
{
  char data temp;
  if(bat=1)
  wtt=0xa0a0a0a1|wtt;
  else wtt=0xa0a0a0a0|wtt;
}


void time0() interrupt 1 using 2 //前面为中断向量,后面为选用的寄存器组
{
char data temp;

        //送定时常数4ms
   TH0=0xc3;   //置定时器初值
   TL0=0x00;                       
   if (mask==0){
   
        ad_send=1;
           ET1=1;
           TR1=1;
           ET0=0;
              }
              
   if( mask&send_dat) ad_send=1;      // 如果掩码为1则送1否则送0
   else ad_send=0;
   mask=mask>>1;

}
void time1() interrupt 3 using 3
{
   //送时间常数
   
   TH1=0x00;
   TL1=0x00;
   tt++;
   if(tt>4){
      tt=0;
      ET0=1;
      ET1=0;
      TR1=0;
      mask=0x80000000;
   }
}


main(){
    ad_ctrl_word=0x003c1493;     //写读数据控制字
    ad_ctrl_wr(ad_ctrl_word);    //先写控制字为0011 1100 0001     0100 1001 0011
                                 //完成一步校准,//全放大,//关电流//双悸性//
    delay();                    //延时1秒
    
    dat1=ad_ctrl_rd();         //读控制寄存器数据
    
    display_dat(bat);          //显示
    
    while(1){
        delay();              //延时          
        dat=ad_rd1624(16);//读数据
        
        save();
        
        disp_n++;          //10次显示1次
        
        if(disp_n==10){ disp_n=0;display_dat(dat); }
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -