||
利用12C5A60S2做的一个AD转换,并将模拟量值和数字量值仪器显示在数码管上,(初学者)。
#include <reg52.h>
sfr P1ASF=0x9d;
sfr ADC_CONTR =0xbc; //power speed1 speed0 flag st chs2 chs1 chs0
sfr ADC_RES=0xbd;
sfr ADC_RESL=0xbe;
#define uint unsigned int
#define uchar unsigned char
sbit ser=P2^1; //LED显示 595数据输入
sbit srclk1=P2^2; //
sbit rclk1=P2^3; //
uchar idata LED[ ]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xfe,0xbf};//共阳极段码表说明
uchar idata bb[]={0,0,10,0,11,11,11,11};
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++) //位码移位串行输出
{ 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};
// P1M0=0x01;
// P1M1=0x01;
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;
e=0x7f;
a=0xfe;
for(i=0;i<3;i++) //模拟量显示0-5v
{
c=LED[aa];
if(i==2) c=c&0x7f;
outbyte(a,c);
a=(a<<1)|0x01; //a数字量显示位码
}
for(i=0;i<4;i++) //数字量显示1024
{
d=LED[bb];
if(i==2) c=c&0x7f;
outbyte(e,d);
e=(e>>1)|0x80; //e数字量显示位码
}
}
}