/********************************************************************
文件名稱:ad7705.c
功能:數(shù)字萬用表
說明:電壓五檔、電流五檔、電阻七檔
********************************************************************/
#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;
} //防止接口迷失,通信寄存器返回到等待寫狀態(tài)
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位數(shù)據(jù)接口
write_com(0x0c); //開顯示,不顯示光標
write_com(0x06); //寫一個字符后地址指針加1
write_com(0x01); //顯示清零,數(shù)據(jù)指針清零
}
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; //注意:新板數(shù)據(jù)口是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; // 輸入數(shù)據(jù)位
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數(shù)值******************/
uint ReadADC_16BitValue()
{
uint z;
unsigned long AD16bit;
//uint AD16bit;
WriteToReg_ADC(0x38);
while (ADC_DRDY) ; //等待數(shù)據(jù)準備
{ //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() //檔符顯示前移到各檔處理函數(shù)中
{ //本函數(shù)可共用
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]);
}
}
|