导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→请问:谁用过温度传感器AD7416![xiao_die]

 *第14244篇: 请问:谁用过温度传感器AD7416!

  
楼 主:xiao_die 2003年7月9日14:39
 请问:谁用过温度传感器AD7416!
问题:在数据处理程序怎样把读出来的数据变成两个字节的二进制数呢?
(数据放在ADCH,ADCL中)
温度值寄存器
温度值寄存器是一个16位只读寄存器,它的高10位D15~D6由A/D转换器送来的数字量以补码格式储存,低6位D5~D0未用.
温度数据格式见表4(小数点在D8、D7之间)。该表中显示了A/D转换器的全部理论范围-128℃至+127℃。实际应用中,温度的测量范围将取决于器件的正常工作温度范围.

利用单片机测量温度:
ad7416的地址A0A1A2为111:
ADSCL BIT P1.1
ADSDL BIT P1.7
.............
;程序初始化
............
;AD7416的采样参考程序:
SAMPLE74:MOV ADCNUM,#8 ;连续采样8次
SEO74: MOV R6,#9EH ;片选AD7416的地址写操作
MOV R5,#1 ;选中配置寄存器
MOV R4,#28H ;给配置寄存器赋值
LCALL WRCOM ;三字节写操作
MOV R6,#10011110B
MOV R5,#3 ;选中温度上限寄存器
MOV R4,#40H ;上限温度=64
LCALL WRCOM
MOV R6,#10011110B
MOV R5,#2 ;选中温度下限寄存器
MOV R4,#20H ;下限温度=32
LCALL WRCOM
MOV R6,#10011110B
MOV R5,#0 ;选中温度寄存器
LCALL WREXE ;两字节写操作
MOV DATA1,#10011110B ;片选AD7416.读操作
LCALL RDCOM
................
;数据处理
............... 
DJNZ ADCNUM,SE074 ;采样没完,返回
RET
WRCIM: LCALL BEGIN ;三字节的写操作
MOV DATA1,R6
LCALL OUTBYTE ;输出字节
MOV DATA1,R5
LCALL OUTBYTE
MOV DATA1,R4
LCALL OUTBYTE
LCALL STOP
RET
WREXE: LCALL BEGIN ;两字节的写操作
MOV DATA1,R6
LCALL OUTBYTE
MOV DATA1,R5
LCALL OUTBYTE
LCALL STOP
RET
RDCOM: LCALL BEGIN ;读操作
LCALL OUTBYTE
LCALL INBYTE ;输入字节
MOV ADCH,DATA1 
LCALL NACK ;MCU使ADSDA数据线变为低电平
LCALL INBYTE
MOV ADCL,DATA1
LCALL ACK ;MCU使ADSDA数据线变为高电平
LCALL STOP
RET
OUTBYTE: MOV R7,#8 ;输出字节
OE1: MOV A,DATA1
RLC A
MOV ADSDA,C
MOV DATA1,A
LCALL CLOCK
DJNZ R7,OE1
LCALL ACK
RET
INBYTE: SETB ADSDA ;输入字节
MOV R7,#8
INE1: LCALL CLOCK
MOV A,DATA1
RCL A
MOV DATA1,A
CJNZ R7,INE1
RET
NACK: CLR ADSDA ;AD7416无应答
LCALL CLOCK ;ADSDA数据线为0,一个时钟脉冲之后,ADSDA为1
RET
ACK: SETB ADSDA ;AD7416有应答
LCALL CLOCK ;ADSDA数据线为1,一个时钟脉冲之后,ADSDA为0
RET
STOP: CLR ADSDA ;产生停止信号 
SETB ADSCL 
NOP
NOP
NOP
NOP
SETB ADSDA
RET
BEGIN: SETB ADSDA ;产生开始信号
SETB ADSCL
NOP
NOP
NOP
NOP
CLR ADSDA
NOP
NOP
NOP
NOP
CLR ADSCL
RET
CLOCK: NOP ;产生时钟脉冲
SETB ADSCL
NOP
NOP
NOP
NOP
MOV C,ADSDA
CLR ADSCL
RET

AD7416简单描叙:
1:10位温度至数字转换器 
2:漏极开路超温掉电输出,可以实现“线与” 
3:I2C兼容的串行接口 
4:可选的串行总线地址,允许在单一总线上连接多达8个AD7416 
5:低功耗掉电方式(典型2mA) 
6:400ms更新速率 
7:-128℃至+128℃温度测量范围 
AD7416表示温度的数据是10位二进制数码,以2的补码格式储存。上面给出了几个温度数据的格式。
AD7416有5个内部寄存器。其中四个是数字寄存器,一个是地址指针寄存器。地址指针寄存器是一个8位寄存器,它储存指向四个数据寄存器之一的地址。对AD7416每一次串行写操作的第一个数据字节是数据寄存器的地址,这就是随后的数据字节要写入的地址。这个寄存器只须最低两位被用来选择一个数据寄存器。
温度值寄存器是一个16位只读寄存器,它的高10位以2的补码格式储存由AD转换器送来的10位温度读数;配置寄存器是一个8位读/写寄存器,它用来设置AD7416的工作方式;THYST设点寄存器是一个16位读/写寄存器,它的9个最高位储存以2的补码格式表示的低温度门限设点;TOTI设点寄存器是一个16位读/写寄存器,它的9个最高位储存以2 的补码格式表示的高温度门限设点。AD7416上电时地址指针指向温度值寄存器,TOTI=80℃,THYST=75℃,这些缺省使得AD7416可以用于标准的恒温器而不需要与任何串行总线连接。
AD7416与AT89C2051的接口
如所有的I2C兼容器件一样,AD7416有一个7位串行地址。这个地址的高4位设定为1001,而低3位可由用户通过将A2至A0引脚连接到无论是+VS或GND来设置。通过它们不同的设定地址,可将多达8个AD7416接到一条串行总线,超过8个则将与总线上的其它器件发生冲突。

  
2楼:xiao_die 2003年7月9日18:13
 怎么没人帮我!?
  
3楼:madnut 2003年7月9日18:23
 D15不动,D14~D0右移6位;或采样数据除以64
D15不动,D14~D0右移6位;或采样数据除以64
  
4楼:xiao_die 2003年7月10日09:01
 要不要把它转变成原码(因为采样数据是补码的形式)?
  
5楼:madnut 2003年7月10日09:39
 先转变成原码,右移6位,再转成补码试试看
先转变成原码,右移6位,再转成补码试试看,你还在用ASM?建议用C51写!
  
6楼:xiao_die 2003年7月10日09:54
 是asm!这个我会做:-
是不是这样:
正数的原码和补码不变,
负数的补码是正数的原码的反码,且在最后位(即最低位)加1所形成.
我现在对AD7416采样出来的数据怎样表示温度感到不理解~!
AD7416测量温度范围:-128~+128度
数据温度表示:
温度值 |数字量输出
-128 |10,0000,000
-125 |10,0000,1100
-100 |10,0111,0000
-75 |10,1101,0100
-50 |11,0011,1000
-25 |11,1001,1100
-0.25 |11,1111,1111
0 |00,0000,0000
+0.25 |00,0000,0001
+10 |0,0001,01000
+25 |0,0011,00100
+50 |0,0110,01000
+75 |0,1001,01100
+100 |0,1100,10000
+125 |0,1111,10100
+127 |0,1111,11100
我对上面的数据就是找不到什么规予!
我要的数据只是整数不带小数! 
  
7楼:madnut 2003年7月10日10:34
 可能前8位代表整数(-128~+127),后2位代表小数(00=0,01=1/4,10=2/4,11=3/4),
可能前8位代表整数(-128~+127),后2位代表小数(00=0,01=1/4,10=2/4,11=3/4),
-0.25=-1+3/4=1111,1111  <  <2+00,0000,0011
It's right?
  
8楼:xiao_die 2003年7月10日10:47
 温度数据格式(小数点在D8、D7之间)。
温度数据格式(小数点在D8、D7之间)。
D15,D14,D13,D12,D11,D10,D9,D8,D7,D6,D5,D4,D3,D2,D1,D0

D0,D1,D2,D3,D4,D5没用!
数据是在D15——D6

完全正确!

谢谢!


>>>>>>对该主题发表你的看法

本主题贴数8,分页: [第1页]


[上一篇主题]:有没有见过mega128的超过100页中文资料的大虾?

[下一篇主题]:求教VPX3226E的配置参数!!!!!!!