|
大家好:
希望我的資料能幫助你
1,實物圖片
2,原理圖及PCB
0.png (37.89 KB, 下載次數: 65)
下載附件
2019-8-31 04:14 上傳
3,手工制作PCB
4,程序
#include<reg52.h>//頭文件
#include<intrins.h>
#include<math.h>
#define uchar unsigned char
#define uint unsigned int//宏定義
uchar code table[]=
{
0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90,
}; //共陽數碼管段碼表 沒有小數點 0~9
uchar code table1[]=
{
0x40,0x79,0x24,0x30,0x19,
0x12,0x02,0x78,0x00,0x10
};//帶小數點的編碼 0~9
sbit ADCCLK=P1^0;//ADC0832時鐘端
sbit DI=P1^1;//ADC0832數據輸入
sbit DO=P1^1;//ADC0832數據輸出,輸入輸出共用P1.1
sbit ADCCS=P1^2;//ADC0832片選端
uchar dat=0;//AD值
uchar count=0;//定時器計數
uchar CH=0;//通道變量
uint num,ge,xiao1,xiao2,shi,shi1,ge1,xiao3,xiao4;
uint dy=0;
/**********************************************************/
/***********************************************************
初始化函數
***********************************************************/
void init()
{
TMOD=0x01;//定時器0工作方式1
TH0=0;//賦初值
TL0=0;
EA=1;//開總中斷
TR0=1;//啟動定時器0
ET0=1;//開定時器0中斷
}
/*********************************************************
延時函數
**********************************************************/
void delay(uint x)
{
uint a,b;
for(a=x;a>0;a--)
for(b=110;b>0;b--);
}
/**************************************************
AD轉換函數
***************************************************/
uint ADC0832()
{
uint i,test,adval;
adval=0;
test=0;
ADCCS=0; //選通ADC0832,CS使能端保持低電平并保持低電平直到轉化完全結束
_nop_(); //延時
ADCCLK=1;//第一個脈沖的上升沿
_nop_(); //延時
DI=1; //第一個脈沖下降沿之前DI必須是高電平,ADC0832轉換啟動信號
ADCCLK=0;//第一個脈沖的下降沿
_nop_(); //延時
ADCCLK=1;//第二個脈沖的上升沿
_nop_(); //延時
if(CH==0)//DI輸入先后輸入1,0。選通CH0通道
{
DI=1;//第二個脈沖下降之前送人通道選擇第二位
ADCCLK=0;//第二個下降沿
_nop_();
ADCCLK=1;//第三個脈沖上升沿
_nop_();
DI=0; //第三個脈沖下降沿之前送入通道選擇第3位
ADCCLK=0;//第三個脈沖的下降沿
_nop_();
ADCCLK=1;//開始第四個脈沖
_nop_();
}
else //選通CH1通道
{
DI=1; //第二個脈沖下降沿之前送通道選擇的第一位
ADCCLK=0; //第二個下降沿
_nop_();
ADCCLK=1; //第三個脈沖的上升沿
_nop_();
DI=1;//第三個脈沖的下降沿之前送通道通道選擇的第二位
ADCCLK=0;//第三個脈沖的下降沿
_nop_();
ADCCLK=1;//開始第四個脈沖
_nop_();
}
ADCCLK=0;//第四個脈沖的下降沿
DO=1;
for(i=0;i<8;i++)//讀取前八位
{
_nop_();
adval<<=1;
ADCCLK=1;
_nop_();
ADCCLK=0;
if(DO)
adval|=0x01;
else
adval|=0x00;
}
for(i=0;i<8;i++)//讀取后八位
{
test>>=1;
if(DO)
test|=0x80;
else
test|=0x00;
_nop_();
ADCCLK=1;
_nop_();
ADCCLK=0;
}
if(adval==test)//比較前8位與后8位的數值,如果不相同,舍去
dat=test;
_nop_();
ADCCS=1;//釋放ADC0832
DO=1;
ADCCLK=1;
return dat;
}
/*******************************************************
數據轉換函數
********************************************************/
void convdata(uint i)//數據轉換函數
{
shi=i/51;//十位,8位AD,0-255對應0-5V,例如:AD得到的數據是1000 0000,即128。128/51=2.509,可見i/51,就可以得到十位
ge=(i%51)*10/51;//小數點后一位,i(例如128)用51取余數,等于26,26*10/51=5,就得到個位
xiao1=((i%51)*10%51)*10/51;//小數點后兩位
dy=abs(shi*100+ge*10+xiao1-0 ///3 后改成0的
)*4;//硬件電路中,用4個10k電阻串聯,取其中一個電阻電壓,總電壓就是4倍,測量范圍變寬了,但是精度降低了。
//-3是矯正值
shi1=dy/1000;
ge1=dy%1000/100;
xiao2=dy%100/10;
xiao3=dy%10;
}
/********************************************************
顯示函數
********************************************************/
void display()
{
P2=0xfe;
if(shi1==0)
{
P0=0xff;
}
else
P0=table[shi1];
delay(5);
P2=0xfd;
P0=table1[ge1];//帶小數點
delay(5);
P2=0xfb;
P0=table[xiao2];
delay(5);
P2=0xf7;
P0=table[xiao3];
delay(5);
P2=0xff;
}
/*********************************************************
主函數
**********************************************************/
void main()
{
init();
while(1)
{
convdata(dat);
display();
}
}
/***************************************************
中斷服務函數
*****************************************************/
void T0_time() interrupt 1
{
TH0=0x00;//賦初值
TL0=0x00;
num++;
if(num==10)
{
num=0;
dat=ADC0832();
}
}
5,壓縮包里有更詳細的教程及源文件 謝謝觀賞
|
-
-
數字電壓表.rar
2019-8-30 16:28 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
8.8 MB, 下載次數: 29, 下載積分: 黑幣 -5
|