|
大家好:
希望我的资料能帮助你
1,实物图片
2,原理图及PCB
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,压缩包里有更详细的教程及源文件 谢谢观赏
|
|