A/D转换实现0~5V测量0~1V数码管显示数字量与模拟量;
1~2V显示学号;
2~3V显示HAPPY!!!;
3~4V从右至左滚动显示HAPPY!!!;
4.5V~ 报警
#i nclude <reg52.h>
#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long
sfr P1ASF=0x9d;
sfr ADC_CONTR=0xbc; //power speed1 speed0 flag st chs2 chs1 chs0
sfr ADC_RES=0xbd;
sfr ADC_RESL=0xbe;
sbit ser=P2^1; //LED显示 595数据输入
sbit srclk1=P2^2;
sbit rclk1=P2^3;
sbit speak=P3^2;
// H A P Y !
uchar idata LED[ ]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xfe,0xbf,0x89,0x88,0x8c,0x99,0x7d,0xff};//共阳极段码表说明
uchar idata bb[]={0,0,10,0,11,11,11,11},cc[]={0,0,10,0,11,11,11,11},dd[]={0,0,10,0,11,11,11,11},jj[]={0,0,10,0,11,11,11,11};
//--------------------------------------------------------------------
void delayXms(uint n)
{
uint i,j;
for(i=0;i<n;i++)
for(j=0;j<125;j++);
}
//--------------------------------------------------------------------
void outbyte(uchar a,b)
{
uchar j;
for(j=0;j<8;j++) //位码移位串行输出
{ if(a&0x80) ser=1; else ser=0;
a=a<<1;
srclk1=0;
srclk1=1;
}
for(j=0;j<8;j++) //duan码移位串行输出
{ if(b&0x80) ser=1; else ser=0;
b=b<<1;
srclk1=0;
srclk1=1;
}
rclk1=0; //595锁存脉冲
rclk1=1;
}
//--------------------------------------------------------------------
uint GET_AD_Result()//启动AD转换并返回转换值
{
uchar temp;
uint data_temp;
data_temp=0;
ADC_RES=0;
ADC_RESL=0;
ADC_CONTR|=0x08;//启动AD
re: temp=0x10;
temp&=ADC_CONTR;//查询ADC_FLAG,忙标志,转换完否
if(temp==0)
goto re;
ADC_CONTR&=0xe0;//P1.0为AD输入口
data_temp=ADC_RES;
data_temp<<=2;
data_temp+=ADC_RESL;
return data_temp;
}
//--------------------------------------------------------------------
void main(void) using 0
{
uint result,temp,i,a,c,d,e;
uchar aa[3]={0,0,0};
P1ASF=0x01;
ADC_CONTR=0xe0; //P1.0为AD输入口
while(1)
{
result=GET_AD_Result();
aa[2]=result*5/1024; //模拟量显示0-5v 数学转换
temp=result*5%1024;
temp=temp*10;
aa[1]=temp/1024;
temp=temp%1024;
temp=temp*10;
aa[0]=temp/1024;
bb[0]=result/1000; //数字量显示1024 数学转换
bb[1]=(result%1000)/100;
bb[2]=(result%100)/10;
bb[3]=result%10;
dd[0]=6;
dd[1]=0;
dd[2]=1;
dd[3]=1;
dd[4]=3;
dd[5]=1;
dd[6]=8;
dd[7]=0;
cc[0]=16;
cc[1]=16;
cc[2]=16;
cc[3]=15;
cc[4]=14;
cc[5]=14;
cc[6]=13;
cc[7]=12;
jj[0]=17;
jj[1]=17;
jj[2]=17;
jj[3]=17;
jj[4]=17;
jj[5]=17;
jj[6]=17;
jj[7]=17;
e=0xfe;
switch(aa[2]%10)
{
case 0:
e=0x7f;
a=0xfe;
for(i=0;i<3;i++) //模拟量显示0-5v
{
c=LED[aa[i]];
if(i==2) c=c&0x7f;
outbyte(a,c);
a=(a<<1)|0x01; //a数字量显示位码
}
for(i=0;i<4;i++) //数字量显示1024
{
d=LED[bb[i]];
if(i==2) c=c&0x7f;
outbyte(e,d);
e=(e>>1)|0x80; //e数字量显示位码
} break;
case 1:
for(i=0;i<8;i++)
{
d=LED[dd[i]];
if(i==2) c=c&0x7f;
outbyte(e,d);
e=(e<<1)|0x01;
} break;
case 2:
for(i=0;i<8;i++)
{
d=LED[cc[i]];
if(i==2) c=c&0x7f;
outbyte(e,d);
e=(e<<1)|0x01;
} break;
case 3:
for(i=0;i<8;i++)
{
d=LED[cc[i]];
outbyte(e,d);
delayXms(1000);
d=LED[jj[i]];
if(i==2) c=c&0x7f;
outbyte(e,d);
e=(e<<1)|0x01;
}break;
case 4:
if(aa[1]>=5)
{
speak=0;
delayXms(1000);
speak=1;
delayXms(1000);
}
break;
}
}
} |