#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit k1=P2^0;
sbit k2=P2^1;
sbit k3=P2^2;
sbit k4=P2^3;
sbit A1=P2^6;
sbit B1=P2^7;
sbit led1=P3^2;
sbit led2=P3^3;
sbit beep=P3^5;
sbit P0_7=P0^7;
sbit cs=P3^4;
sbit clk=P3^6;
sbit dati=P3^7;
sbit dato=P3^7;
uchar dat=0x00;
uchar temp;
uchar a[4];
/*******************************共阳LED段码表*******************************/
uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xc1};
/******************************/
/* ADC0832模数转换应用程序 */
/******************************/
/****************************************************************************
函数功能:AD转换子程序
入口参数:CH
出口参数:dat
****************************************************************************/
uchar adc_0832(uchar CH)
{
uchar i,test,advai;
advai=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_();
advai<<=1;
clk=1;
_nop_();
clk=0;
if(dato)
advai|=0x01;
else
advai|=0x00;
}
clk=0;
for(i=0;i<8;i++) //读取后8位的值
{
_nop_();
test>>=1;
clk=1;
_nop_();
clk=0;
if(dato)
test|=0x80;
else
test|=0x00;
}
if(advai==test)
dat=test;
_nop_();
cs=1;//释放ADC0832
dato=1;
return dat;
}
/***按键查询****/
void scan(void)
{
void display();
void delay(uint t);
display();
if(k1==0) //k1检测
{
delay(10);
}
if(k1==0)
{
while(k1==0)
{display();};
temp=1;
A1=0;
B1=0;
}
if(k2==0) //k2检测
{
delay(10);
}
if(k2==0)
{
while(k2==0)
{display();};
temp=2;
A1=1;
B1=0;
}
if(k3==0) //k3检测
{
delay(10);
}
if(k3==0)
{
while(k3==0)
{display();};
temp=3;
A1=0;
B1=1;
}
if(k4==0)
{
delay(10);
}
if(k4==0)
{
while(k4==0)
{display();};
temp=4;
A1=1;
B1=1;
}
}
/********延时**********
12MHZ约为1ms
***********************/
void delay(uint t)
{
uint k;
while(t--)
{
for(k=0; k<123; k++)
{ }
}
}
/*****************************************/
/* 运算程序 */
/*****************************************/
void yu_suan(void)
{
uint bept;
if(temp==4)
{
bept=((dat*5.0/256.0)-2.5)*1000;
a[0]=(bept/1000);
a[1]=((bept%1000)/100);
a[2]=(bept%100);
a[3]=0;
if(bept<0) led1=0;
else if(bept>1000) led2=0;
}
else
{
bept=(dat*5.0/256.0)*1000;
a[0]=(bept/1000);
a[1]=((bept%1000)/100);
a[2]=(bept%100);
a[3]=10;
if(bept<25) led1=0;
else if(bept>35) led2=0;
}
}
/*****display******/
void display(void)
{ uchar n;
for(n=0;n<4;n++)
{
P0=tab[a[n]];
if(n==0)
{
if(temp==4) P0_7=1;
else P0_7=0;
P1=P1&0xfe;
}
if(n==1)
{
P1=P1&0xfd;
}
if(n==2)
{
if(temp==4) P0_7=0;
else P0_7=1;
P1=P1&0xfb;
}
if(n==3)
{
P1=P1&0xf7;
}
}
}
void main(void)
{
beep=1;
delay(50);
beep=0;
while(1)
{
scan();
adc_0832(0);
yu_suan();
display();
}
}