为什么24位的AD要转换芯片?

为什么24位的AD要转换芯片?,第1张

24位的AD要转换芯片是因为24位二进制数字位数太长,所以改用6位16进制数字来替代。2进制和16进制数字之间的转换很简单,每一位16进制数字对应四位2进制数字,这样比较简明一些。

AD转换就是模数转换,可以把模拟信号转换成数字信号。AD芯片的8位,12位,16位,24位代表的是AD转换的二进制位数。比如8位AD转换后二进制数值的取值范围为00000000 ~ 11111111,换成十进制数值为 0 ~ 255。6位AD二进制数取值范围是 00000000 00000000 ~ 11111111 11111111,换成十进制数是 0 ~ 65535,12位和24位也是一样的。总之位数多,AD转换后分辨率高,数值精度高。

24位AD范围是 -2^23 + 1  ~  +2^23 - 1(这里^代表次幂)。此范围从0x800000~0x7fffff也能看出来,最高位为符号位,0x800000代表-2^23 + 1,0x7fffff代表+2^23 - 1。

而count = count^0x800000中的 ^ 符号代表的是按位异或运算(C语言中就是这么规定)至于你这个程序应该是有问题的,正确写法如下:if(count &0x800000 == 0x800000)//判断符号位,1为负,0为正{    count = ~(count - 1)。

呵呵呵我给你个满意回答吧

19位有效位啊 补位的 17位的无噪声位 海芯文档上说的

也就是说虚标24位 实际16位不跳字 本人亲测的!!!

虚标这么多 肯定要移位啊 16位有效位 与上 800000 还算富余好多无效位的呢

原本是应该输出 000000--FFFFFF的 而它不是

它是

800000是最低位128增益 正负20mV的负20mV

7FFFFF是最高位 128增效 正负20mV的正20mV

零点为0x000000 0mV 晓不得啦

总共40mV的量程

Count=Count^0x800000是反转作用

使其变换为000000-FFFFFF的变化范围

要不你的程序没法计算的

我刚开始没看到说明书写的这一点 也搞的我晕头转向哇

后来调试好了 右移了8位用的16位数据

不接传感器来看 还是只有1数值的跳变 还是比较稳定的

接上传感器 线性很好

楼上那个设为满意的回答 纯粹在不懂放P

AD0809的采集程序

//---A/D转换---

//-----头文件引用------

#include <Reg51.h>

#include <absacc.h>

#include <intrins.h>

typedef unsigned char BYTE/*自定义字节类型*/

#define Set_Bit(BIT) (BIT = 1) /*定义置1函数*/

#define Clear_Bit(BIT) (BIT = 0) /*定义清0函数*/

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

void Write_Hd7279(BYTE,BYTE)/*定义HD7279写函数*/

BYTE Read_Hd7279(BYTE)/*定义HD7279读函数*/

void Send_Byte(BYTE)/*定义HD7279发送字节函数*/

BYTE Receive_Byte(void)/*定义HD7279接收字节函数*/

void Short_Delay(void)/*定义短延时函数*/

void Long_Delay(void)/*定义长延时函数*/

void Mcu_Init(void)/*定义MCU初始化函数*/

void Delay_200_mS(void)/*定义200ms延时函数*/

sbit Hd7279_Clk=P1^6/*定义HD7279时钟硬件连接*/

sbit Hd7279_Data=P1^5/*定义HD7279数据硬件连接*/

sbit cs=P1^7

void Short_Delay(void) /*短延时函数*/

{

BYTE i

for(i=0i<0x08i++)

}

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

void Long_Delay(void) /*长延时函数*/

{

BYTE i

for(i=0i<0x30i++)

}

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

void Write_Hd7279(BYTE Command,BYTE Data) /*HD7279写函数*/

{

Send_Byte(Command)

Send_Byte(Data)

}

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

void Send_Byte(BYTE Data_Out) /*HD7279发送字节函数*/

{

BYTE i

cs=0

Long_Delay()

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

{

if(Data_Out&0x80) Set_Bit(Hd7279_Data)

else Clear_Bit(Hd7279_Data)

Set_Bit(Hd7279_Clk)

Short_Delay()

Clear_Bit(Hd7279_Clk)

Short_Delay()

Data_Out=Data_Out<<1

}

Clear_Bit(Hd7279_Data)

}

//-----宏声明-----

#define A_DPORT XBYTE[0xFef3]//0809通道0地址

#define uchar unsigned char

//-----变量定义-----

bit bdata bz=0//定义标志

uchar val

//-----初始化-----

void first(void)

{

P1=0xff

P2=0xff

P3=0xff

P0=0xff

Send_Byte(0xa4)

IT1=1

EX1=1

EA=1//INT0 允许

}

//-----中断-----

void int_0(void) interrupt 2

{

val=A_DPORT//读 A_D 数据

bz=1//置读数标志

}

//-----主程序-----

main()

{

first()//初始化

while(1)

{

A_DPORT=val//启动 A_D

while(bz==0)//等待 A_D 转换结束

// val=~A_DPORT

//P1=val//数据输出

Write_Hd7279(0xc8,val&0x0f)

Write_Hd7279(0xc9,val>>4)

Write_Hd7279(0x92,0x00)

Write_Hd7279(0x93,0x00)

Write_Hd7279(0x94,0x00)

Write_Hd7279(0x95,0x00)

Write_Hd7279(0xce,0x0d)

Write_Hd7279(0xcf,0x0a)

bz=0//清读数标志

}

}

这就是C的程序

http://hi.baidu.com/dzkfw/blog/item/4a188216fd986b12c83d6d05.html

不平凡的单片机学习资料,很好的单片机教程,超好用,一个不占内存的教程,有案例。

1、最新版单片机编程宝典下载地址,学习单片机编程必备手册

2、单片机c语言运用例子

3、十天学会单片机c语言和单片机制作,最好的单片机资料


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12099892.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存