ADC0832简易数字电压表C语言

admin 2025-05-13 289人围观 ,发现221个评论

//**************************************************************

/*简易数字电压表制作——ADC0832模数转换应用程序(C语言版)

/*目标器件:AT89S52*/

/*晶振:12.000MHZ*/

/*编译环境:*/

//*****************************************************************

defineucharunsignedchar

/*******************************定义全局变量********************************/

unsignedchardat=0x00;//AD值

unsignedcharcount=0x00;//定时器计数

unsignedcharchannel;//通道变量

//ADC0832的引脚

sbitADCS=P1^4;//ADC0832chipseclect

sbitADDI=P1^6;//ADC0832kin

sbitADDO=P1^6;//ADC0832kout

sbitADCLK=P1^5;//ADC0832clocksignal

unsignedchardispbitcode[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位扫描

unsignedchardispcode[11]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff};//共阳数码管字段码

unsignedchardispbuf[3];

/*******************************共阳LED段码表*******************************/

unsignedcharcodetab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

uinttemp;

uchardat;//获取ADC转换回来的值

/****************************************************************************

函数功能:AD转换子程序

入口参数:CH

出口参数:dat

****************************************************************************/

//采集并返回

unsignedintAdc0832(unsignedcharchannel)//AD转换,返回结果

{

uchari=0;

ucharj;

uintdat=0;

ucharndat=0;

if(channel==0)channel=2;

if(channel==1)channel=3;

ADDI=1;

_nop_();

_nop_();

ADCS=0;//拉低CS端

_nop_();

_nop_();

ADCLK=1;//拉高CLK端

_nop_();

_nop_();

ADCLK=0;//拉低CLK端,形成下降沿1

_nop_();

_nop_();

ADCLK=1;//拉高CLK端

ADDI=channel0x1;

_nop_();

_nop_();

ADCLK=0;//拉低CLK端,形成下降沿2

_nop_();

_nop_();

ADCLK=1;//拉高CLK端

ADDI=(channel1)0x1;

_nop_();

_nop_();

ADCLK=0;//拉低CLK端,形成下降沿3

ADDI=1;//控制命令结束

_nop_();

_nop_();

dat=0;

for(i=0;i8;i++)

{

dat|=ADDO;//收数据

ADCLK=1;

_nop_();

_nop_();

ADCLK=0;//形成一次时钟脉冲

_nop_();

_nop_();

dat=1;

if(i==7)dat|=ADDO;

}

for(i=0;i8;i++)

{

j=0;

j=j|ADDO;//收数据

ADCLK=1;

_nop_();

_nop_();

ADCLK=0;//形成一次时钟脉冲

_nop_();

_nop_();

j=j7;

ndat=ndat|j;

if(i7)ndat=1;

}

ADCS=1;//拉低CS端

ADCLK=0;//拉低CLK端

ADDO=1;//拉高数据端,回到初始状态

dat=8;

dat|=ndat;

return(dat);//returnadk

}

/**************************************************************************

函数功能:延时子程序

入口参数:

出口参数:

****************************************************************************/

voiddelay(void)

{

intk;

for(k=0;k500;k++);

}

/******************************************************************************

函数功能:数码管显示函数

入口参数:

出口参数:

******************************************************************************/

voiddisplay(void)

{

P2=0xff;

P0=tab[dispbuf[2]]0x7f;//显示个位和小数点

P2=0xfb;

delay();

P2=0xff;

P0=tab[dispbuf[1]];//显示小数点后第一位

P2=0xfd;

delay();

P2=0xff;

P0=tab[dispbuf[0]];//显示小数点后第二位

P2=0xfe;

delay();

}

/****************************************************************************

函数功能:定时器中断延时程序这一段的作用时隔一段时间抽样一次否侧显示的最后一位会不稳定

入口参数:

出口参数:

****************************************************************************/

voidtimer0(void)interrupt1

{

TMOD=0x01;

TH0=0x00;

TL0=0x00;

IE=0x82;

TR0=01;

count++;

if(count==0x0A)

{

count=0x00;

dat=Adc0832(channel);

}

}

/****************************************

函数功能:主程序

入口参数:

出口参数:

****************************************/

voidmain(void)

{P2=0xff;//端口初始化

P0=0xff;

channel=0x00;//channel=0

TMOD=0x01;

TH0=0x00;

TL0=0x00;

IE=0x82;

TR0=01;

while(1)

{

temp=dat*1.0/255*500;//电压值转换,5V做为参考电压,分成256份。

dispbuf[0]=temp%10;//个位

dispbuf[1]=temp/10%10;//十位

dispbuf[2]=temp/100%10;//百位

display();

}

}

猜你喜欢
    不容错过