ADC0832学习笔记

AD转换与ADC0832学习总结

ADC0832的重点内容,我总结如下,重要性分先后

  1. ADC0832采用同步串行传输,要注意,串行传输的方式会明显体现在对MCU的编程中,而同步则体现得不明显。同步异步介绍
  2. ADC0832的外部连接采用SPI总线结构,这样便把它的连接方式与其他设备统一起来了。SPI的连接与介绍可以参考我的这篇总结
    ADC0832学习笔记_第1张图片
  3. 对于ADC0832的使用者来说,不需要关注其怎样读取模拟量与具体的AD转换方式,需要关注的是DI/DO口的输入输出,它串行地输出数字量。另外,这两个口由于实际使用时不会产生冲突,所以一般都连接起来,合称DODI口
  4. 对编程者而言,需要注意的是它的配置与初始化编程
    4.1 一个下降沿,DI必须为高电平,表示启始信号
    4.2 第二第三两个下降沿表示对通道的选择。选择方式
    4.3 初始化编程最好的方法是对照时序图与Datasheet
    ADC0832学习笔记_第2张图片

实例–数字电阻表

原型设计来自于AD转换
以下是我模仿的版本
电路图
ADC0832学习笔记_第3张图片

说明:

  1. 数码管使用的是共阳极的7SEG-4MPX-CA
  2. 通道0的输入直接是变阻器POT-HG上的电流,并不需要经过传感器。

main.c:

#include
#include
#define uchar unsigned char 
#define nop  _nop_()

code uchar seven_seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x82,0xf8,0x80,0x90};
uchar cp1,cp2,dat_ad;
sbit CS = P3^0;
sbit CLK = P3^1;
sbit DIDO = P3^2;
/*对ADC0832初始化处理*/
void adc0832_init(void)
{
	CS = 1;nop;	                              
	CLK = 1;
	CS = 0;
}
/*对转换ch0通道的模拟信号*/
uchar adc0832_ch0(void)
{
	uchar dat1,i;
	adc0832_init();
	DIDO = 1;CLK = 0;nop;CLK = 1;nop;		  //第一个下降沿,DI必须为高电平,表示启始信号
	DIDO = 1;CLK = 0;/*这里是第二个下降沿*/nop;CLK = 1;nop;		  //第二个下降沿
	DIDO = 0;CLK = 0;/*这里是第三个下降沿*/nop;CLK = 1;nop;	      //第三个下降沿,发送1,0;选择通道ch0
	DIDO = 1;								  //释放总线
	/*上面都是配置位,达到了启动并选择通道0的作用*/ 
	
	
	
	
	for(i = 0;i<8;i++)						  //第4个下降沿到第11个下降沿
	{										 
		CLK = 0;nop;						  //
		if(DIDO)dat1 = dat1|0x01;			  //最低位置1(与特定数字按位或的作用,可以达到控制指定位而其他位不变) 
		//注意dat1是MCU中的数据嗷,ADC发送的是DIDO 
		CLK = 1;nop;						  //这个CLK是单片机发给ADC的,因此在一个上升沿之间还可以处理一些程序。注意上面的这个IF语句是由MCU处理的啊! 
		dat1 = dat1<<1;						  //左移,低位填充0,依次输出最高位
		//DIDO每发送一位,MCU中的dat1变化一位。8位完成后即dat1返回 
	}
	return(dat1);      //返回的是数模转换的值 
	CS = 1;
	
}


void timer0_init()					//中断初始化函数
{
	TMOD = 0x01;					
	TL0 = 0x78;
	TH0 = 0xec;
	EA = 1;
	TR0 = 1;
	ET0 = 1;
}

void timer0_isr()interrupt 1	    //中断服务函数
{
	TL0 = 0x78;
	TH0 = 0xec;
	cp1++;
	if(cp1>100)						//0.5s
	{
		cp1 = 0;
		dat_ad=adc0832_ch0();		//adc0832转换一次
	}
	P0 = 0xff;						//消隐
	switch(cp2)
	{
		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];P2 = 0x04;break;
	}
	cp2++;
	if(cp2>=3)
	cp2 = 0;
}
void main()
{
	timer0_init();
	adc0832_init();
	while(1);
}

设计思路:
将ADC0832的具体测量程序卸载了中断程序中,这样就可以达到更改电阻阻值时数码管实时显示的效果

你可能感兴趣的:(硬件)