adc0832工作原理,ADC0832原理

#include #include”ADC0832.c”code uchar seven_seg[]={0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};//共阳数码管0–9(0时为有效断)

uchar cp, j;uintdat_ad;void timer0_isr(void); //声明中断服务函数

void timer0_init(void); //声明中断初始化函数

void main(void) /**************************主函数**************************/{

timer0_init();//中断初始化函数

adc0832_init(); //adc0832初始化函数

while(1); //表示一个死循环,循环一直运行下去

}/***********************中断服务函数************************/

void timer0_isr(void) interrupt 1{

TH0= 0xf8;

TL0= 0x2f;

cp++;if(cp > 250) //0.5秒·

{

cp= 0;

dat_ad= adc0832_cho();//0.5秒让ADC0832转换一次

dat_ad = dat_ad * 1.96;//模拟信号转化为数字信号

}

P0= 0xff;switch(j)

{case 0: P0 = seven_seg[dat_ad % 10]; P2 = ~0x01;break; //模拟信号

case 1: P0 = seven_seg[dat_ad % 100/10]; P2 = ~0x02;break;// case 2: P0 = seven_seg[dat_ad / 100]& 0x7f; P2 = ~0x04;break;// case 3: P0 = seven_seg[adc0832_cho()% 10]; P2 = ~0x08; break; //、 数字信号

case 4: P0 = seven_seg[adc0832_cho()% 100 / 10]; P2 = ~0x10;break;// case 5: P0 = seven_seg[adc0832_cho() / 100]; P2 = ~0x20; break;//}

j++;if(j >= 6)

j= 0; //共显示六位

}/***********************中断初始化函数**********************/

void timer0_init(void)

{

TMOD= 0x01; //中断方式1

TH0 = 0xf8;

TL0= 0x2f; //对机器脉冲计数,2000个计满溢出引发中断

EA = 1; //开总中断

ET0 = 1; //开T0中断

TR0 = 1; //启动定时器T0

}/****************************************************************************************/

/*************************************ADC0832的驱动程序***********************************/

/*ADC0832模数转换将连续变化的模拟信号转换为离散的数字信号V = 5 / 256 = 0.01953v = 19.53mv*/

/****************************************************************************************/#include

#define nop _nop_()

#define uchar unsigned char //宏定义用uchar 代替 unsigned char

#define uint unsigned int //宏定义用uint 代替 unsigned intsbit CS= P3^0;

sbit CLK= P3^1;

sbit DIDO= P3^2;void adc0832_init(void) /*****ADC0832初始化函数*****/{

CS= 1; //adc0832未工作时,CS端为高电平,此时芯片禁用

nop; //对于延时很短的,要求在us级的,采用“_nop_”函数

CLK = 1;

CS= 0;

}

uchar adc0832_cho(void) //包含11个CLK下降沿 /**对转换CHO通道的模拟信号**/

{

uchar i, dat;

adc0832_init();

DIDO= 1; CLK = 0; nop; CLK = 1; nop; //SCLK第一个下降沿来到时,DI = 1启动ADC0832

DIDO = 1; CLK = 0; nop; CLK = 1; nop; //SCLK第二个下降沿

DIDO = 0; CLK = 0; nop; CLK = 1; nop; //SCLK第三个下降沿,发送1,0选择通道cho

DIDO = 1; //释放总线

for(i = 0; i < 8; i++) //第四个下降沿到第11个下降沿

{

CLK= 0; //clk处于下降沿,每一个下降沿DO端输入下一个

nop; //对于延时很短的,要求在us级的,采用“_nop_”函数

if(DIDO) dat |= 0x01; //dat = dat | 0x01,dat和0x01做“或”的运算,意思是最低位置1,其它位保持不变。

CLK = 1; nop; //clk处于上升沿

dat <<= 1; //数据左移

}return(dat);

CS= 1; //adc0832停止工作

}

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注