#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
#include <intrins.h>
code uchar TAB[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //定义数码管显示数值
uchar str_TME[4]={0,0,0,0,}; //定义数码管显示初始值
unsigned char data1; //data1用来存放转换以后的数据
void delay(uchar ms) //定义ms延迟程序
{
uchar j;
while(ms--)
for(j=0;j<125;j++);
}
uchar tmel=0;
bit sim=1;
/***********************计数器中断函数,用于控制电压转*********************
*******************时间间隔,此程序设定间隔为1S电压转换一次***************/
void tme_tr0(void) interrupt 1
{
TL0=0x58;
TH0=0x9e; //设置25ms 延时的初值
if(++tmel==40)
{
tmel=0;
sim=1;
}
/***************************************************************************
AD0832AD转换子程序
***************************************************************************/
sbit bADcs=P2^2; //片选位
sbit bADcl=P2^1; //时钟位
sbit bADda=P2^0; //数据位
void ad(void)
{ uchar i;
bADcs = 0;//当ADC0832未工作时其CS输入端应为高电平,此时芯片禁用,开始工作CS为低电平
bADcl=0; //第一个时钟下降沿前da为1,第二个与第三时钟下降沿前的数据为通道选择
bADda=1; //选置起始位
bADcl=1;
bADcl=0; // 1down
bADda=1; //通道选择第1位
bADcl=1;
bADcl=0; // 2 down
bADda=0; //通道选择第2位,通道选择为
for(i=8;i>0;i--)
{
data1<<=1; //从第7位开始,要左移data1=data1<<1
bADcl=0;
bADcl=1;
if(bADda==1) data1|=0x01; //如果输出1,data1最后一位补1
}
bADcs=1; //转换完后CS置1
}
void changs() //转换程序
{
double sum;
uchar val_Integer; //定义整数变量
unsigned int val_Decimal; //定义小数变量
sum=data1*0.0196078 ;
val_Integer=(uchar)sum;
val_Decimal=(unsigned int)((sum-val_Integer)*1000);
str_TME[3]=val_Decimal%10;
str_TME[2]=val_Decimal/10%10;
str_TME[1]=val_Decimal/100;
str_TME[0]=val_Integer;
}
}
/*****************定义数码管显示(共阳数码管)***************************/
sbit g1=P1^0; //第一位
sbit g2=P1^1; //第二位
sbit g3=P1^2; //第三位
sbit g4=P1^3; //第四位
void VAL_xs()
{
P3=(TAB[str_TME[0]])&0x7f; //显示小数点
g1=0; //第一位显示
delay(4);
g1=1;
P3=TAB[str_TME[1]];
g2=0; //第二位显示
delay(4);
g2=1;
P3=TAB[str_TME[2]];
g3=0; //第三位显示
delay(4);
g3=1;
P3=TAB[str_TME[3]];
g4=0; //第四位显示
delay(4);
g4=1;
}
/*****************************************************
主程序
*******************************************************/
main()
{
P1=0xc0;
IE=0x82; //中断请求
TMOD=0x01;
IP=0x01;
TL0=0x58;
TH0=0x9e;
TR0=1; //运行控制位
while(1)
{
VAL_xs();
if(sim==1)
{
ad(); //电压转换
changs(); //数据转换
sim=0;
}
}
}
#include<reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit bADcs=P2^2; //片选位
sbit bADcl=P2^1; //时钟位
sbit bADda=P2^0; //数据位
sbit g1=P1^0; //第一位
sbit g2=P1^1; //第二位
sbit g3=P1^2; //第三位
sbit g4=P1^3; //第四位
code uchar TAB[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //定义数码管显示数值
uchar str_TME[4]={0,0,0,0,}; //定义数码管显示初始值
unsigned char data1; //data1用来存放转换以后的数据
void delay(uchar ms) //定义ms延迟程序
{
uchar j;
while(ms--)
for(j=0;j<125;j++);
}
uchar tmel=0;
bit sim=1;
/***********************计数器中断函数,用于控制电压转*********************
*******************时间间隔,此程序设定间隔为1S电压转换一次***************/
void tme_tr0(void) interrupt 1
{
TL0=0x58;
TH0=0x9e; //设置25ms 延时的初值
if(++tmel==40)
{
tmel=0;
sim=1;
}
}
/***************************************************************************
AD0832AD转换子程序
***************************************************************************/
//sbit bADcs=P2^2; //片选位
//sbit bADcl=P2^1; //时钟位
//sbit bADda=P2^0; //数据位
void ad()
{ uchar i;
bADcs = 0;//当ADC0832未工作时其CS输入端应为高电平,此时芯片禁用,开始工作CS为低电平
bADcl=0; //第一个时钟下降沿前da为1,第二个与第三时钟下降沿前的数据为通道选择
bADda=1; //选置起始位
bADcl=1;
bADcl=0; // 1down
bADda=1; //通道选择第1位
bADcl=1;
bADcl=0; // 2 down
bADda=0; //通道选择第2位,通道选择为
for(i=8;i>0;i--)
{
data1<<=1; //从第7位开始,要左移data1=data1<<1
bADcl=0;
bADcl=1;
if(bADda==1) data1|=0x01; //如果输出1,data1最后一位补1
}
bADcs=1; //转换完后CS置1
}
void changs() //转换程序
{
double sum;
uchar val_Integer; //定义整数变量
unsigned int val_Decimal; //定义小数变量
sum=data1*0.0196078 ;
val_Integer=(uchar)sum;
val_Decimal=(unsigned int)((sum-val_Integer)*1000);
str_TME[3]=val_Decimal%10;
str_TME[2]=val_Decimal/10%10;
str_TME[1]=val_Decimal/100;
str_TME[0]=val_Integer;
}
/*****************定义数码管显示(共阳数码管)***************************/
//sbit g1=P1^0; //第一位
//sbit g2=P1^1; //第二位
//sbit g3=P1^2; //第三位
//sbit g4=P1^3; //第四位
void VAL_xs()
{
P3=(TAB[str_TME[0]])&0x7f; //显示小数点
g1=0; //第一位显示
delay(4);
g1=1;
P3=TAB[str_TME[1]];
g2=0; //第二位显示
delay(4);
g2=1;
P3=TAB[str_TME[2]];
g3=0; //第三位显示
delay(4);
g3=1;
P3=TAB[str_TME[3]];
g4=0; //第四位显示
delay(4);
g4=1;
}
/*****************************************************
主程序
*******************************************************/
main()
{
P1=0xc0;
IE=0x82; //中断请求
TMOD=0x01;
IP=0x01;
TL0=0x58;
TH0=0x9e;
TR0=1; //运行控制位
while(1)
{
VAL_xs();
if(sim==1)
{
ad(); //电压转换
changs(); //数据转换
sim=0;
}
}
}