ADC0832简易数字电压表C语言

发布时间:2023-01-04  

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

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

/*目标器件:AT89S52 */

/*晶振:12.000MHZ */

/*编译环境:Keil uVision2 V2.12 */

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

#include

#include

#define uint unsigned int

#define uchar unsigned char

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

unsigned char dat=0x00 ; //AD值

unsigned char count = 0x00; //定时器计数

unsigned char channel; //通道变量

//ADC0832的引脚

sbit ADCS =P1^4; //ADC0832 chip seclect

sbit ADDI =P1^6; //ADC0832 k in

sbit ADDO =P1^6; //ADC0832 k out

sbit ADCLK =P1^5; //ADC0832 clock signal

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

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

unsigned char dispbuf[3];

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

unsigned char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

uint temp;

uchar dat; //获取ADC转换回来的值

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

函数功能:AD转换子程序

入口参数:CH

出口参数:dat

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

//采集并返回

unsigned int Adc0832(unsigned char channel) //AD转换,返回结果

{

uchar i=0;

uchar j;

uint dat=0;

uchar ndat=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=channel&0x1;

_nop_();

_nop_();

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

_nop_();

_nop_();

ADCLK=1;//拉高CLK端

ADDI=(channel>>1)&0x1;

_nop_();

_nop_();

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

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

_nop_();

_nop_();

dat=0;

for(i=0;i<8;i++)

{

dat|=ADDO;//收数据

ADCLK=1;

_nop_();

_nop_();

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

_nop_();

_nop_();

dat<<=1;

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

}

for(i=0;i<8;i++)

{

j=0;

j=j|ADDO;//收数据

ADCLK=1;

_nop_();

_nop_();

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

_nop_();

_nop_();

j=j<<7;

ndat=ndat|j;

if(i<7)ndat>>=1;

}

ADCS=1;//拉低CS端

ADCLK=0;//拉低CLK端

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

dat<<=8;

dat|=ndat;

return(dat); //return ad k

}

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

函数功能:延时子程序

入口参数:

出口参数:

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

void delay(void)

{

int k;

for(k=0;k<500;k++);

}

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

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

入口参数:

出口参数:

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

void display(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();

}

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

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

入口参数:

出口参数:

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

void timer0(void) interrupt 1

{

TMOD = 0x01;

TH0 = 0x00;

TL0 = 0x00;

IE = 0x82;

TR0 = 01;

count++;

if (count == 0x0A)

{

count = 0x00;

dat= Adc0832(channel);

}

}

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

函数功能:主程序

入口参数:

出口参数:

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

void main(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();

}

}


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    较小的为中性线。 (1)如果用红表笔分别触及两个电源插孔,两次显示值接近且读数较大,说明中性线对地开路,因中性线紧靠相线,故也感应出交流电压。 (2)用数字式电压表......
    电流表简称钳形表,其工作部分主要是由电流表和穿心式电流互感器组成。穿心式电流互感器铁芯制成活动开口,且成钳形,故名钳形电流表。目前,常见的钳形电流表按显示方式分有指针式和数字式;按功......
    万用表可以测量什么;又叫做万能表,其特点是量限多、用途广,测量机构是电压表、电流表、欧姆表原理的组合。一般可用来测量直流电流、直流电压、交流电压和电阻,有些万用表还可测交流电流、电功率、电感量、量等......
    管电流放大倍数(HFE),电容档(F),电感挡(H)还可以识别火线,方波档,TTL逻辑电平测量档,占空比测量,频率(Hz)测量,电导nS等等。。 数字式万用表是在以一个三位半或四位半的数字电压表DVM基础上通过扩大量程来构成的多量程数字......
    预热后再按要求进行该项试验。开机后,应能正常工作,报警复位键能正常工作;开关、按键、显示屏(或数码)正常工作。   3.电压误差   3.1直流高压分压器法   使用标准分压器与低压直流数字电压表作标准,按图1连线......
    测量的准确度。 (4)试验接线:将被试绕组首尾端分别接入电桥,非被试绕组悬空,采用双臂电桥(或数字式直流电阻测试仪)时,电流端子应在电压端子的外侧,见图2.4......
    C.A 757数字式电压探棒的产品特点及适用范围;C.A 757数字式电压探棒作为一款紧凑型、轻量级的测试测量仪器,提供日常所需的基本功能。C.A 757适合单手操作,配备IP54外壳,防尘......
    作原理分为磁电式、电磁式和电动式等。 1、电压表的选择 电压表的选择原则和方法与电流表的选择基本相同,主要从测量对象、测量范围、要求精度和仪表价格等几方面考虑。测量精度要求不高,一般多用电磁式电压表。而对......
    对氧传感器进行预热,使其工作温度达到360℃以上。 检测操作方法: 将汽车数字式万用表功能选择开关置于直流(DC)mV挡,黑线搭铁,红线与氧传感器输出端相连接,用来测量氧传感器信号输出端与搭铁之间的直流电压......
    表的实际应用 指针式万用表的使用 指针式万用表,作为早期被广泛使用的电工仪表,尽管如今已逐渐被数字式万用表所取代,但其......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>