硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1936|回复: 0
收起左侧

ad7705

[复制链接]

1

主题

2

回帖

5

积分

新手上路

积分
5
发表于 2019-4-15 19:30:18 | 显示全部楼层 |阅读模式
/********************************************************************
文件名称:ad7705.c
功能:数字万用表
说明:电压五档、电流五档、电阻七档
********************************************************************/
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit ADC_CLK=P1^7 ;                          
sbit ADC_DIN=P3^0 ;                                
sbit ADC_DOUT=P3^0 ;
sbit ADC_DRDY=P3^1;

sbit lcden=P3^3;                                
sbit lcdrs=P3^2;

sbit U=P1^6;
sbit I=P3^5;
sbit R=P3^7;
/*电压档*/
sbit a=P1^4;
sbit b=P1^3;
sbit c=P1^2;
sbit d=P1^1;
sbit e=P1^0;
/*电流档*/
sbit f=P2^0;
sbit g=P2^1;
sbit h=P2^2;
sbit i=P2^3;
sbit j=P2^4;
/*电阻档*/
sbit k=P1^0;
sbit l=P1^1;
sbit m=P1^2;
sbit n=P1^3;
sbit o=P1^4;
sbit p=P2^1;
sbit q=P2^0;
/*短路口*/
sbit DUANLU=P2^5;

/********************************************************************/
void delayms(uint xms);
uint choose();
void readad_16deal_choose();
void InitADC(void);
void InitLCD(void);
void write_com(uchar com);
void write_data(uchar date);
uint WriteToReg_ADC(uint byteword);
uint ReadADC_16BitValue();
void readad_16deal0() ;
void readad_16deal11() ;
void readad_16deal12() ;
void readad_16deal13() ;
void readad_16deal14() ;
void readad_16deal15() ;
void readad_16deal21() ;
void readad_16deal22() ;
void readad_16deal23() ;
void readad_16deal24() ;
void readad_16deal25() ;
void readad_16deal31() ;
void readad_16deal32() ;
void readad_16deal33() ;
void readad_16deal34() ;
void readad_16deal35() ;
void readad_16deal36() ;
void readad_16deal37() ;

void display();
void display0();
/********************************************************************/
uint ch;
uint readad_16bit;
unsigned long v=0;
unsigned long v0=0;
float DATAF,DATAF2;
int DATA=0;
char TRUE;
char count=0;
char code table0[]="welcome!      ";
char code table11[]="DC-200mV~200mV";
char code table12[]="DC-2~2V       ";
char code table13[]="DC-20~20V     ";
char code table14[]="DC-200~200V   ";
char code table15[]="DC-500~500V   ";
char code table21[]="DC-2~2mA      ";
char code table22[]="DC-20~20mA    ";
char code table23[]="DC-200~200mA  ";
char code table24[]="DC-2~2A       ";
char code table25[]="DC-15~15A     ";
char code table31[]="         0~20";
char code table32[]="        0~200";
char code table33[]="         0~2k";                                                               
char code table34[]="        0~20k";
char code table35[]="       0~200k";
char code table36[]="         0~2M";
char code table37[]="       0~100M";
/********************************************************************/
void main()
{        
     DUANLU=1;
         InitLCD();        
     while(1)
         {
           InitADC();
           readad_16deal0();                          
           readad_16deal_choose();        
           display();         
         }
}
uint choose()
{  U=0;a=0;b=0;c=0;d=0;e=0;
   I=0;f=0;g=0;h=0;i=0;j=0;
   R=0;k=0;l=0;m=0;n=0;o=0;p=0;q=0;
           if(U)
        {
                 if(a)ch=11;
                else if(b) ch=12;
                else if(c) ch=13;
                else if(d) ch=14;
                else if(e) ch=15;
        }
        else if(I)
        {
                if(f)ch=21;
                else if(g)ch=22;
                else if(h)ch=23;
                else if(i)ch=24;
                else if(j)ch=25;
        }
        else if(R)
        {
                if(k)ch=31;
                else if(l)ch=32;
                else if(m)ch=33;
                else if(n)ch=34;
                else if(o)ch=35;
                else if(p)ch=36;
                else if(q)ch=37;
        }
        else ch=0;
        return ch;
}
void readad_16deal_choose()
{   switch(choose())
        {
                case 11: readad_16deal11();break;//电压        
                case 12: readad_16deal12();break;
                case 13: readad_16deal13();break;
                case 14: readad_16deal14();break;
                case 15: readad_16deal15();break;        
                case 21: readad_16deal21();break;//电流
                case 22: readad_16deal22();break;
                case 23: readad_16deal23();break;
                case 24: readad_16deal24();break;
                case 25: readad_16deal25();break;
                case 31: readad_16deal31();break;//电阻
                case 32: readad_16deal32();break;
                case 33: readad_16deal33();break;
                case 34: readad_16deal34();break;
                case 35: readad_16deal35();break;
                case 36: readad_16deal36();break;  
                case 37: readad_16deal37();break;
         }
}
void delayms(uint xms)
{
  uint i,j;
  for(i=xms;i>0;i--)
   for(j=110;j>0;j--);
}
void InitADC(void)                        
{
        uchar z;
        ADC_CLK=1;
        ADC_DIN=1;                        
        for(z=0;z<40;z++)                                 
        {
                ADC_CLK=0;
                ADC_CLK=1;
        }                                                           //防止接口迷失,通信寄存器返回到等待写状态
        WriteToReg_ADC(0x20);                 //通道1,下一个写时钟寄存器
        WriteToReg_ADC(0x00);                 //写时钟寄存器设置更新速率为20Hz  0x03:200Hz
        WriteToReg_ADC(0x10);                 //通道1,下一个写设置寄存器
        //WriteToReg_ADC(0x40);                 //写设置寄存器 ,设置成双极性、无缓冲、增益为1、滤波器不工作、自校准
        switch(choose())
        {        case 0:        display0();break;
                case 11: WriteToReg_ADC(0x58);break;        //增益8        以下全为双极性  
                case 12:
                case 13:
                case 14:
                case 15: WriteToReg_ADC(0x40);break;        //增益1
                case 21: WriteToReg_ADC(0x58);break;        //增益8
                case 22: WriteToReg_ADC(0x58);break;        //增益8
                case 23: WriteToReg_ADC(0x58);break;        //增益8
                case 24: WriteToReg_ADC(0x58);break;        //增益8
                case 25: WriteToReg_ADC(0x40);break;
                case 31: WriteToReg_ADC(0x48);break;        //增益2
                case 32: WriteToReg_ADC(0x48);break;
                case 33: WriteToReg_ADC(0x48);break;
                case 34: WriteToReg_ADC(0x48);break;
                case 35: WriteToReg_ADC(0x48);break;
                case 36: WriteToReg_ADC(0x48);break;
                case 37: WriteToReg_ADC(0x40);break;  //增益1  
        }
        delayms(50);
}
void InitLCD(void)               
{
          lcden=0;
      write_com(0x38);         //设置16*2显示,5*7点阵,8位数据接口
      write_com(0x0c);         //开显示,不显示光标
      write_com(0x06);         //写一个字符后地址指针加1
      write_com(0x01);         //显示清零,数据指针清零
}
void write_com(uchar com)        
{
          lcdrs=0;
          P0=com;
          delayms(5);
          lcden=1;
          delayms(5);
          lcden=0;
}
void write_data(uchar date)         
{
           lcdrs=1;
           P0=date;                              //注意:新板数据口是P0,旧板是P1
           delayms(5);
           lcden=1;
           delayms(5);
           lcden=0;
}
/*********写ad转换寄存器**********/
uint WriteToReg_ADC(uint byteword)                  
{
        uint Token,z;
        uint AD16bit_WriteToReg;                                 
        ADC_CLK=1;
        Token=0x80;                        
    AD16bit_WriteToReg=byteword;                        
        for(z=0;z<8;z++)
        {
                if(AD16bit_WriteToReg & Token)
                        ADC_DIN=1; // 输入数据位
                else
                        ADC_DIN=0;
                delayms(1);
                ADC_CLK=1;
                delayms(1);
                ADC_CLK=0;
                ADC_CLK=1;
            Token=Token>>1;
        }                                                                  
        ADC_CLK=1;
        ADC_DIN=1;                         //结束
        return(TRUE);                                 
}
/******************读16位AD数值******************/
uint ReadADC_16BitValue()         
{
        uint z;
        unsigned long AD16bit;
        //uint AD16bit;
        WriteToReg_ADC(0x38);
    while (ADC_DRDY) ;                 //等待数据准备
        { //delayms(5);         
          ADC_CLK=1;
          AD16bit=0x0000;

                for(z=0;z<16;z++)
                {
                        AD16bit=AD16bit<<1;
                        ADC_CLK=0;
                        delayms(1);
                        if(ADC_DOUT==1)AD16bit=AD16bit|0x0001;  
                        ADC_CLK=1;
                }

        }
        ADC_CLK=1;
        ADC_DIN=1;
        return(AD16bit);               
}
void readad_16deal0()            
{
        char count=0;
        readad_16bit=ReadADC_16BitValue();         
        {
        if(readad_16bit>0x8000)DATA=readad_16bit-0x8000;
        if(readad_16bit<0x8000)DATA=0x8000-readad_16bit;
        DATAF=DATA;        
        }

}
/*********************电压***********************/
void readad_16deal11() //200m
{   
         DATAF2=DATAF/32767*31250000;
         v0=DATAF2;
         v=v0;
         if(v>20000000)v=20000000;
         for(count=0;count<14;count++)
         {
                write_com(0x80+count);
                write_data(table11[count]);
         }
}
void readad_16deal12()  // 2v
{         
     DATAF2=DATAF/32767*250000;
         v0=DATAF2;
         v=v0;
         if(v>200000)v=200000;
         for(count=0;count<14;count++)
         {
                write_com(0x80+count);
                write_data(table12[count]);
         }

}
void readad_16deal13() // 20v
{    DATAF2=DATAF/32767*250000*11;
         v0=DATAF2;
         v=v0;
         if(v>2000000)v=2000000;
         for(count=0;count<14;count++)
         {
                write_com(0x80+count);
                write_data(table13[count]);
         }

}
void readad_16deal14()  // 200v
{    DATAF2=DATAF/32767*250000*101;
         v0=DATAF2;
         v=v0;
         if(v>20000000)v=20000000;
         for(count=0;count<14;count++)
         {
                write_com(0x80+count);
                write_data(table14[count]);
         }

}
void readad_16deal15()  //500v
{    DATAF2=DATAF/32767*250000*491;
         v0=DATAF2;
         v=v0;
         if(v>50000000)v=50000000;
         for(count=0;count<14;count++)
         {
                write_com(0x80+count);
                write_data(table15[count]);
         }

}
/*******************电流*********************/
void readad_16deal21() //2mA
{    DATAF2=DATAF/32767*2500000000/8/106;
         v0=DATAF2;
         v=v0;
         if(v>200000)v=200000;
         for(count=0;count<14;count++)
         {
                write_com(0x80+count);
                write_data(table21[count]);
         }

}
void readad_16deal22() //20mA
{    DATAF2=DATAF/32767*250000000/8/18*15;
         v0=DATAF2;
         v=v0;
         if(v>2000000)v=2000000;
         for(count=0;count<14;count++)
         {
                write_com(0x80+count);
                write_data(table22[count]);
         }

}
void readad_16deal23() //200mA
{    DATAF2=DATAF/32767*250000000/8/16*12;
         v0=DATAF2;
         v=v0;
         if(v>20000000)v=20000000;
         for(count=0;count<14;count++)
         {
                write_com(0x80+count);
                write_data(table23[count]);
         }

}
void readad_16deal24() //2A
{    DATAF2=DATAF/32767*250000/8/18*15;
         v0=DATAF2;
         v=v0;
         if(v>200000)v=200000;
         for(count=0;count<14;count++)
         {
                write_com(0x80+count);
                write_data(table24[count]);                        
         }

}
void readad_16deal25() //15A
{    DATAF2=DATAF/32767*1562500;
         v0=DATAF2;
         v=v0;
         if(v>1500000)v=15000000;
         for(count=0;count<14;count++)
         {
                write_com(0x80+count);
                write_data(table25[count]);
         }

}
/*********************电阻********************/
void readad_16deal31() // 20Ω
{    DATAF2=(DATAF/32767*125000)*2120/(250-(DATAF/32767*125));
         v0=DATAF2;
         v=v0;
//         if(v>2000000)v=2000000;
         if(DATAF<30000)DUANLU=0;
         else DUANLU=1;


         for(count=0;count<13;count++)
         {
                write_com(0x80+count);
                write_data(table31[count]);
         }
         write_com(0x80+13);
         write_data(0xf4);
}
void readad_16deal32() //200Ω
{    DATAF2=(DATAF/32767*125000)*20060/(250-(DATAF/32767*125));
         v0=DATAF2;
         v=v0;
//         if(v>20000000)v=20000000;

         for(count=0;count<13;count++)
         {
                write_com(0x80+count);
                write_data(table32[count]);
         }
         write_com(0x80+13);
         write_data(0xf4);
}
void readad_16deal33() // 2kΩ
{    DATAF2=(DATAF/32767*125)*200000/(250-(DATAF/32767*125));
         v0=DATAF2;
         v=v0;
//         if(v>200000)v=200000;

         for(count=0;count<13;count++)
         {
                write_com(0x80+count);
                write_data(table33[count]);
         }
         write_com(0x80+13);
         write_data(0xf4);
}
void readad_16deal34() //20kΩ
{    DATAF2=(DATAF/32767*125)*2001000/(250-(DATAF/32767*125));
         v0=DATAF2;
         v=v0;
//         if(v>2000000)v=2000000;

         for(count=0;count<13;count++)
         {
                write_com(0x80+count);
                write_data(table34[count]);
         }
         write_com(0x80+13);
         write_data(0xf4);
}
void readad_16deal35() // 200kΩ
{    DATAF2=(DATAF/32767*125)*19980000/(250-(DATAF/32767*125));
         v0=DATAF2;
         v=v0;
//         if(v>20000000)v=20000000;

         for(count=0;count<13;count++)
         {
                write_com(0x80+count);
                write_data(table35[count]);
         }
         write_com(0x80+13);
         write_data(0xf4);
}
void readad_16deal36() //2MΩ
{    DATAF2=(DATAF/32767*1.3*125)*200000/(250-(DATAF/32767*1.3*125));
         v0=DATAF2;
         v=v0;
//         if(v>200000)v=200000;

         for(count=0;count<13;count++)
         {
                write_com(0x80+count);
                write_data(table36[count]);
         }
         write_com(0x80+13);
         write_data(0xf4);
}
void readad_16deal37() //100MΩ
{    DATAF2=(DATAF/32767*2.5)*510000/(2.5-(DATAF/32767*2.5));
         v0=DATAF2;
         v=v0;
//         if(v>10000000)v=10000000;

         for(count=0;count<13;count++)
         {
                write_com(0x80+count);
                write_data(table37[count]);
         }
         write_com(0x80+13);
         write_data(0xf4);
}

void display()                                                   //档符显示前移到各档处理函数中
{                                                                     //本函数可共用

        char disp[9]="12345678";

        disp[0]= (v/10000000)+0x30;           //0对应的十进制ASCII码48换为十六进制即为0x30                                          
        v%=10000000;        
        disp[1]= (v/1000000)+0x30;                                             
        v%=1000000;
        disp[2]= (v/100000)+0x30;                                             
        v%=100000;   
        disp[3]= (v/10000)+0x30;                                             
        v%=10000;
        disp[4]= (v/1000)+0x30;         
        v%=1000;
        disp[5]= (v/100)+0x30;
        v%=100;
        disp[6]= (v/10)+0x30;
        v%=10;
        disp[7]= (v/1)+0x30;

        if(readad_16bit<0x8000)
        {
                write_com(0x80+0x41);
                write_data('-');        
        }
        if(readad_16bit>0x8000)
        {
                write_com(0x80+0x41);
                write_data('+');        

        } ;
        for(count=0;count<3;count++)
        {
                write_com(0x80+0x42+count);
                write_data(disp[count]);        
        }
        write_com(0x80+0x42+3);
        write_data('.');
        for(count=3;count<8;count++)
        {
                write_com(0x80+0x42+count+1);
                write_data(disp[count]);               
        }

}
void display0()
{         
        for(count=0;count<14;count++)
         {
                write_com(0x80+count);
                write_data(table0[count]);
         }
}


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-11 22:16 , Processed in 0.212660 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表