#include <reg51.h>
#include <intrins.h>
#define uint unsigned int
//==========端口定义============
sbit CS=P2^4;
sbit Clk=P2^5;
sbit DATI=P2^6;
sbit DATO=P2^6;
sbit wei1=P2^3;
sbit wei2=P2^2;
sbit wei3=P2^1;
sbit wei4=P2^0;
sbit p10=P1^0;
sbit p11=P1^1;
sbit p12=P1^2;
sbit p13=P1^3;
sbit p14=P1^4;
sbit p15=P1^5;
sbit p16=P1^6;
sbit p17=P1^7;
sbit up=P3^0;
sbit dow=P3^1;
//===========全局===============
unsigned char dat = 0x00; //AD值
unsigned char count = 0x00; //定时器计数
unsigned char CH; //通道变量
//=============共阳=============
unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//========AD转换=========
unsigned char adc0832(void)
{
unsigned char i,test,adval;
adval=0x00;
test=0x00;
Clk=0; //初始化
DATI=1;
_nop_();
CS=0;
_nop_();
Clk=1;
_nop_();
if(CH==0x00) //通道选择
{
Clk=0;
DATI=1; //通道0的第一位
_nop_();
Clk=1;
_nop_();
Clk=0;
DATI=0; //通道0的第二位
_nop_();
Clk=1;
_nop_();
}
else
{
Clk=0;
DATI=1; //通道1的第一位
_nop_();
Clk=1;
_nop_();
Clk=0;
DATI=1; //通道1的第二位
_nop_();
Clk=1;
_nop_();
}
Clk=0;
DATI=1;
for(i=0;i<8;i++) //读前8位
{
_nop_();
adval<<=1;
Clk=1;
_nop_();
Clk = 0;
if (DATO) adval |= 0x01;
else adval |= 0x00;
}
for(i=0;i<8;i++) //读后8位
{
test>>=1;
if (DATO)
test|=0x80;
else
test|=0x00;
_nop_();
Clk=1;
_nop_();
Clk=0;
}
if(adval==test) //比较前8位与后8位的值
dat=test;
_nop_();
CS=1; //释放AD
DATO=1;
Clk=1;
return dat;
}
//===========延时==============
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=300;y>0;y--);
}
//============显示============
void display(unsigned char A)
{
wei4=0;
P0=table[A/51]& 0x7f;
delay(1);
wei4=1;
wei3=0;
P0=table[(A%51)*10/51];
delay(1);
wei3=1;
wei2=0;
P0=table[((A%51)*10%51)*10/51];
delay(1);
wei2=1;
wei1=0;
P0=table[(((A%51)*10%51)*10%51)*10/51];
delay(1);
wei1=1;
}
//========发光管显示不同电压等级==========
void SHUCHU(void)
{
if(dat<5) { P1=0xFF; }
else if(dat<30) { P1=0xFF; p10=0; } //1
else if(dat<45) { P1=0xFF; p11=0; } //2
else if(dat<70) { P1=0xFF; p12=0; } //3
else if(dat<80) { P1=0xFF; p13=0; } //4
else if(dat<100) { P1=0xFF; p14=0; } //5
else if(dat<120) { P1=0xFF; p15=0; } //6
else if(dat<130) { P1=0xFF; p16=0; } //7
else if(dat<140) { P1=0xFF; p17=0; } //8
if(dat>150) { P1=0xFF; }
}
//========================================
void main(void)
{
wei1=1;
wei2=1;
wei3=1;
wei4=1;
P0=0xff;
CH = 0x00; //选择通道 0x00或0x01
TMOD = 0x01; //设置中断
TH0 = 0x00;
TL0 = 0x00;
IE = 0x82;
TR0 = 01;
while(1) //主循环
{
dat=adc0832(); //数据转换
display(dat); //显示数值
SHUCHU(); //显示等级
}
}